package ws.wamp.jawampa.auth.client; import com.fasterxml.jackson.databind.ObjectMapper; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import ws.wamp.jawampa.WampMessages; public class WampCra implements ClientSideAuthentication { public static final String AUTH_METHOD = "wampcra"; private final String key; public WampCra(String key) { this.key = key; } @Override public String getAuthMethod() { return AUTH_METHOD; } private String calculateHmacSHA256(String challenge, ObjectMapper objectMapper) throws NoSuchAlgorithmException, InvalidKeyException { SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(signingKey); byte[] rawHmac = mac.doFinal(challenge.getBytes()); return objectMapper.convertValue( rawHmac, String.class ); } @Override public WampMessages.AuthenticateMessage handleChallenge(WampMessages.ChallengeMessage message, ObjectMapper objectMapper) { String challenge = message.extra.get( "challenge" ).asText(); try { String signature = calculateHmacSHA256( challenge, objectMapper ); return new WampMessages.AuthenticateMessage(signature, objectMapper.createObjectNode() ); } catch( InvalidKeyException e ) { throw new RuntimeException( "InvalidKeyException while calculating HMAC" ); } catch( NoSuchAlgorithmException e ) { throw new RuntimeException( "NoSuchAlgorithmException while calculating HMAC" ); } } }