/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.gecko.sync.crypto.test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.junit.Test;
import org.mozilla.apache.commons.codec.binary.Base64;
import org.mozilla.gecko.sync.Utils;
import org.mozilla.gecko.sync.crypto.CryptoException;
import org.mozilla.gecko.sync.crypto.CryptoInfo;
import org.mozilla.gecko.sync.crypto.KeyBundle;
public class TestCryptoInfo {
@Test
public void testEncryptedHMACIsSet() throws CryptoException, UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
KeyBundle kb = KeyBundle.withRandomKeys();
CryptoInfo encrypted = CryptoInfo.encrypt("plaintext".getBytes("UTF-8"), kb);
assertSame(kb, encrypted.getKeys());
assertTrue(encrypted.generatedHMACIsHMAC());
}
@Test
public void testRandomEncryptedDecrypted() throws CryptoException, UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
KeyBundle kb = KeyBundle.withRandomKeys();
byte[] plaintext = "plaintext".getBytes("UTF-8");
CryptoInfo info = CryptoInfo.encrypt(plaintext, kb);
byte[] iv = info.getIV();
info.decrypt();
assertArrayEquals(plaintext, info.getMessage());
assertSame(null, info.getHMAC());
assertArrayEquals(iv, info.getIV());
assertSame(kb, info.getKeys());
}
@Test
public void testDecrypt() throws CryptoException {
String base64CipherText = "NMsdnRulLwQsVcwxKW9XwaUe7ouJk5Wn" +
"80QhbD80l0HEcZGCynh45qIbeYBik0lg" +
"cHbKmlIxTJNwU+OeqipN+/j7MqhjKOGI" +
"lvbpiPQQLC6/ffF2vbzL0nzMUuSyvaQz" +
"yGGkSYM2xUFt06aNivoQTvU2GgGmUK6M" +
"vadoY38hhW2LCMkoZcNfgCqJ26lO1O0s" +
"EO6zHsk3IVz6vsKiJ2Hq6VCo7hu123wN" +
"egmujHWQSGyf8JeudZjKzfi0OFRRvvm4" +
"QAKyBWf0MgrW1F8SFDnVfkq8amCB7Nhd" +
"whgLWbN+21NitNwWYknoEWe1m6hmGZDg" +
"DT32uxzWxCV8QqqrpH/ZggViEr9uMgoy" +
"4lYaWqP7G5WKvvechc62aqnsNEYhH26A" +
"5QgzmlNyvB+KPFvPsYzxDnSCjOoRSLx7" +
"GG86wT59QZw=";
String base64IV = "GX8L37AAb2FZJMzIoXlX8w==";
String base16Hmac = "b1e6c18ac30deb70236bc0d65a46f7a4" +
"dce3b8b0e02cf92182b914e3afa5eebc";
String base64EncryptionKey = "9K/wLdXdw+nrTtXo4ZpECyHFNr4d7aYH" +
"qeg3KW9+m6Q=";
String base64HmacKey = "MMntEfutgLTc8FlTLQFms8/xMPmCldqP" +
"lq/QQXEjx70=";
String base64ExpectedBytes = "eyJpZCI6IjVxUnNnWFdSSlpYciIsImhp" +
"c3RVcmkiOiJmaWxlOi8vL1VzZXJzL2ph" +
"c29uL0xpYnJhcnkvQXBwbGljYXRpb24l" +
"MjBTdXBwb3J0L0ZpcmVmb3gvUHJvZmls" +
"ZXMva3NnZDd3cGsuTG9jYWxTeW5jU2Vy" +
"dmVyL3dlYXZlL2xvZ3MvIiwidGl0bGUi" +
"OiJJbmRleCBvZiBmaWxlOi8vL1VzZXJz" +
"L2phc29uL0xpYnJhcnkvQXBwbGljYXRp" +
"b24gU3VwcG9ydC9GaXJlZm94L1Byb2Zp" +
"bGVzL2tzZ2Q3d3BrLkxvY2FsU3luY1Nl" +
"cnZlci93ZWF2ZS9sb2dzLyIsInZpc2l0" +
"cyI6W3siZGF0ZSI6MTMxOTE0OTAxMjM3" +
"MjQyNSwidHlwZSI6MX1dfQ==";
CryptoInfo decrypted = CryptoInfo.decrypt(
Base64.decodeBase64(base64CipherText),
Base64.decodeBase64(base64IV),
Utils.hex2Byte(base16Hmac),
new KeyBundle(
Base64.decodeBase64(base64EncryptionKey),
Base64.decodeBase64(base64HmacKey))
);
assertArrayEquals(decrypted.getMessage(), Base64.decodeBase64(base64ExpectedBytes));
}
@Test
public void testEncrypt() throws CryptoException {
String base64CipherText = "NMsdnRulLwQsVcwxKW9XwaUe7ouJk5Wn" +
"80QhbD80l0HEcZGCynh45qIbeYBik0lg" +
"cHbKmlIxTJNwU+OeqipN+/j7MqhjKOGI" +
"lvbpiPQQLC6/ffF2vbzL0nzMUuSyvaQz" +
"yGGkSYM2xUFt06aNivoQTvU2GgGmUK6M" +
"vadoY38hhW2LCMkoZcNfgCqJ26lO1O0s" +
"EO6zHsk3IVz6vsKiJ2Hq6VCo7hu123wN" +
"egmujHWQSGyf8JeudZjKzfi0OFRRvvm4" +
"QAKyBWf0MgrW1F8SFDnVfkq8amCB7Nhd" +
"whgLWbN+21NitNwWYknoEWe1m6hmGZDg" +
"DT32uxzWxCV8QqqrpH/ZggViEr9uMgoy" +
"4lYaWqP7G5WKvvechc62aqnsNEYhH26A" +
"5QgzmlNyvB+KPFvPsYzxDnSCjOoRSLx7" +
"GG86wT59QZw=";
String base64IV = "GX8L37AAb2FZJMzIoXlX8w==";
String base16Hmac = "b1e6c18ac30deb70236bc0d65a46f7a4" +
"dce3b8b0e02cf92182b914e3afa5eebc";
String base64EncryptionKey = "9K/wLdXdw+nrTtXo4ZpECyHFNr4d7aYH" +
"qeg3KW9+m6Q=";
String base64HmacKey = "MMntEfutgLTc8FlTLQFms8/xMPmCldqP" +
"lq/QQXEjx70=";
String base64ExpectedBytes = "eyJpZCI6IjVxUnNnWFdSSlpYciIsImhp" +
"c3RVcmkiOiJmaWxlOi8vL1VzZXJzL2ph" +
"c29uL0xpYnJhcnkvQXBwbGljYXRpb24l" +
"MjBTdXBwb3J0L0ZpcmVmb3gvUHJvZmls" +
"ZXMva3NnZDd3cGsuTG9jYWxTeW5jU2Vy" +
"dmVyL3dlYXZlL2xvZ3MvIiwidGl0bGUi" +
"OiJJbmRleCBvZiBmaWxlOi8vL1VzZXJz" +
"L2phc29uL0xpYnJhcnkvQXBwbGljYXRp" +
"b24gU3VwcG9ydC9GaXJlZm94L1Byb2Zp" +
"bGVzL2tzZ2Q3d3BrLkxvY2FsU3luY1Nl" +
"cnZlci93ZWF2ZS9sb2dzLyIsInZpc2l0" +
"cyI6W3siZGF0ZSI6MTMxOTE0OTAxMjM3" +
"MjQyNSwidHlwZSI6MX1dfQ==";
CryptoInfo encrypted = CryptoInfo.encrypt(
Base64.decodeBase64(base64ExpectedBytes),
Base64.decodeBase64(base64IV),
new KeyBundle(
Base64.decodeBase64(base64EncryptionKey),
Base64.decodeBase64(base64HmacKey))
);
assertArrayEquals(Base64.decodeBase64(base64CipherText), encrypted.getMessage());
assertArrayEquals(Utils.hex2Byte(base16Hmac), encrypted.getHMAC());
}
}