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 copyright [year] [name of copyright owner]".
13  *
14  * Copyright 2014-2017 ForgeRock AS.
15  */
16  package org.forgerock.json.jose.jwk;
17  
18  import java.security.Key;
19  import javax.crypto.spec.SecretKeySpec;
20  import org.forgerock.json.JsonException;
21  import org.forgerock.json.jose.exceptions.FailedToLoadJWKException;
22  import org.forgerock.json.jose.jws.JwsAlgorithm;
23  
24  /**
25   * Helper class to look up and return the keys from specific JWK implementation
26   * algorithm types.
27   */
28  public class JWKLookup {
29  
30      /**
31       * Lookup returns the key from the given json, under the assumption it's of the correct
32       * keyType.
33       *
34       * @param json JSON from which to attempt to generate a key
35       * @param keyType The type of key we expect to be generated from the JSON
36       * @return a valid key for verifying a JWT
37       * @throws FailedToLoadJWKException If there's an issue handling the loading of the JWK
38       */
39      public Key lookup(String json, KeyType keyType) throws FailedToLoadJWKException {
40          try {
41              switch (keyType) {
42              case RSA:
43                  final RsaJWK rsaJWK = RsaJWK.parse(json);
44                  return rsaJWK.toRSAPublicKey();
45              case EC:
46                  final EcJWK ecJWK = EcJWK.parse(json);
47                  return ecJWK.toECPublicKey();
48              case OCT:
49                  final OctJWK octJWK = OctJWK.parse(json);
50                  final String jwkKey = octJWK.getKey();
51  
52                  final Key key = new SecretKeySpec(jwkKey.getBytes(),
53                          JwsAlgorithm.parseCryptographicAlgorithm(octJWK.getAlgorithm()).getMdAlgorithm());
54  
55                  return key;
56              default:
57                  throw new FailedToLoadJWKException("Unable to find handler for Key Type");
58              }
59          } catch (JsonException je) {
60              throw new FailedToLoadJWKException("Unable to generate Key from provided JSON", je);
61          }
62      }
63  
64  }