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 2013-2017 ForgeRock AS.
15   */
16  
17  package org.forgerock.json.jose.jws;
18  
19  import org.forgerock.json.jose.jwt.Algorithm;
20  
21  /**
22   * An Enum of the possible signing algorithms that can be used to sign a JWT.
23   * <p>
24   * @see <a href="http://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-11#section-3.1">JWS Algorithms</a>
25   *
26   * @since 2.0.0
27   */
28  public enum JwsAlgorithm implements Algorithm {
29  
30      /** No digital signature or MAC value included. */
31      NONE(null, null, JwsAlgorithmType.NONE),
32      /** HMAC using SHA-256 hash algorithm. */
33      HS256("HmacSHA256", "SHA-256", JwsAlgorithmType.HMAC),
34      /** HMAC using SHA-384 hash algorithm. */
35      HS384("HmacSHA384", "SHA-384", JwsAlgorithmType.HMAC),
36      /** HMAC using SHA-512 hash algorithm. */
37      HS512("HmacSHA512", "SHA-512", JwsAlgorithmType.HMAC),
38      /** RSA using SHA-256 hash algorithm. **/
39      RS256("SHA256withRSA", "SHA-256", JwsAlgorithmType.RSA),
40      /** ECDSA using SHA-256 hash algorithm. */
41      ES256("SHA256WithECDSA", "SHA-256", JwsAlgorithmType.ECDSA),
42      /** ECDSA using SHA-384 hash algorithm. */
43      ES384("SHA384WithECDSA", "SHA-384", JwsAlgorithmType.ECDSA),
44      /** ECDSA using SHA-512 hash algorithm. */
45      ES512("SHA512WithECDSA", "SHA-512", JwsAlgorithmType.ECDSA);
46  
47      private final String algorithm;
48      private final String mdAlgorithm;
49      private final JwsAlgorithmType algorithmType;
50  
51      /**
52       * Constructs a new JwsAlgorithm with the Java Cryptographic string name of the algorithm and the JwsAlgorithmType
53       * of the algorithm.
54       *
55       * @param algorithm The Java Cryptographic algorithm name.
56       * @param mdAlgorithm The MessageDigest algorithm.
57       * @param algorithmType The JwsAlgorithmType of the JwsAlgorithm.
58       */
59      JwsAlgorithm(String algorithm, String mdAlgorithm, JwsAlgorithmType algorithmType) {
60          this.algorithm = algorithm;
61          this.mdAlgorithm = mdAlgorithm;
62          this.algorithmType = algorithmType;
63      }
64  
65      @Override
66      public String getAlgorithm() {
67          return algorithm;
68      }
69  
70      @Override
71      public String getJwaAlgorithmName() {
72          return name();
73      }
74  
75      /**
76       * Returns the Java-friendly name of the message digest algorithm
77       * implementation.
78       *
79       * @return the Java-friendly name of the message digest algorithm
80       *         implementation.
81       * @see <a
82       *      href="http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html">Standard
83       *      Names</a>
84       */
85      public String getMdAlgorithm() {
86          return mdAlgorithm;
87      }
88  
89      /**
90       * Return the standard name of the elliptic curve definition. Only applicable for ECDSA algorithms.
91       *
92       * @return the curve name or null if not applicable.
93       */
94      public String getEllipticCurveName() {
95          switch (this) {
96          case ES256:
97              return "P-256";
98          case ES384:
99              return "P-384";
100         case ES512:
101             return "P-521"; // Not a typo!
102         default:
103             return null;
104         }
105     }
106 
107     /**
108      * Gets the JwsAlgorithmType of the JwsAlgorithm.
109      *
110      * @return The JwsAlgorithmType.
111      */
112     public JwsAlgorithmType getAlgorithmType() {
113         return algorithmType;
114     }
115 
116     /**
117      * See {@link #parseCryptographicAlgorithm(String)}}.
118      * @deprecated Replaced by {@link #parseCryptographicAlgorithm(String)}
119      *
120      * @param algorithm The Java Cryptographic string algorithm name.
121      * @return The matching JwsAlgorithm.
122      */
123     @Deprecated
124     public static JwsAlgorithm getJwsAlgorithm(String algorithm) {
125         return parseCryptographicAlgorithm(algorithm);
126     }
127 
128     /**
129      * Parses the given algorithm string to find the matching Java Cryptographic algorithm name.
130      * <p>
131      * If the given algorithm name does not match the algorithm name of any of the constants, then an
132      * IllegalArgumentException will be thrown.
133      *
134      * @param algorithm The Java Cryptographic string algorithm name.
135      * @return The matching JwsAlgorithm.
136      */
137     public static JwsAlgorithm parseCryptographicAlgorithm(String algorithm) {
138         for (JwsAlgorithm jwsAlgorithm : JwsAlgorithm.values()) {
139             if (algorithm.equalsIgnoreCase(jwsAlgorithm.getAlgorithm())) {
140                 return jwsAlgorithm;
141             }
142         }
143         throw new IllegalArgumentException("Unknown JwsAlgorithm, " + algorithm);
144     }
145 
146     /**
147      * Turns the JwsAlgorithm constant into a JSON value string.
148      *
149      * @return {@inheritDoc}
150      */
151     @Override
152     public String toString() {
153         return super.toString();
154     }
155 }