/*******************************************************************************
* Copyright (c) 2005, 2007 Remy Suen
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Remy Suen <remy.suen@gmail.com> - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.protocol.msn.internal.encode;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* This class provides static methods to compute the SHA digest of strings.
*/
public class Encryption {
private static MessageDigest shaDigest;
static {
try {
shaDigest = MessageDigest.getInstance("SHA-1"); //$NON-NLS-1$
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException();
}
}
/**
* Computes the SHA hash of the bytes provided and then truncate it down to
* a length of twenty. A base 64 encoding of the twenty character string
* literal is then computed and returned.
*
* @param bytes
* the bytes to be computed from
* @return a base 64 encoding of a twenty character SHA hash of the bytes
* provided
*/
public static String computeSHA(byte[] bytes) {
synchronized (shaDigest) {
bytes = shaDigest.digest(bytes);
}
StringBuffer buffer = new StringBuffer();
synchronized (buffer) {
for (int i = 0; i < 20; i++) {
if (0 < bytes[i] && bytes[i] < 16) {
buffer.append('0');
}
buffer.append(Integer.toHexString((0xff & bytes[i])));
}
bytes = new byte[20];
for (int i = 0; i < 20; i++) {
bytes[i] = (byte) Integer.parseInt(buffer.substring(i * 2,
i * 2 + 2), 16);
}
}
return Base64.encodeBytes(bytes);
}
}