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 }