blob: 633b088e9c6fa001942bbae0b61fd509915c9ab6 [file] [log] [blame]
/*
* Copyright 2016 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.conscrypt;
import java.security.NoSuchAlgorithmException;
import java.util.Locale;
/**
* Utility class to convert between BoringSSL- and JCE-style message digest identifiers.
*/
final class EvpMdRef {
static final String MGF1_ALGORITHM_NAME = "MGF1";
static final String MGF1_OID = "1.2.840.113549.1.1.8";
/**
* Returns the canonical JCA digest algorithm name for the provided digest
* algorithm name or {@code null} if the digest algorithm is not known.
*/
static String getJcaDigestAlgorithmStandardName(String algorithm) {
String algorithmUpper = algorithm.toUpperCase(Locale.US);
if ((SHA256.JCA_NAME.equals(algorithmUpper)) || (SHA256.OID.equals(algorithmUpper))) {
return SHA256.JCA_NAME;
} else if ((SHA512.JCA_NAME.equals(algorithmUpper))
|| (SHA512.OID.equals(algorithmUpper))) {
return SHA512.JCA_NAME;
} else if ((SHA1.JCA_NAME.equals(algorithmUpper)) || (SHA1.OID.equals(algorithmUpper))) {
return SHA1.JCA_NAME;
} else if ((SHA384.JCA_NAME.equals(algorithmUpper))
|| (SHA384.OID.equals(algorithmUpper))) {
return SHA384.JCA_NAME;
} else if ((SHA224.JCA_NAME.equals(algorithmUpper))
|| (SHA224.OID.equals(algorithmUpper))) {
return SHA224.JCA_NAME;
} else {
return null;
}
}
static long getEVP_MDByJcaDigestAlgorithmStandardName(String algorithm)
throws NoSuchAlgorithmException {
String algorithmUpper = algorithm.toUpperCase(Locale.US);
if (SHA256.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA256.EVP_MD;
} else if (SHA512.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA512.EVP_MD;
} else if (SHA1.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA1.EVP_MD;
} else if (SHA384.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA384.EVP_MD;
} else if (SHA224.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA224.EVP_MD;
} else {
throw new NoSuchAlgorithmException("Unsupported algorithm: " + algorithm);
}
}
static int getDigestSizeBytesByJcaDigestAlgorithmStandardName(String algorithm)
throws NoSuchAlgorithmException {
String algorithmUpper = algorithm.toUpperCase(Locale.US);
if (SHA256.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA256.SIZE_BYTES;
} else if (SHA512.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA512.SIZE_BYTES;
} else if (SHA1.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA1.SIZE_BYTES;
} else if (SHA384.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA384.SIZE_BYTES;
} else if (SHA224.JCA_NAME.equals(algorithmUpper)) {
return EvpMdRef.SHA224.SIZE_BYTES;
} else {
throw new NoSuchAlgorithmException("Unsupported algorithm: " + algorithm);
}
}
static String getJcaDigestAlgorithmStandardNameFromEVP_MD(long evpMdRef) {
if (evpMdRef == MD5.EVP_MD) {
return MD5.JCA_NAME;
} else if (evpMdRef == SHA1.EVP_MD) {
return SHA1.JCA_NAME;
} else if (evpMdRef == SHA224.EVP_MD) {
return SHA224.JCA_NAME;
} else if (evpMdRef == SHA256.EVP_MD) {
return SHA256.JCA_NAME;
} else if (evpMdRef == SHA384.EVP_MD) {
return SHA384.JCA_NAME;
} else if (evpMdRef == SHA512.EVP_MD) {
return SHA512.JCA_NAME;
} else {
throw new IllegalArgumentException("Unknown EVP_MD reference");
}
}
static final class MD5 {
static final String JCA_NAME = "MD5";
static final String OID = "1.2.840.113549.2.5";
static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("md5");
static final int SIZE_BYTES = NativeCrypto.EVP_MD_size(EVP_MD);
private MD5() {}
}
static final class SHA1 {
static final String JCA_NAME = "SHA-1";
static final String OID = "1.3.14.3.2.26";
static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha1");
static final int SIZE_BYTES = NativeCrypto.EVP_MD_size(EVP_MD);
private SHA1() {}
}
static final class SHA224 {
static final String JCA_NAME = "SHA-224";
static final String OID = "2.16.840.1.101.3.4.2.4";
static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha224");
static final int SIZE_BYTES = NativeCrypto.EVP_MD_size(EVP_MD);
private SHA224() {}
}
static final class SHA256 {
static final String JCA_NAME = "SHA-256";
static final String OID = "2.16.840.1.101.3.4.2.1";
static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha256");
static final int SIZE_BYTES = NativeCrypto.EVP_MD_size(EVP_MD);
private SHA256() {}
}
static final class SHA384 {
static final String JCA_NAME = "SHA-384";
static final String OID = "2.16.840.1.101.3.4.2.2";
static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha384");
static final int SIZE_BYTES = NativeCrypto.EVP_MD_size(EVP_MD);
private SHA384() {}
}
static final class SHA512 {
static final String JCA_NAME = "SHA-512";
static final String OID = "2.16.840.1.101.3.4.2.3";
static final long EVP_MD = NativeCrypto.EVP_get_digestbyname("sha512");
static final int SIZE_BYTES = NativeCrypto.EVP_MD_size(EVP_MD);
private SHA512() {}
}
private EvpMdRef() {}
}