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    }