diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java | 130 |
1 files changed, 26 insertions, 104 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java b/bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java index 37df370..2846725 100644 --- a/bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java +++ b/bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java @@ -16,151 +16,73 @@ package org.bouncycastle.crypto.digests; -import com.android.org.conscrypt.NativeCrypto; -import org.bouncycastle.crypto.ExtendedDigest; +import org.bouncycastle.crypto.Digest; +import java.security.DigestException; +import java.security.MessageDigest; /** * Implements the BouncyCastle Digest interface using OpenSSL's EVP API. */ -public class OpenSSLDigest implements ExtendedDigest { - - /** - * Holds the standard name of the hashing algorithm, e.g. "SHA-1"; - */ - private final String algorithm; - - /** - * Holds the EVP_MD for the hashing algorithm, e.g. EVP_get_digestbyname("sha1"); - */ - private final long evp_md; - - /** - * Holds the output size of the message digest. - */ - private final int size; - - /** - * Holds the block size of the message digest. - */ - private final int blockSize; - - /** - * Holds a pointer to the native message digest context. It is - * lazily initialized to avoid having to reallocate on reset when - * its unlikely to be reused. - */ - private long ctx; - - /** - * Holds a dummy buffer for writing single bytes to the digest. - */ - private final byte[] singleByte = new byte[1]; - - /** - * Creates a new OpenSSLMessageDigest instance for the given algorithm - * name. - */ - private OpenSSLDigest(String algorithm, long evp_md, int size, int blockSize) { - this.algorithm = algorithm; - this.evp_md = evp_md; - this.size = size; - this.blockSize = blockSize; +public class OpenSSLDigest implements Digest { + private final MessageDigest delegate; + + public OpenSSLDigest(String algorithm) { + try { + delegate = MessageDigest.getInstance(algorithm, "AndroidOpenSSL"); + } catch (Exception e) { + throw new RuntimeException(e); + } } public String getAlgorithmName() { - return algorithm; + return delegate.getAlgorithm(); } public int getDigestSize() { - return size; - } - - public int getByteLength() { - return blockSize; + return delegate.getDigestLength(); } public void reset() { - free(); + delegate.reset(); } public void update(byte in) { - singleByte[0] = in; - update(singleByte, 0, 1); + delegate.update(in); } public void update(byte[] in, int inOff, int len) { - NativeCrypto.EVP_DigestUpdate(getCtx(), in, inOff, len); + delegate.update(in, inOff, len); } public int doFinal(byte[] out, int outOff) { - int i = NativeCrypto.EVP_DigestFinal(getCtx(), out, outOff); - ctx = 0; // EVP_DigestFinal frees the context as a side effect - reset(); - return i; - } - - private long getCtx() { - if (ctx == 0) { - ctx = NativeCrypto.EVP_DigestInit(evp_md); - } - return ctx; - } - - private void free() { - if (ctx != 0) { - NativeCrypto.EVP_MD_CTX_destroy(ctx); - ctx = 0; - } - } - - @Override - protected void finalize() throws Throwable { try { - free(); - } finally { - super.finalize(); + return delegate.digest(out, outOff, out.length); + } catch (DigestException e) { + throw new RuntimeException(e); } } public static class MD5 extends OpenSSLDigest { - private static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("md5"); - private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD); - private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD); - public MD5() { super("MD5", EVP_MD, SIZE, BLOCK_SIZE); } + public MD5() { super("MD5"); } } public static class SHA1 extends OpenSSLDigest { - private static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha1"); - private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD); - private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD); - public SHA1() { super("SHA-1", EVP_MD, SIZE, BLOCK_SIZE); } + public SHA1() { super("SHA-1"); } } public static class SHA224 extends OpenSSLDigest { - private static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha224"); - private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD); - private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD); - public SHA224() { super("SHA-224", EVP_MD, SIZE, BLOCK_SIZE); } + public SHA224() { super("SHA-224"); } } public static class SHA256 extends OpenSSLDigest { - private static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha256"); - private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD); - private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD); - public SHA256() { super("SHA-256", EVP_MD, SIZE, BLOCK_SIZE); } + public SHA256() { super("SHA-256"); } } public static class SHA384 extends OpenSSLDigest { - private static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha384"); - private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD); - private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD); - public SHA384() { super("SHA-384", EVP_MD, SIZE, BLOCK_SIZE); } + public SHA384() { super("SHA-384"); } } public static class SHA512 extends OpenSSLDigest { - private static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha512"); - private static final int SIZE = NativeCrypto.EVP_MD_size(EVP_MD); - private static final int BLOCK_SIZE = NativeCrypto.EVP_MD_block_size(EVP_MD); - public SHA512() { super("SHA-512", EVP_MD, SIZE, BLOCK_SIZE); } + public SHA512() { super("SHA-512"); } } } |