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 }