/**
* $URL: https://source.sakaiproject.org/svn/basiclti/trunk/basiclti-common/src/java/org/sakaiproject/basiclti/util/PortableShaUtil.java $
* $Id: PortableShaUtil.java 315745 2014-11-28 17:14:44Z csev@umich.edu $
*
* Copyright (c) 2010 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sakaiproject.basiclti.util;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.imsglobal.basiclti.Base64;
public class PortableShaUtil {
public static final String UTF8 = "UTF8";
public static byte[] sha1(final String todigest) {
try {
byte[] b = todigest.getBytes("UTF-8");
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
return sha1.digest(b);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
} catch (NoSuchAlgorithmException e) {
throw new Error(e);
}
}
public static String sha1Hash(final String tohash) {
byte[] b = null;
try {
b = tohash.getBytes("UTF-8");
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
b = sha1.digest(b);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
} catch (NoSuchAlgorithmException e) {
throw new Error(e);
}
return bin2hex(b);
}
public static String sha256Hash(final String tohash) {
byte[] b = null;
try {
b = tohash.getBytes("UTF-8");
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
b = sha256.digest(b);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
} catch (NoSuchAlgorithmException e) {
throw new Error(e);
}
return bin2hex(b);
}
public static String sha512Hash(final String tohash) {
byte[] b = null;
try {
b = tohash.getBytes("UTF-8");
MessageDigest sha512 = MessageDigest.getInstance("SHA-512");
b = sha512.digest(b);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
} catch (NoSuchAlgorithmException e) {
throw new Error(e);
}
return bin2hex(b);
}
private static final char[] TOHEX = "0123456789abcdef".toCharArray();
/**
* Checks to see if a string is legitimate hex data
*/
public static boolean isHex(String str)
{
for(int i = 0; i < str.length(); i++)
{
int digit = Character.digit(str.charAt(i), 16);
if ( digit == -1 ) return false;
}
return true;
}
// Support bin2hex as per
// http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA256.pdf
// Using lower case as convention
public static String bin2hex(final byte[] base) {
if (base != null) {
char[] c = new char[base.length * 2];
int i = 0;
for (byte b : base) {
int j = b;
// j = j + 128; // Wrong - not portable
j = j & 0xff; // Right - portable
c[i++] = TOHEX[j / 0x10];
c[i++] = TOHEX[j % 0x10];
}
return new String(c);
} else {
return null;
}
}
/**
* Hex-encode a string of characters - convienence class
*/
public static String str2hex(String str) {
byte[] b = null;
try {
b = str.getBytes("UTF-8");
return bin2hex(b);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
public static byte[] hex2bin(String hex) {
if (hex == null) {
return null;
}
byte[] base = new byte[hex.length() / 2];
int i = 0;
for (int j = 0; j < base.length; j++) {
int digit = 0;
int ch = Character.digit(hex.charAt(i++), 16);
if ( ch < 0 ) {
throw new RuntimeException("Illegal character in hex string");
}
digit += ch * 0x10;
ch = Character.digit(hex.charAt(i++), 16);
if ( ch < 0 ) {
throw new RuntimeException("Illegal character in hex string");
}
digit += ch % 0x10;
base[j] = (byte) digit;
}
return base;
}
}