package org.knowm.xchange.kraken.service; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.ws.rs.FormParam; import org.knowm.xchange.service.BaseParamsDigest; import net.iharder.Base64; import si.mazi.rescu.RestInvocation; /** * @author Benedikt Bünz */ public class KrakenDigest extends BaseParamsDigest { /** * Constructor * * @param secretKeyBase64 * @throws IllegalArgumentException if key is invalid (cannot be base-64-decoded or the decoded key is invalid). */ private KrakenDigest(byte[] secretKeyBase64) { super(secretKeyBase64, HMAC_SHA_512); } public static KrakenDigest createInstance(String secretKeyBase64) { try { if (secretKeyBase64 != null) return new KrakenDigest(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."); } sha256.update(restInvocation.getParamValue(FormParam.class, "nonce").toString().getBytes()); sha256.update(restInvocation.getRequestBody().getBytes()); Mac mac512 = getMac(); mac512.update(("/" + restInvocation.getPath()).getBytes()); mac512.update(sha256.digest()); return Base64.encodeBytes(mac512.doFinal()).trim(); } }