[
https://issues.apache.org/jira/browse/HADOOP-11343?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14232466#comment-14232466
]
Jerry Chen commented on HADOOP-11343:
-------------------------------------
Thanks Mike for following up.
I agree that wrap around should work good for the this implementation. But the
data it encrypted might cannot be decrypted by Java Cipher with the same key
and initial IV. Because the iv + counter calculation here doesn't not follow
the "convention" : Both openssl and java Cipher increment counter on 16 bytes
space, but the currently calculateIV implementation increment on 8 bytes only
and wrap around.
Using the same key and same initial IV, the cipher text steam of AES-CTR mode
will be different with other "standard" Ciphers, just because it use a
different way of increment the counter. The result encrypted data will be the
implementation specific and locked in here for all the cases. The data key can
be managed or exported in many possible ways but what really matters here is
the AES-CTR conformance of resulted data. Application may stored the resulted
data in different layout such as add headers, but the different output data
from the same configuration with the same algorithm is a serious problem.
Yes. Dealing with the existing data would be something difficult. One possible
solution is to add versioning mechanism in EZ attributes or file attributes in
EZ.
> Overflow is not properly handled in caclulating final iv for AES CTR
> --------------------------------------------------------------------
>
> Key: HADOOP-11343
> URL: https://issues.apache.org/jira/browse/HADOOP-11343
> Project: Hadoop Common
> Issue Type: Bug
> Components: security
> Affects Versions: trunk-win
> Reporter: Jerry Chen
>
> In the AesCtrCryptoCodec calculateIV, as the init IV is a random generated 16
> bytes,
> final byte[] iv = new byte[cc.getCipherSuite().getAlgorithmBlockSize()];
> cc.generateSecureRandom(iv);
> Then the following calculation of iv and counter on 8 bytes (64bit) space
> would easily cause overflow and this overflow gets lost. The result would be
> the 128 bit data block was encrypted with a wrong counter and cannot be
> decrypted by standard aes-ctr.
> /**
> * The IV is produced by adding the initial IV to the counter. IV length
> * should be the same as {@link #AES_BLOCK_SIZE}
> */
> @Override
> public void calculateIV(byte[] initIV, long counter, byte[] IV) {
> Preconditions.checkArgument(initIV.length == AES_BLOCK_SIZE);
> Preconditions.checkArgument(IV.length == AES_BLOCK_SIZE);
>
> System.arraycopy(initIV, 0, IV, 0, CTR_OFFSET);
> long l = 0;
> for (int i = 0; i < 8; i++) {
> l = ((l << 8) | (initIV[CTR_OFFSET + i] & 0xff));
> }
> l += counter;
> IV[CTR_OFFSET + 0] = (byte) (l >>> 56);
> IV[CTR_OFFSET + 1] = (byte) (l >>> 48);
> IV[CTR_OFFSET + 2] = (byte) (l >>> 40);
> IV[CTR_OFFSET + 3] = (byte) (l >>> 32);
> IV[CTR_OFFSET + 4] = (byte) (l >>> 24);
> IV[CTR_OFFSET + 5] = (byte) (l >>> 16);
> IV[CTR_OFFSET + 6] = (byte) (l >>> 8);
> IV[CTR_OFFSET + 7] = (byte) (l);
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)