package com.workshare.msnos.core.security;
import com.workshare.msnos.core.Iden;
import com.workshare.msnos.core.Message;
import com.workshare.msnos.core.Message.Type;
import com.workshare.msnos.core.MessageBuilder;
import com.workshare.msnos.core.serializers.WireSerializer;
import org.junit.Before;
import org.junit.Test;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
public class SignerTest {
private static final String MESSAGE_AS_TEXT = "This is the serialized version of the message :)";
private static final String KEY_ID = "123";
private static final String KEY_VAL = "1234567890";
private KeysStore keys;
private WireSerializer serializer;
private Signer signer;
private Message message;
@Before
public void init() {
keys = mock(KeysStore.class);
when(keys.get(KEY_ID)).thenReturn(KEY_VAL);
serializer = mock(WireSerializer.class);
when(serializer.toText(anyObject())).thenReturn(MESSAGE_AS_TEXT);
final Iden src = new Iden(Iden.Type.CLD, UUID.randomUUID());
final Iden dst = new Iden(Iden.Type.AGT, UUID.randomUUID());
message = new MessageBuilder(Type.PIN, src, dst).with(UUID.randomUUID()).make();
signer = new Signer(serializer, keys);
}
@Test
public void shouldUsAccessTheKeystore() throws Exception {
signer.signed(message, KEY_ID);
verify(keys).get(KEY_ID);
}
@Test
public void shouldSignUsingTheStoreKey() throws Exception {
Message result = signer.signed(message, KEY_ID);
String signature = KEY_ID + ":" + sign(KEY_VAL, MESSAGE_AS_TEXT);
assertEquals(signature, result.getSig());
}
@Test
public void shouldLeaveMessagUnsignedIfKeystoreEmpty() throws Exception {
when(keys.get(anyString())).thenReturn(null);
Message result = signer.signed(message, KEY_ID);
assertNull(result.getSig());
}
private String sign(String key, String text) throws Exception {
byte[] keyBytes = key.getBytes("UTF-8");
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
byte[] textBytes = mac.doFinal(text.getBytes("UTF-8"));
return DatatypeConverter.printHexBinary(textBytes);
}
}