001package com.nimbusds.jose;
002
003
004import 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
032public 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                } else if (s == HS384.getName()) {
126                        return HS384;
127                } else if (s == HS512.getName()) {
128                        return HS512;
129                } else if (s == RS256.getName()) {
130                        return RS256;
131                } else if (s == RS384.getName()) {
132                        return RS384;
133                } else if (s == RS512.getName()) {
134                        return RS512;
135                } else if (s == ES256.getName()) {
136                        return ES256;
137                } else if (s == ES384.getName()) {
138                        return ES384;
139                } else if (s == ES512.getName()) {
140                        return ES512;
141                } else {
142                        return new JWSAlgorithm(s);
143                }
144        }
145}