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     *     <li>{@link #PS256}
025     *     <li>{@link #PS512}
026     * </ul>
027     *
028     * <p>Additional JWS algorithm names can be defined using the constructors.
029     *
030     * @author Vladimir Dzhuvinov
031     * @version $version$ (2013-05-29)
032     */
033    @Immutable
034    public final class JWSAlgorithm extends Algorithm {
035    
036    
037            /**
038             * HMAC using SHA-256 hash algorithm (required).
039             */
040            public static final JWSAlgorithm HS256 = new JWSAlgorithm("HS256", Requirement.REQUIRED);
041    
042    
043            /**
044             * HMAC using SHA-384 hash algorithm (optional).
045             */
046            public static final JWSAlgorithm HS384 = new JWSAlgorithm("HS384", Requirement.OPTIONAL);
047    
048    
049            /**
050             * HMAC using SHA-512 hash algorithm (optional).
051             */
052            public static final JWSAlgorithm HS512 = new JWSAlgorithm("HS512", Requirement.OPTIONAL);
053    
054    
055            /**
056             * RSASSA-PKCS-v1_5 using SHA-256 hash algorithm (recommended).
057             */
058            public static final JWSAlgorithm RS256 = new JWSAlgorithm("RS256", Requirement.RECOMMENDED);
059    
060    
061            /**
062             * RSASSA-PKCS-v1_5 using SHA-384 hash algorithm (optional).
063             */
064            public static final JWSAlgorithm RS384 = new JWSAlgorithm("RS384", Requirement.OPTIONAL);
065    
066    
067            /**
068             * RSASSA-PKCS-v1_5 using SHA-512 hash algorithm (optional).
069             */
070            public static final JWSAlgorithm RS512 = new JWSAlgorithm("RS512", Requirement.OPTIONAL);
071    
072    
073            /**
074             * ECDSA using P-256 curve and SHA-256 hash algorithm (recommended).
075             */
076            public static final JWSAlgorithm ES256 = new JWSAlgorithm("ES256", Requirement.RECOMMENDED);
077    
078    
079            /**
080             * ECDSA using P-384 curve and SHA-384 hash algorithm (optional).
081             */
082            public static final JWSAlgorithm ES384 = new JWSAlgorithm("ES384", Requirement.OPTIONAL);
083    
084    
085            /**
086             * ECDSA using P-521 curve and SHA-512 hash algorithm (optional).
087             */
088            public static final JWSAlgorithm ES512 = new JWSAlgorithm("ES512", Requirement.OPTIONAL);
089    
090    
091            /**
092             * RSASSA-PSS using SHA-256 hash algorithm (optional).
093             */
094            public static final JWSAlgorithm PS256 = new JWSAlgorithm("PS256", Requirement.OPTIONAL);
095    
096    
097            /**
098             * RSASSA-PSS using SHA-512 hash algorithm (optional).
099             */
100            public static final JWSAlgorithm PS512 = new JWSAlgorithm("PS512", Requirement.OPTIONAL);
101    
102    
103            /**
104             * Creates a new JSON Web Signature (JWS) algorithm name.
105             *
106             * @param name The algorithm name. Must not be {@code null}.
107             * @param req  The implementation requirement, {@code null} if not 
108             *             known.
109             */
110            public JWSAlgorithm(final String name, final Requirement req) {
111    
112                    super(name, req);
113            }
114    
115    
116            /**
117             * Creates a new JSON Web Signature (JWS) algorithm name.
118             *
119             * @param name The algorithm name. Must not be {@code null}.
120             */
121            public JWSAlgorithm(final String name) {
122    
123                    super(name, null);
124            }
125    
126    
127            /**
128             * Parses a JWS algorithm from the specified string.
129             *
130             * @param s The string to parse. Must not be {@code null}.
131             *
132             * @return The JWS algorithm (matching standard algorithm constant, else
133             *         a newly created algorithm).
134             */
135            public static JWSAlgorithm parse(final String s) {
136    
137                    if (s.equals(HS256.getName())) {
138                            return HS256;
139                    } else if (s.equals(HS384.getName())) {
140                            return HS384;
141                    } else if (s.equals(HS512.getName())) {
142                            return HS512;
143                    } else if (s.equals(RS256.getName())) {
144                            return RS256;
145                    } else if (s.equals(RS384.getName())) {
146                            return RS384;
147                    } else if (s.equals(RS512.getName())) {
148                            return RS512;
149                    } else if (s.equals(ES256.getName())) {
150                            return ES256;
151                    } else if (s.equals(ES384.getName())) {
152                            return ES384;
153                    } else if (s.equals(ES512.getName())) {
154                            return ES512;
155                    } else if (s.equals(PS256.getName())) {
156                            return PS256;
157                    } else if (s.equals(PS512.getName())) {
158                            return PS512;
159                    } else {
160                            return new JWSAlgorithm(s);
161                    }
162            }
163    }