001 package com.nimbusds.jose;
002
003
004 import net.jcip.annotations.Immutable;
005
006
007 /**
008 * JSON Web Signature (JWS) algorithm name, represents the {@code alg} header
009 * parameter in JWS objects. Also used to represent integrity algorithm
010 * ({@code ia}) header parameters in JWE objects. This class is immutable.
011 *
012 * <p>Includes constants for the following standard JWS algorithm names:
013 *
014 * <ul>
015 * <li>{@link #HS256}
016 * <li>{@link #HS384}
017 * <li>{@link #HS512}
018 * <li>{@link #RS256}
019 * <li>{@link #RS384}
020 * <li>{@link #RS512}
021 * <li>{@link #ES256}
022 * <li>{@link #ES384}
023 * <li>{@link #ES512}
024 * </ul>
025 *
026 * <p>Additional JWS algorithm names can be defined using the constructors.
027 *
028 * @author Vladimir Dzhuvinov
029 * @version $version$ (2013-01-08)
030 */
031 @Immutable
032 public final class JWSAlgorithm extends Algorithm {
033
034
035 /**
036 * HMAC using SHA-256 hash algorithm (required).
037 */
038 public static final JWSAlgorithm HS256 = new JWSAlgorithm("HS256", Requirement.REQUIRED);
039
040
041 /**
042 * HMAC using SHA-384 hash algorithm (optional).
043 */
044 public static final JWSAlgorithm HS384 = new JWSAlgorithm("HS384", Requirement.OPTIONAL);
045
046
047 /**
048 * HMAC using SHA-512 hash algorithm (optional).
049 */
050 public static final JWSAlgorithm HS512 = new JWSAlgorithm("HS512", Requirement.OPTIONAL);
051
052
053 /**
054 * RSA using SHA-256 hash algorithm (recommended).
055 */
056 public static final JWSAlgorithm RS256 = new JWSAlgorithm("RS256", Requirement.RECOMMENDED);
057
058
059 /**
060 * RSA using SHA-384 hash algorithm (optional).
061 */
062 public static final JWSAlgorithm RS384 = new JWSAlgorithm("RS384", Requirement.OPTIONAL);
063
064
065 /**
066 * RSA using SHA-512 hash algorithm (optional).
067 */
068 public static final JWSAlgorithm RS512 = new JWSAlgorithm("RS512", Requirement.OPTIONAL);
069
070
071 /**
072 * ECDSA using P-256 curve and SHA-256 hash algorithm (recommended).
073 */
074 public static final JWSAlgorithm ES256 = new JWSAlgorithm("ES256", Requirement.RECOMMENDED);
075
076
077 /**
078 * ECDSA using P-384 curve and SHA-384 hash algorithm (optional).
079 */
080 public static final JWSAlgorithm ES384 = new JWSAlgorithm("ES384", Requirement.OPTIONAL);
081
082
083 /**
084 * ECDSA using P-521 curve and SHA-512 hash algorithm (optional).
085 */
086 public static final JWSAlgorithm ES512 = new JWSAlgorithm("ES512", Requirement.OPTIONAL);
087
088
089 /**
090 * Creates a new JSON Web Signature (JWS) algorithm name.
091 *
092 * @param name The algorithm name. Must not be {@code null}.
093 * @param req The implementation requirement, {@code null} if not
094 * known.
095 */
096 public JWSAlgorithm(final String name, final Requirement req) {
097
098 super(name, req);
099 }
100
101
102 /**
103 * Creates a new JSON Web Signature (JWS) algorithm name.
104 *
105 * @param name The algorithm name. Must not be {@code null}.
106 */
107 public JWSAlgorithm(final String name) {
108
109 super(name, null);
110 }
111
112
113 /**
114 * Parses a JWS algorithm from the specified string.
115 *
116 * @param s The string to parse. Must not be {@code null}.
117 *
118 * @return The JWS algorithm (matching standard algorithm constant, else
119 * a newly created algorithm).
120 */
121 public static JWSAlgorithm parse(final String s) {
122
123 if (s == HS256.getName())
124 return HS256;
125
126 else if (s == HS384.getName())
127 return HS384;
128
129 else if (s == HS512.getName())
130 return HS512;
131
132 else if (s == RS256.getName())
133 return RS256;
134
135 else if (s == RS384.getName())
136 return RS384;
137
138 else if (s == RS512.getName())
139 return RS512;
140
141 else if (s == ES256.getName())
142 return ES256;
143
144 else if (s == ES384.getName())
145 return ES384;
146
147 else if (s == ES512.getName())
148 return ES512;
149
150 else
151 return new JWSAlgorithm(s);
152 }
153 }