| | |
| | | * CDDL HEADER END |
| | | * |
| | | * |
| | | * Copyright 2006-2008 Sun Microsystems, Inc. |
| | | * Copyright 2006-2010 Sun Microsystems, Inc. |
| | | */ |
| | | package org.opends.server.extensions; |
| | | |
| | |
| | | */ |
| | | private static final int NUM_SALT_BYTES = 8; |
| | | |
| | | // The number of bytes SHA algorithm produces |
| | | private static final int SHA1_LENGTH = 20; |
| | | |
| | | |
| | | // The message digest that will actually be used to generate the SHA-1 hashes. |
| | |
| | | ByteSequence storedPassword) |
| | | { |
| | | // Base64-decode the stored value and take the last 8 bytes as the salt. |
| | | byte[] saltBytes = new byte[NUM_SALT_BYTES]; |
| | | byte[] digestBytes; |
| | | byte[] saltBytes; |
| | | byte[] digestBytes = new byte[SHA1_LENGTH]; |
| | | int saltLength = 0; |
| | | try |
| | | { |
| | | byte[] decodedBytes = Base64.decode(storedPassword.toString()); |
| | | |
| | | int digestLength = decodedBytes.length - NUM_SALT_BYTES; |
| | | digestBytes = new byte[digestLength]; |
| | | System.arraycopy(decodedBytes, 0, digestBytes, 0, digestLength); |
| | | System.arraycopy(decodedBytes, digestLength, saltBytes, 0, |
| | | NUM_SALT_BYTES); |
| | | saltLength = decodedBytes.length - SHA1_LENGTH; |
| | | saltBytes = new byte[saltLength]; |
| | | System.arraycopy(decodedBytes, 0, digestBytes, 0, SHA1_LENGTH); |
| | | System.arraycopy(decodedBytes, SHA1_LENGTH, saltBytes, 0, |
| | | saltLength); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | |
| | | // Use the salt to generate a digest based on the provided plain-text value. |
| | | int plainBytesLength = plaintextPassword.length(); |
| | | byte[] plainPlusSalt = new byte[plainBytesLength + NUM_SALT_BYTES]; |
| | | byte[] plainPlusSalt = new byte[plainBytesLength + saltLength]; |
| | | plaintextPassword.copyTo(plainPlusSalt); |
| | | System.arraycopy(saltBytes, 0,plainPlusSalt, plainBytesLength, |
| | | NUM_SALT_BYTES); |
| | | saltLength); |
| | | |
| | | byte[] userDigestBytes; |
| | | |