• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2022 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ////////////////////////////////////////////////////////////////////////////////
16 
17 package com.google.crypto.tink.subtle;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.junit.runners.JUnit4;
24 
25 @RunWith(JUnit4.class)
26 public final class Base64Test {
27   @Test
testEncode_testVectors()28   public void testEncode_testVectors() {
29     assertThat(Base64.encode(new byte[] {})).isEqualTo("");
30     assertThat(Base64.encode(new byte[] {0})).isEqualTo("AA==");
31     assertThat(Base64.encode(new byte[] {0, 0})).isEqualTo("AAA=");
32     assertThat(Base64.encode(new byte[] {0, 0, 0})).isEqualTo("AAAA");
33     assertThat(Base64.encode(new byte[] {0, 0, 25})).isEqualTo("AAAZ");
34     assertThat(Base64.encode(new byte[] {0, 0, 26})).isEqualTo("AAAa");
35     assertThat(Base64.encode(new byte[] {0, 0, 51})).isEqualTo("AAAz");
36     assertThat(Base64.encode(new byte[] {0, 0, 52})).isEqualTo("AAA0");
37     assertThat(Base64.encode(new byte[] {0, 0, 61})).isEqualTo("AAA9");
38     assertThat(Base64.encode(new byte[] {0, 0, 62})).isEqualTo("AAA+");
39     assertThat(Base64.encode(new byte[] {0, 0, 63})).isEqualTo("AAA/");
40     assertThat(Base64.encode(new byte[] {0, 0, 64})).isEqualTo("AABA");
41   }
42 
43   @Test
testUrlSafeEncode_testVectors()44   public void testUrlSafeEncode_testVectors() {
45     assertThat(Base64.urlSafeEncode(new byte[] {})).isEqualTo("");
46     assertThat(Base64.urlSafeEncode(new byte[] {0})).isEqualTo("AA");
47     assertThat(Base64.urlSafeEncode(new byte[] {0, 0})).isEqualTo("AAA");
48     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 0})).isEqualTo("AAAA");
49     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 25})).isEqualTo("AAAZ");
50     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 26})).isEqualTo("AAAa");
51     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 51})).isEqualTo("AAAz");
52     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 52})).isEqualTo("AAA0");
53     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 61})).isEqualTo("AAA9");
54     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 62})).isEqualTo("AAA-");
55     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 63})).isEqualTo("AAA_");
56     assertThat(Base64.urlSafeEncode(new byte[] {0, 0, 64})).isEqualTo("AABA");
57   }
58 
59   @Test
testEncode_noPadding()60   public void testEncode_noPadding() throws Exception {
61     assertThat(Base64.encode(new byte[] {}, Base64.NO_PADDING)).isEqualTo(new byte[]{});
62     assertThat(Base64.encode(new byte[] {0}, Base64.NO_PADDING))
63         .isEqualTo("AA\n".getBytes("UTF-8"));
64     assertThat(Base64.encode(new byte[] {0, 0}, Base64.NO_PADDING))
65         .isEqualTo("AAA\n".getBytes("UTF-8"));
66   }
67 
68   @Test
testEncode_flags()69   public void testEncode_flags() throws Exception {
70     // 114 = 19 * 3 * 2 -> when encoded: 19 * 4 * 2 -- hence 2 lines at 19 * 4 characters
71     byte[] longByteArray = new byte[114];
72 
73     String singleLine =
74         "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
75     assertThat(Base64.encode(longByteArray, Base64.DEFAULT))
76         .isEqualTo((singleLine + "\n" + singleLine + "\n").getBytes("UTF-8"));
77     assertThat(Base64.encode(longByteArray, Base64.NO_WRAP))
78         .isEqualTo((singleLine + singleLine).getBytes("UTF-8"));
79     assertThat(Base64.encode(longByteArray, Base64.CRLF))
80         .isEqualTo((singleLine + "\r\n" + singleLine + "\r\n").getBytes("UTF-8"));
81   }
82 
83   @Test
testDecode_testVectors()84   public void testDecode_testVectors() {
85     assertThat(Base64.decode("")).isEqualTo(new byte[] {});
86     assertThat(Base64.decode("AA==")).isEqualTo(new byte[] {0});
87     assertThat(Base64.decode("AAA=")).isEqualTo(new byte[] {0, 0});
88     assertThat(Base64.decode("AAAA")).isEqualTo(new byte[] {0, 0, 0});
89     assertThat(Base64.decode("AAAZ")).isEqualTo(new byte[] {0, 0, 25});
90     assertThat(Base64.decode("AAAa")).isEqualTo(new byte[] {0, 0, 26});
91     assertThat(Base64.decode("AAAz")).isEqualTo(new byte[] {0, 0, 51});
92     assertThat(Base64.decode("AAA0")).isEqualTo(new byte[] {0, 0, 52});
93     assertThat(Base64.decode("AAA9")).isEqualTo(new byte[] {0, 0, 61});
94     assertThat(Base64.decode("AAA+")).isEqualTo(new byte[] {0, 0, 62});
95     assertThat(Base64.decode("AAA/")).isEqualTo(new byte[] {0, 0, 63});
96     assertThat(Base64.decode("AABA")).isEqualTo(new byte[] {0, 0, 64});
97   }
98 
99   @Test
testUrlSafeDecode_testVectors()100   public void testUrlSafeDecode_testVectors() {
101     assertThat(Base64.urlSafeDecode("")).isEqualTo(new byte[] {});
102     assertThat(Base64.urlSafeDecode("AA")).isEqualTo(new byte[] {0});
103     assertThat(Base64.urlSafeDecode("AAA")).isEqualTo(new byte[] {0, 0});
104     assertThat(Base64.urlSafeDecode("AAAA")).isEqualTo(new byte[] {0, 0, 0});
105     assertThat(Base64.urlSafeDecode("AAAZ")).isEqualTo(new byte[] {0, 0, 25});
106     assertThat(Base64.urlSafeDecode("AAAa")).isEqualTo(new byte[] {0, 0, 26});
107     assertThat(Base64.urlSafeDecode("AAAz")).isEqualTo(new byte[] {0, 0, 51});
108     assertThat(Base64.urlSafeDecode("AAA0")).isEqualTo(new byte[] {0, 0, 52});
109     assertThat(Base64.urlSafeDecode("AAA9")).isEqualTo(new byte[] {0, 0, 61});
110     assertThat(Base64.urlSafeDecode("AAA-")).isEqualTo(new byte[] {0, 0, 62});
111     assertThat(Base64.urlSafeDecode("AAA_")).isEqualTo(new byte[] {0, 0, 63});
112     assertThat(Base64.urlSafeDecode("AABA")).isEqualTo(new byte[] {0, 0, 64});
113   }
114 
115   @Test
testDecode_flags()116   public void testDecode_flags() throws Exception {
117     // 114 = 19 * 3 * 2 -> when encoded: 19 * 4 * 2 -- hence 2 lines at 19 * 4 characters
118     byte[] longByteArray = new byte[114];
119 
120     String singleLine =
121         "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
122     assertThat(
123             Base64.decode(
124                 (singleLine + "\n" + singleLine + "\n").getBytes("UTF-8"), Base64.DEFAULT))
125         .isEqualTo(longByteArray);
126     assertThat(Base64.decode((singleLine + singleLine).getBytes("UTF-8"), Base64.NO_WRAP))
127         .isEqualTo(longByteArray);
128     assertThat(
129             Base64.decode(
130                 (singleLine + "\r\n" + singleLine + "\r\n").getBytes("UTF-8"), Base64.CRLF))
131         .isEqualTo(longByteArray);
132   }
133 
134   // TODO(b/238096965) Add more tests.
135 }
136