diff options
author | Benedict Wong <benedictwong@google.com> | 2019-07-01 17:10:12 -0700 |
---|---|---|
committer | Benedict Wong <benedictwong@google.com> | 2019-07-01 17:10:12 -0700 |
commit | 7d795a6f6a0865a7fcd17deafab881d1a220676f (patch) | |
tree | e575fa47deea21e5349206091d596bad23d6cafb /repackaged | |
parent | ea2e58bec896a084e8a4d5717df11753c1c6e4ef (diff) | |
download | bouncycastle-7d795a6f6a0865a7fcd17deafab881d1a220676f.tar.gz |
Expose some SHA1Digest methods for FIPS 186-2 PRF
The FIPS 186-2 PRF required by EAP-SIM and EAP-AKA (used in telephony)
require a hashing function extremely similar to SHA1, with the exception
of the padding bytes added. This commit exposes the BouncyCastle
SHA1Digest implementation as core-platform-api to allow platform
internals to implement FIPS 186-2 PRF without re-implementing SHA1.
Bug: 136175302
Test: Build succeeds, IKE using this, tests passing.
Change-Id: I2d61e2c331f3f80c8a1ebcb85209f9a49968ade5
Diffstat (limited to 'repackaged')
2 files changed, 26 insertions, 19 deletions
diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java index c075dce5..80714665 100644 --- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java +++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java @@ -10,6 +10,7 @@ import com.android.org.bouncycastle.util.Pack; * "Handbook of Applied Cryptography", pages 344 - 347. * @hide This class is not part of the Android public SDK API */ +@libcore.api.CorePlatformApi public abstract class GeneralDigest implements ExtendedDigest, Memoable { @@ -67,6 +68,7 @@ public abstract class GeneralDigest byteCount++; } + @libcore.api.CorePlatformApi public void update( byte[] in, int inOff, @@ -112,6 +114,7 @@ public abstract class GeneralDigest byteCount += len; } + @libcore.api.CorePlatformApi public void finish() { long bitLength = (byteCount << 3); @@ -153,10 +156,11 @@ public abstract class GeneralDigest { return BYTE_LENGTH; } - + protected abstract void processWord(byte[] in, int inOff); protected abstract void processLength(long bitLength); + @libcore.api.CorePlatformApi protected abstract void processBlock(); } diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java index ebc5bfe4..a101d405 100644 --- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java +++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java @@ -11,6 +11,7 @@ import com.android.org.bouncycastle.util.Pack; * is the "endianness" of the word processing! * @hide This class is not part of the Android public SDK API */ +@libcore.api.CorePlatformApi public class SHA1Digest extends GeneralDigest implements EncodableDigest @@ -25,6 +26,7 @@ public class SHA1Digest /** * Standard constructor */ + @libcore.api.CorePlatformApi public SHA1Digest() { reset(); @@ -100,7 +102,7 @@ public class SHA1Digest if (++xOff == 16) { processBlock(); - } + } } protected void processLength( @@ -115,6 +117,7 @@ public class SHA1Digest X[15] = (int)bitLength; } + @libcore.api.CorePlatformApi public int doFinal( byte[] out, int outOff) @@ -159,7 +162,7 @@ public class SHA1Digest private static final int Y2 = 0x6ed9eba1; private static final int Y3 = 0x8f1bbcdc; private static final int Y4 = 0xca62c1d6; - + private int f( int u, int v, @@ -208,27 +211,27 @@ public class SHA1Digest // round 1 // int idx = 0; - + for (int j = 0; j < 4; j++) { // E = rotateLeft(A, 5) + f(B, C, D) + E + X[idx++] + Y1 // B = rotateLeft(B, 30) E += (A << 5 | A >>> 27) + f(B, C, D) + X[idx++] + Y1; B = B << 30 | B >>> 2; - + D += (E << 5 | E >>> 27) + f(A, B, C) + X[idx++] + Y1; A = A << 30 | A >>> 2; - + C += (D << 5 | D >>> 27) + f(E, A, B) + X[idx++] + Y1; E = E << 30 | E >>> 2; - + B += (C << 5 | C >>> 27) + f(D, E, A) + X[idx++] + Y1; D = D << 30 | D >>> 2; A += (B << 5 | B >>> 27) + f(C, D, E) + X[idx++] + Y1; C = C << 30 | C >>> 2; } - + // // round 2 // @@ -237,21 +240,21 @@ public class SHA1Digest // E = rotateLeft(A, 5) + h(B, C, D) + E + X[idx++] + Y2 // B = rotateLeft(B, 30) E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y2; - B = B << 30 | B >>> 2; - + B = B << 30 | B >>> 2; + D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y2; A = A << 30 | A >>> 2; - + C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y2; E = E << 30 | E >>> 2; - + B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y2; D = D << 30 | D >>> 2; A += (B << 5 | B >>> 27) + h(C, D, E) + X[idx++] + Y2; C = C << 30 | C >>> 2; } - + // // round 3 // @@ -261,13 +264,13 @@ public class SHA1Digest // B = rotateLeft(B, 30) E += (A << 5 | A >>> 27) + g(B, C, D) + X[idx++] + Y3; B = B << 30 | B >>> 2; - + D += (E << 5 | E >>> 27) + g(A, B, C) + X[idx++] + Y3; A = A << 30 | A >>> 2; - + C += (D << 5 | D >>> 27) + g(E, A, B) + X[idx++] + Y3; E = E << 30 | E >>> 2; - + B += (C << 5 | C >>> 27) + g(D, E, A) + X[idx++] + Y3; D = D << 30 | D >>> 2; @@ -284,13 +287,13 @@ public class SHA1Digest // B = rotateLeft(B, 30) E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y4; B = B << 30 | B >>> 2; - + D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y4; A = A << 30 | A >>> 2; - + C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y4; E = E << 30 | E >>> 2; - + B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y4; D = D << 30 | D >>> 2; |