package com.workshare.msnos.core.security; import java.io.IOException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import com.workshare.msnos.core.Message; import com.workshare.msnos.core.serializers.WireJsonSerializer; import com.workshare.msnos.core.serializers.WireSerializer; public class Signer { public static final KeysStore DEFAULT_KEYSSTORE = new SystemPropertiesKeysStore(); private final WireSerializer sz; private final KeysStore keys; public Signer() { this(DEFAULT_KEYSSTORE); } public Signer(KeysStore keys) { this(new WireJsonSerializer(), keys); } public Signer(WireSerializer sz, KeysStore keys) { this.sz = sz; this.keys = keys; } public Message signed(Message message, String keyId) throws IOException { String key = keys.get(keyId); if (key == null) return message; else return message.signed(keyId, signText(key, sz.toText(message))); } private String signText(String key, String text) throws IOException { byte[] keyBytes = key.getBytes("UTF-8"); SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1"); Mac mac; try { mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); byte[] textBytes = mac.doFinal(text.getBytes("UTF-8")); return DatatypeConverter.printHexBinary(textBytes); } catch (Exception e) { throw new IOException(e); } } }