View Javadoc
1   /*
2    * The contents of this file are subject to the terms of the Common Development and
3    * Distribution License (the License). You may not use this file except in compliance with the
4    * License.
5    *
6    * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
7    * specific language governing permission and limitations under the License.
8    *
9    * When distributing Covered Software, include this CDDL Header Notice in each file and include
10   * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
11   * Header, with the fields enclosed by brackets [] replaced by your own identifying
12   * information: "Portions Copyrighted [year] [name of copyright owner]".
13   *
14   * Copyright 2011-2016 ForgeRock AS.
15   */
16  
17  package org.forgerock.json.crypto;
18  
19  import static org.forgerock.json.JsonValue.field;
20  import static org.forgerock.json.JsonValue.object;
21  import static org.forgerock.util.crypto.CryptoConstants.CRYPTO;
22  import static org.forgerock.util.crypto.CryptoConstants.CRYPTO_TYPE;
23  import static org.forgerock.util.crypto.CryptoConstants.CRYPTO_VALUE;
24  
25  import java.util.Map;
26  
27  import org.forgerock.json.JsonValue;
28  import org.forgerock.json.JsonValueException;
29  import org.forgerock.util.crypto.CryptoConstants;
30  
31  /**
32   * Represents a JSON {@code $crypto} object.
33   *
34   * For example:
35   * <pre>
36   * "$crypto":{
37   *     "value":{
38   *         "data":"wfoQJXXXXTa551pKTMjZ/Q==",
39   *         "cipher":"AES/CBC/PKCS5Padding",
40   *         "iv":"OXHdtVBURv6fAuRa88CDnA==",
41   *         "key":"openidm-sym-default"
42   *     },
43   *     "type":"x-simple-encryption"
44   * }
45   * </pre>
46   *
47   * @see CryptoConstants for constants used to build the json.
48   */
49  public class JsonCrypto {
50  
51      /** The type of JSON cryptographic representation. */
52      private String type;
53  
54      /** The JSON cryptographic value. */
55      private JsonValue value;
56  
57      /**
58       * Constructs an empty JSON cryptographic object.
59       */
60      public JsonCrypto() {
61          // empty
62      }
63  
64      /**
65       * Constructs a new JSON cryptographic object, initializing from a JSON value.
66       *
67       * @param value a JSON value containing a {@code $crypto} JSON object value.
68       * @throws JsonValueException if the specified value is malformed.
69       */
70      public JsonCrypto(JsonValue value) throws JsonValueException {
71          fromJsonValue(value);
72      }
73  
74      /**
75       * Constructs a new JSON cryptographic object, initializing with the specified type
76       * and cryptographic value.
77       *
78       * @param type the type of JSON cryptographic representation.
79       * @param value the JSON cryptographic value.
80       */
81      public JsonCrypto(String type, JsonValue value) {
82          setType(type);
83          setValue(value);
84      }
85  
86      /**
87       * Returns {@code true} if the specified JSON value contains a valid {@code $crypto}
88       * JSON object structure.
89       *
90       * @param value The JSON to check.
91       * @return The result.
92       */
93      public static boolean isJsonCrypto(JsonValue value) {
94          boolean result = false;
95          if (value.isDefined(CRYPTO)) { // avoid transformer endless loops
96              JsonValue crypto = value.get(CRYPTO);
97              result = (crypto.get(CRYPTO_TYPE).isString() && crypto.isDefined(CRYPTO_VALUE));
98          }
99          return result;
100     }
101 
102     /**
103      * Returns the type of JSON cryptographic representation.
104      * @return The type.
105      */
106     public String getType() {
107         return type;
108     }
109 
110     /**
111      * Sets the type of JSON cryptographic representation.
112      *
113      * @param type the type of JSON cryptographic representation.
114      */
115     public void setType(String type) {
116         this.type = type;
117     }
118 
119     /**
120      * Returns the JSON cryptographic value.
121      * @return The value.
122      */
123     public JsonValue getValue() {
124         return value;
125     }
126 
127     /**
128      * Sets the JSON cryptographic value.
129      *
130      * @param value the JSON cryptographic value.
131      */
132     public void setValue(JsonValue value) {
133         this.value = value;
134     }
135 
136     /**
137      * Initializes this object from the specified {@code $crypto} JSON object value.
138      *
139      * @param value a JSON value containing a {@code $crypto} JSON object value.
140      * @throws JsonValueException if the specified value is malformed.
141      */
142     public void fromJsonValue(JsonValue value) throws JsonValueException {
143         JsonValue crypto = value.get(CRYPTO).required();
144         this.type = crypto.get(CRYPTO_TYPE).required().asString();
145         this.value = crypto.get(CRYPTO_VALUE).required();
146     }
147 
148     /**
149      * Returns this object as a {@code $crypto} JSON object value.
150      * @return The value.
151      */
152     public JsonValue toJsonValue() {
153         Map<String, Object> object = object(field(CRYPTO, object(
154                 field(CRYPTO_TYPE, type),
155                 field(CRYPTO_VALUE, value == null ? null : value.getObject())))
156         );
157         return new JsonValue(object, value == null ? null : value.getPointer());
158     }
159 }