package network.thunder.core.communication.objects.messages.impl;
import network.thunder.core.communication.Message;
import network.thunder.core.communication.objects.messages.impl.message.encryption.EncryptedMessage;
import network.thunder.core.communication.objects.messages.interfaces.helper.MessageEncrypter;
import network.thunder.core.communication.objects.messages.interfaces.helper.MessageSerializer;
import network.thunder.core.etc.crypto.CryptoTools;
import network.thunder.core.etc.crypto.ECDHKeySet;
/**
* Created by matsjerratsch on 30/11/2015.
*/
public class MessageEncrypterImpl implements MessageEncrypter {
public MessageEncrypterImpl (MessageSerializer serializater) {
this.serializater = serializater;
}
MessageSerializer serializater;
@Override
public EncryptedMessage encrypt (Message data, ECDHKeySet keySet) {
byte[] bytes = serializater.serializeMessage(data);
byte[] enc = CryptoTools.encryptAES_CTR(bytes, keySet.encryptionKey, keySet.ivServer, keySet.counterOut);
byte[] hmac = CryptoTools.getHMAC(enc, keySet.hmacKey);
return new EncryptedMessage(hmac, enc);
}
@Override
public Message decrypt (EncryptedMessage message, ECDHKeySet ecdhKeySet) {
CryptoTools.checkHMAC(message.hmac, message.payload, ecdhKeySet.hmacKey);
byte[] bytes = CryptoTools.decryptAES_CTR(message.payload, ecdhKeySet.encryptionKey, ecdhKeySet.ivClient, ecdhKeySet.counterIn);
return serializater.deserializeMessage(bytes);
}
}