# HG changeset patch # User weijun # Date 1594566449 -3600 # Node ID 0e9efa336f0012dde71be94313b2be5b08a1faf0 # Parent ce29e542f3fa6bca7ad2403ac60b28cbb67b2a60 8238804: Enhance key handling process Reviewed-by: rriggs, mullan, ahgross, rhalade, mbalao, andrew diff -r ce29e542f3fa -r 0e9efa336f00 src/share/classes/java/security/MessageDigest.java --- a/src/share/classes/java/security/MessageDigest.java Wed Jul 15 21:15:05 2020 +0100 +++ b/src/share/classes/java/security/MessageDigest.java Sun Jul 12 16:07:29 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -433,6 +433,12 @@ /** * Compares two digests for equality. Does a simple byte compare. * + * @implNote + * All bytes in {@code digesta} are examined to determine equality. + * The calculation time depends only on the length of {@code digesta}. + * It does not depend on the length of {@code digestb} or the contents + * of {@code digesta} and {@code digestb}. + * * @param digesta one of the digests to compare. * * @param digestb the other digest to compare. @@ -444,14 +450,22 @@ if (digesta == null || digestb == null) { return false; } - if (digesta.length != digestb.length) { - return false; + + int lenA = digesta.length; + int lenB = digestb.length; + + if (lenB == 0) { + return lenA == 0; } int result = 0; + result |= lenA - lenB; + // time-constant comparison - for (int i = 0; i < digesta.length; i++) { - result |= digesta[i] ^ digestb[i]; + for (int i = 0; i < lenA; i++) { + // If i >= lenB, indexB is 0; otherwise, i. + int indexB = ((i - lenB) >>> 31) * i; + result |= digesta[i] ^ digestb[indexB]; } return result == 0; }