From 2005a31e5dffb3939c0cd9da68818881bac0975f Mon Sep 17 00:00:00 2001 From: Christian Thalinger Date: Wed, 20 May 2009 10:11:23 +0800 Subject: [PATCH] 6832016: {DigestMD5Base,Des3DkCrypto}.setParityBit should use Integer.bitCount Reviewed-by: weijun --- .../security/sasl/digest/DigestMD5Base.java | 25 +++--------------- .../krb5/internal/crypto/dk/Des3DkCrypto.java | 26 +++---------------- 2 files changed, 8 insertions(+), 43 deletions(-) diff --git a/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java b/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java index f231369a0a9..190b9eb20a5 100644 --- a/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java +++ b/jdk/src/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2009 Sun Microsystems, Inc. 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 @@ -1516,11 +1516,6 @@ abstract class DigestMD5Base extends AbstractSaslImpl { // ---------------- DES and 3 DES key manipulation routines - /* Mask used to check for parity adjustment */ - private static final byte[] PARITY_BIT_MASK = { - (byte)0x80, (byte)0x40, (byte)0x20, (byte)0x10, - (byte)0x08, (byte)0x04, (byte)0x02 - }; private static final BigInteger MASK = new BigInteger("7f", 16); /** @@ -1529,21 +1524,9 @@ abstract class DigestMD5Base extends AbstractSaslImpl { */ private static void setParityBit(byte[] key) { for (int i = 0; i < key.length; i++) { - int bitCount = 0; - for (int maskIndex = 0; - maskIndex < PARITY_BIT_MASK.length; maskIndex++) { - if ((key[i] & PARITY_BIT_MASK[maskIndex]) - == PARITY_BIT_MASK[maskIndex]) { - bitCount++; - } - } - if ((bitCount & 0x01) == 1) { - // Odd number of 1 bits in the top 7 bits. Set parity bit to 0 - key[i] = (byte)(key[i] & (byte)0xfe); - } else { - // Even number of 1 bits in the top 7 bits. Set parity bit to 1 - key[i] = (byte)(key[i] | 1); - } + int b = key[i] & 0xfe; + b |= (Integer.bitCount(b) & 1) ^ 1; + key[i] = (byte) b; } } diff --git a/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/Des3DkCrypto.java b/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/Des3DkCrypto.java index 425cd5677d7..83366cc3dd0 100644 --- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/Des3DkCrypto.java +++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/dk/Des3DkCrypto.java @@ -1,5 +1,5 @@ /* - * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2009 Sun Microsystems, Inc. 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 @@ -169,33 +169,15 @@ public class Des3DkCrypto extends DkCrypto { return result; } - /* Mask used to check for parity adjustment */ - private static final byte[] PARITY_BIT_MASK = { - (byte)0x80, (byte)0x40, (byte)0x20, (byte)0x10, - (byte)0x08, (byte)0x04, (byte)0x02 - }; - /** * Sets the parity bit (0th bit) in each byte so that each byte * contains an odd number of 1's. */ private static void setParityBit(byte[] key) { for (int i = 0; i < key.length; i++) { - int bitCount = 0; - for (int maskIndex = 0; - maskIndex < PARITY_BIT_MASK.length; maskIndex++) { - if ((key[i] & PARITY_BIT_MASK[maskIndex]) - == PARITY_BIT_MASK[maskIndex]) { - bitCount++; - } - } - if ((bitCount & 0x01) == 1) { - // Odd number of 1 bits in the top 7 bits. Set parity bit to 0 - key[i] = (byte)(key[i] & (byte)0xfe); - } else { - // Even number of 1 bits in the top 7 bits. Set parity bit to 1 - key[i] = (byte)(key[i] | 1); - } + int b = key[i] & 0xfe; + b |= (Integer.bitCount(b) & 1) ^ 1; + key[i] = (byte) b; } }