package fr.xephi.authme.security.pbkdf2; /* * Free auxiliary functions. Copyright 2007, 2014, Matthias Gärtner * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ /** * Free auxiliary functions * * @author Matthias Gärtner */ public class BinTools { public static final String hex = "0123456789ABCDEF"; /** * Simple binary-to-hexadecimal conversion. * * @param b * Input bytes. May be null. * @return Hexadecimal representation of b. Uppercase A-F, two characters * per byte. Empty string on null input. */ public static String bin2hex(final byte[] b) { if (b == null) { return ""; } StringBuffer sb = new StringBuffer(2 * b.length); for (int i = 0; i < b.length; i++) { int v = (256 + b[i]) % 256; sb.append(hex.charAt((v / 16) & 15)); sb.append(hex.charAt((v % 16) & 15)); } return sb.toString(); } /** * Convert hex string to array of bytes. * * @param s * String containing hexadecimal digits. May be null * . On odd length leading zero will be assumed. * @return Array on bytes, non-null. * @throws IllegalArgumentException * when string contains non-hex character */ public static byte[] hex2bin(final String s) { String m = s; if (s == null) { // Allow empty input string. m = ""; } else if (s.length() % 2 != 0) { // Assume leading zero for odd string length m = "0" + s; } byte r[] = new byte[m.length() / 2]; for (int i = 0, n = 0; i < m.length(); n++) { char h = m.charAt(i++); char l = m.charAt(i++); r[n] = (byte) (hex2bin(h) * 16 + hex2bin(l)); } return r; } /** * Convert hex digit to numerical value. * * @param c * 0-9, a-f, A-F allowd. * @return 0-15 * @throws IllegalArgumentException * on non-hex character */ public static int hex2bin(char c) { if (c >= '0' && c <= '9') { return (c - '0'); } if (c >= 'A' && c <= 'F') { return (c - 'A' + 10); } if (c >= 'a' && c <= 'f') { return (c - 'a' + 10); } throw new IllegalArgumentException("Input string may only contain hex digits, but found '" + c + "'"); } public static void main(String[] args) { byte b[] = new byte[256]; byte bb = 0; for (int i = 0; i < 256; i++) { b[i] = bb++; } String s = bin2hex(b); byte c[] = hex2bin(s); String t = bin2hex(c); if (!s.equals(t)) { throw new AssertionError("Mismatch"); } } }