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