package org.knowm.xchange.cryptofacilities.service; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.ws.rs.HeaderParam; import org.knowm.xchange.service.BaseParamsDigest; import net.iharder.Base64; import si.mazi.rescu.RestInvocation; /** * @author Jean-Christophe Laruelle */ public class CryptoFacilitiesDigest extends BaseParamsDigest { /** * Constructor * * @param secretKeyBase64 * @throws IllegalArgumentException if key is invalid (cannot be base-64-decoded or the decoded key is invalid). */ private CryptoFacilitiesDigest(byte[] secretKeyBase64) { super(secretKeyBase64, HMAC_SHA_512); } public static CryptoFacilitiesDigest createInstance(String secretKeyBase64) { try { if (secretKeyBase64 != null) return new CryptoFacilitiesDigest(Base64.decode(secretKeyBase64.getBytes())); } catch (IOException e) { throw new IllegalArgumentException("Could not decode Base 64 string", e); } return null; } @Override public String digestParams(RestInvocation restInvocation) { MessageDigest sha256; try { sha256 = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("Illegal algorithm for post body digest. Check the implementation."); } String decodedQuery = null; try { decodedQuery = URLDecoder.decode(restInvocation.getQueryString(), "UTF-8"); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("Unsupported query encoding", e); } sha256.update(decodedQuery.getBytes()); sha256.update(restInvocation.getParamValue(HeaderParam.class, "Nonce").toString().getBytes()); sha256.update((restInvocation.getPath()).getBytes()); Mac mac512 = getMac(); mac512.update(sha256.digest()); return Base64.encodeBytes(mac512.doFinal()).trim(); } }