Skip to content

Commit

Permalink
Merge pull request knowm#1392 from jheusser/fixes/quoine-nonce
Browse files Browse the repository at this point in the history
xchange-quoine: Clean up digest, pass through nonce factory
  • Loading branch information
jheusser authored Feb 22, 2017
2 parents b66d407 + e6243fb commit 06daa8e
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public QuoineBaseService(Exchange exchange) {
this.secret = (String) exchange.getExchangeSpecification().getExchangeSpecificParameters().get(QuoineExchange.KEY_USER_SECRET);

if (this.tokenID != null && this.secret != null) {
this.signatureCreator = new QuoineSignatureDigest(this.tokenID, this.secret);
this.signatureCreator = new QuoineSignatureDigest(this.tokenID, this.secret, exchange.getNonceFactory());
} else {
this.signatureCreator = null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,74 +1,38 @@
package org.knowm.xchange.quoine.service;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.ws.rs.HeaderParam;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import org.knowm.xchange.service.BaseParamsDigest;

import net.iharder.Base64;
import si.mazi.rescu.Params;
import si.mazi.rescu.ParamsDigest;
import si.mazi.rescu.RestInvocation;
import si.mazi.rescu.SynchronizedValueFactory;

public class QuoineSignatureDigest implements ParamsDigest {

private final JWTCreator.Builder builder;
private final String tokenID;
private final byte[] userSecret;
private final SynchronizedValueFactory<Long> nonceFactory;

public QuoineSignatureDigest(String tokenID, String userSecret) {
public QuoineSignatureDigest(String tokenID, String userSecret, SynchronizedValueFactory<Long> nonceFactory) {
this.tokenID = tokenID;
this.userSecret = userSecret.getBytes();
this.nonceFactory = nonceFactory;

this.builder = JWT.create();
}

public ParamsDigest getContentMD5Digester() {
return new QuoineContentMD5Digest();
}

@Override
public String digestParams(RestInvocation restInvocation) {

String path = "/" + restInvocation.getMethodPath();

final String sign = builder
.withClaim("path", path)
.withClaim("nonce", String.valueOf(System.nanoTime()))
.withClaim("nonce", String.valueOf(nonceFactory.createValue()))
.withClaim("token_id", tokenID)
.sign(Algorithm.HMAC256(userSecret));

return sign;
}

private String getContentMD5(String content) {
if(content == null || "".equals(content)) {
return "";
}
String digest = null;
try {
byte[] bytesOfMessage = content.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
digest = Base64.encodeBytes(md.digest(bytesOfMessage));
} catch(NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return digest;
}

private class QuoineContentMD5Digest implements ParamsDigest {

@Override
public String digestParams(RestInvocation restInvocation) {

return getContentMD5(restInvocation.getRequestBody());
}
}
}

0 comments on commit 06daa8e

Please sign in to comment.