gcm_test.cc
Go to the documentation of this file.
1 /* ====================================================================
2  * Copyright (c) 2008 The OpenSSL Project. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in
13  * the documentation and/or other materials provided with the
14  * distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  * software must display the following acknowledgment:
18  * "This product includes software developed by the OpenSSL Project
19  * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  * endorse or promote products derived from this software without
23  * prior written permission. For written permission, please contact
24  * openssl-core@openssl.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  * nor may "OpenSSL" appear in their names without prior written
28  * permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  * acknowledgment:
32  * "This product includes software developed by the OpenSSL Project
33  * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ==================================================================== */
48 
49 #include <stdio.h>
50 #include <string.h>
51 
52 #include <vector>
53 
54 #include <gtest/gtest.h>
55 
56 #include <openssl/aes.h>
57 #include <openssl/cpu.h>
58 
59 #include "../../test/abi_test.h"
60 #include "../../test/file_test.h"
61 #include "../../test/test_util.h"
62 #include "../aes/internal.h"
63 #include "internal.h"
64 
65 
66 TEST(GCMTest, TestVectors) {
67  FileTestGTest("crypto/fipsmodule/modes/gcm_tests.txt", [](FileTest *t) {
68  std::vector<uint8_t> key, plaintext, additional_data, nonce, ciphertext,
69  tag;
70  ASSERT_TRUE(t->GetBytes(&key, "Key"));
71  ASSERT_TRUE(t->GetBytes(&plaintext, "Plaintext"));
72  ASSERT_TRUE(t->GetBytes(&additional_data, "AdditionalData"));
73  ASSERT_TRUE(t->GetBytes(&nonce, "Nonce"));
74  ASSERT_TRUE(t->GetBytes(&ciphertext, "Ciphertext"));
75  ASSERT_TRUE(t->GetBytes(&tag, "Tag"));
76 
77  ASSERT_EQ(plaintext.size(), ciphertext.size());
78  ASSERT_TRUE(key.size() == 16 || key.size() == 24 || key.size() == 32);
79  ASSERT_EQ(16u, tag.size());
80 
81  std::vector<uint8_t> out(plaintext.size());
82  AES_KEY aes_key;
83  ASSERT_EQ(0, AES_set_encrypt_key(key.data(), key.size() * 8, &aes_key));
84 
86  OPENSSL_memset(&ctx, 0, sizeof(ctx));
87  CRYPTO_gcm128_init_key(&ctx.gcm_key, &aes_key, AES_encrypt, 0);
88  CRYPTO_gcm128_setiv(&ctx, &aes_key, nonce.data(), nonce.size());
89  if (!additional_data.empty()) {
90  CRYPTO_gcm128_aad(&ctx, additional_data.data(), additional_data.size());
91  }
92  if (!plaintext.empty()) {
93  CRYPTO_gcm128_encrypt(&ctx, &aes_key, plaintext.data(), out.data(),
94  plaintext.size());
95  }
96 
97  std::vector<uint8_t> got_tag(tag.size());
98  CRYPTO_gcm128_tag(&ctx, got_tag.data(), got_tag.size());
99  EXPECT_EQ(Bytes(tag), Bytes(got_tag));
101 
102  CRYPTO_gcm128_setiv(&ctx, &aes_key, nonce.data(), nonce.size());
103  OPENSSL_memset(out.data(), 0, out.size());
104  if (!additional_data.empty()) {
105  CRYPTO_gcm128_aad(&ctx, additional_data.data(), additional_data.size());
106  }
107  if (!ciphertext.empty()) {
108  CRYPTO_gcm128_decrypt(&ctx, &aes_key, ciphertext.data(), out.data(),
109  ciphertext.size());
110  }
111  ASSERT_TRUE(CRYPTO_gcm128_finish(&ctx, tag.data(), tag.size()));
113  });
114 }
115 
116 TEST(GCMTest, ByteSwap) {
117  EXPECT_EQ(0x04030201u, CRYPTO_bswap4(0x01020304u));
118  EXPECT_EQ(UINT64_C(0x0807060504030201),
119  CRYPTO_bswap8(UINT64_C(0x0102030405060708)));
120 }
121 
122 #if defined(SUPPORTS_ABI_TEST) && !defined(OPENSSL_NO_ASM)
123 TEST(GCMTest, ABI) {
124  static const uint64_t kH[2] = {
125  UINT64_C(0x66e94bd4ef8a2c3b),
126  UINT64_C(0x884cfa59ca342b2e),
127  };
128  static const size_t kBlockCounts[] = {1, 2, 3, 4, 5, 6, 7, 8, 15, 16, 31, 32};
129  uint8_t buf[16 * 32];
130  OPENSSL_memset(buf, 42, sizeof(buf));
131 
132  uint64_t X[2] = {
133  UINT64_C(0x0388dace60b6a392),
134  UINT64_C(0xf328c2b971b2fe78),
135  };
136 
137  alignas(16) u128 Htable[16];
138 #if defined(GHASH_ASM_X86) || defined(GHASH_ASM_X86_64)
139  if (gcm_ssse3_capable()) {
140  CHECK_ABI_SEH(gcm_init_ssse3, Htable, kH);
141  CHECK_ABI_SEH(gcm_gmult_ssse3, X, Htable);
142  for (size_t blocks : kBlockCounts) {
143  CHECK_ABI_SEH(gcm_ghash_ssse3, X, Htable, buf, 16 * blocks);
144  }
145  }
146 
147  if (crypto_gcm_clmul_enabled()) {
148  CHECK_ABI_SEH(gcm_init_clmul, Htable, kH);
149  CHECK_ABI_SEH(gcm_gmult_clmul, X, Htable);
150  for (size_t blocks : kBlockCounts) {
151  CHECK_ABI_SEH(gcm_ghash_clmul, X, Htable, buf, 16 * blocks);
152  }
153 
154 #if defined(GHASH_ASM_X86_64)
155  if (((OPENSSL_ia32cap_get()[1] >> 22) & 0x41) == 0x41) { // AVX+MOVBE
156  CHECK_ABI_SEH(gcm_init_avx, Htable, kH);
157  CHECK_ABI_SEH(gcm_gmult_avx, X, Htable);
158  for (size_t blocks : kBlockCounts) {
159  CHECK_ABI_SEH(gcm_ghash_avx, X, Htable, buf, 16 * blocks);
160  }
161 
162  if (hwaes_capable()) {
163  AES_KEY aes_key;
164  static const uint8_t kKey[16] = {0};
165 
166  // aesni_gcm_* makes assumptions about |GCM128_CONTEXT|'s layout.
167  GCM128_CONTEXT gcm;
168  memset(&gcm, 0, sizeof(gcm));
169  memcpy(&gcm.gcm_key.H, kH, sizeof(kH));
170  memcpy(&gcm.gcm_key.Htable, Htable, sizeof(Htable));
171  memcpy(&gcm.Xi, X, sizeof(X));
172  uint8_t iv[16] = {0};
173 
174  aes_hw_set_encrypt_key(kKey, 128, &aes_key);
175  for (size_t blocks : kBlockCounts) {
176  CHECK_ABI(aesni_gcm_encrypt, buf, buf, blocks * 16, &aes_key, iv,
177  gcm.Xi.u);
178  CHECK_ABI(aesni_gcm_encrypt, buf, buf, blocks * 16 + 7, &aes_key, iv,
179  gcm.Xi.u);
180  }
181  aes_hw_set_decrypt_key(kKey, 128, &aes_key);
182  for (size_t blocks : kBlockCounts) {
183  CHECK_ABI(aesni_gcm_decrypt, buf, buf, blocks * 16, &aes_key, iv,
184  gcm.Xi.u);
185  CHECK_ABI(aesni_gcm_decrypt, buf, buf, blocks * 16 + 7, &aes_key, iv,
186  gcm.Xi.u);
187  }
188  }
189  }
190 #endif // GHASH_ASM_X86_64
191  }
192 #endif // GHASH_ASM_X86 || GHASH_ASM_X86_64
193 
194 #if defined(GHASH_ASM_ARM)
195  if (gcm_neon_capable()) {
196  CHECK_ABI(gcm_init_neon, Htable, kH);
197  CHECK_ABI(gcm_gmult_neon, X, Htable);
198  for (size_t blocks : kBlockCounts) {
199  CHECK_ABI(gcm_ghash_neon, X, Htable, buf, 16 * blocks);
200  }
201  }
202 
203  if (gcm_pmull_capable()) {
204  CHECK_ABI(gcm_init_v8, Htable, kH);
205  CHECK_ABI(gcm_gmult_v8, X, Htable);
206  for (size_t blocks : kBlockCounts) {
207  CHECK_ABI(gcm_ghash_v8, X, Htable, buf, 16 * blocks);
208  }
209  }
210 #endif // GHASH_ASM_ARM
211 
212 #if defined(GHASH_ASM_PPC64LE)
213  if (CRYPTO_is_PPC64LE_vcrypto_capable()) {
214  CHECK_ABI(gcm_init_p8, Htable, kH);
215  CHECK_ABI(gcm_gmult_p8, X, Htable);
216  for (size_t blocks : kBlockCounts) {
217  CHECK_ABI(gcm_ghash_p8, X, Htable, buf, 16 * blocks);
218  }
219  }
220 #endif // GHASH_ASM_PPC64LE
221 }
222 #endif // SUPPORTS_ABI_TEST && !OPENSSL_NO_ASM
gcm_init_ssse3
#define gcm_init_ssse3
Definition: boringssl_prefix_symbols.h:3168
gcm_gmult_ssse3
#define gcm_gmult_ssse3
Definition: boringssl_prefix_symbols.h:3164
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
AES_set_encrypt_key
#define AES_set_encrypt_key
Definition: boringssl_prefix_symbols.h:603
Bytes
Definition: boringssl-with-bazel/src/crypto/test/test_util.h:38
CRYPTO_gcm128_finish
#define CRYPTO_gcm128_finish
Definition: boringssl_prefix_symbols.h:1157
X
#define X(c)
ctx
Definition: benchmark-async.c:30
memset
return memset(p, 0, total)
CRYPTO_gcm128_encrypt
#define CRYPTO_gcm128_encrypt
Definition: boringssl_prefix_symbols.h:1155
GCM128_CONTEXT::gcm_key
GCM128_KEY gcm_key
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h:160
gcm_gmult_avx
#define gcm_gmult_avx
Definition: boringssl_prefix_symbols.h:3161
gcm_init_avx
#define gcm_init_avx
Definition: boringssl_prefix_symbols.h:3165
string.h
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
u128
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h:115
CRYPTO_bswap8
static uint64_t CRYPTO_bswap8(uint64_t x)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:759
ciphertext
const char * ciphertext
Definition: protobuf/src/google/protobuf/stubs/strutil_unittest.cc:86
aes_hw_set_encrypt_key
OPENSSL_INLINE int aes_hw_set_encrypt_key(const uint8_t *user_key, int bits, AES_KEY *key)
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h:96
TEST
TEST(GCMTest, TestVectors)
Definition: gcm_test.cc:66
u
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:351
CRYPTO_gcm128_decrypt
#define CRYPTO_gcm128_decrypt
Definition: boringssl_prefix_symbols.h:1153
ctx
static struct test_ctx ctx
Definition: test-ipc-send-recv.c:65
GCM128_CONTEXT::u
uint64_t u[2]
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h:150
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
gcm_init_clmul
#define gcm_init_clmul
Definition: boringssl_prefix_symbols.h:3166
CRYPTO_gcm128_setiv
#define CRYPTO_gcm128_setiv
Definition: boringssl_prefix_symbols.h:1159
CRYPTO_gcm128_init_key
#define CRYPTO_gcm128_init_key
Definition: boringssl_prefix_symbols.h:1158
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:835
aesni_gcm_encrypt
#define aesni_gcm_encrypt
Definition: boringssl_prefix_symbols.h:2826
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
FileTestGTest
void FileTestGTest(const char *path, std::function< void(FileTest *)> run_test)
Definition: file_test_gtest.cc:68
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
hwaes_capable
OPENSSL_INLINE int hwaes_capable(void)
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h:94
CRYPTO_bswap4
static uint32_t CRYPTO_bswap4(uint32_t x)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:753
crypto_gcm_clmul_enabled
#define crypto_gcm_clmul_enabled
Definition: boringssl_prefix_symbols.h:2935
tag
static void * tag(intptr_t t)
Definition: bad_client.cc:318
aes.h
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
FileTest
Definition: file_test.h:90
gcm_gmult_clmul
#define gcm_gmult_clmul
Definition: boringssl_prefix_symbols.h:3162
aesni_gcm_decrypt
#define aesni_gcm_decrypt
Definition: boringssl_prefix_symbols.h:2825
UINT64_C
#define UINT64_C(val)
Definition: stdint-msvc2008.h:238
gcm128_key_st::Htable
u128 Htable[16]
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h:134
kKey
static const uint8_t kKey[32]
Definition: chacha_test.cc:32
gcm128_key_st::H
u128 H
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h:133
gcm_ghash_avx
#define gcm_ghash_avx
Definition: boringssl_prefix_symbols.h:3157
AES_encrypt
#define AES_encrypt
Definition: boringssl_prefix_symbols.h:600
CHECK_ABI_SEH
#define CHECK_ABI_SEH(...)
Definition: abi_test.h:476
key
const char * key
Definition: hpack_parser_table.cc:164
gcm_ghash_ssse3
#define gcm_ghash_ssse3
Definition: boringssl_prefix_symbols.h:3160
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1973
GCM128_CONTEXT::Xi
union GCM128_CONTEXT::@354 Xi
internal.h
cpu.h
plaintext
const char * plaintext
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/strutil_unittest.cc:85
gcm_ghash_clmul
#define gcm_ghash_clmul
Definition: boringssl_prefix_symbols.h:3158
CHECK_ABI
#define CHECK_ABI(...)
Definition: abi_test.h:472
CRYPTO_gcm128_aad
#define CRYPTO_gcm128_aad
Definition: boringssl_prefix_symbols.h:1152
aes_hw_set_decrypt_key
OPENSSL_INLINE int aes_hw_set_decrypt_key(const uint8_t *user_key, int bits, AES_KEY *key)
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h:101
GCM128_CONTEXT
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h:147
aes_key_st
Definition: aes.h:72
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056
bloaty::ByteSwap
constexpr T ByteSwap(T val)
Definition: bloaty/src/util.h:133
CRYPTO_gcm128_tag
#define CRYPTO_gcm128_tag
Definition: boringssl_prefix_symbols.h:1160


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:25