001    package com.nimbusds.jose;
002    
003    
004    import net.jcip.annotations.Immutable;
005    
006    
007    /**
008     * Encryption method name, represents the {@code enc} header parameter in JSON
009     * Web Encryption (JWE) objects. This class is immutable.
010     *
011     * <p>Includes constants for the following standard encryption method names:
012     *
013     * <ul>
014     *     <li>{@link #A128CBC_HS256 A128CBC+HS256}
015     *     <li>{@link #A256CBC_HS512 A256CBC+HS512}
016     *     <li>{@link #A128GCM}
017     *     <li>{@link #A256GCM}
018     * </ul>
019     *
020     * <p>Additional encryption method names can be defined using the constructors.
021     *
022     * @author Vladimir Dzhuvinov
023     * @version $version$ (2013-01-08)
024     */
025    @Immutable
026    public final class EncryptionMethod extends Algorithm {
027    
028    
029            /**
030             * Composite Authenticated Encryption algorithm using Advanced 
031             * Encryption Standard (AES) in Cipher Block Chaining (CBC) mode with 
032             * PKCS #5 padding (NIST.800-38A) with an integrity calculation using 
033             * HMAC SHA-256, using a 256 bit CMK (and a 128 bit CEK) (required).
034             */
035            public static final EncryptionMethod A128CBC_HS256 = new EncryptionMethod("A128CBC+HS256", Requirement.REQUIRED);
036            
037            
038            /**
039             * Composite Authenticated Encryption algorithm using Advanced 
040             * Encryption Standard (AES) in Cipher Block Chaining (CBC) mode with 
041             * PKCS #5 padding (NIST.800-38A) with an integrity calculation using 
042             * HMAC SHA-512, using a 512 bit CMK (and a 256 bit CEK) (required).
043             */
044            public static final EncryptionMethod A256CBC_HS512 = new EncryptionMethod("A256CBC+HS512", Requirement.REQUIRED);
045            
046            
047            /**
048             * Advanced Encryption Standard (AES) in Galois/Counter Mode (GCM)
049             * (NIST.800-38D) using 128 bit keys (recommended).
050             */
051            public static final EncryptionMethod A128GCM = new EncryptionMethod("A128GCM", Requirement.RECOMMENDED);
052            
053            
054            /**
055             * Advanced Encryption Standard (AES) in Galois/Counter Mode (GCM)
056             * (NIST.800-38D) using 256 bit keys (recommended).
057             */
058            public static final EncryptionMethod A256GCM = new EncryptionMethod("A256GCM", Requirement.RECOMMENDED);
059            
060            
061            /**
062             * Creates a new encryption method.
063             *
064             * @param name The encryption method name. Must not be {@code null}.
065             * @param req  The implementation requirement, {@code null} if not 
066             *             known.
067             */
068            public EncryptionMethod(final String name, final Requirement req) {
069            
070                    super(name, req);
071            }
072            
073            
074            /**
075             * Creates a new encryption method.
076             *
077             * @param name The encryption method name. Must not be {@code null}.
078             */
079            public EncryptionMethod(final String name) {
080            
081                    super(name, null);
082            }
083            
084            
085            /**
086             * Parses an encryption method from the specified string.
087             *
088             * @param s The string to parse. Must not be {@code null}.
089             *
090             * @return The encryption method  (matching standard algorithm constant,
091             *         else a newly created algorithm).
092             */
093            public static EncryptionMethod parse(final String s) {
094            
095                    if (s == A128CBC_HS256.getName())
096                            return A128CBC_HS256;
097                    
098                    else if (s == A256CBC_HS512.getName())
099                            return A256CBC_HS512;
100                    
101                    else if (s == A128GCM.getName())
102                            return A128GCM;
103                    
104                    else if (s == A256GCM.getName())
105                            return A256GCM;
106                    
107                    else
108                            return new EncryptionMethod(s);
109            }
110    }