diff a/src/java.base/share/classes/sun/security/tools/keytool/Main.java b/src/java.base/share/classes/sun/security/tools/keytool/Main.java --- a/src/java.base/share/classes/sun/security/tools/keytool/Main.java +++ b/src/java.base/share/classes/sun/security/tools/keytool/Main.java @@ -1466,11 +1466,11 @@ new CertificateAlgorithmId(algID)); info.set(X509CertInfo.ISSUER, issuer); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); boolean canRead = false; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while (true) { String s = reader.readLine(); if (s == null) break; // OpenSSL does not use NEW //if (s.startsWith("-----BEGIN NEW CERTIFICATE REQUEST-----")) { @@ -2623,11 +2623,11 @@ private void doPrintCertReq(InputStream in, PrintStream out) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); boolean started = false; while (true) { String s = reader.readLine(); if (s == null) break; if (!started) { @@ -3543,37 +3543,10 @@ out.write(cert.getEncoded()); // binary } } /** - * Converts a byte to hex digit and writes to the supplied buffer - */ - private void byte2hex(byte b, StringBuffer buf) { - char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', - '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - int high = ((b & 0xf0) >> 4); - int low = (b & 0x0f); - buf.append(hexChars[high]); - buf.append(hexChars[low]); - } - - /** - * Converts a byte array to hex string - */ - private String toHexString(byte[] block) { - StringBuffer buf = new StringBuffer(); - int len = block.length; - for (int i = 0; i < len; i++) { - byte2hex(block[i], buf); - if (i < len-1) { - buf.append(":"); - } - } - return buf.toString(); - } - - /** * Recovers (private) key associated with given alias. * * @return an array of objects, where the 1st element in the array is the * recovered private key, and the 2nd element is the password used to * recover it. @@ -3698,11 +3671,11 @@ throws Exception { byte[] encCertInfo = cert.getEncoded(); MessageDigest md = MessageDigest.getInstance(mdAlg); byte[] digest = md.digest(encCertInfo); - return toHexString(digest); + return Hex.encoder(":","", "", true).encode(digest); } /** * Prints warning about missing integrity check. */ @@ -4610,19 +4583,14 @@ ObjectIdentifier oid = ObjectIdentifier.of(name); byte[] data = null; if (value != null) { data = new byte[value.length() / 2 + 1]; int pos = 0; + Hex.Decoder decoder = Hex.decoder(); for (char c: value.toCharArray()) { - int hex; - if (c >= '0' && c <= '9') { - hex = c - '0' ; - } else if (c >= 'A' && c <= 'F') { - hex = c - 'A' + 10; - } else if (c >= 'a' && c <= 'f') { - hex = c - 'a' + 10; - } else { + int hex = decoder.fromHex(c); + if (hex < 0) { continue; } if (pos % 2 == 0) { data[pos/2] = (byte)(hex << 4); } else {