1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 package org.mozilla.gecko.sync.crypto.test; 5 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.mozilla.apache.commons.codec.binary.Base64; 9 import org.mozilla.gecko.background.testhelpers.TestRunner; 10 import org.mozilla.gecko.sync.Utils; 11 import org.mozilla.gecko.sync.crypto.CryptoException; 12 import org.mozilla.gecko.sync.crypto.CryptoInfo; 13 import org.mozilla.gecko.sync.crypto.KeyBundle; 14 15 import java.io.UnsupportedEncodingException; 16 import java.security.InvalidKeyException; 17 import java.security.NoSuchAlgorithmException; 18 19 import static org.junit.Assert.assertArrayEquals; 20 import static org.junit.Assert.assertSame; 21 import static org.junit.Assert.assertTrue; 22 23 @RunWith(TestRunner.class) 24 public class TestCryptoInfo { 25 26 @Test testEncryptedHMACIsSet()27 public void testEncryptedHMACIsSet() throws CryptoException, UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { 28 KeyBundle kb = KeyBundle.withRandomKeys(); 29 CryptoInfo encrypted = CryptoInfo.encrypt("plaintext".getBytes("UTF-8"), kb); 30 assertSame(kb, encrypted.getKeys()); 31 assertTrue(encrypted.generatedHMACIsHMAC()); 32 } 33 34 @Test testRandomEncryptedDecrypted()35 public void testRandomEncryptedDecrypted() throws CryptoException, UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException { 36 KeyBundle kb = KeyBundle.withRandomKeys(); 37 byte[] plaintext = "plaintext".getBytes("UTF-8"); 38 CryptoInfo info = CryptoInfo.encrypt(plaintext, kb); 39 byte[] iv = info.getIV(); 40 info.decrypt(); 41 assertArrayEquals(plaintext, info.getMessage()); 42 assertSame(null, info.getHMAC()); 43 assertArrayEquals(iv, info.getIV()); 44 assertSame(kb, info.getKeys()); 45 } 46 47 @Test testDecrypt()48 public void testDecrypt() throws CryptoException { 49 String base64CipherText = "NMsdnRulLwQsVcwxKW9XwaUe7ouJk5Wn" + 50 "80QhbD80l0HEcZGCynh45qIbeYBik0lg" + 51 "cHbKmlIxTJNwU+OeqipN+/j7MqhjKOGI" + 52 "lvbpiPQQLC6/ffF2vbzL0nzMUuSyvaQz" + 53 "yGGkSYM2xUFt06aNivoQTvU2GgGmUK6M" + 54 "vadoY38hhW2LCMkoZcNfgCqJ26lO1O0s" + 55 "EO6zHsk3IVz6vsKiJ2Hq6VCo7hu123wN" + 56 "egmujHWQSGyf8JeudZjKzfi0OFRRvvm4" + 57 "QAKyBWf0MgrW1F8SFDnVfkq8amCB7Nhd" + 58 "whgLWbN+21NitNwWYknoEWe1m6hmGZDg" + 59 "DT32uxzWxCV8QqqrpH/ZggViEr9uMgoy" + 60 "4lYaWqP7G5WKvvechc62aqnsNEYhH26A" + 61 "5QgzmlNyvB+KPFvPsYzxDnSCjOoRSLx7" + 62 "GG86wT59QZw="; 63 String base64IV = "GX8L37AAb2FZJMzIoXlX8w=="; 64 String base16Hmac = "b1e6c18ac30deb70236bc0d65a46f7a4" + 65 "dce3b8b0e02cf92182b914e3afa5eebc"; 66 String base64EncryptionKey = "9K/wLdXdw+nrTtXo4ZpECyHFNr4d7aYH" + 67 "qeg3KW9+m6Q="; 68 String base64HmacKey = "MMntEfutgLTc8FlTLQFms8/xMPmCldqP" + 69 "lq/QQXEjx70="; 70 String base64ExpectedBytes = "eyJpZCI6IjVxUnNnWFdSSlpYciIsImhp" + 71 "c3RVcmkiOiJmaWxlOi8vL1VzZXJzL2ph" + 72 "c29uL0xpYnJhcnkvQXBwbGljYXRpb24l" + 73 "MjBTdXBwb3J0L0ZpcmVmb3gvUHJvZmls" + 74 "ZXMva3NnZDd3cGsuTG9jYWxTeW5jU2Vy" + 75 "dmVyL3dlYXZlL2xvZ3MvIiwidGl0bGUi" + 76 "OiJJbmRleCBvZiBmaWxlOi8vL1VzZXJz" + 77 "L2phc29uL0xpYnJhcnkvQXBwbGljYXRp" + 78 "b24gU3VwcG9ydC9GaXJlZm94L1Byb2Zp" + 79 "bGVzL2tzZ2Q3d3BrLkxvY2FsU3luY1Nl" + 80 "cnZlci93ZWF2ZS9sb2dzLyIsInZpc2l0" + 81 "cyI6W3siZGF0ZSI6MTMxOTE0OTAxMjM3" + 82 "MjQyNSwidHlwZSI6MX1dfQ=="; 83 84 CryptoInfo decrypted = CryptoInfo.decrypt( 85 Base64.decodeBase64(base64CipherText), 86 Base64.decodeBase64(base64IV), 87 Utils.hex2Byte(base16Hmac), 88 new KeyBundle( 89 Base64.decodeBase64(base64EncryptionKey), 90 Base64.decodeBase64(base64HmacKey)) 91 ); 92 93 assertArrayEquals(decrypted.getMessage(), Base64.decodeBase64(base64ExpectedBytes)); 94 } 95 96 @Test testEncrypt()97 public void testEncrypt() throws CryptoException { 98 String base64CipherText = "NMsdnRulLwQsVcwxKW9XwaUe7ouJk5Wn" + 99 "80QhbD80l0HEcZGCynh45qIbeYBik0lg" + 100 "cHbKmlIxTJNwU+OeqipN+/j7MqhjKOGI" + 101 "lvbpiPQQLC6/ffF2vbzL0nzMUuSyvaQz" + 102 "yGGkSYM2xUFt06aNivoQTvU2GgGmUK6M" + 103 "vadoY38hhW2LCMkoZcNfgCqJ26lO1O0s" + 104 "EO6zHsk3IVz6vsKiJ2Hq6VCo7hu123wN" + 105 "egmujHWQSGyf8JeudZjKzfi0OFRRvvm4" + 106 "QAKyBWf0MgrW1F8SFDnVfkq8amCB7Nhd" + 107 "whgLWbN+21NitNwWYknoEWe1m6hmGZDg" + 108 "DT32uxzWxCV8QqqrpH/ZggViEr9uMgoy" + 109 "4lYaWqP7G5WKvvechc62aqnsNEYhH26A" + 110 "5QgzmlNyvB+KPFvPsYzxDnSCjOoRSLx7" + 111 "GG86wT59QZw="; 112 String base64IV = "GX8L37AAb2FZJMzIoXlX8w=="; 113 String base16Hmac = "b1e6c18ac30deb70236bc0d65a46f7a4" + 114 "dce3b8b0e02cf92182b914e3afa5eebc"; 115 String base64EncryptionKey = "9K/wLdXdw+nrTtXo4ZpECyHFNr4d7aYH" + 116 "qeg3KW9+m6Q="; 117 String base64HmacKey = "MMntEfutgLTc8FlTLQFms8/xMPmCldqP" + 118 "lq/QQXEjx70="; 119 String base64ExpectedBytes = "eyJpZCI6IjVxUnNnWFdSSlpYciIsImhp" + 120 "c3RVcmkiOiJmaWxlOi8vL1VzZXJzL2ph" + 121 "c29uL0xpYnJhcnkvQXBwbGljYXRpb24l" + 122 "MjBTdXBwb3J0L0ZpcmVmb3gvUHJvZmls" + 123 "ZXMva3NnZDd3cGsuTG9jYWxTeW5jU2Vy" + 124 "dmVyL3dlYXZlL2xvZ3MvIiwidGl0bGUi" + 125 "OiJJbmRleCBvZiBmaWxlOi8vL1VzZXJz" + 126 "L2phc29uL0xpYnJhcnkvQXBwbGljYXRp" + 127 "b24gU3VwcG9ydC9GaXJlZm94L1Byb2Zp" + 128 "bGVzL2tzZ2Q3d3BrLkxvY2FsU3luY1Nl" + 129 "cnZlci93ZWF2ZS9sb2dzLyIsInZpc2l0" + 130 "cyI6W3siZGF0ZSI6MTMxOTE0OTAxMjM3" + 131 "MjQyNSwidHlwZSI6MX1dfQ=="; 132 133 CryptoInfo encrypted = CryptoInfo.encrypt( 134 Base64.decodeBase64(base64ExpectedBytes), 135 Base64.decodeBase64(base64IV), 136 new KeyBundle( 137 Base64.decodeBase64(base64EncryptionKey), 138 Base64.decodeBase64(base64HmacKey)) 139 ); 140 141 assertArrayEquals(Base64.decodeBase64(base64CipherText), encrypted.getMessage()); 142 assertArrayEquals(Utils.hex2Byte(base16Hmac), encrypted.getHMAC()); 143 } 144 }