From 54148c0e572892284e7f72637581bf388c4e4a52 Mon Sep 17 00:00:00 2001 From: Adam Vartanian Date: Thu, 20 Sep 2018 15:15:56 +0100 Subject: [PATCH] Inline two short methods from Conscrypt We're trying to reduce unnecessary direct dependencies on Conscrypt. These two methods are simple and the implementations can't change, so they're good candidates for inlining directly instead of depending on the Conscrypt implementation. Bug: 110404540 Test: atest NetworkSecurityConfigTests (same failures pre/post) Change-Id: I303d955e3f49885326fe75f451c06a52af745053 --- .../config/DirectoryCertificateSource.java | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/core/java/android/security/net/config/DirectoryCertificateSource.java b/core/java/android/security/net/config/DirectoryCertificateSource.java index 119f5d0de0a06..4f4d62af679c0 100644 --- a/core/java/android/security/net/config/DirectoryCertificateSource.java +++ b/core/java/android/security/net/config/DirectoryCertificateSource.java @@ -16,26 +16,23 @@ package android.security.net.config; -import android.os.Environment; -import android.os.UserHandle; import android.util.ArraySet; import android.util.Log; -import android.util.Pair; + +import libcore.io.IoUtils; + import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; -import java.io.InputStream; import java.io.IOException; -import java.security.cert.Certificate; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Collections; import java.util.Set; -import libcore.io.IoUtils; - -import com.android.org.conscrypt.Hex; -import com.android.org.conscrypt.NativeCrypto; import javax.security.auth.x500.X500Principal; @@ -192,8 +189,36 @@ abstract class DirectoryCertificateSource implements CertificateSource { } private String getHash(X500Principal name) { - int hash = NativeCrypto.X509_NAME_hash_old(name); - return Hex.intToHexString(hash, 8); + int hash = hashName(name); + return intToHexString(hash, 8); + } + + private static final char[] DIGITS = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + private static String intToHexString(int i, int minWidth) { + int bufLen = 8; // Max number of hex digits in an int + char[] buf = new char[bufLen]; + int cursor = bufLen; + + do { + buf[--cursor] = DIGITS[i & 0xf]; + } while ((i >>>= 4) != 0 || (bufLen - cursor < minWidth)); + + return new String(buf, cursor, bufLen - cursor); + } + + // This code matches the code in X509_NAME_hash_old() in Conscrypt, which in turn matches + // the names of certificate files. It must be kept in sync. + private static int hashName(X500Principal principal) { + try { + byte[] digest = MessageDigest.getInstance("MD5").digest(principal.getEncoded()); + int offset = 0; + return (((digest[offset++] & 0xff) << 0) | ((digest[offset++] & 0xff) << 8) + | ((digest[offset++] & 0xff) << 16) | ((digest[offset] & 0xff) << 24)); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } } private X509Certificate readCertificate(String file) {