/** * Generate a new instance of an TlsMac. * * @param context the TLS client context * @param digest The digest to use. * @param key A byte-array where the key for this mac is located. * @param keyOff The number of bytes to skip, before the key starts in the buffer. * @param len The length of the key. */ public TlsMac(TlsContext context, Digest digest, byte[] key, int keyOff, int keyLen) { this.context = context; KeyParameter keyParameter = new KeyParameter(key, keyOff, keyLen); this.secret = Arrays.clone(keyParameter.getKey()); // TODO This should check the actual algorithm, not rely on the engine type if (digest instanceof LongDigest) { this.digestBlockSize = 128; this.digestOverhead = 16; } else { this.digestBlockSize = 64; this.digestOverhead = 8; } if (context.getServerVersion().isSSL()) { this.mac = new SSL3Mac(digest); // TODO This should check the actual algorithm, not assume based on the digest size if (digest.getDigestSize() == 20) { /* * NOTE: When SHA-1 is used with the SSL 3.0 MAC, the secret + input pad is not * digest block-aligned. */ this.digestOverhead = 4; } } else { this.mac = new HMac(digest); // NOTE: The input pad for HMAC is always a full digest block } this.mac.init(keyParameter); }
/** * Generate a new instance of an TlsMac. * * @param context the TLS client context * @param digest The digest to use. * @param key A byte-array where the key for this MAC is located. * @param keyOff The number of bytes to skip, before the key starts in the buffer. * @param keyLen The length of the key. */ public TlsMac(TlsContext context, Digest digest, byte[] key, int keyOff, int keyLen) { this.context = context; KeyParameter keyParameter = new KeyParameter(key, keyOff, keyLen); this.secret = Arrays.clone(keyParameter.getKey()); // TODO This should check the actual algorithm, not rely on the engine type if (digest instanceof LongDigest) { this.digestBlockSize = 128; this.digestOverhead = 16; } else { this.digestBlockSize = 64; this.digestOverhead = 8; } if (TlsUtils.isSSL(context)) { this.mac = new SSL3Mac(digest); // TODO This should check the actual algorithm, not assume based on the digest size if (digest.getDigestSize() == 20) { /* * NOTE: When SHA-1 is used with the SSL 3.0 MAC, the secret + input pad is not * digest block-aligned. */ this.digestOverhead = 4; } } else { this.mac = new HMac(digest); // NOTE: The input pad for HMAC is always a full digest block } this.mac.init(keyParameter); this.macLength = mac.getMacSize(); if (context.getSecurityParameters().truncatedHMac) { this.macLength = Math.min(this.macLength, 10); } }
/** * Generate a new instance of an TlsMac. * * @param context the TLS client context * @param digest The digest to use. * @param key A byte-array where the key for this MAC is located. * @param keyOff The number of bytes to skip, before the key starts in the buffer. * @param len The length of the key. */ public TlsMac(TlsContext context, Digest digest, byte[] key, int keyOff, int keyLen) { this.context = context; KeyParameter keyParameter = new KeyParameter(key, keyOff, keyLen); this.secret = Arrays.clone(keyParameter.getKey()); // TODO This should check the actual algorithm, not rely on the engine type if (digest instanceof LongDigest) { this.digestBlockSize = 128; this.digestOverhead = 16; } else { this.digestBlockSize = 64; this.digestOverhead = 8; } if (TlsUtils.isSSL(context)) { this.mac = new SSL3Mac(digest); // TODO This should check the actual algorithm, not assume based on the digest size if (digest.getDigestSize() == 20) { /* * NOTE: When SHA-1 is used with the SSL 3.0 MAC, the secret + input pad is not * digest block-aligned. */ this.digestOverhead = 4; } } else { this.mac = new HMac(digest); // NOTE: The input pad for HMAC is always a full digest block } this.mac.init(keyParameter); this.macLength = mac.getMacSize(); if (context.getSecurityParameters().truncatedHMac) { this.macLength = Math.min(this.macLength, 10); } }