001package com.nimbusds.jose;
002
003
004import 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-05-05)
024 */
025@Immutable
026public final class EncryptionMethod extends Algorithm {
027
028
029        /**
030         * The Content Encryption Key (CEK) bit length, zero if not specified.
031         */
032        private final int cekBitLength;
033
034
035        /**
036         * AES_128_CBC_HMAC_SHA_256 authenticated encryption using a 256 bit 
037         * key (required).
038         */
039        public static final EncryptionMethod A128CBC_HS256 = 
040                new EncryptionMethod("A128CBC-HS256", Requirement.REQUIRED, 256);
041
042
043        /**
044         * AES_256_CBC_HMAC_SHA_512 authenticated encryption using a 512 bit
045         * key (required).
046         */
047        public static final EncryptionMethod A256CBC_HS512 = 
048                new EncryptionMethod("A256CBC-HS512", Requirement.REQUIRED, 512);
049
050
051        /**
052         * AES in Galois/Counter Mode (GCM) (NIST.800-38D) using a 128 bit key 
053         * (recommended).
054         */
055        public static final EncryptionMethod A128GCM = 
056                new EncryptionMethod("A128GCM", Requirement.RECOMMENDED, 128);
057
058
059        /**
060         * AES in Galois/Counter Mode (GCM) (NIST.800-38D) using a 256 bit key 
061         * (recommended).
062         */
063        public static final EncryptionMethod A256GCM = 
064                new EncryptionMethod("A256GCM", Requirement.RECOMMENDED, 256);
065
066
067        /**
068         * Creates a new encryption method.
069         *
070         * @param name         The encryption method name. Must not be 
071         *                     {@code null}.
072         * @param req          The implementation requirement, {@code null} if 
073         *                     not known.
074         * @param cekBitLength The Content Encryption Key (CEK) bit length, 
075         *                     zero if not specified.
076         */
077        public EncryptionMethod(final String name, final Requirement req, final int cekBitLength) {
078
079                super(name, req);
080
081                this.cekBitLength = cekBitLength;
082        }
083
084
085        /**
086         * Creates a new encryption method. The Content Encryption Key (CEK)
087         * bit length is not specified.
088         *
089         * @param name The encryption method name. Must not be {@code null}.
090         * @param req  The implementation requirement, {@code null} if not 
091         *             known.
092         */
093        public EncryptionMethod(final String name, final Requirement req) {
094
095                this(name, req, 0);
096        }
097
098
099        /**
100         * Creates a new encryption method. The implementation requirement and
101         * the Content Encryption Key (CEK) bit length are not specified.
102         *
103         * @param name The encryption method name. Must not be {@code null}.
104         */
105        public EncryptionMethod(final String name) {
106
107                this(name, null, 0);
108        }
109
110
111        /**
112         * Gets the length of the associated Content Encryption Key (CEK).
113         *
114         * @return The Content Encryption Key (CEK) bit length, zero if not 
115         *         specified.
116         */
117        public int cekBitLength() {
118
119                return cekBitLength;
120        }
121
122
123        /**
124         * Parses an encryption method from the specified string.
125         *
126         * @param s The string to parse. Must not be {@code null}.
127         *
128         * @return The encryption method  (matching standard algorithm constant,
129         *         else a newly created algorithm).
130         */
131        public static EncryptionMethod parse(final String s) {
132
133                if (s.equals(A128CBC_HS256.getName())) {
134
135                        return A128CBC_HS256;
136
137                } else if (s.equals(A256CBC_HS512.getName())) {
138
139                        return A256CBC_HS512;
140
141                } else if (s.equals(A128GCM.getName())) {
142
143                        return A128GCM;
144
145                } else if (s.equals(A256GCM.getName())) {
146
147                        return A256GCM;
148
149                } else {
150
151                        return new EncryptionMethod(s);
152                }
153        }
154}