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