/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.bouncycastle.crypto.digests; import org.bouncycastle.crypto.ExtendedDigest; import org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi; import java.security.DigestException; import java.security.MessageDigest; /** * Implements the BouncyCastle Digest interface using OpenSSL's EVP API. This * must be an ExtendedDigest for {@link BcKeyStoreSpi} to be able to use it. */ public class OpenSSLDigest implements ExtendedDigest { private final MessageDigest delegate; private final int byteSize; public OpenSSLDigest(String algorithm, int byteSize) { try { delegate = MessageDigest.getInstance(algorithm, "AndroidOpenSSL"); this.byteSize = byteSize; } catch (Exception e) { throw new RuntimeException(e); } } public String getAlgorithmName() { return delegate.getAlgorithm(); } public int getDigestSize() { return delegate.getDigestLength(); } public int getByteLength() { return byteSize; } public void reset() { delegate.reset(); } public void update(byte in) { delegate.update(in); } public void update(byte[] in, int inOff, int len) { delegate.update(in, inOff, len); } public int doFinal(byte[] out, int outOff) { try { return delegate.digest(out, outOff, out.length - outOff); } catch (DigestException e) { throw new RuntimeException(e); } } public static class MD5 extends OpenSSLDigest { public MD5() { super("MD5", 64); } } public static class SHA1 extends OpenSSLDigest { public SHA1() { super("SHA-1", 64); } } public static class SHA224 extends OpenSSLDigest { public SHA224() { super("SHA-224", 64); } } public static class SHA256 extends OpenSSLDigest { public SHA256() { super("SHA-256", 64); } } public static class SHA384 extends OpenSSLDigest { public SHA384() { super("SHA-384", 128); } } public static class SHA512 extends OpenSSLDigest { public SHA512() { super("SHA-512", 128); } } }