Fix crash and latest update.

This commit is contained in:
2019-03-16 01:19:24 +09:00
parent ee0cf37f98
commit c03e0c45f8
168 changed files with 12859 additions and 1295 deletions
+1 -2
View File
@@ -94,7 +94,7 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
int mdnid, pknid;
size_t inll = 0;
if (!pkey) {
if (pkey == NULL) {
ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_PASSED_NULL_PARAMETER);
return -1;
}
@@ -150,7 +150,6 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
ret = 0;
goto err;
}
}
inl = ASN1_item_i2d(asn, &buf_in, it);
+4 -4
View File
@@ -23,10 +23,10 @@
static const uint64_t blake2b_IV[8] =
{
0x6a09e667f3bcc908U, 0xbb67ae8584caa73bU,
0x3c6ef372fe94f82bU, 0xa54ff53a5f1d36f1U,
0x510e527fade682d1U, 0x9b05688c2b3e6c1fU,
0x1f83d9abfb41bd6bU, 0x5be0cd19137e2179U
0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
};
static const uint8_t blake2b_sigma[12][16] =
+189 -82
View File
@@ -1,5 +1,5 @@
/*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -19,14 +19,49 @@
*/
#include "bn_prime.h"
static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,
const BIGNUM *a1_odd, int k, BN_CTX *ctx,
BN_MONT_CTX *mont);
static int probable_prime(BIGNUM *rnd, int bits, prime_t *mods);
static int probable_prime_dh_safe(BIGNUM *rnd, int bits,
const BIGNUM *add, const BIGNUM *rem,
BN_CTX *ctx);
#if BN_BITS2 == 64
# define BN_DEF(lo, hi) (BN_ULONG)hi<<32|lo
#else
# define BN_DEF(lo, hi) lo, hi
#endif
/*
* See SP800 89 5.3.3 (Step f)
* The product of the set of primes ranging from 3 to 751
* Generated using process in test/bn_internal_test.c test_bn_small_factors().
* This includes 751 (which is not currently included in SP 800-89).
*/
static const BN_ULONG small_prime_factors[] = {
BN_DEF(0x3ef4e3e1, 0xc4309333), BN_DEF(0xcd2d655f, 0x71161eb6),
BN_DEF(0x0bf94862, 0x95e2238c), BN_DEF(0x24f7912b, 0x3eb233d3),
BN_DEF(0xbf26c483, 0x6b55514b), BN_DEF(0x5a144871, 0x0a84d817),
BN_DEF(0x9b82210a, 0x77d12fee), BN_DEF(0x97f050b3, 0xdb5b93c2),
BN_DEF(0x4d6c026b, 0x4acad6b9), BN_DEF(0x54aec893, 0xeb7751f3),
BN_DEF(0x36bc85c4, 0xdba53368), BN_DEF(0x7f5ec78e, 0xd85a1b28),
BN_DEF(0x6b322244, 0x2eb072d8), BN_DEF(0x5e2b3aea, 0xbba51112),
BN_DEF(0x0e2486bf, 0x36ed1a6c), BN_DEF(0xec0c5727, 0x5f270460),
(BN_ULONG)0x000017b1
};
#define BN_SMALL_PRIME_FACTORS_TOP OSSL_NELEM(small_prime_factors)
static const BIGNUM _bignum_small_prime_factors = {
(BN_ULONG *)small_prime_factors,
BN_SMALL_PRIME_FACTORS_TOP,
BN_SMALL_PRIME_FACTORS_TOP,
0,
BN_FLG_STATIC_DATA
};
const BIGNUM *bn_get0_small_factors(void)
{
return &_bignum_small_prime_factors;
}
int BN_GENCB_call(BN_GENCB *cb, int a, int b)
{
/* No callback means continue */
@@ -148,127 +183,199 @@ int BN_is_prime_ex(const BIGNUM *a, int checks, BN_CTX *ctx_passed,
return BN_is_prime_fasttest_ex(a, checks, ctx_passed, 0, cb);
}
int BN_is_prime_fasttest_ex(const BIGNUM *a, int checks, BN_CTX *ctx_passed,
/* See FIPS 186-4 C.3.1 Miller Rabin Probabilistic Primality Test. */
int BN_is_prime_fasttest_ex(const BIGNUM *w, int checks, BN_CTX *ctx_passed,
int do_trial_division, BN_GENCB *cb)
{
int i, j, ret = -1;
int k;
int i, status, ret = -1;
BN_CTX *ctx = NULL;
BIGNUM *A1, *A1_odd, *A3, *check; /* taken from ctx */
BN_MONT_CTX *mont = NULL;
/* Take care of the really small primes 2 & 3 */
if (BN_is_word(a, 2) || BN_is_word(a, 3))
return 1;
/* Check odd and bigger than 1 */
if (!BN_is_odd(a) || BN_cmp(a, BN_value_one()) <= 0)
/* w must be bigger than 1 */
if (BN_cmp(w, BN_value_one()) <= 0)
return 0;
if (checks == BN_prime_checks)
checks = BN_prime_checks_for_size(BN_num_bits(a));
/* w must be odd */
if (BN_is_odd(w)) {
/* Take care of the really small prime 3 */
if (BN_is_word(w, 3))
return 1;
} else {
/* 2 is the only even prime */
return BN_is_word(w, 2);
}
/* first look for small factors */
if (do_trial_division) {
for (i = 1; i < NUMPRIMES; i++) {
BN_ULONG mod = BN_mod_word(a, primes[i]);
BN_ULONG mod = BN_mod_word(w, primes[i]);
if (mod == (BN_ULONG)-1)
goto err;
return -1;
if (mod == 0)
return BN_is_word(a, primes[i]);
return BN_is_word(w, primes[i]);
}
if (!BN_GENCB_call(cb, 1, -1))
goto err;
return -1;
}
if (ctx_passed != NULL)
ctx = ctx_passed;
else if ((ctx = BN_CTX_new()) == NULL)
goto err;
ret = bn_miller_rabin_is_prime(w, checks, ctx, cb, 0, &status);
if (!ret)
goto err;
ret = (status == BN_PRIMETEST_PROBABLY_PRIME);
err:
if (ctx_passed == NULL)
BN_CTX_free(ctx);
return ret;
}
/*
* Refer to FIPS 186-4 C.3.2 Enhanced Miller-Rabin Probabilistic Primality Test.
* OR C.3.1 Miller-Rabin Probabilistic Primality Test (if enhanced is zero).
* The Step numbers listed in the code refer to the enhanced case.
*
* if enhanced is set, then status returns one of the following:
* BN_PRIMETEST_PROBABLY_PRIME
* BN_PRIMETEST_COMPOSITE_WITH_FACTOR
* BN_PRIMETEST_COMPOSITE_NOT_POWER_OF_PRIME
* if enhanced is zero, then status returns either
* BN_PRIMETEST_PROBABLY_PRIME or
* BN_PRIMETEST_COMPOSITE
*
* returns 0 if there was an error, otherwise it returns 1.
*/
int bn_miller_rabin_is_prime(const BIGNUM *w, int iterations, BN_CTX *ctx,
BN_GENCB *cb, int enhanced, int *status)
{
int i, j, a, ret = 0;
BIGNUM *g, *w1, *w3, *x, *m, *z, *b;
BN_MONT_CTX *mont = NULL;
/* w must be odd */
if (!BN_is_odd(w))
return 0;
BN_CTX_start(ctx);
g = BN_CTX_get(ctx);
w1 = BN_CTX_get(ctx);
w3 = BN_CTX_get(ctx);
x = BN_CTX_get(ctx);
m = BN_CTX_get(ctx);
z = BN_CTX_get(ctx);
b = BN_CTX_get(ctx);
A1 = BN_CTX_get(ctx);
A3 = BN_CTX_get(ctx);
A1_odd = BN_CTX_get(ctx);
check = BN_CTX_get(ctx);
if (check == NULL)
if (!(b != NULL
/* w1 := w - 1 */
&& BN_copy(w1, w)
&& BN_sub_word(w1, 1)
/* w3 := w - 3 */
&& BN_copy(w3, w)
&& BN_sub_word(w3, 3)))
goto err;
/* compute A1 := a - 1 */
if (!BN_copy(A1, a) || !BN_sub_word(A1, 1))
goto err;
/* compute A3 := a - 3 */
if (!BN_copy(A3, a) || !BN_sub_word(A3, 3))
/* check w is larger than 3, otherwise the random b will be too small */
if (BN_is_zero(w3) || BN_is_negative(w3))
goto err;
/* write A1 as A1_odd * 2^k */
k = 1;
while (!BN_is_bit_set(A1, k))
k++;
if (!BN_rshift(A1_odd, A1, k))
/* (Step 1) Calculate largest integer 'a' such that 2^a divides w-1 */
a = 1;
while (!BN_is_bit_set(w1, a))
a++;
/* (Step 2) m = (w-1) / 2^a */
if (!BN_rshift(m, w1, a))
goto err;
/* Montgomery setup for computations mod a */
mont = BN_MONT_CTX_new();
if (mont == NULL)
goto err;
if (!BN_MONT_CTX_set(mont, a, ctx))
if (mont == NULL || !BN_MONT_CTX_set(mont, w, ctx))
goto err;
for (i = 0; i < checks; i++) {
/* 1 < check < a-1 */
if (!BN_priv_rand_range(check, A3) || !BN_add_word(check, 2))
if (iterations == BN_prime_checks)
iterations = BN_prime_checks_for_size(BN_num_bits(w));
/* (Step 4) */
for (i = 0; i < iterations; ++i) {
/* (Step 4.1) obtain a Random string of bits b where 1 < b < w-1 */
if (!BN_priv_rand_range(b, w3) || !BN_add_word(b, 2)) /* 1 < b < w-1 */
goto err;
j = witness(check, a, A1, A1_odd, k, ctx, mont);
if (j == -1)
goto err;
if (j) {
ret = 0;
if (enhanced) {
/* (Step 4.3) */
if (!BN_gcd(g, b, w, ctx))
goto err;
/* (Step 4.4) */
if (!BN_is_one(g)) {
*status = BN_PRIMETEST_COMPOSITE_WITH_FACTOR;
ret = 1;
goto err;
}
}
/* (Step 4.5) z = b^m mod w */
if (!BN_mod_exp_mont(z, b, m, w, ctx, mont))
goto err;
/* (Step 4.6) if (z = 1 or z = w-1) */
if (BN_is_one(z) || BN_cmp(z, w1) == 0)
goto outer_loop;
/* (Step 4.7) for j = 1 to a-1 */
for (j = 1; j < a ; ++j) {
/* (Step 4.7.1 - 4.7.2) x = z. z = x^2 mod w */
if (!BN_copy(x, z) || !BN_mod_mul(z, x, x, w, ctx))
goto err;
/* (Step 4.7.3) */
if (BN_cmp(z, w1) == 0)
goto outer_loop;
/* (Step 4.7.4) */
if (BN_is_one(z))
goto composite;
}
if (!BN_GENCB_call(cb, 1, i))
goto err;
/* At this point z = b^((w-1)/2) mod w */
/* (Steps 4.8 - 4.9) x = z, z = x^2 mod w */
if (!BN_copy(x, z) || !BN_mod_mul(z, x, x, w, ctx))
goto err;
/* (Step 4.10) */
if (BN_is_one(z))
goto composite;
/* (Step 4.11) x = b^(w-1) mod w */
if (!BN_copy(x, z))
goto err;
composite:
if (enhanced) {
/* (Step 4.1.2) g = GCD(x-1, w) */
if (!BN_sub_word(x, 1) || !BN_gcd(g, x, w, ctx))
goto err;
/* (Steps 4.1.3 - 4.1.4) */
if (BN_is_one(g))
*status = BN_PRIMETEST_COMPOSITE_NOT_POWER_OF_PRIME;
else
*status = BN_PRIMETEST_COMPOSITE_WITH_FACTOR;
} else {
*status = BN_PRIMETEST_COMPOSITE;
}
ret = 1;
goto err;
outer_loop: ;
/* (Step 4.1.5) */
}
/* (Step 5) */
*status = BN_PRIMETEST_PROBABLY_PRIME;
ret = 1;
err:
if (ctx != NULL) {
BN_CTX_end(ctx);
if (ctx_passed == NULL)
BN_CTX_free(ctx);
}
err:
BN_clear(g);
BN_clear(w1);
BN_clear(w3);
BN_clear(x);
BN_clear(m);
BN_clear(z);
BN_clear(b);
BN_CTX_end(ctx);
BN_MONT_CTX_free(mont);
return ret;
}
static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,
const BIGNUM *a1_odd, int k, BN_CTX *ctx,
BN_MONT_CTX *mont)
{
if (!BN_mod_exp_mont(w, w, a1_odd, a, ctx, mont)) /* w := w^a1_odd mod a */
return -1;
if (BN_is_one(w))
return 0; /* probably prime */
if (BN_cmp(w, a1) == 0)
return 0; /* w == -1 (mod a), 'a' is probably prime */
while (--k) {
if (!BN_mod_mul(w, w, w, a, ctx)) /* w := w^2 mod a */
return -1;
if (BN_is_one(w))
return 1; /* 'a' is composite, otherwise a previous 'w'
* would have been == -1 (mod 'a') */
if (BN_cmp(w, a1) == 0)
return 0; /* w == -1 (mod a), 'a' is probably prime */
}
/*
* If we get here, 'w' is the (a-1)/2-th power of the original 'w', and
* it is neither -1 nor +1 -- so 'a' cannot be prime
*/
bn_check_top(w);
return 1;
}
static int probable_prime(BIGNUM *rnd, int bits, prime_t *mods)
{
int i;
+346
View File
@@ -0,0 +1,346 @@
/*
* Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
/*
* According to NIST SP800-131A "Transitioning the use of cryptographic
* algorithms and key lengths" Generation of 1024 bit RSA keys are no longer
* allowed for signatures (Table 2) or key transport (Table 5). In the code
* below any attempt to generate 1024 bit RSA keys will result in an error (Note
* that digital signature verification can still use deprecated 1024 bit keys).
*
* Also see FIPS1402IG A.14
* FIPS 186-4 relies on the use of the auxiliary primes p1, p2, q1 and q2 that
* must be generated before the module generates the RSA primes p and q.
* Table B.1 in FIPS 186-4 specifies, for RSA modulus lengths of 2048 and
* 3072 bits only, the min/max total length of the auxiliary primes.
* When implementing the RSA signature generation algorithm
* with other approved RSA modulus sizes, the vendor shall use the limitations
* from Table B.1 that apply to the longest RSA modulus shown in Table B.1 of
* FIPS 186-4 whose length does not exceed that of the implementation's RSA
* modulus. In particular, when generating the primes for the 4096-bit RSA
* modulus the limitations stated for the 3072-bit modulus shall apply.
*/
#include <stdio.h>
#include <openssl/bn.h>
#include "bn_lcl.h"
#include "internal/bn_int.h"
/*
* FIPS 186-4 Table B.1. "Min length of auxiliary primes p1, p2, q1, q2".
*
* Params:
* nbits The key size in bits.
* Returns:
* The minimum size of the auxiliary primes or 0 if nbits is invalid.
*/
static int bn_rsa_fips186_4_aux_prime_min_size(int nbits)
{
if (nbits >= 3072)
return 171;
if (nbits == 2048)
return 141;
return 0;
}
/*
* FIPS 186-4 Table B.1 "Maximum length of len(p1) + len(p2) and
* len(q1) + len(q2) for p,q Probable Primes".
*
* Params:
* nbits The key size in bits.
* Returns:
* The maximum length or 0 if nbits is invalid.
*/
static int bn_rsa_fips186_4_aux_prime_max_sum_size_for_prob_primes(int nbits)
{
if (nbits >= 3072)
return 1518;
if (nbits == 2048)
return 1007;
return 0;
}
/*
* FIPS 186-4 Table C.3 for error probability of 2^-100
* Minimum number of Miller Rabin Rounds for p1, p2, q1 & q2.
*
* Params:
* aux_prime_bits The auxiliary prime size in bits.
* Returns:
* The minimum number of Miller Rabin Rounds for an auxiliary prime, or
* 0 if aux_prime_bits is invalid.
*/
static int bn_rsa_fips186_4_aux_prime_MR_min_checks(int aux_prime_bits)
{
if (aux_prime_bits > 170)
return 27;
if (aux_prime_bits > 140)
return 32;
return 0; /* Error case */
}
/*
* FIPS 186-4 Table C.3 for error probability of 2^-100
* Minimum number of Miller Rabin Rounds for p, q.
*
* Params:
* nbits The key size in bits.
* Returns:
* The minimum number of Miller Rabin Rounds required,
* or 0 if nbits is invalid.
*/
int bn_rsa_fips186_4_prime_MR_min_checks(int nbits)
{
if (nbits >= 3072) /* > 170 */
return 3;
if (nbits == 2048) /* > 140 */
return 4;
return 0; /* Error case */
}
/*
* Find the first odd integer that is a probable prime.
*
* See section FIPS 186-4 B.3.6 (Steps 4.2/5.2).
*
* Params:
* Xp1 The passed in starting point to find a probably prime.
* p1 The returned probable prime (first odd integer >= Xp1)
* ctx A BN_CTX object.
* cb An optional BIGNUM callback.
* Returns: 1 on success otherwise it returns 0.
*/
static int bn_rsa_fips186_4_find_aux_prob_prime(const BIGNUM *Xp1,
BIGNUM *p1, BN_CTX *ctx,
BN_GENCB *cb)
{
int ret = 0;
int i = 0;
int checks = bn_rsa_fips186_4_aux_prime_MR_min_checks(BN_num_bits(Xp1));
if (checks == 0 || BN_copy(p1, Xp1) == NULL)
return 0;
/* Find the first odd number >= Xp1 that is probably prime */
for(;;) {
i++;
BN_GENCB_call(cb, 0, i);
/* MR test with trial division */
if (BN_is_prime_fasttest_ex(p1, checks, ctx, 1, cb))
break;
/* Get next odd number */
if (!BN_add_word(p1, 2))
goto err;
}
BN_GENCB_call(cb, 2, i);
ret = 1;
err:
return ret;
}
/*
* Generate a probable prime (p or q).
*
* See FIPS 186-4 B.3.6 (Steps 4 & 5)
*
* Params:
* p The returned probable prime.
* Xpout An optionally returned random number used during generation of p.
* p1, p2 The returned auxiliary primes. If NULL they are not returned.
* Xp An optional passed in value (that is random number used during
* generation of p).
* Xp1, Xp2 Optional passed in values that are normally generated
* internally. Used to find p1, p2.
* nlen The bit length of the modulus (the key size).
* e The public exponent.
* ctx A BN_CTX object.
* cb An optional BIGNUM callback.
* Returns: 1 on success otherwise it returns 0.
*/
int bn_rsa_fips186_4_gen_prob_primes(BIGNUM *p, BIGNUM *Xpout,
BIGNUM *p1, BIGNUM *p2,
const BIGNUM *Xp, const BIGNUM *Xp1,
const BIGNUM *Xp2, int nlen,
const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb)
{
int ret = 0;
BIGNUM *p1i = NULL, *p2i = NULL, *Xp1i = NULL, *Xp2i = NULL;
int bitlen;
if (p == NULL || Xpout == NULL)
return 0;
BN_CTX_start(ctx);
p1i = (p1 != NULL) ? p1 : BN_CTX_get(ctx);
p2i = (p2 != NULL) ? p2 : BN_CTX_get(ctx);
Xp1i = (Xp1 != NULL) ? (BIGNUM *)Xp1 : BN_CTX_get(ctx);
Xp2i = (Xp2 != NULL) ? (BIGNUM *)Xp2 : BN_CTX_get(ctx);
if (p1i == NULL || p2i == NULL || Xp1i == NULL || Xp2i == NULL)
goto err;
bitlen = bn_rsa_fips186_4_aux_prime_min_size(nlen);
if (bitlen == 0)
goto err;
/* (Steps 4.1/5.1): Randomly generate Xp1 if it is not passed in */
if (Xp1 == NULL) {
/* Set the top and bottom bits to make it odd and the correct size */
if (!BN_priv_rand(Xp1i, bitlen, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD))
goto err;
}
/* (Steps 4.1/5.1): Randomly generate Xp2 if it is not passed in */
if (Xp2 == NULL) {
/* Set the top and bottom bits to make it odd and the correct size */
if (!BN_priv_rand(Xp2i, bitlen, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD))
goto err;
}
/* (Steps 4.2/5.2) - find first auxiliary probable primes */
if (!bn_rsa_fips186_4_find_aux_prob_prime(Xp1i, p1i, ctx, cb)
|| !bn_rsa_fips186_4_find_aux_prob_prime(Xp2i, p2i, ctx, cb))
goto err;
/* (Table B.1) auxiliary prime Max length check */
if ((BN_num_bits(p1i) + BN_num_bits(p2i)) >=
bn_rsa_fips186_4_aux_prime_max_sum_size_for_prob_primes(nlen))
goto err;
/* (Steps 4.3/5.3) - generate prime */
if (!bn_rsa_fips186_4_derive_prime(p, Xpout, Xp, p1i, p2i, nlen, e, ctx, cb))
goto err;
ret = 1;
err:
/* Zeroize any internally generated values that are not returned */
if (p1 == NULL)
BN_clear(p1i);
if (p2 == NULL)
BN_clear(p2i);
if (Xp1 == NULL)
BN_clear(Xp1i);
if (Xp2 == NULL)
BN_clear(Xp2i);
BN_CTX_end(ctx);
return ret;
}
/*
* Constructs a probable prime (a candidate for p or q) using 2 auxiliary
* prime numbers and the Chinese Remainder Theorem.
*
* See FIPS 186-4 C.9 "Compute a Probable Prime Factor Based on Auxiliary
* Primes". Used by FIPS 186-4 B.3.6 Section (4.3) for p and Section (5.3) for q.
*
* Params:
* Y The returned prime factor (private_prime_factor) of the modulus n.
* X The returned random number used during generation of the prime factor.
* Xin An optional passed in value for X used for testing purposes.
* r1 An auxiliary prime.
* r2 An auxiliary prime.
* nlen The desired length of n (the RSA modulus).
* e The public exponent.
* ctx A BN_CTX object.
* cb An optional BIGNUM callback object.
* Returns: 1 on success otherwise it returns 0.
* Assumptions:
* Y, X, r1, r2, e are not NULL.
*/
int bn_rsa_fips186_4_derive_prime(BIGNUM *Y, BIGNUM *X, const BIGNUM *Xin,
const BIGNUM *r1, const BIGNUM *r2, int nlen,
const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb)
{
int ret = 0;
int i, imax;
int bits = nlen >> 1;
int checks = bn_rsa_fips186_4_prime_MR_min_checks(nlen);
BIGNUM *tmp, *R, *r1r2x2, *y1, *r1x2;
if (checks == 0)
return 0;
BN_CTX_start(ctx);
R = BN_CTX_get(ctx);
tmp = BN_CTX_get(ctx);
r1r2x2 = BN_CTX_get(ctx);
y1 = BN_CTX_get(ctx);
r1x2 = BN_CTX_get(ctx);
if (r1x2 == NULL)
goto err;
if (Xin != NULL && BN_copy(X, Xin) == NULL)
goto err;
if (!(BN_lshift1(r1x2, r1)
/* (Step 1) GCD(2r1, r2) = 1 */
&& BN_gcd(tmp, r1x2, r2, ctx)
&& BN_is_one(tmp)
/* (Step 2) R = ((r2^-1 mod 2r1) * r2) - ((2r1^-1 mod r2)*2r1) */
&& BN_mod_inverse(R, r2, r1x2, ctx)
&& BN_mul(R, R, r2, ctx) /* R = (r2^-1 mod 2r1) * r2 */
&& BN_mod_inverse(tmp, r1x2, r2, ctx)
&& BN_mul(tmp, tmp, r1x2, ctx) /* tmp = (2r1^-1 mod r2)*2r1 */
&& BN_sub(R, R, tmp)
/* Calculate 2r1r2 */
&& BN_mul(r1r2x2, r1x2, r2, ctx)))
goto err;
/* Make positive by adding the modulus */
if (BN_is_negative(R) && !BN_add(R, R, r1r2x2))
goto err;
imax = 5 * bits; /* max = 5/2 * nbits */
for (;;) {
if (Xin == NULL) {
/*
* (Step 3) Choose Random X such that
* sqrt(2) * 2^(nlen/2-1) < Random X < (2^(nlen/2)) - 1.
*
* For the lower bound:
* sqrt(2) * 2^(nlen/2 - 1) == sqrt(2)/2 * 2^(nlen/2)
* where sqrt(2)/2 = 0.70710678.. = 0.B504FC33F9DE...
* so largest number will have B5... as the top byte
* Setting the top 2 bits gives 0xC0.
*/
if (!BN_priv_rand(X, bits, BN_RAND_TOP_TWO, BN_RAND_BOTTOM_ANY))
goto end;
}
/* (Step 4) Y = X + ((R - X) mod 2r1r2) */
if (!BN_mod_sub(Y, R, X, r1r2x2, ctx) || !BN_add(Y, Y, X))
goto err;
/* (Step 5) */
i = 0;
for (;;) {
/* (Step 6) */
if (BN_num_bits(Y) > bits) {
if (Xin == NULL)
break; /* Randomly Generated X so Go back to Step 3 */
else
goto err; /* X is not random so it will always fail */
}
BN_GENCB_call(cb, 0, 2);
/* (Step 7) If GCD(Y-1) == 1 & Y is probably prime then return Y */
if (BN_copy(y1, Y) == NULL
|| !BN_sub_word(y1, 1)
|| !BN_gcd(tmp, y1, e, ctx))
goto err;
if (BN_is_one(tmp)
&& BN_is_prime_fasttest_ex(Y, checks, ctx, 1, cb))
goto end;
/* (Step 8-10) */
if (++i >= imax || !BN_add(Y, Y, r1r2x2))
goto err;
}
}
end:
ret = 1;
BN_GENCB_call(cb, 3, 0);
err:
BN_clear(y1);
BN_CTX_end(ctx);
return ret;
}
+2 -1
View File
@@ -5,7 +5,8 @@ SOURCE[../../libcrypto]=\
bn_kron.c bn_sqrt.c bn_gcd.c bn_prime.c bn_err.c bn_sqr.c \
{- $target{bn_asm_src} -} \
bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c bn_gf2m.c bn_nist.c \
bn_depr.c bn_const.c bn_x931p.c bn_intern.c bn_dh.c bn_srp.c
bn_depr.c bn_const.c bn_x931p.c bn_intern.c bn_dh.c bn_srp.c \
bn_rsa_fips186_4.c
INCLUDE[../../libcrypto]=../../crypto/include
INCLUDE[bn_exp.o]=..
+6 -2
View File
@@ -5,15 +5,19 @@ SUBDIRS=objects buffer bio stack lhash rand evp asn1 pem x509 x509v3 conf \
md2 md4 md5 sha mdc2 gmac hmac ripemd whrlpool poly1305 blake2 \
siphash sm3 des aes rc2 rc4 rc5 idea aria bf cast camellia \
seed sm4 chacha modes bn ec rsa dsa dh sm2 dso engine \
err comp ocsp cms ts srp cmac ct async kmac ess
err comp ocsp cms ts srp cmac ct async kmac ess crmf
LIBS=../libcrypto
# The Core
SOURCE[../libcrypto]=provider_core.c core_fetch.c
# Central utilities
SOURCE[../libcrypto]=\
cryptlib.c mem.c mem_dbg.c cversion.c ex_data.c cpt_err.c \
ebcdic.c uid.c o_time.c o_str.c o_dir.c o_fopen.c ctype.c \
threads_pthread.c threads_win.c threads_none.c getenv.c \
o_init.c o_fips.c mem_sec.c init.c context.c sparse_array.c \
trace.c \
trace.c provider.c params.c \
{- $target{cpuid_asm_src} -} {- $target{uplink_aux_src} -}
DEPEND[cversion.o]=buildinf.h
+718 -286
View File
@@ -23,11 +23,20 @@
#
# August 2018
#
# Add vx code path.
# Add vx code path: 4x"vertical".
#
# Copyright IBM Corp. 2018
# Author: Patrick Steuer <patrick.steuer@de.ibm.com>
#
# February 2019
#
# Add 6x"horizontal" VX implementation. It's ~25% faster than IBM's
# 4x"vertical" submission [on z13] and >3 faster than scalar code.
# But to harness overheads revert to transliteration of VSX code path
# from chacha-ppc module, which is also 4x"vertical", to handle inputs
# not longer than 256 bytes.
use strict;
use FindBin qw($Bin);
use lib "$Bin/../..";
@@ -50,11 +59,9 @@ while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
my $sp="%r15";
my $stdframe=16*$SIZE_T+4*8;
sub ROUND {
my @x=map("%r$_",(0..7,"x","x","x","x",(10..13)));
my @t=map("%r$_",(8,9));
my @v=map("%v$_",(16..31));
sub ROUND {
my ($a0,$b0,$c0,$d0)=@_;
my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0));
my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1));
@@ -143,63 +150,92 @@ my ($xc,$xc_)=map("$_",@t);
rll (@x[$b3],@x[$b3],7);
}
sub VX_ROUND {
sub VX_lane_ROUND {
my ($a0,$b0,$c0,$d0)=@_;
my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0));
my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1));
my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2));
my @x=map("%v$_",(0..15));
vaf (@v[$a0],@v[$a0],@v[$b0]);
vaf (@v[$a1],@v[$a1],@v[$b1]);
vaf (@v[$a2],@v[$a2],@v[$b2]);
vaf (@v[$a3],@v[$a3],@v[$b3]);
vx (@v[$d0],@v[$d0],@v[$a0]);
vx (@v[$d1],@v[$d1],@v[$a1]);
vx (@v[$d2],@v[$d2],@v[$a2]);
vx (@v[$d3],@v[$d3],@v[$a3]);
verllf (@v[$d0],@v[$d0],16);
verllf (@v[$d1],@v[$d1],16);
verllf (@v[$d2],@v[$d2],16);
verllf (@v[$d3],@v[$d3],16);
vaf (@x[$a0],@x[$a0],@x[$b0]); # Q1
vx (@x[$d0],@x[$d0],@x[$a0]);
verllf (@x[$d0],@x[$d0],16);
vaf (@x[$a1],@x[$a1],@x[$b1]); # Q2
vx (@x[$d1],@x[$d1],@x[$a1]);
verllf (@x[$d1],@x[$d1],16);
vaf (@x[$a2],@x[$a2],@x[$b2]); # Q3
vx (@x[$d2],@x[$d2],@x[$a2]);
verllf (@x[$d2],@x[$d2],16);
vaf (@x[$a3],@x[$a3],@x[$b3]); # Q4
vx (@x[$d3],@x[$d3],@x[$a3]);
verllf (@x[$d3],@x[$d3],16);
vaf (@v[$c0],@v[$c0],@v[$d0]);
vaf (@v[$c1],@v[$c1],@v[$d1]);
vaf (@v[$c2],@v[$c2],@v[$d2]);
vaf (@v[$c3],@v[$c3],@v[$d3]);
vx (@v[$b0],@v[$b0],@v[$c0]);
vx (@v[$b1],@v[$b1],@v[$c1]);
vx (@v[$b2],@v[$b2],@v[$c2]);
vx (@v[$b3],@v[$b3],@v[$c3]);
verllf (@v[$b0],@v[$b0],12);
verllf (@v[$b1],@v[$b1],12);
verllf (@v[$b2],@v[$b2],12);
verllf (@v[$b3],@v[$b3],12);
vaf (@x[$c0],@x[$c0],@x[$d0]);
vx (@x[$b0],@x[$b0],@x[$c0]);
verllf (@x[$b0],@x[$b0],12);
vaf (@x[$c1],@x[$c1],@x[$d1]);
vx (@x[$b1],@x[$b1],@x[$c1]);
verllf (@x[$b1],@x[$b1],12);
vaf (@x[$c2],@x[$c2],@x[$d2]);
vx (@x[$b2],@x[$b2],@x[$c2]);
verllf (@x[$b2],@x[$b2],12);
vaf (@x[$c3],@x[$c3],@x[$d3]);
vx (@x[$b3],@x[$b3],@x[$c3]);
verllf (@x[$b3],@x[$b3],12);
vaf (@v[$a0],@v[$a0],@v[$b0]);
vaf (@v[$a1],@v[$a1],@v[$b1]);
vaf (@v[$a2],@v[$a2],@v[$b2]);
vaf (@v[$a3],@v[$a3],@v[$b3]);
vx (@v[$d0],@v[$d0],@v[$a0]);
vx (@v[$d1],@v[$d1],@v[$a1]);
vx (@v[$d2],@v[$d2],@v[$a2]);
vx (@v[$d3],@v[$d3],@v[$a3]);
verllf (@v[$d0],@v[$d0],8);
verllf (@v[$d1],@v[$d1],8);
verllf (@v[$d2],@v[$d2],8);
verllf (@v[$d3],@v[$d3],8);
vaf (@x[$a0],@x[$a0],@x[$b0]);
vx (@x[$d0],@x[$d0],@x[$a0]);
verllf (@x[$d0],@x[$d0],8);
vaf (@x[$a1],@x[$a1],@x[$b1]);
vx (@x[$d1],@x[$d1],@x[$a1]);
verllf (@x[$d1],@x[$d1],8);
vaf (@x[$a2],@x[$a2],@x[$b2]);
vx (@x[$d2],@x[$d2],@x[$a2]);
verllf (@x[$d2],@x[$d2],8);
vaf (@x[$a3],@x[$a3],@x[$b3]);
vx (@x[$d3],@x[$d3],@x[$a3]);
verllf (@x[$d3],@x[$d3],8);
vaf (@v[$c0],@v[$c0],@v[$d0]);
vaf (@v[$c1],@v[$c1],@v[$d1]);
vaf (@v[$c2],@v[$c2],@v[$d2]);
vaf (@v[$c3],@v[$c3],@v[$d3]);
vx (@v[$b0],@v[$b0],@v[$c0]);
vx (@v[$b1],@v[$b1],@v[$c1]);
vx (@v[$b2],@v[$b2],@v[$c2]);
vx (@v[$b3],@v[$b3],@v[$c3]);
verllf (@v[$b0],@v[$b0],7);
verllf (@v[$b1],@v[$b1],7);
verllf (@v[$b2],@v[$b2],7);
verllf (@v[$b3],@v[$b3],7);
vaf (@x[$c0],@x[$c0],@x[$d0]);
vx (@x[$b0],@x[$b0],@x[$c0]);
verllf (@x[$b0],@x[$b0],7);
vaf (@x[$c1],@x[$c1],@x[$d1]);
vx (@x[$b1],@x[$b1],@x[$c1]);
verllf (@x[$b1],@x[$b1],7);
vaf (@x[$c2],@x[$c2],@x[$d2]);
vx (@x[$b2],@x[$b2],@x[$c2]);
verllf (@x[$b2],@x[$b2],7);
vaf (@x[$c3],@x[$c3],@x[$d3]);
vx (@x[$b3],@x[$b3],@x[$c3]);
verllf (@x[$b3],@x[$b3],7);
}
sub VX_ROUND {
my @a=@_[0..5];
my @b=@_[6..11];
my @c=@_[12..17];
my @d=@_[18..23];
my $odd=@_[24];
vaf (@a[$_],@a[$_],@b[$_]) for (0..5);
vx (@d[$_],@d[$_],@a[$_]) for (0..5);
verllf (@d[$_],@d[$_],16) for (0..5);
vaf (@c[$_],@c[$_],@d[$_]) for (0..5);
vx (@b[$_],@b[$_],@c[$_]) for (0..5);
verllf (@b[$_],@b[$_],12) for (0..5);
vaf (@a[$_],@a[$_],@b[$_]) for (0..5);
vx (@d[$_],@d[$_],@a[$_]) for (0..5);
verllf (@d[$_],@d[$_],8) for (0..5);
vaf (@c[$_],@c[$_],@d[$_]) for (0..5);
vx (@b[$_],@b[$_],@c[$_]) for (0..5);
verllf (@b[$_],@b[$_],7) for (0..5);
vsldb (@c[$_],@c[$_],@c[$_],8) for (0..5);
vsldb (@b[$_],@b[$_],@b[$_],$odd?12:4) for (0..5);
vsldb (@d[$_],@d[$_],@d[$_],$odd?4:12) for (0..5);
}
PERLASM_BEGIN($output);
@@ -210,13 +246,11 @@ TEXT ();
################
# void ChaCha20_ctr32(unsigned char *out, const unsigned char *inp, size_t len,
# const unsigned int key[8], const unsigned int counter[4])
{
my ($out,$inp,$len,$key,$counter)=map("%r$_",(2..6));
# VX CODE PATH
{
my $off=$z*8*16+8; # offset(initial state)
my $frame=$stdframe+4*16+$off;
my $frame=$stdframe+4*20;
my @x=map("%r$_",(0..7,"x","x","x","x",(10..13)));
my @t=map("%r$_",(8,9));
GLOBL ("ChaCha20_ctr32");
TYPE ("ChaCha20_ctr32","\@function");
@@ -225,230 +259,16 @@ LABEL ("ChaCha20_ctr32");
larl ("%r1","OPENSSL_s390xcap_P");
lghi ("%r0",64);
&{$z? \&clgr:\&clr} ($len,"%r0");
jle ("_s390x_chacha_novx");
lg ("%r0","S390X_STFLE+16(%r1)");
tmhh ("%r0",0x4000); # check for vector facility
jz ("_s390x_chacha_novx");
if (!$z) {
llgfr ($len,$len);
std ("%f4","16*$SIZE_T+2*8($sp)");
std ("%f6","16*$SIZE_T+3*8($sp)");
}
&{$z? \&stmg:\&stm} ("%r6","%r7","6*$SIZE_T($sp)");
lghi ("%r1",-$frame);
lgr ("%r0",$sp);
la ($sp,"0(%r1,$sp)"); # allocate stack frame
larl ("%r7",".Lsigma");
&{$z? \&stg:\&st} ("%r0","0($sp)"); # backchain
vstm ("%v8","%v15","8($sp)") if ($z);
vlm ("%v1","%v2","0($key)"); # load key
vl ("%v0","0(%r7)"); # load sigma constant
vl ("%v3","0($counter)"); # load iv (counter||nonce)
l ("%r0","0($counter)"); # load counter
vstm ("%v0","%v3","$off($sp)"); # copy initial state to stack
srlg ("%r1",$len,8);
ltgr ("%r1","%r1");
jz (".Lvx_4x_done");
ALIGN (16); # process 4 64-byte blocks
LABEL (".Lvx_4x");
vlrepf ("%v$_",($_*4)."+$off($sp)") for (0..15); # load initial
# state
vl ("%v31","16(%r7)");
vaf ("%v12","%v12","%v31"); # increment counter
vlr (@v[$_],"%v$_") for (0..15); # copy initial state
lhi ("%r6",10);
j (".Loop_vx_4x");
ALIGN (16);
LABEL (".Loop_vx_4x");
VX_ROUND( 0, 4, 8,12); # column round
VX_ROUND( 0, 5,10,15); # diagonal round
brct ("%r6",".Loop_vx_4x");
vaf (@v[$_],@v[$_],"%v$_") for (0..15); # state += initial
# state (mod 32)
vlm ("%v6","%v7","32(%r7)"); # load vperm operands
for (0..3) { # blocks 1,2
vmrhf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrhf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+ 8),"%v0","%v1","%v6");
vperm ("%v".($_+12),"%v0","%v1","%v7");
}
vlm ("%v0","%v7","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+8)) for (0..7); # out = in ^ ks
vstm ("%v0","%v7","0($out)"); # store out
vlm ("%v6","%v7","32(%r7)"); # restore vperm operands
for (0..3) { # blocks 2,3
vmrlf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrlf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+ 8),"%v0","%v1","%v6");
vperm ("%v".($_+12),"%v0","%v1","%v7");
}
vlm ("%v0","%v7","128($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+8)) for (0..7); # out = in ^ ks
vstm ("%v0","%v7","128($out)"); # store out
ahi ("%r0",4);
st ("%r0","48+$off($sp)"); # update initial state
la ($inp,"256($inp)");
la ($out,"256($out)");
brctg ("%r1",".Lvx_4x");
ALIGN (16);
LABEL (".Lvx_4x_done");
lghi ("%r1",0xff);
ngr ($len,"%r1");
jnz (".Lvx_rem");
ALIGN (16);
LABEL (".Lvx_done");
vzero ("%v$_") for (16..31); # wipe ks and key copy
vstm ("%v16","%v17","16+$off($sp)");
vlm ("%v8","%v15","8($sp)") if ($z);
la ($sp,"$frame($sp)");
&{$z? \&lmg:\&lm} ("%r6","%r7","6*$SIZE_T($sp)");
if (!$z) {
ld ("%f4","16*$SIZE_T+2*8($sp)");
ld ("%f6","16*$SIZE_T+3*8($sp)");
vzero ("%v$_") for (8..15);
}
br ("%r14");
ALIGN (16);
LABEL (".Lvx_rem");
lhi ("%r0",64);
sr ($len,"%r0");
brc (2,".Lvx_rem_g64"); # cc==2?
lghi ("%r1",-$stdframe);
la ($counter,"48+$off($sp)"); # load updated iv
ar ($len,"%r0"); # restore len
lgr ("%r7",$counter);
&{$z? \&stg:\&st} ("%r14","14*$SIZE_T+$frame($sp)");
la ($sp,"0(%r1,$sp)");
bras ("%r14","_s390x_chacha_novx");
la ($sp,"$stdframe($sp)");
&{$z? \&lg:\&l} ("%r14","14*$SIZE_T+$frame($sp)");
lgr ($counter,"%r7");
j (".Lvx_done");
ALIGN (16);
LABEL (".Lvx_rem_g64");
vlrepf ("%v$_",($_*4)."+$off($sp)") for (0..15); # load initial
# state
vl ("%v31","16(%r7)");
vaf ("%v12","%v12","%v31"); # increment counter
vlr (@v[$_],"%v$_") for (0..15); # state = initial state
lhi ("%r6",10);
j (".Loop_vx_rem");
ALIGN (16);
LABEL (".Loop_vx_rem");
VX_ROUND( 0, 4, 8,12); # column round
VX_ROUND( 0, 5,10,15); # diagonal round
brct ("%r6",".Loop_vx_rem");
vaf (@v[$_],@v[$_],"%v$_") for (0..15); # state += initial
# state (mod 32)
vlm ("%v6","%v7","32(%r7)"); # load vperm operands
for (0..3) { # blocks 1,2
vmrhf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrhf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+8),"%v0","%v1","%v6");
vperm ("%v".($_+12),"%v0","%v1","%v7");
}
vlm ("%v0","%v3","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+8)) for (0..3); # out = in ^ ks
vstm ("%v0","%v3","0($out)"); # store out
la ($inp,"64($inp)");
la ($out,"64($out)");
sr ($len,"%r0");
brc (4,".Lvx_tail"); # cc==4?
vlm ("%v0","%v3","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+12)) for (0..3); # out = in ^ ks
vstm ("%v0","%v3","0($out)"); # store out
jz (".Lvx_done");
for (0..3) { # blocks 3,4
vmrlf ("%v0",@v[$_*4+0],@v[$_*4+1]); # ks = serialize(state)
vmrlf ("%v1",@v[$_*4+2],@v[$_*4+3]);
vperm ("%v".($_+12),"%v0","%v1","%v6");
vperm ("%v".($_+8),"%v0","%v1","%v7");
}
la ($inp,"64($inp)");
la ($out,"64($out)");
sr ($len,"%r0");
brc (4,".Lvx_tail"); # cc==4?
vlm ("%v0","%v3","0($inp)"); # load in
vx ("%v$_","%v$_","%v".($_+12)) for (0..3); # out = in ^ ks
vstm ("%v0","%v3","0($out)"); # store out
jz (".Lvx_done");
la ($inp,"64($inp)");
la ($out,"64($out)");
sr ($len,"%r0");
vlr ("%v".($_+4),"%v$_") for (8..11);
j (".Lvx_tail");
ALIGN (16);
LABEL (".Lvx_tail");
ar ($len,"%r0"); # restore $len
ahi ($len,-1);
lhi ("%r0",16);
for (0..2) {
vll ("%v0",$len,($_*16)."($inp)");
vx ("%v0","%v0","%v".($_+12));
vstl ("%v0",$len,($_*16)."($out)");
sr ($len,"%r0");
brc (4,".Lvx_done"); # cc==4?
}
vll ("%v0",$len,"3*16($inp)");
vx ("%v0","%v0","%v15");
vstl ("%v0",$len,"3*16($out)");
j (".Lvx_done");
SIZE ("ChaCha20_ctr32",".-ChaCha20_ctr32");
}
# NOVX CODE PATH
{
my $frame=$stdframe+4*20;
TYPE ("_s390x_chacha_novx","\@function");
ALIGN (32);
LABEL ("_s390x_chacha_novx");
&{$z? \&ltgr:\&ltr} ($len,$len); # $len==0?
&{$z? \&ltgr:\&ltr} ($len,$len); # len==0?
bzr ("%r14");
lg ("%r1","S390X_STFLE+16(%r1)");
&{$z? \&clgr:\&clr} ($len,"%r0");
jle (".Lshort");
tmhh ("%r1",0x4000); # check for vx bit
jnz (".LChaCha20_ctr32_vx");
LABEL (".Lshort");
&{$z? \&aghi:\&ahi} ($len,-64);
&{$z? \&lghi:\&lhi} ("%r1",-$frame);
&{$z? \&stmg:\&stm} ("%r6","%r15","6*$SIZE_T($sp)");
@@ -607,17 +427,629 @@ LABEL (".Loop_tail");
brct (@t[1],".Loop_tail");
j (".Ldone");
SIZE ("_s390x_chacha_novx",".-_s390x_chacha_novx");
SIZE ("ChaCha20_ctr32",".-ChaCha20_ctr32");
}
########################################################################
# 4x"vertical" layout minimizes amount of instructions, but pipeline
# runs underutilized [because of vector instructions' high latency].
# On the other hand minimum amount of data it takes to fully utilize
# the pipeline is higher, so that effectively, short inputs would be
# processed slower. Hence this code path targeting <=256 bytes lengths.
#
{
my ($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3,
$xc0,$xc1,$xc2,$xc3, $xd0,$xd1,$xd2,$xd3)=map("%v$_",(0..15));
my @K=map("%v$_",(16..19));
my $CTR="%v26";
my ($xt0,$xt1,$xt2,$xt3)=map("%v$_",(27..30));
my $beperm="%v31";
my ($x00,$x10,$x20,$x30)=(0,map("r$_",(8..10)));
my $FRAME=$stdframe+4*16;
ALIGN (32);
LABEL ("ChaCha20_ctr32_4x");
LABEL (".LChaCha20_ctr32_4x");
&{$z? \&stmg:\&stm} ("%r6","%r7","6*$SIZE_T($sp)");
if (!$z) {
std ("%f4","16*$SIZE_T+2*8($sp)");
std ("%f6","16*$SIZE_T+3*8($sp)");
}
&{$z? \&lghi:\&lhi} ("%r1",-$FRAME);
lgr ("%r0",$sp);
la ($sp,"0(%r1,$sp)");
&{$z? \&stg:\&st} ("%r0","0($sp)"); # back-chain
if ($z) {
std ("%f8","$stdframe+8*0($sp)");
std ("%f9","$stdframe+8*1($sp)");
std ("%f10","$stdframe+8*2($sp)");
std ("%f11","$stdframe+8*3($sp)");
std ("%f12","$stdframe+8*4($sp)");
std ("%f13","$stdframe+8*5($sp)");
std ("%f14","$stdframe+8*6($sp)");
std ("%f15","$stdframe+8*7($sp)");
}
larl ("%r7",".Lsigma");
lhi ("%r0",10);
lhi ("%r1",0);
vl (@K[0],"0(%r7)"); # load sigma
vl (@K[1],"0($key)"); # load key
vl (@K[2],"16($key)");
vl (@K[3],"0($counter)"); # load counter
vl ($beperm,"0x40(%r7)");
vl ($xt1,"0x50(%r7)");
vrepf ($CTR,@K[3],0);
vlvgf (@K[3],"%r1",0); # clear @K[3].word[0]
vaf ($CTR,$CTR,$xt1);
#LABEL (".Loop_outer_4x");
vlm ($xa0,$xa3,"0x60(%r7)"); # load [smashed] sigma
vrepf ($xb0,@K[1],0); # smash the key
vrepf ($xb1,@K[1],1);
vrepf ($xb2,@K[1],2);
vrepf ($xb3,@K[1],3);
vrepf ($xc0,@K[2],0);
vrepf ($xc1,@K[2],1);
vrepf ($xc2,@K[2],2);
vrepf ($xc3,@K[2],3);
vlr ($xd0,$CTR);
vrepf ($xd1,@K[3],1);
vrepf ($xd2,@K[3],2);
vrepf ($xd3,@K[3],3);
LABEL (".Loop_4x");
VX_lane_ROUND(0, 4, 8,12);
VX_lane_ROUND(0, 5,10,15);
brct ("%r0",".Loop_4x");
vaf ($xd0,$xd0,$CTR);
vmrhf ($xt0,$xa0,$xa1); # transpose data
vmrhf ($xt1,$xa2,$xa3);
vmrlf ($xt2,$xa0,$xa1);
vmrlf ($xt3,$xa2,$xa3);
vpdi ($xa0,$xt0,$xt1,0b0000);
vpdi ($xa1,$xt0,$xt1,0b0101);
vpdi ($xa2,$xt2,$xt3,0b0000);
vpdi ($xa3,$xt2,$xt3,0b0101);
vmrhf ($xt0,$xb0,$xb1);
vmrhf ($xt1,$xb2,$xb3);
vmrlf ($xt2,$xb0,$xb1);
vmrlf ($xt3,$xb2,$xb3);
vpdi ($xb0,$xt0,$xt1,0b0000);
vpdi ($xb1,$xt0,$xt1,0b0101);
vpdi ($xb2,$xt2,$xt3,0b0000);
vpdi ($xb3,$xt2,$xt3,0b0101);
vmrhf ($xt0,$xc0,$xc1);
vmrhf ($xt1,$xc2,$xc3);
vmrlf ($xt2,$xc0,$xc1);
vmrlf ($xt3,$xc2,$xc3);
vpdi ($xc0,$xt0,$xt1,0b0000);
vpdi ($xc1,$xt0,$xt1,0b0101);
vpdi ($xc2,$xt2,$xt3,0b0000);
vpdi ($xc3,$xt2,$xt3,0b0101);
vmrhf ($xt0,$xd0,$xd1);
vmrhf ($xt1,$xd2,$xd3);
vmrlf ($xt2,$xd0,$xd1);
vmrlf ($xt3,$xd2,$xd3);
vpdi ($xd0,$xt0,$xt1,0b0000);
vpdi ($xd1,$xt0,$xt1,0b0101);
vpdi ($xd2,$xt2,$xt3,0b0000);
vpdi ($xd3,$xt2,$xt3,0b0101);
#vrepif ($xt0,4);
#vaf ($CTR,$CTR,$xt0); # next counter value
vaf ($xa0,$xa0,@K[0]);
vaf ($xb0,$xb0,@K[1]);
vaf ($xc0,$xc0,@K[2]);
vaf ($xd0,$xd0,@K[3]);
vperm ($xa0,$xa0,$xa0,$beperm);
vperm ($xb0,$xb0,$xb0,$beperm);
vperm ($xc0,$xc0,$xc0,$beperm);
vperm ($xd0,$xd0,$xd0,$beperm);
#&{$z? \&clgfi:\&clfi} ($len,0x40);
#jl (".Ltail_4x");
vlm ($xt0,$xt3,"0($inp)");
vx ($xt0,$xt0,$xa0);
vx ($xt1,$xt1,$xb0);
vx ($xt2,$xt2,$xc0);
vx ($xt3,$xt3,$xd0);
vstm ($xt0,$xt3,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
#je (".Ldone_4x");
vaf ($xa0,$xa1,@K[0]);
vaf ($xb0,$xb1,@K[1]);
vaf ($xc0,$xc1,@K[2]);
vaf ($xd0,$xd1,@K[3]);
vperm ($xa0,$xa0,$xa0,$beperm);
vperm ($xb0,$xb0,$xb0,$beperm);
vperm ($xc0,$xc0,$xc0,$beperm);
vperm ($xd0,$xd0,$xd0,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_4x");
vlm ($xt0,$xt3,"0($inp)");
vx ($xt0,$xt0,$xa0);
vx ($xt1,$xt1,$xb0);
vx ($xt2,$xt2,$xc0);
vx ($xt3,$xt3,$xd0);
vstm ($xt0,$xt3,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_4x");
vaf ($xa0,$xa2,@K[0]);
vaf ($xb0,$xb2,@K[1]);
vaf ($xc0,$xc2,@K[2]);
vaf ($xd0,$xd2,@K[3]);
vperm ($xa0,$xa0,$xa0,$beperm);
vperm ($xb0,$xb0,$xb0,$beperm);
vperm ($xc0,$xc0,$xc0,$beperm);
vperm ($xd0,$xd0,$xd0,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_4x");
vlm ($xt0,$xt3,"0($inp)");
vx ($xt0,$xt0,$xa0);
vx ($xt1,$xt1,$xb0);
vx ($xt2,$xt2,$xc0);
vx ($xt3,$xt3,$xd0);
vstm ($xt0,$xt3,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_4x");
vaf ($xa0,$xa3,@K[0]);
vaf ($xb0,$xb3,@K[1]);
vaf ($xc0,$xc3,@K[2]);
vaf ($xd0,$xd3,@K[3]);
vperm ($xa0,$xa0,$xa0,$beperm);
vperm ($xb0,$xb0,$xb0,$beperm);
vperm ($xc0,$xc0,$xc0,$beperm);
vperm ($xd0,$xd0,$xd0,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_4x");
vlm ($xt0,$xt3,"0($inp)");
vx ($xt0,$xt0,$xa0);
vx ($xt1,$xt1,$xb0);
vx ($xt2,$xt2,$xc0);
vx ($xt3,$xt3,$xd0);
vstm ($xt0,$xt3,"0($out)");
#la $inp,0x40($inp));
#la $out,0x40($out));
#lhi %r0,10);
#&{$z? \&aghi:\&ahi} $len,-0x40);
#jne .Loop_outer_4x);
LABEL (".Ldone_4x");
if (!$z) {
ld ("%f4","$FRAME+16*$SIZE_T+2*8($sp)");
ld ("%f6","$FRAME+16*$SIZE_T+3*8($sp)");
} else {
ld ("%f8","$stdframe+8*0($sp)");
ld ("%f9","$stdframe+8*1($sp)");
ld ("%f10","$stdframe+8*2($sp)");
ld ("%f11","$stdframe+8*3($sp)");
ld ("%f12","$stdframe+8*4($sp)");
ld ("%f13","$stdframe+8*5($sp)");
ld ("%f14","$stdframe+8*6($sp)");
ld ("%f15","$stdframe+8*7($sp)");
}
&{$z? \&lmg:\&lm} ("%r6","%r7","$FRAME+6*$SIZE_T($sp)");
la ($sp,"$FRAME($sp)");
br ("%r14");
ALIGN (16);
LABEL (".Ltail_4x");
if (!$z) {
vlr ($xt0,$xb0);
ld ("%f4","$FRAME+16*$SIZE_T+2*8($sp)");
ld ("%f6","$FRAME+16*$SIZE_T+3*8($sp)");
vst ($xa0,"$stdframe+0x00($sp)");
vst ($xt0,"$stdframe+0x10($sp)");
vst ($xc0,"$stdframe+0x20($sp)");
vst ($xd0,"$stdframe+0x30($sp)");
} else {
vlr ($xt0,$xc0);
ld ("%f8","$stdframe+8*0($sp)");
ld ("%f9","$stdframe+8*1($sp)");
ld ("%f10","$stdframe+8*2($sp)");
ld ("%f11","$stdframe+8*3($sp)");
vlr ($xt1,$xd0);
ld ("%f12","$stdframe+8*4($sp)");
ld ("%f13","$stdframe+8*5($sp)");
ld ("%f14","$stdframe+8*6($sp)");
ld ("%f15","$stdframe+8*7($sp)");
vst ($xa0,"$stdframe+0x00($sp)");
vst ($xb0,"$stdframe+0x10($sp)");
vst ($xt0,"$stdframe+0x20($sp)");
vst ($xt1,"$stdframe+0x30($sp)");
}
lghi ("%r1",0);
LABEL (".Loop_tail_4x");
llgc ("%r5","0(%r1,$inp)");
llgc ("%r6","$stdframe(%r1,$sp)");
xr ("%r6","%r5");
stc ("%r6","0(%r1,$out)");
la ("%r1","1(%r1)");
brct ($len,".Loop_tail_4x");
&{$z? \&lmg:\&lm} ("%r6","%r7","$FRAME+6*$SIZE_T($sp)");
la ($sp,"$FRAME($sp)");
br ("%r14");
SIZE ("ChaCha20_ctr32_4x",".-ChaCha20_ctr32_4x");
}
########################################################################
# 6x"horizontal" layout is optimal fit for the platform in its current
# shape, more specifically for given vector instructions' latency. Well,
# computational part of 8x"vertical" would be faster, but it consumes
# all registers and dealing with that will diminish the return...
#
{
my ($a0,$b0,$c0,$d0, $a1,$b1,$c1,$d1,
$a2,$b2,$c2,$d2, $a3,$b3,$c3,$d3,
$a4,$b4,$c4,$d4, $a5,$b5,$c5,$d5)=map("%v$_",(0..23));
my @K=map("%v$_",(27,24..26));
my ($t0,$t1,$t2,$t3)=map("%v$_",27..30);
my $beperm="%v31";
my $FRAME=$stdframe + 4*16;
GLOBL ("ChaCha20_ctr32_vx");
ALIGN (32);
LABEL ("ChaCha20_ctr32_vx");
LABEL (".LChaCha20_ctr32_vx");
&{$z? \&clgfi:\&clfi} ($len,256);
jle (".LChaCha20_ctr32_4x");
&{$z? \&stmg:\&stm} ("%r6","%r7","6*$SIZE_T($sp)");
if (!$z) {
std ("%f4","16*$SIZE_T+2*8($sp)");
std ("%f6","16*$SIZE_T+3*8($sp)");
}
&{$z? \&lghi:\&lhi} ("%r1",-$FRAME);
lgr ("%r0",$sp);
la ($sp,"0(%r1,$sp)");
&{$z? \&stg:\&st} ("%r0","0($sp)"); # back-chain
if ($z) {
std ("%f8","$FRAME-8*8($sp)");
std ("%f9","$FRAME-8*7($sp)");
std ("%f10","$FRAME-8*6($sp)");
std ("%f11","$FRAME-8*5($sp)");
std ("%f12","$FRAME-8*4($sp)");
std ("%f13","$FRAME-8*3($sp)");
std ("%f14","$FRAME-8*2($sp)");
std ("%f15","$FRAME-8*1($sp)");
}
larl ("%r7",".Lsigma");
lhi ("%r0",10);
vlm (@K[1],@K[2],"0($key)"); # load key
vl (@K[3],"0($counter)"); # load counter
vlm (@K[0],"$beperm","0(%r7)"); # load sigma, increments, ...
LABEL (".Loop_outer_vx");
vlr ($a0,@K[0]);
vlr ($b0,@K[1]);
vlr ($a1,@K[0]);
vlr ($b1,@K[1]);
vlr ($a2,@K[0]);
vlr ($b2,@K[1]);
vlr ($a3,@K[0]);
vlr ($b3,@K[1]);
vlr ($a4,@K[0]);
vlr ($b4,@K[1]);
vlr ($a5,@K[0]);
vlr ($b5,@K[1]);
vlr ($d0,@K[3]);
vaf ($d1,@K[3],$t1); # K[3]+1
vaf ($d2,@K[3],$t2); # K[3]+2
vaf ($d3,@K[3],$t3); # K[3]+3
vaf ($d4,$d2,$t2); # K[3]+4
vaf ($d5,$d2,$t3); # K[3]+5
vlr ($c0,@K[2]);
vlr ($c1,@K[2]);
vlr ($c2,@K[2]);
vlr ($c3,@K[2]);
vlr ($c4,@K[2]);
vlr ($c5,@K[2]);
vlr ($t1,$d1);
vlr ($t2,$d2);
vlr ($t3,$d3);
ALIGN (4);
LABEL (".Loop_vx");
VX_ROUND($a0,$a1,$a2,$a3,$a4,$a5,
$b0,$b1,$b2,$b3,$b4,$b5,
$c0,$c1,$c2,$c3,$c4,$c5,
$d0,$d1,$d2,$d3,$d4,$d5,
0);
VX_ROUND($a0,$a1,$a2,$a3,$a4,$a5,
$b0,$b1,$b2,$b3,$b4,$b5,
$c0,$c1,$c2,$c3,$c4,$c5,
$d0,$d1,$d2,$d3,$d4,$d5,
1);
brct ("%r0",".Loop_vx");
vaf ($a0,$a0,@K[0]);
vaf ($b0,$b0,@K[1]);
vaf ($c0,$c0,@K[2]);
vaf ($d0,$d0,@K[3]);
vaf ($a1,$a1,@K[0]);
vaf ($d1,$d1,$t1); # +K[3]+1
vperm ($a0,$a0,$a0,$beperm);
vperm ($b0,$b0,$b0,$beperm);
vperm ($c0,$c0,$c0,$beperm);
vperm ($d0,$d0,$d0,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_vx");
vaf ($d2,$d2,$t2); # +K[3]+2
vaf ($d3,$d3,$t3); # +K[3]+3
vlm ($t0,$t3,"0($inp)");
vx ($a0,$a0,$t0);
vx ($b0,$b0,$t1);
vx ($c0,$c0,$t2);
vx ($d0,$d0,$t3);
vlm (@K[0],$t3,"0(%r7)"); # re-load sigma and increments
vstm ($a0,$d0,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_vx");
vaf ($b1,$b1,@K[1]);
vaf ($c1,$c1,@K[2]);
vperm ($a0,$a1,$a1,$beperm);
vperm ($b0,$b1,$b1,$beperm);
vperm ($c0,$c1,$c1,$beperm);
vperm ($d0,$d1,$d1,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_vx");
vlm ($a1,$d1,"0($inp)");
vx ($a0,$a0,$a1);
vx ($b0,$b0,$b1);
vx ($c0,$c0,$c1);
vx ($d0,$d0,$d1);
vstm ($a0,$d0,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_vx");
vaf ($a2,$a2,@K[0]);
vaf ($b2,$b2,@K[1]);
vaf ($c2,$c2,@K[2]);
vperm ($a0,$a2,$a2,$beperm);
vperm ($b0,$b2,$b2,$beperm);
vperm ($c0,$c2,$c2,$beperm);
vperm ($d0,$d2,$d2,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_vx");
vlm ($a1,$d1,"0($inp)");
vx ($a0,$a0,$a1);
vx ($b0,$b0,$b1);
vx ($c0,$c0,$c1);
vx ($d0,$d0,$d1);
vstm ($a0,$d0,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_vx");
vaf ($a3,$a3,@K[0]);
vaf ($b3,$b3,@K[1]);
vaf ($c3,$c3,@K[2]);
vaf ($d2,@K[3],$t3); # K[3]+3
vperm ($a0,$a3,$a3,$beperm);
vperm ($b0,$b3,$b3,$beperm);
vperm ($c0,$c3,$c3,$beperm);
vperm ($d0,$d3,$d3,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_vx");
vaf ($d3,$d2,$t1); # K[3]+4
vlm ($a1,$d1,"0($inp)");
vx ($a0,$a0,$a1);
vx ($b0,$b0,$b1);
vx ($c0,$c0,$c1);
vx ($d0,$d0,$d1);
vstm ($a0,$d0,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_vx");
vaf ($a4,$a4,@K[0]);
vaf ($b4,$b4,@K[1]);
vaf ($c4,$c4,@K[2]);
vaf ($d4,$d4,$d3); # +K[3]+4
vaf ($d3,$d3,$t1); # K[3]+5
vaf (@K[3],$d2,$t3); # K[3]+=6
vperm ($a0,$a4,$a4,$beperm);
vperm ($b0,$b4,$b4,$beperm);
vperm ($c0,$c4,$c4,$beperm);
vperm ($d0,$d4,$d4,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_vx");
vlm ($a1,$d1,"0($inp)");
vx ($a0,$a0,$a1);
vx ($b0,$b0,$b1);
vx ($c0,$c0,$c1);
vx ($d0,$d0,$d1);
vstm ($a0,$d0,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
&{$z? \&aghi:\&ahi} ($len,-0x40);
je (".Ldone_vx");
vaf ($a5,$a5,@K[0]);
vaf ($b5,$b5,@K[1]);
vaf ($c5,$c5,@K[2]);
vaf ($d5,$d5,$d3); # +K[3]+5
vperm ($a0,$a5,$a5,$beperm);
vperm ($b0,$b5,$b5,$beperm);
vperm ($c0,$c5,$c5,$beperm);
vperm ($d0,$d5,$d5,$beperm);
&{$z? \&clgfi:\&clfi} ($len,0x40);
jl (".Ltail_vx");
vlm ($a1,$d1,"0($inp)");
vx ($a0,$a0,$a1);
vx ($b0,$b0,$b1);
vx ($c0,$c0,$c1);
vx ($d0,$d0,$d1);
vstm ($a0,$d0,"0($out)");
la ($inp,"0x40($inp)");
la ($out,"0x40($out)");
lhi ("%r0",10);
&{$z? \&aghi:\&ahi} ($len,-0x40);
jne (".Loop_outer_vx");
LABEL (".Ldone_vx");
if (!$z) {
ld ("%f4","$FRAME+16*$SIZE_T+2*8($sp)");
ld ("%f6","$FRAME+16*$SIZE_T+3*8($sp)");
} else {
ld ("%f8","$FRAME-8*8($sp)");
ld ("%f9","$FRAME-8*7($sp)");
ld ("%f10","$FRAME-8*6($sp)");
ld ("%f11","$FRAME-8*5($sp)");
ld ("%f12","$FRAME-8*4($sp)");
ld ("%f13","$FRAME-8*3($sp)");
ld ("%f14","$FRAME-8*2($sp)");
ld ("%f15","$FRAME-8*1($sp)");
}
&{$z? \&lmg:\&lm} ("%r6","%r7","$FRAME+6*$SIZE_T($sp)");
la ($sp,"$FRAME($sp)");
br ("%r14");
ALIGN (16);
LABEL (".Ltail_vx");
if (!$z) {
ld ("%f4","$FRAME+16*$SIZE_T+2*8($sp)");
ld ("%f6","$FRAME+16*$SIZE_T+3*8($sp)");
} else {
ld ("%f8","$FRAME-8*8($sp)");
ld ("%f9","$FRAME-8*7($sp)");
ld ("%f10","$FRAME-8*6($sp)");
ld ("%f11","$FRAME-8*5($sp)");
ld ("%f12","$FRAME-8*4($sp)");
ld ("%f13","$FRAME-8*3($sp)");
ld ("%f14","$FRAME-8*2($sp)");
ld ("%f15","$FRAME-8*1($sp)");
}
vstm ($a0,$d0,"$stdframe($sp)");
lghi ("%r1",0);
LABEL (".Loop_tail_vx");
llgc ("%r5","0(%r1,$inp)");
llgc ("%r6","$stdframe(%r1,$sp)");
xr ("%r6","%r5");
stc ("%r6","0(%r1,$out)");
la ("%r1","1(%r1)");
brct ($len,".Loop_tail_vx");
&{$z? \&lmg:\&lm} ("%r6","%r7","$FRAME+6*$SIZE_T($sp)");
la ($sp,"$FRAME($sp)");
br ("%r14");
SIZE ("ChaCha20_ctr32_vx",".-ChaCha20_ctr32_vx");
}
################
ALIGN (64);
ALIGN (32);
LABEL (".Lsigma");
LONG (0x61707865,0x3320646e,0x79622d32,0x6b206574); # endian-neutral sigma
LONG (0x00000000,0x00000001,0x00000002,0x00000003); # vaf counter increment
LONG (0x03020100,0x07060504,0x13121110,0x17161514); # vperm serialization
LONG (0x0b0a0908,0x0f0e0d0c,0x1b1a1918,0x1f1e1d1c); # vperm serialization
LONG (1,0,0,0);
LONG (2,0,0,0);
LONG (3,0,0,0);
LONG (0x03020100,0x07060504,0x0b0a0908,0x0f0e0d0c); # byte swap
LONG (0,1,2,3);
LONG (0x61707865,0x61707865,0x61707865,0x61707865); # smashed sigma
LONG (0x3320646e,0x3320646e,0x3320646e,0x3320646e);
LONG (0x79622d32,0x79622d32,0x79622d32,0x79622d32);
LONG (0x6b206574,0x6b206574,0x6b206574,0x6b206574);
ASCIZ ("\"ChaCha20 for s390x, CRYPTOGAMS by <appro\@openssl.org>\"");
ALIGN (4);
+1 -1
View File
@@ -60,7 +60,7 @@ CMS_ContentInfo *cms_CompressedData_create(int comp_nid)
return NULL;
}
BIO *cms_CompressedData_init_bio(CMS_ContentInfo *cms)
BIO *cms_CompressedData_init_bio(const CMS_ContentInfo *cms)
{
CMS_CompressedData *cd;
const ASN1_OBJECT *compoid;
+97
View File
@@ -0,0 +1,97 @@
/*
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <stddef.h>
#include <openssl/core.h>
#include "internal/cryptlib.h"
#include "internal/core.h"
#include "internal/property.h"
#include "internal/provider.h"
struct construct_data_st {
OPENSSL_CTX *libctx;
OSSL_METHOD_STORE *store;
int operation_id;
int force_store;
OSSL_METHOD_CONSTRUCT_METHOD *mcm;
void *mcm_data;
};
static int ossl_method_construct_this(OSSL_PROVIDER *provider, void *cbdata)
{
struct construct_data_st *data = cbdata;
int no_store = 0; /* Assume caching is ok */
const OSSL_ALGORITHM *map =
ossl_provider_query_operation(provider, data->operation_id, &no_store);
while (map->algorithm_name != NULL) {
const OSSL_ALGORITHM *thismap = map++;
void *method = NULL;
if ((method = data->mcm->construct(thismap->implementation, provider,
data->mcm_data)) == NULL)
continue;
if (data->force_store || !no_store) {
/*
* If we haven't been told not to store,
* add to the global store
*/
if (!data->mcm->put(data->libctx, NULL,
thismap->property_definition,
method, data->mcm_data)) {
data->mcm->destruct(method);
continue;
}
}
if (!data->mcm->put(data->libctx, data->store,
thismap->property_definition,
method, data->mcm_data)) {
data->mcm->destruct(method);
continue;
}
}
return 1;
}
void *ossl_method_construct(OPENSSL_CTX *libctx, int operation_id,
const char *name, const char *propquery,
int force_store,
OSSL_METHOD_CONSTRUCT_METHOD *mcm, void *mcm_data)
{
void *method = NULL;
if ((method = mcm->get(libctx, NULL, propquery, mcm_data)) == NULL) {
struct construct_data_st cbdata;
/*
* We have a temporary store to be able to easily search among new
* items, or items that should find themselves in the global store.
*/
if ((cbdata.store = mcm->alloc_tmp_store()) == NULL)
goto fin;
cbdata.libctx = libctx;
cbdata.operation_id = operation_id;
cbdata.force_store = force_store;
cbdata.mcm = mcm;
cbdata.mcm_data = mcm_data;
ossl_provider_forall_loaded(libctx, ossl_method_construct_this,
&cbdata);
method = mcm->get(libctx, cbdata.store, propquery, mcm_data);
mcm->dealloc_tmp_store(cbdata.store);
}
fin:
return method;
}
+11 -1
View File
@@ -1,6 +1,6 @@
/*
* Generated by util/mkerr.pl DO NOT EDIT
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -32,6 +32,8 @@ static const ERR_STRING_DATA CRYPTO_str_functs[] = {
"CRYPTO_set_ex_data"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_FIPS_MODE_SET, 0), "FIPS_mode_set"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_GET_AND_LOCK, 0), "get_and_lock"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_GET_PROVIDER_STORE, 0),
"get_provider_store"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OPENSSL_ATEXIT, 0), "OPENSSL_atexit"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OPENSSL_BUF2HEXSTR, 0),
"OPENSSL_buf2hexstr"},
@@ -44,6 +46,12 @@ static const ERR_STRING_DATA CRYPTO_str_functs[] = {
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OPENSSL_SK_DEEP_COPY, 0),
"OPENSSL_sk_deep_copy"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OPENSSL_SK_DUP, 0), "OPENSSL_sk_dup"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OSSL_PROVIDER_ADD_BUILTIN, 0),
"OSSL_PROVIDER_add_builtin"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OSSL_PROVIDER_ACTIVATE, 0),
"ossl_provider_activate"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_OSSL_PROVIDER_NEW, 0),
"ossl_provider_new"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_PKEY_HMAC_INIT, 0), "pkey_hmac_init"},
{ERR_PACK(ERR_LIB_CRYPTO, CRYPTO_F_PKEY_POLY1305_INIT, 0),
"pkey_poly1305_init"},
@@ -60,6 +68,8 @@ static const ERR_STRING_DATA CRYPTO_str_reasons[] = {
"illegal hex digit"},
{ERR_PACK(ERR_LIB_CRYPTO, 0, CRYPTO_R_ODD_NUMBER_OF_DIGITS),
"odd number of digits"},
{ERR_PACK(ERR_LIB_CRYPTO, 0, CRYPTO_R_PROVIDER_ALREADY_EXISTS),
"provider already exists"},
{0, NULL}
};
+2
View File
@@ -0,0 +1,2 @@
LIBS=../../libcrypto
SOURCE[../../libcrypto]=crmf_asn.c crmf_err.c crmf_lib.c crmf_pbm.c
+240
View File
@@ -0,0 +1,240 @@
/*-
* Copyright 2007-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Nokia 2007-2018
* Copyright Siemens AG 2015-2018
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*
* CRMF implementation by Martin Peylo, Miikka Viljanen, and David von Oheimb.
*/
#include <openssl/asn1t.h>
#include "crmf_int.h"
/* explicit #includes not strictly needed since implied by the above: */
#include <openssl/crmf.h>
ASN1_SEQUENCE(OSSL_CRMF_PRIVATEKEYINFO) = {
ASN1_SIMPLE(OSSL_CRMF_PRIVATEKEYINFO, version, ASN1_INTEGER),
ASN1_SIMPLE(OSSL_CRMF_PRIVATEKEYINFO, privateKeyAlgorithm, X509_ALGOR),
ASN1_SIMPLE(OSSL_CRMF_PRIVATEKEYINFO, privateKey, ASN1_OCTET_STRING),
ASN1_IMP_SET_OF_OPT(OSSL_CRMF_PRIVATEKEYINFO, attributes, X509_ATTRIBUTE, 0)
} ASN1_SEQUENCE_END(OSSL_CRMF_PRIVATEKEYINFO)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_PRIVATEKEYINFO)
ASN1_CHOICE(OSSL_CRMF_ENCKEYWITHID_IDENTIFIER) = {
ASN1_SIMPLE(OSSL_CRMF_ENCKEYWITHID_IDENTIFIER, value.string, ASN1_UTF8STRING),
ASN1_SIMPLE(OSSL_CRMF_ENCKEYWITHID_IDENTIFIER, value.generalName, GENERAL_NAME)
} ASN1_CHOICE_END(OSSL_CRMF_ENCKEYWITHID_IDENTIFIER)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_ENCKEYWITHID_IDENTIFIER)
ASN1_SEQUENCE(OSSL_CRMF_ENCKEYWITHID) = {
ASN1_SIMPLE(OSSL_CRMF_ENCKEYWITHID, privateKey, OSSL_CRMF_PRIVATEKEYINFO),
ASN1_OPT(OSSL_CRMF_ENCKEYWITHID, identifier,
OSSL_CRMF_ENCKEYWITHID_IDENTIFIER)
} ASN1_SEQUENCE_END(OSSL_CRMF_ENCKEYWITHID)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_ENCKEYWITHID)
ASN1_SEQUENCE(OSSL_CRMF_CERTID) = {
ASN1_SIMPLE(OSSL_CRMF_CERTID, issuer, GENERAL_NAME),
ASN1_SIMPLE(OSSL_CRMF_CERTID, serialNumber, ASN1_INTEGER)
} ASN1_SEQUENCE_END(OSSL_CRMF_CERTID)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_CERTID)
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTID)
ASN1_SEQUENCE(OSSL_CRMF_ENCRYPTEDVALUE) = {
ASN1_IMP_OPT(OSSL_CRMF_ENCRYPTEDVALUE, intendedAlg, X509_ALGOR, 0),
ASN1_IMP_OPT(OSSL_CRMF_ENCRYPTEDVALUE, symmAlg, X509_ALGOR, 1),
ASN1_IMP_OPT(OSSL_CRMF_ENCRYPTEDVALUE, encSymmKey, ASN1_BIT_STRING, 2),
ASN1_IMP_OPT(OSSL_CRMF_ENCRYPTEDVALUE, keyAlg, X509_ALGOR, 3),
ASN1_IMP_OPT(OSSL_CRMF_ENCRYPTEDVALUE, valueHint, ASN1_OCTET_STRING, 4),
ASN1_SIMPLE(OSSL_CRMF_ENCRYPTEDVALUE, encValue, ASN1_BIT_STRING)
} ASN1_SEQUENCE_END(OSSL_CRMF_ENCRYPTEDVALUE)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_ENCRYPTEDVALUE)
ASN1_SEQUENCE(OSSL_CRMF_SINGLEPUBINFO) = {
ASN1_SIMPLE(OSSL_CRMF_SINGLEPUBINFO, pubMethod, ASN1_INTEGER),
ASN1_SIMPLE(OSSL_CRMF_SINGLEPUBINFO, pubLocation, GENERAL_NAME)
} ASN1_SEQUENCE_END(OSSL_CRMF_SINGLEPUBINFO)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_SINGLEPUBINFO)
ASN1_SEQUENCE(OSSL_CRMF_PKIPUBLICATIONINFO) = {
ASN1_SIMPLE(OSSL_CRMF_PKIPUBLICATIONINFO, action, ASN1_INTEGER),
ASN1_SEQUENCE_OF_OPT(OSSL_CRMF_PKIPUBLICATIONINFO, pubInfos,
OSSL_CRMF_SINGLEPUBINFO)
} ASN1_SEQUENCE_END(OSSL_CRMF_PKIPUBLICATIONINFO)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_PKIPUBLICATIONINFO)
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CRMF_PKIPUBLICATIONINFO)
ASN1_SEQUENCE(OSSL_CRMF_PKMACVALUE) = {
ASN1_SIMPLE(OSSL_CRMF_PKMACVALUE, algId, X509_ALGOR),
ASN1_SIMPLE(OSSL_CRMF_PKMACVALUE, value, ASN1_BIT_STRING)
} ASN1_SEQUENCE_END(OSSL_CRMF_PKMACVALUE)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_PKMACVALUE)
ASN1_CHOICE(OSSL_CRMF_POPOPRIVKEY) = {
ASN1_IMP(OSSL_CRMF_POPOPRIVKEY, value.thisMessage, ASN1_BIT_STRING, 0),
ASN1_IMP(OSSL_CRMF_POPOPRIVKEY, value.subsequentMessage, ASN1_INTEGER, 1),
ASN1_IMP(OSSL_CRMF_POPOPRIVKEY, value.dhMAC, ASN1_BIT_STRING, 2),
ASN1_IMP(OSSL_CRMF_POPOPRIVKEY, value.agreeMAC, OSSL_CRMF_PKMACVALUE, 3),
/*
* TODO: This is not ASN1_NULL but CMS_ENVELOPEDDATA which should be somehow
* taken from crypto/cms which exists now - this is not used anywhere so far
*/
ASN1_IMP(OSSL_CRMF_POPOPRIVKEY, value.encryptedKey, ASN1_NULL, 4),
} ASN1_CHOICE_END(OSSL_CRMF_POPOPRIVKEY)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_POPOPRIVKEY)
ASN1_SEQUENCE(OSSL_CRMF_PBMPARAMETER) = {
ASN1_SIMPLE(OSSL_CRMF_PBMPARAMETER, salt, ASN1_OCTET_STRING),
ASN1_SIMPLE(OSSL_CRMF_PBMPARAMETER, owf, X509_ALGOR),
ASN1_SIMPLE(OSSL_CRMF_PBMPARAMETER, iterationCount, ASN1_INTEGER),
ASN1_SIMPLE(OSSL_CRMF_PBMPARAMETER, mac, X509_ALGOR)
} ASN1_SEQUENCE_END(OSSL_CRMF_PBMPARAMETER)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_PBMPARAMETER)
ASN1_CHOICE(OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO) = {
ASN1_EXP(OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO, value.sender,
GENERAL_NAME, 0),
ASN1_SIMPLE(OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO, value.publicKeyMAC,
OSSL_CRMF_PKMACVALUE)
} ASN1_CHOICE_END(OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO)
ASN1_SEQUENCE(OSSL_CRMF_POPOSIGNINGKEYINPUT) = {
ASN1_SIMPLE(OSSL_CRMF_POPOSIGNINGKEYINPUT, authInfo,
OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO),
ASN1_SIMPLE(OSSL_CRMF_POPOSIGNINGKEYINPUT, publicKey, X509_PUBKEY)
} ASN1_SEQUENCE_END(OSSL_CRMF_POPOSIGNINGKEYINPUT)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_POPOSIGNINGKEYINPUT)
ASN1_SEQUENCE(OSSL_CRMF_POPOSIGNINGKEY) = {
ASN1_IMP_OPT(OSSL_CRMF_POPOSIGNINGKEY, poposkInput,
OSSL_CRMF_POPOSIGNINGKEYINPUT, 0),
ASN1_SIMPLE(OSSL_CRMF_POPOSIGNINGKEY, algorithmIdentifier, X509_ALGOR),
ASN1_SIMPLE(OSSL_CRMF_POPOSIGNINGKEY, signature, ASN1_BIT_STRING)
} ASN1_SEQUENCE_END(OSSL_CRMF_POPOSIGNINGKEY)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_POPOSIGNINGKEY)
ASN1_CHOICE(OSSL_CRMF_POPO) = {
ASN1_IMP(OSSL_CRMF_POPO, value.raVerified, ASN1_NULL, 0),
ASN1_IMP(OSSL_CRMF_POPO, value.signature, OSSL_CRMF_POPOSIGNINGKEY, 1),
ASN1_EXP(OSSL_CRMF_POPO, value.keyEncipherment, OSSL_CRMF_POPOPRIVKEY, 2),
ASN1_EXP(OSSL_CRMF_POPO, value.keyAgreement, OSSL_CRMF_POPOPRIVKEY, 3)
} ASN1_CHOICE_END(OSSL_CRMF_POPO)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_POPO)
ASN1_ADB_TEMPLATE(attributetypeandvalue_default) = ASN1_OPT(
OSSL_CRMF_ATTRIBUTETYPEANDVALUE, value.other, ASN1_ANY);
ASN1_ADB(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) = {
ADB_ENTRY(NID_id_regCtrl_regToken,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.regToken, ASN1_UTF8STRING)),
ADB_ENTRY(NID_id_regCtrl_authenticator,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.authenticator, ASN1_UTF8STRING)),
ADB_ENTRY(NID_id_regCtrl_pkiPublicationInfo,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.pkiPublicationInfo,
OSSL_CRMF_PKIPUBLICATIONINFO)),
ADB_ENTRY(NID_id_regCtrl_oldCertID,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.oldCertID, OSSL_CRMF_CERTID)),
ADB_ENTRY(NID_id_regCtrl_protocolEncrKey,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.protocolEncrKey, X509_PUBKEY)),
ADB_ENTRY(NID_id_regInfo_utf8Pairs,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.utf8Pairs, ASN1_UTF8STRING)),
ADB_ENTRY(NID_id_regInfo_certReq,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.certReq, OSSL_CRMF_CERTREQUEST)),
} ASN1_ADB_END(OSSL_CRMF_ATTRIBUTETYPEANDVALUE, 0, type, 0,
&attributetypeandvalue_default_tt, NULL);
ASN1_SEQUENCE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) = {
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE, type, ASN1_OBJECT),
ASN1_ADB_OBJECT(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
} ASN1_SEQUENCE_END(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
ASN1_SEQUENCE(OSSL_CRMF_OPTIONALVALIDITY) = {
ASN1_EXP_OPT(OSSL_CRMF_OPTIONALVALIDITY, notBefore, ASN1_TIME, 0),
ASN1_EXP_OPT(OSSL_CRMF_OPTIONALVALIDITY, notAfter, ASN1_TIME, 1)
} ASN1_SEQUENCE_END(OSSL_CRMF_OPTIONALVALIDITY)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_OPTIONALVALIDITY)
ASN1_SEQUENCE(OSSL_CRMF_CERTTEMPLATE) = {
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, version, ASN1_INTEGER, 0),
/*
* serialNumber MUST be omitted. This field is assigned by the CA
* during certificate creation.
*/
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, serialNumber, ASN1_INTEGER, 1),
/*
* signingAlg MUST be omitted. This field is assigned by the CA
* during certificate creation.
*/
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, signingAlg, X509_ALGOR, 2),
ASN1_EXP_OPT(OSSL_CRMF_CERTTEMPLATE, issuer, X509_NAME, 3),
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, validity,
OSSL_CRMF_OPTIONALVALIDITY, 4),
ASN1_EXP_OPT(OSSL_CRMF_CERTTEMPLATE, subject, X509_NAME, 5),
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, publicKey, X509_PUBKEY, 6),
/* issuerUID is deprecated in version 2 */
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, issuerUID, ASN1_BIT_STRING, 7),
/* subjectUID is deprecated in version 2 */
ASN1_IMP_OPT(OSSL_CRMF_CERTTEMPLATE, subjectUID, ASN1_BIT_STRING, 8),
ASN1_IMP_SEQUENCE_OF_OPT(OSSL_CRMF_CERTTEMPLATE, extensions,
X509_EXTENSION, 9),
} ASN1_SEQUENCE_END(OSSL_CRMF_CERTTEMPLATE)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_CERTTEMPLATE)
ASN1_SEQUENCE(OSSL_CRMF_CERTREQUEST) = {
ASN1_SIMPLE(OSSL_CRMF_CERTREQUEST, certReqId, ASN1_INTEGER),
ASN1_SIMPLE(OSSL_CRMF_CERTREQUEST, certTemplate, OSSL_CRMF_CERTTEMPLATE),
ASN1_SEQUENCE_OF_OPT(OSSL_CRMF_CERTREQUEST, controls,
OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
} ASN1_SEQUENCE_END(OSSL_CRMF_CERTREQUEST)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_CERTREQUEST)
IMPLEMENT_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTREQUEST)
ASN1_SEQUENCE(OSSL_CRMF_MSG) = {
ASN1_SIMPLE(OSSL_CRMF_MSG, certReq, OSSL_CRMF_CERTREQUEST),
ASN1_OPT(OSSL_CRMF_MSG, popo, OSSL_CRMF_POPO),
ASN1_SEQUENCE_OF_OPT(OSSL_CRMF_MSG, regInfo,
OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
} ASN1_SEQUENCE_END(OSSL_CRMF_MSG)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_MSG)
ASN1_ITEM_TEMPLATE(OSSL_CRMF_MSGS) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
OSSL_CRMF_MSGS, OSSL_CRMF_MSG)
ASN1_ITEM_TEMPLATE_END(OSSL_CRMF_MSGS)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_MSGS)
+104
View File
@@ -0,0 +1,104 @@
/*
* Generated by util/mkerr.pl DO NOT EDIT
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <openssl/err.h>
#include <openssl/crmferr.h>
#ifndef OPENSSL_NO_ERR
static const ERR_STRING_DATA CRMF_str_functs[] = {
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_CRMF_POPOSIGNINGKEY_INIT, 0),
"CRMF_poposigningkey_init"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_CERTID_GEN, 0),
"OSSL_CRMF_CERTID_gen"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_CERTTEMPLATE_FILL, 0),
"OSSL_CRMF_CERTTEMPLATE_fill"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT, 0),
"OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSGS_VERIFY_POPO, 0),
"OSSL_CRMF_MSGS_verify_popo"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_CREATE_POPO, 0),
"OSSL_CRMF_MSG_create_popo"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_GET0_TMPL, 0),
"OSSL_CRMF_MSG_get0_tmpl"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_GET_CERTREQID, 0),
"OSSL_CRMF_MSG_get_certReqId"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_PKIPUBLICATIONINFO_PUSH0_SINGLEPUBINFO, 0),
"OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_PUSH0_EXTENSION, 0),
"OSSL_CRMF_MSG_push0_extension"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_PUSH0_REGCTRL, 0),
"OSSL_CRMF_MSG_push0_regCtrl"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_PUSH0_REGINFO, 0),
"OSSL_CRMF_MSG_push0_regInfo"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_SET0_EXTENSIONS, 0),
"OSSL_CRMF_MSG_set0_extensions"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_SET0_SINGLEPUBINFO, 0),
"OSSL_CRMF_MSG_set0_SinglePubInfo"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_SET_CERTREQID, 0),
"OSSL_CRMF_MSG_set_certReqId"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_SET_PKIPUBLICATIONINFO_ACTION, 0),
"OSSL_CRMF_MSG_set_PKIPublicationInfo_action"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_MSG_SET_VALIDITY, 0),
"OSSL_CRMF_MSG_set_validity"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_PBMP_NEW, 0),
"OSSL_CRMF_pbmp_new"},
{ERR_PACK(ERR_LIB_CRMF, CRMF_F_OSSL_CRMF_PBM_NEW, 0), "OSSL_CRMF_pbm_new"},
{0, NULL}
};
static const ERR_STRING_DATA CRMF_str_reasons[] = {
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_BAD_PBM_ITERATIONCOUNT),
"bad pbm iterationcount"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_CRMFERROR), "crmferror"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_ERROR), "error"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_ERROR_DECODING_CERTIFICATE),
"error decoding certificate"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_ERROR_DECRYPTING_CERTIFICATE),
"error decrypting certificate"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY),
"error decrypting symmetric key"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_FAILURE_OBTAINING_RANDOM),
"failure obtaining random"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_ITERATIONCOUNT_BELOW_100),
"iterationcount below 100"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_MALFORMED_IV), "malformed iv"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_NULL_ARGUMENT), "null argument"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_SETTING_MAC_ALGOR_FAILURE),
"setting mac algor failure"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_SETTING_OWF_ALGOR_FAILURE),
"setting owf algor failure"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_UNSUPPORTED_ALGORITHM),
"unsupported algorithm"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_UNSUPPORTED_ALG_FOR_POPSIGNINGKEY),
"unsupported alg for popsigningkey"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_UNSUPPORTED_CIPHER),
"unsupported cipher"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO),
"unsupported method for creating popo"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_UNSUPPORTED_POPO_METHOD),
"unsupported popo method"},
{ERR_PACK(ERR_LIB_CRMF, 0, CRMF_R_UNSUPPORTED_POPO_NOT_ACCEPTED),
"unsupported popo not accepted"},
{0, NULL}
};
#endif
int ERR_load_CRMF_strings(void)
{
#ifndef OPENSSL_NO_ERR
if (ERR_func_error_string(CRMF_str_functs[0].error) == NULL) {
ERR_load_strings_const(CRMF_str_functs);
ERR_load_strings_const(CRMF_str_reasons);
}
#endif
return 1;
}
+394
View File
@@ -0,0 +1,394 @@
/*-
* Copyright 2007-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Nokia 2007-2018
* Copyright Siemens AG 2015-2018
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*
* CRMF implementation by Martin Peylo, Miikka Viljanen, and David von Oheimb.
*/
#ifndef OSSL_HEADER_CRMF_INT_H
# define OSSL_HEADER_CRMF_INT_H
# include <openssl/crmf.h>
# include <openssl/err.h>
/* explicit #includes not strictly needed since implied by the above: */
# include <openssl/ossl_typ.h>
# include <openssl/safestack.h>
# include <openssl/x509.h>
# include <openssl/x509v3.h>
/*-
* EncryptedValue ::= SEQUENCE {
* intendedAlg [0] AlgorithmIdentifier OPTIONAL,
* -- the intended algorithm for which the value will be used
* symmAlg [1] AlgorithmIdentifier OPTIONAL,
* -- the symmetric algorithm used to encrypt the value
* encSymmKey [2] BIT STRING OPTIONAL,
* -- the (encrypted) symmetric key used to encrypt the value
* keyAlg [3] AlgorithmIdentifier OPTIONAL,
* -- algorithm used to encrypt the symmetric key
* valueHint [4] OCTET STRING OPTIONAL,
* -- a brief description or identifier of the encValue content
* -- (may be meaningful only to the sending entity, and
* -- used only if EncryptedValue might be re-examined
* -- by the sending entity in the future)
* encValue BIT STRING
* -- the encrypted value itself
* }
*/
struct OSSL_crmf_encryptedvalue_st {
X509_ALGOR *intendedAlg; /* 0 */
X509_ALGOR *symmAlg; /* 1 */
ASN1_BIT_STRING *encSymmKey; /* 2 */
X509_ALGOR *keyAlg; /* 3 */
ASN1_OCTET_STRING *valueHint; /* 4 */
ASN1_BIT_STRING *encValue;
} /* OSSL_CRMF_ENCRYPTEDVALUE */;
/*-
* Attributes ::= SET OF Attribute
* => X509_ATTRIBUTE
*
* PrivateKeyInfo ::= SEQUENCE {
* version INTEGER,
* privateKeyAlgorithm AlgorithmIdentifier,
* privateKey OCTET STRING,
* attributes [0] IMPLICIT Attributes OPTIONAL
* }
*/
typedef struct OSSL_crmf_privatekeyinfo_st {
ASN1_INTEGER *version;
X509_ALGOR *privateKeyAlgorithm;
ASN1_OCTET_STRING *privateKey;
STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
} OSSL_CRMF_PRIVATEKEYINFO;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PRIVATEKEYINFO)
/*-
* section 4.2.1 Private Key Info Content Type
* id-ct-encKeyWithID OBJECT IDENTIFIER ::= {id-ct 21}
*
* EncKeyWithID ::= SEQUENCE {
* privateKey PrivateKeyInfo,
* identifier CHOICE {
* string UTF8String,
* generalName GeneralName
* } OPTIONAL
* }
*/
typedef struct OSSL_crmf_enckeywithid_identifier_st {
int type;
union {
ASN1_UTF8STRING *string;
GENERAL_NAME *generalName;
} value;
} OSSL_CRMF_ENCKEYWITHID_IDENTIFIER;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCKEYWITHID_IDENTIFIER)
typedef struct OSSL_crmf_enckeywithid_st {
OSSL_CRMF_PRIVATEKEYINFO *privateKey;
/* [0] */
OSSL_CRMF_ENCKEYWITHID_IDENTIFIER *identifier;
} OSSL_CRMF_ENCKEYWITHID;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ENCKEYWITHID)
/*-
* CertId ::= SEQUENCE {
* issuer GeneralName,
* serialNumber INTEGER
* }
*/
struct OSSL_crmf_certid_st {
GENERAL_NAME *issuer;
ASN1_INTEGER *serialNumber;
} /* OSSL_CRMF_CERTID */;
DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTID)
/*-
* SinglePubInfo ::= SEQUENCE {
* pubMethod INTEGER {
* dontCare (0),
* x500 (1),
* web (2),
* ldap (3) },
* pubLocation GeneralName OPTIONAL
* }
*/
struct OSSL_crmf_singlepubinfo_st {
ASN1_INTEGER *pubMethod;
GENERAL_NAME *pubLocation;
} /* OSSL_CRMF_SINGLEPUBINFO */;
DEFINE_STACK_OF(OSSL_CRMF_SINGLEPUBINFO)
typedef STACK_OF(OSSL_CRMF_SINGLEPUBINFO) OSSL_CRMF_PUBINFOS;
/*-
* PKIPublicationInfo ::= SEQUENCE {
* action INTEGER {
* dontPublish (0),
* pleasePublish (1) },
* pubInfos SEQUENCE SIZE (1..MAX) OF SinglePubInfo OPTIONAL
* -- pubInfos MUST NOT be present if action is "dontPublish"
* -- (if action is "pleasePublish" and pubInfos is omitted,
* -- "dontCare" is assumed)
* }
*/
struct OSSL_crmf_pkipublicationinfo_st {
ASN1_INTEGER *action;
OSSL_CRMF_PUBINFOS *pubInfos;
} /* OSSL_CRMF_PKIPUBLICATIONINFO */;
DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_PKIPUBLICATIONINFO)
/*-
* PKMACValue ::= SEQUENCE {
* algId AlgorithmIdentifier,
* -- algorithm value shall be PasswordBasedMac {1 2 840 113533 7 66 13}
* -- parameter value is PBMParameter
* value BIT STRING
* }
*/
typedef struct OSSL_crmf_pkmacvalue_st {
X509_ALGOR *algId;
ASN1_BIT_STRING *value;
} OSSL_CRMF_PKMACVALUE;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_PKMACVALUE)
/*-
* SubsequentMessage ::= INTEGER {
* encrCert (0),
* -- requests that resulting certificate be encrypted for the
* -- end entity (following which, POP will be proven in a
* -- confirmation message)
* challengeResp (1)
* -- requests that CA engage in challenge-response exchange with
* -- end entity in order to prove private key possession
* }
*
* POPOPrivKey ::= CHOICE {
* thisMessage [0] BIT STRING, -- Deprecated
* -- possession is proven in this message (which contains the private
* -- key itself (encrypted for the CA))
* subsequentMessage [1] SubsequentMessage,
* -- possession will be proven in a subsequent message
* dhMAC [2] BIT STRING, -- Deprecated
* agreeMAC [3] PKMACValue,
* encryptedKey [4] EnvelopedData
* }
*/
typedef struct OSSL_crmf_popoprivkey_st {
int type;
union {
ASN1_BIT_STRING *thisMessage; /* 0 */ /* Deprecated */
ASN1_INTEGER *subsequentMessage; /* 1 */
ASN1_BIT_STRING *dhMAC; /* 2 */ /* Deprecated */
OSSL_CRMF_PKMACVALUE *agreeMAC; /* 3 */
/*
* TODO: This is not ASN1_NULL but CMS_ENVELOPEDDATA which should be
* somehow taken from crypto/cms which exists now
* - this is not used anywhere so far
*/
ASN1_NULL *encryptedKey; /* 4 */
} value;
} OSSL_CRMF_POPOPRIVKEY;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_POPOPRIVKEY)
/*-
* PBMParameter ::= SEQUENCE {
* salt OCTET STRING,
* owf AlgorithmIdentifier,
* -- AlgId for a One-Way Function (SHA-1 recommended)
* iterationCount INTEGER,
* -- number of times the OWF is applied
* mac AlgorithmIdentifier
* -- the MAC AlgId (e.g., DES-MAC, Triple-DES-MAC [PKCS11],
* -- or HMAC [HMAC, RFC2202])
* }
*/
struct OSSL_crmf_pbmparameter_st {
ASN1_OCTET_STRING *salt;
X509_ALGOR *owf;
ASN1_INTEGER *iterationCount;
X509_ALGOR *mac;
} /* OSSL_CRMF_PBMPARAMETER */;
#define OSSL_CRMF_PBM_MAX_ITERATION_COUNT 100000 /* if too large allows DoS */
/*-
* POPOSigningKeyInput ::= SEQUENCE {
* authInfo CHOICE {
* sender [0] GeneralName,
* -- used only if an authenticated identity has been
* -- established for the sender (e.g., a DN from a
* -- previously-issued and currently-valid certificate)
* publicKeyMAC PKMACValue },
* -- used if no authenticated GeneralName currently exists for
* -- the sender; publicKeyMAC contains a password-based MAC
* -- on the DER-encoded value of publicKey
* publicKey SubjectPublicKeyInfo -- from CertTemplate
* }
*/
typedef struct OSSL_crmf_poposigningkeyinput_authinfo_st {
int type;
union {
/* 0 */ GENERAL_NAME *sender;
/* 1 */ OSSL_CRMF_PKMACVALUE *publicKeyMAC;
} value;
} OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO)
typedef struct OSSL_crmf_poposigningkeyinput_st {
OSSL_CRMF_POPOSIGNINGKEYINPUT_AUTHINFO *authInfo;
X509_PUBKEY *publicKey;
} OSSL_CRMF_POPOSIGNINGKEYINPUT;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_POPOSIGNINGKEYINPUT)
/*-
* POPOSigningKey ::= SEQUENCE {
* poposkInput [0] POPOSigningKeyInput OPTIONAL,
* algorithmIdentifier AlgorithmIdentifier,
* signature BIT STRING
* }
*/
struct OSSL_crmf_poposigningkey_st {
OSSL_CRMF_POPOSIGNINGKEYINPUT *poposkInput;
X509_ALGOR *algorithmIdentifier;
ASN1_BIT_STRING *signature;
} /* OSSL_CRMF_POPOSIGNINGKEY */;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_POPOSIGNINGKEY)
/*-
* ProofOfPossession ::= CHOICE {
* raVerified [0] NULL,
* -- used if the RA has already verified that the requester is in
* -- possession of the private key
* signature [1] POPOSigningKey,
* keyEncipherment [2] POPOPrivKey,
* keyAgreement [3] POPOPrivKey
* }
*/
typedef struct OSSL_crmf_popo_st {
int type;
union {
ASN1_NULL *raVerified; /* 0 */
OSSL_CRMF_POPOSIGNINGKEY *signature; /* 1 */
OSSL_CRMF_POPOPRIVKEY *keyEncipherment; /* 2 */
OSSL_CRMF_POPOPRIVKEY *keyAgreement; /* 3 */
} value;
} OSSL_CRMF_POPO;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_POPO)
/*-
* OptionalValidity ::= SEQUENCE {
* notBefore [0] Time OPTIONAL,
* notAfter [1] Time OPTIONAL -- at least one MUST be present
* }
*/
struct OSSL_crmf_optionalvalidity_st {
/* 0 */ ASN1_TIME *notBefore;
/* 1 */ ASN1_TIME *notAfter;
} /* OSSL_CRMF_OPTIONALVALIDITY */;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_OPTIONALVALIDITY)
/*-
* CertTemplate ::= SEQUENCE {
* version [0] Version OPTIONAL,
* serialNumber [1] INTEGER OPTIONAL,
* signingAlg [2] AlgorithmIdentifier OPTIONAL,
* issuer [3] Name OPTIONAL,
* validity [4] OptionalValidity OPTIONAL,
* subject [5] Name OPTIONAL,
* publicKey [6] SubjectPublicKeyInfo OPTIONAL,
* issuerUID [7] UniqueIdentifier OPTIONAL,
* subjectUID [8] UniqueIdentifier OPTIONAL,
* extensions [9] Extensions OPTIONAL
* }
*/
struct OSSL_crmf_certtemplate_st {
ASN1_INTEGER *version; /* 0 */
ASN1_INTEGER *serialNumber; /* 1 */ /* serialNumber MUST be omitted */
/* This field is assigned by the CA during certificate creation */
X509_ALGOR *signingAlg; /* 2 */ /* signingAlg MUST be omitted */
/* This field is assigned by the CA during certificate creation */
X509_NAME *issuer; /* 3 */
OSSL_CRMF_OPTIONALVALIDITY *validity; /* 4 */
X509_NAME *subject; /* 5 */
X509_PUBKEY *publicKey; /* 6 */
ASN1_BIT_STRING *issuerUID; /* 7 */ /* deprecated in version 2 */
/* According to rfc 3280: UniqueIdentifier ::= BIT STRING */
ASN1_BIT_STRING *subjectUID; /* 8 */ /* deprecated in version 2 */
/* Could be X509_EXTENSION*S*, but that's only cosmetic */
STACK_OF(X509_EXTENSION) *extensions; /* 9 */
} /* OSSL_CRMF_CERTTEMPLATE */;
/*-
* CertRequest ::= SEQUENCE {
* certReqId INTEGER, -- ID for matching request and reply
* certTemplate CertTemplate, -- Selected fields of cert to be issued
* controls Controls OPTIONAL -- Attributes affecting issuance
* }
*/
struct OSSL_crmf_certrequest_st {
ASN1_INTEGER *certReqId;
OSSL_CRMF_CERTTEMPLATE *certTemplate;
/* TODO: make OSSL_CRMF_CONTROLS out of that - but only cosmetical */
STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *controls;
} /* OSSL_CRMF_CERTREQUEST */;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_CERTREQUEST)
DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_CERTREQUEST)
/* TODO: isn't there a better way to have this for ANY type? */
struct OSSL_crmf_attributetypeandvalue_st {
ASN1_OBJECT *type;
union {
/* NID_id_regCtrl_regToken */
ASN1_UTF8STRING *regToken;
/* NID_id_regCtrl_authenticator */
ASN1_UTF8STRING *authenticator;
/* NID_id_regCtrl_pkiPublicationInfo */
OSSL_CRMF_PKIPUBLICATIONINFO *pkiPublicationInfo;
/* NID_id_regCtrl_oldCertID */
OSSL_CRMF_CERTID *oldCertID;
/* NID_id_regCtrl_protocolEncrKey */
X509_PUBKEY *protocolEncrKey;
/* NID_id_regInfo_utf8Pairs */
ASN1_UTF8STRING *utf8Pairs;
/* NID_id_regInfo_certReq */
OSSL_CRMF_CERTREQUEST *certReq;
ASN1_TYPE *other;
} value;
} /* OSSL_CRMF_ATTRIBUTETYPEANDVALUE */;
DECLARE_ASN1_FUNCTIONS(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
DEFINE_STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
DECLARE_ASN1_DUP_FUNCTION(OSSL_CRMF_ATTRIBUTETYPEANDVALUE)
/*-
* CertReqMessages ::= SEQUENCE SIZE (1..MAX) OF CertReqMsg
* CertReqMsg ::= SEQUENCE {
* certReq CertRequest,
* popo ProofOfPossession OPTIONAL,
* -- content depends upon key type
* regInfo SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue OPTIONAL
* }
*/
struct OSSL_crmf_msg_st {
OSSL_CRMF_CERTREQUEST *certReq;
/* 0 */
OSSL_CRMF_POPO *popo;
/* 1 */
STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *regInfo;
} /* OSSL_CRMF_MSG */;
/* DEFINE_STACK_OF(OSSL_CRMF_MSG) */
#endif
+753
View File
@@ -0,0 +1,753 @@
/*-
* Copyright 2007-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Nokia 2007-2018
* Copyright Siemens AG 2015-2018
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*
* CRMF implementation by Martin Peylo, Miikka Viljanen, and David von Oheimb.
*/
/*
* This file contains the functions that handle the individual items inside
* the CRMF structures
*/
/*
* NAMING
*
* The 0 functions use the supplied structure pointer directly in the parent and
* it will be freed up when the parent is freed.
*
* The 1 functions use a copy of the supplied structure pointer (or in some
* cases increases its link count) in the parent and so both should be freed up.
*/
#include <openssl/asn1t.h>
#include "crmf_int.h"
/* explicit #includes not strictly needed since implied by the above: */
#include <openssl/crmf.h>
#include <openssl/err.h>
#include <openssl/evp.h>
/*-
* atyp = Attribute Type
* valt = Value Type
* ctrlinf = "regCtrl" or "regInfo"
*/
#define IMPLEMENT_CRMF_CTRL_FUNC(atyp, valt, ctrlinf) \
int OSSL_CRMF_MSG_set1_##ctrlinf##_##atyp(OSSL_CRMF_MSG *msg, \
const valt *in) \
{ \
OSSL_CRMF_ATTRIBUTETYPEANDVALUE *atav = NULL; \
\
if (msg == NULL || in == NULL) \
goto err; \
if ((atav = OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new()) == NULL) \
goto err; \
if ((atav->type = OBJ_nid2obj(NID_id_##ctrlinf##_##atyp)) == NULL) \
goto err; \
if ((atav->value.atyp = valt##_dup(in)) == NULL) \
goto err; \
if (!OSSL_CRMF_MSG_push0_##ctrlinf(msg, atav)) \
goto err; \
return 1; \
err: \
OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(atav); \
return 0; \
}
/*-
* Pushes the given control attribute into the controls stack of a CertRequest
* (section 6)
* returns 1 on success, 0 on error
*/
static int OSSL_CRMF_MSG_push0_regCtrl(OSSL_CRMF_MSG *crm,
OSSL_CRMF_ATTRIBUTETYPEANDVALUE *ctrl)
{
int new = 0;
if (crm == NULL || crm->certReq == NULL || ctrl == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PUSH0_REGCTRL, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (crm->certReq->controls == NULL) {
crm->certReq->controls = sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_null();
if (crm->certReq->controls == NULL)
goto oom;
new = 1;
}
if (!sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push(crm->certReq->controls, ctrl))
goto oom;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PUSH0_REGCTRL, ERR_R_MALLOC_FAILURE);
if (new != 0) {
sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(crm->certReq->controls);
crm->certReq->controls = NULL;
}
return 0;
}
/* id-regCtrl-regToken Control (section 6.1) */
IMPLEMENT_CRMF_CTRL_FUNC(regToken, ASN1_STRING, regCtrl)
/* id-regCtrl-authenticator Control (section 6.2) */
#define ASN1_UTF8STRING_dup ASN1_STRING_dup
IMPLEMENT_CRMF_CTRL_FUNC(authenticator, ASN1_UTF8STRING, regCtrl)
int OSSL_CRMF_MSG_set0_SinglePubInfo(OSSL_CRMF_SINGLEPUBINFO *spi,
int method, GENERAL_NAME *nm)
{
if (spi == NULL
|| method < OSSL_CRMF_PUB_METHOD_DONTCARE
|| method > OSSL_CRMF_PUB_METHOD_LDAP) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_SET0_SINGLEPUBINFO,
ERR_R_PASSED_INVALID_ARGUMENT);
return 0;
}
if (!ASN1_INTEGER_set(spi->pubMethod, method))
return 0;
GENERAL_NAME_free(spi->pubLocation);
spi->pubLocation = nm;
return 1;
}
int OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo(
OSSL_CRMF_PKIPUBLICATIONINFO *pi,
OSSL_CRMF_SINGLEPUBINFO *spi)
{
if (pi == NULL || spi == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PKIPUBLICATIONINFO_PUSH0_SINGLEPUBINFO,
CRMF_R_NULL_ARGUMENT);
return 0;
}
if (pi->pubInfos == NULL)
pi->pubInfos = sk_OSSL_CRMF_SINGLEPUBINFO_new_null();
if (pi->pubInfos == NULL)
goto oom;
if (!sk_OSSL_CRMF_SINGLEPUBINFO_push(pi->pubInfos, spi))
goto oom;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PKIPUBLICATIONINFO_PUSH0_SINGLEPUBINFO,
ERR_R_MALLOC_FAILURE);
return 0;
}
int OSSL_CRMF_MSG_set_PKIPublicationInfo_action(
OSSL_CRMF_PKIPUBLICATIONINFO *pi, int action)
{
if (pi == NULL
|| action < OSSL_CRMF_PUB_ACTION_DONTPUBLISH
|| action > OSSL_CRMF_PUB_ACTION_PLEASEPUBLISH) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_SET_PKIPUBLICATIONINFO_ACTION,
ERR_R_PASSED_INVALID_ARGUMENT);
return 0;
}
return ASN1_INTEGER_set(pi->action, action);
}
/* id-regCtrl-pkiPublicationInfo Control (section 6.3) */
IMPLEMENT_CRMF_CTRL_FUNC(pkiPublicationInfo, OSSL_CRMF_PKIPUBLICATIONINFO,
regCtrl)
/* id-regCtrl-oldCertID Control (section 6.5) from the given */
IMPLEMENT_CRMF_CTRL_FUNC(oldCertID, OSSL_CRMF_CERTID, regCtrl)
OSSL_CRMF_CERTID *OSSL_CRMF_CERTID_gen(const X509_NAME *issuer,
const ASN1_INTEGER *serial)
{
OSSL_CRMF_CERTID *cid = NULL;
if (issuer == NULL || serial == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_CERTID_GEN, CRMF_R_NULL_ARGUMENT);
return NULL;
}
if ((cid = OSSL_CRMF_CERTID_new()) == NULL)
goto oom;
if (!X509_NAME_set(&cid->issuer->d.directoryName, issuer))
goto oom;
cid->issuer->type = GEN_DIRNAME;
ASN1_INTEGER_free(cid->serialNumber);
if ((cid->serialNumber = ASN1_INTEGER_dup(serial)) == NULL)
goto oom;
return cid;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_CERTID_GEN, ERR_R_MALLOC_FAILURE);
OSSL_CRMF_CERTID_free(cid);
return NULL;
}
/*
* id-regCtrl-protocolEncrKey Control (section 6.6)
*
* For some reason X509_PUBKEY_dup() is not implemented in OpenSSL X509
* TODO: check whether that should go elsewhere
*/
static IMPLEMENT_ASN1_DUP_FUNCTION(X509_PUBKEY)
IMPLEMENT_CRMF_CTRL_FUNC(protocolEncrKey, X509_PUBKEY, regCtrl)
/*-
* Pushes the attribute given in regInfo in to the CertReqMsg->regInfo stack.
* (section 7)
* returns 1 on success, 0 on error
*/
static int OSSL_CRMF_MSG_push0_regInfo(OSSL_CRMF_MSG *crm,
OSSL_CRMF_ATTRIBUTETYPEANDVALUE *ri)
{
STACK_OF(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) *info = NULL;
if (crm == NULL || ri == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PUSH0_REGINFO, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (crm->regInfo == NULL)
crm->regInfo = info = sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_new_null();
if (crm->regInfo == NULL)
goto oom;
if (!sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_push(crm->regInfo, ri))
goto oom;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PUSH0_REGINFO, ERR_R_MALLOC_FAILURE);
if (info != NULL)
crm->regInfo = NULL;
sk_OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free(info);
return 0;
}
/* id-regInfo-utf8Pairs to regInfo (section 7.1) */
IMPLEMENT_CRMF_CTRL_FUNC(utf8Pairs, ASN1_UTF8STRING, regInfo)
/* id-regInfo-certReq to regInfo (section 7.2) */
IMPLEMENT_CRMF_CTRL_FUNC(certReq, OSSL_CRMF_CERTREQUEST, regInfo)
/* retrieves the certificate template of crm */
OSSL_CRMF_CERTTEMPLATE *OSSL_CRMF_MSG_get0_tmpl(const OSSL_CRMF_MSG *crm)
{
if (crm == NULL || crm->certReq == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_GET0_TMPL, CRMF_R_NULL_ARGUMENT);
return NULL;
}
return crm->certReq->certTemplate;
}
int OSSL_CRMF_MSG_set_validity(OSSL_CRMF_MSG *crm, time_t from, time_t to)
{
OSSL_CRMF_OPTIONALVALIDITY *vld = NULL;
ASN1_TIME *from_asn = NULL;
ASN1_TIME *to_asn = NULL;
OSSL_CRMF_CERTTEMPLATE *tmpl = OSSL_CRMF_MSG_get0_tmpl(crm);
if (tmpl == NULL) { /* also crm == NULL implies this */
CRMFerr(CRMF_F_OSSL_CRMF_MSG_SET_VALIDITY, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (from != 0 && ((from_asn = ASN1_TIME_set(NULL, from)) == NULL))
goto oom;
if (to != 0 && ((to_asn = ASN1_TIME_set(NULL, to)) == NULL))
goto oom;
if ((vld = OSSL_CRMF_OPTIONALVALIDITY_new()) == NULL)
goto oom;
vld->notBefore = from_asn;
vld->notAfter = to_asn;
tmpl->validity = vld;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_SET_VALIDITY, ERR_R_MALLOC_FAILURE);
ASN1_TIME_free(from_asn);
ASN1_TIME_free(to_asn);
return 0;
}
int OSSL_CRMF_MSG_set_certReqId(OSSL_CRMF_MSG *crm, int rid)
{
if (crm == NULL || crm->certReq == NULL || crm->certReq->certReqId == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_SET_CERTREQID, CRMF_R_NULL_ARGUMENT);
return 0;
}
return ASN1_INTEGER_set(crm->certReq->certReqId, rid);
}
/* get ASN.1 encoded integer, return -1 on error */
static int crmf_asn1_get_int(int func, const ASN1_INTEGER *a)
{
int64_t res;
if (!ASN1_INTEGER_get_int64(&res, a)) {
CRMFerr(func, ASN1_R_INVALID_NUMBER);
return -1;
}
if (res < INT_MIN) {
CRMFerr(func, ASN1_R_TOO_SMALL);
return -1;
}
if (res > INT_MAX) {
CRMFerr(func, ASN1_R_TOO_LARGE);
return -1;
}
return (int)res;
}
int OSSL_CRMF_MSG_get_certReqId(OSSL_CRMF_MSG *crm)
{
if (crm == NULL || /* not really needed: */ crm->certReq == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_GET_CERTREQID, CRMF_R_NULL_ARGUMENT);
return -1;
}
return crmf_asn1_get_int(CRMF_F_OSSL_CRMF_MSG_GET_CERTREQID,
crm->certReq->certReqId);
}
int OSSL_CRMF_MSG_set0_extensions(OSSL_CRMF_MSG *crm,
X509_EXTENSIONS *exts)
{
OSSL_CRMF_CERTTEMPLATE *tmpl = OSSL_CRMF_MSG_get0_tmpl(crm);
if (tmpl == NULL) { /* also crm == NULL implies this */
CRMFerr(CRMF_F_OSSL_CRMF_MSG_SET0_EXTENSIONS, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (sk_X509_EXTENSION_num(exts) == 0) {
sk_X509_EXTENSION_free(exts);
exts = NULL; /* do not include empty extensions list */
}
sk_X509_EXTENSION_pop_free(tmpl->extensions, X509_EXTENSION_free);
tmpl->extensions = exts;
return 1;
}
int OSSL_CRMF_MSG_push0_extension(OSSL_CRMF_MSG *crm,
const X509_EXTENSION *ext)
{
int new = 0;
OSSL_CRMF_CERTTEMPLATE *tmpl = OSSL_CRMF_MSG_get0_tmpl(crm);
if (tmpl == NULL || ext == NULL) { /* also crm == NULL implies this */
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PUSH0_EXTENSION, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (tmpl->extensions == NULL) {
if ((tmpl->extensions = sk_X509_EXTENSION_new_null()) == NULL)
goto oom;
new = 1;
}
if (!sk_X509_EXTENSION_push(tmpl->extensions, (X509_EXTENSION *)ext))
goto oom;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_PUSH0_EXTENSION, ERR_R_MALLOC_FAILURE);
if (new != 0) {
sk_X509_EXTENSION_free(tmpl->extensions);
tmpl->extensions = NULL;
}
return 0;
}
/* TODO: support cases 1+2 (besides case 3) defined in RFC 4211, section 4.1. */
static int CRMF_poposigningkey_init(OSSL_CRMF_POPOSIGNINGKEY *ps,
OSSL_CRMF_CERTREQUEST *cr,
EVP_PKEY *pkey, int dgst)
{
int len;
size_t crlen;
size_t siglen;
unsigned char *crder = NULL, *sig = NULL;
int alg_nid = 0;
int md_nid = 0;
const EVP_MD *alg = NULL;
EVP_MD_CTX *ctx = NULL;
int ret = 0;
if (ps == NULL || cr == NULL || pkey == NULL) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT, CRMF_R_NULL_ARGUMENT);
return 0;
}
/* OpenSSL defaults all bit strings to be encoded as ASN.1 NamedBitList */
ps->signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
ps->signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
len = i2d_OSSL_CRMF_CERTREQUEST(cr, &crder);
if (len < 0 || crder == NULL) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT, CRMF_R_ERROR);
goto err;
}
crlen = (size_t)len;
if (!OBJ_find_sigid_by_algs(&alg_nid, dgst, EVP_PKEY_id(pkey))) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT,
CRMF_R_UNSUPPORTED_ALG_FOR_POPSIGNINGKEY);
goto err;
}
if (!OBJ_find_sigid_algs(alg_nid, &md_nid, NULL)
|| (alg = EVP_get_digestbynid(md_nid)) == NULL) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT,
CRMF_R_UNSUPPORTED_ALG_FOR_POPSIGNINGKEY);
goto err;
}
if (!X509_ALGOR_set0(ps->algorithmIdentifier, OBJ_nid2obj(alg_nid),
V_ASN1_NULL, NULL)
|| (ctx = EVP_MD_CTX_new()) == NULL
|| EVP_DigestSignInit(ctx, NULL, alg, NULL, pkey) <= 0
|| EVP_DigestSignUpdate(ctx, crder, crlen) <= 0
|| EVP_DigestSignFinal(ctx, NULL, &siglen) <= 0) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT, CRMF_R_ERROR);
goto err;
}
if ((sig = OPENSSL_malloc(siglen)) == NULL) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT, ERR_R_MALLOC_FAILURE);
goto err;
}
if (EVP_DigestSignFinal(ctx, sig, &siglen) <= 0
|| !ASN1_BIT_STRING_set(ps->signature, sig, siglen)) {
CRMFerr(CRMF_F_CRMF_POPOSIGNINGKEY_INIT, CRMF_R_ERROR);
goto err;
}
ret = 1;
err:
OPENSSL_free(crder);
EVP_MD_CTX_free(ctx);
OPENSSL_free(sig);
return ret;
}
int OSSL_CRMF_MSG_create_popo(OSSL_CRMF_MSG *crm, EVP_PKEY *pkey,
int dgst, int ppmtd)
{
OSSL_CRMF_POPO *pp = NULL;
ASN1_INTEGER *tag = NULL;
if (crm == NULL || (ppmtd == OSSL_CRMF_POPO_SIGNATURE && pkey == NULL)) {
CRMFerr(CRMF_F_OSSL_CRMF_MSG_CREATE_POPO, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (ppmtd == OSSL_CRMF_POPO_NONE)
goto end;
if ((pp = OSSL_CRMF_POPO_new()) == NULL)
goto oom;
pp->type = ppmtd;
switch (ppmtd) {
case OSSL_CRMF_POPO_RAVERIFIED:
if ((pp->value.raVerified = ASN1_NULL_new()) == NULL)
goto oom;
break;
case OSSL_CRMF_POPO_SIGNATURE:
{
OSSL_CRMF_POPOSIGNINGKEY *ps = OSSL_CRMF_POPOSIGNINGKEY_new();
if (ps == NULL
|| !CRMF_poposigningkey_init(ps, crm->certReq, pkey, dgst)){
OSSL_CRMF_POPOSIGNINGKEY_free(ps);
goto err;
}
pp->value.signature = ps;
}
break;
case OSSL_CRMF_POPO_KEYENC:
if ((pp->value.keyEncipherment = OSSL_CRMF_POPOPRIVKEY_new()) == NULL)
goto oom;
tag = ASN1_INTEGER_new();
pp->value.keyEncipherment->type =
OSSL_CRMF_POPOPRIVKEY_SUBSEQUENTMESSAGE;
pp->value.keyEncipherment->value.subsequentMessage = tag;
if (tag == NULL
|| !ASN1_INTEGER_set(tag, OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT))
goto oom;
break;
default:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_CREATE_POPO,
CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO);
goto err;
}
end:
OSSL_CRMF_POPO_free(crm->popo);
crm->popo = pp;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_MSG_CREATE_POPO, ERR_R_MALLOC_FAILURE);
err:
OSSL_CRMF_POPO_free(pp);
return 0;
}
/* returns 0 for equal, -1 for a < b or error on a, 1 for a > b or error on b */
static int X509_PUBKEY_cmp(X509_PUBKEY *a, X509_PUBKEY *b)
{
X509_ALGOR *algA = NULL, *algB = NULL;
int res = 0;
if (a == b)
return 0;
if (a == NULL || !X509_PUBKEY_get0_param(NULL, NULL, NULL, &algA, a)
|| algA == NULL)
return -1;
if (b == NULL || !X509_PUBKEY_get0_param(NULL, NULL, NULL, &algB, b)
|| algB == NULL)
return 1;
if ((res = X509_ALGOR_cmp(algA, algB)) != 0)
return res;
return EVP_PKEY_cmp(X509_PUBKEY_get0(a), X509_PUBKEY_get0(b));
}
/* verifies the Proof-of-Possession of the request with the given rid in reqs */
int OSSL_CRMF_MSGS_verify_popo(const OSSL_CRMF_MSGS *reqs,
int rid, int acceptRAVerified)
{
OSSL_CRMF_MSG *req = NULL;
X509_PUBKEY *pubkey = NULL;
OSSL_CRMF_POPOSIGNINGKEY *sig = NULL;
if (reqs == NULL
|| (req = sk_OSSL_CRMF_MSG_value(reqs, rid)) == NULL
|| req->popo == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_MSGS_VERIFY_POPO,
CRMF_R_NULL_ARGUMENT);
return 0;
}
switch (req->popo->type) {
case OSSL_CRMF_POPO_RAVERIFIED:
if (acceptRAVerified)
return 1;
break;
case OSSL_CRMF_POPO_SIGNATURE:
pubkey = req->certReq->certTemplate->publicKey;
sig = req->popo->value.signature;
if (sig->poposkInput != NULL) {
/*
* According to RFC 4211: publicKey contains a copy of
* the public key from the certificate template. This MUST be
* exactly the same value as contained in the certificate template.
*/
if (pubkey == NULL
|| sig->poposkInput->publicKey == NULL
|| X509_PUBKEY_cmp(pubkey, sig->poposkInput->publicKey)
|| ASN1_item_verify(
ASN1_ITEM_rptr(OSSL_CRMF_POPOSIGNINGKEYINPUT),
sig->algorithmIdentifier, sig->signature,
sig->poposkInput, X509_PUBKEY_get0(pubkey)) < 1)
break;
} else {
if (pubkey == NULL
|| req->certReq->certTemplate->subject == NULL
|| ASN1_item_verify(ASN1_ITEM_rptr(OSSL_CRMF_CERTREQUEST),
sig->algorithmIdentifier, sig->signature,
req->certReq,
X509_PUBKEY_get0(pubkey)) < 1)
break;
}
return 1;
case OSSL_CRMF_POPO_KEYENC:
/*
* TODO: when OSSL_CMP_certrep_new() supports encrypted certs,
* return 1 if the type of req->popo->value.keyEncipherment
* is OSSL_CRMF_POPOPRIVKEY_SUBSEQUENTMESSAGE and
* its value.subsequentMessage == OSSL_CRMF_SUBSEQUENTMESSAGE_ENCRCERT
*/
case OSSL_CRMF_POPO_KEYAGREE:
default:
CRMFerr(CRMF_F_OSSL_CRMF_MSGS_VERIFY_POPO,
CRMF_R_UNSUPPORTED_POPO_METHOD);
return 0;
}
CRMFerr(CRMF_F_OSSL_CRMF_MSGS_VERIFY_POPO,
CRMF_R_UNSUPPORTED_POPO_NOT_ACCEPTED);
return 0;
}
/* retrieves the serialNumber of the given cert template or NULL on error */
ASN1_INTEGER *OSSL_CRMF_CERTTEMPLATE_get0_serialNumber(OSSL_CRMF_CERTTEMPLATE *tmpl)
{
return tmpl != NULL ? tmpl->serialNumber : NULL;
}
/* retrieves the issuer name of the given cert template or NULL on error */
X509_NAME *OSSL_CRMF_CERTTEMPLATE_get0_issuer(OSSL_CRMF_CERTTEMPLATE *tmpl)
{
return tmpl != NULL ? tmpl->issuer : NULL;
}
/*
* fill in certificate template.
* Any value argument that is NULL will leave the respective field unchanged.
*/
int OSSL_CRMF_CERTTEMPLATE_fill(OSSL_CRMF_CERTTEMPLATE *tmpl,
EVP_PKEY *pubkey,
const X509_NAME *subject,
const X509_NAME *issuer,
const ASN1_INTEGER *serial)
{
if (tmpl == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_CERTTEMPLATE_FILL, CRMF_R_NULL_ARGUMENT);
return 0;
}
if (subject != NULL && !X509_NAME_set(&tmpl->subject, subject))
goto oom;
if (issuer != NULL && !X509_NAME_set(&tmpl->issuer, issuer))
goto oom;
if (serial != NULL) {
ASN1_INTEGER_free(tmpl->serialNumber);
if ((tmpl->serialNumber = ASN1_INTEGER_dup(serial)) == NULL)
goto oom;
}
if (pubkey != NULL && !X509_PUBKEY_set(&tmpl->publicKey, pubkey))
goto oom;
return 1;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_CERTTEMPLATE_FILL, ERR_R_MALLOC_FAILURE);
return 0;
}
/*-
* Decrypts the certificate in the given encryptedValue
* this is needed for the indirect PoP method as in RFC 4210 section 5.2.8.2
*
* returns a pointer to the decrypted certificate
* returns NULL on error or if no certificate available
*/
X509 *OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(OSSL_CRMF_ENCRYPTEDVALUE *ecert,
EVP_PKEY *pkey)
{
X509 *cert = NULL; /* decrypted certificate */
EVP_CIPHER_CTX *evp_ctx = NULL; /* context for symmetric encryption */
unsigned char *ek = NULL; /* decrypted symmetric encryption key */
const EVP_CIPHER *cipher = NULL; /* used cipher */
unsigned char *iv = NULL; /* initial vector for symmetric encryption */
unsigned char *outbuf = NULL; /* decryption output buffer */
const unsigned char *p = NULL; /* needed for decoding ASN1 */
int symmAlg = 0; /* NIDs for symmetric algorithm */
int n, outlen = 0;
EVP_PKEY_CTX *pkctx = NULL; /* private key context */
if (ecert == NULL || ecert->symmAlg == NULL || ecert->encSymmKey == NULL
|| ecert->encValue == NULL || pkey == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_NULL_ARGUMENT);
return NULL;
}
if ((symmAlg = OBJ_obj2nid(ecert->symmAlg->algorithm)) == 0) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_UNSUPPORTED_CIPHER);
return NULL;
}
/* first the symmetric key needs to be decrypted */
pkctx = EVP_PKEY_CTX_new(pkey, NULL);
if (pkctx != NULL && EVP_PKEY_decrypt_init(pkctx)) {
ASN1_BIT_STRING *encKey = ecert->encSymmKey;
size_t eksize = 0;
if (EVP_PKEY_decrypt(pkctx, NULL, &eksize, encKey->data, encKey->length)
<= 0
|| (ek = OPENSSL_malloc(eksize)) == NULL
|| EVP_PKEY_decrypt(pkctx, ek, &eksize, encKey->data,
encKey->length) <= 0) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY);
goto end;
}
} else {
goto oom;
}
/* select symmetric cipher based on algorithm given in message */
if ((cipher = EVP_get_cipherbynid(symmAlg)) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_UNSUPPORTED_CIPHER);
goto end;
}
if ((iv = OPENSSL_malloc(EVP_CIPHER_iv_length(cipher))) == NULL)
goto oom;
if (ASN1_TYPE_get_octetstring(ecert->symmAlg->parameter, iv,
EVP_CIPHER_iv_length(cipher))
!= EVP_CIPHER_iv_length(cipher)) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_MALFORMED_IV);
goto end;
}
/*
* d2i_X509 changes the given pointer, so use p for decoding the message and
* keep the original pointer in outbuf so the memory can be freed later
*/
if ((p = outbuf = OPENSSL_malloc(ecert->encValue->length +
EVP_CIPHER_block_size(cipher))) == NULL
|| (evp_ctx = EVP_CIPHER_CTX_new()) == NULL)
goto oom;
EVP_CIPHER_CTX_set_padding(evp_ctx, 0);
if (!EVP_DecryptInit(evp_ctx, cipher, ek, iv)
|| !EVP_DecryptUpdate(evp_ctx, outbuf, &outlen,
ecert->encValue->data,
ecert->encValue->length)
|| !EVP_DecryptFinal(evp_ctx, outbuf + outlen, &n)) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_ERROR_DECRYPTING_CERTIFICATE);
goto end;
}
outlen += n;
/* convert decrypted certificate from DER to internal ASN.1 structure */
if ((cert = d2i_X509(NULL, &p, outlen)) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT,
CRMF_R_ERROR_DECODING_CERTIFICATE);
}
goto end;
oom:
CRMFerr(CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT, ERR_R_MALLOC_FAILURE);
end:
EVP_PKEY_CTX_free(pkctx);
OPENSSL_free(outbuf);
EVP_CIPHER_CTX_free(evp_ctx);
OPENSSL_free(ek);
OPENSSL_free(iv);
return cert;
}
+231
View File
@@ -0,0 +1,231 @@
/*-
* Copyright 2007-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Nokia 2007-2018
* Copyright Siemens AG 2015-2018
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*
* CRMF implementation by Martin Peylo, Miikka Viljanen, and David von Oheimb.
*/
#include <openssl/rand.h>
#include <openssl/evp.h>
#include "crmf_int.h"
/* explicit #includes not strictly needed since implied by the above: */
#include <openssl/asn1t.h>
#include <openssl/crmf.h>
#include <openssl/err.h>
#include <openssl/evp.h>
/*-
* creates and initializes OSSL_CRMF_PBMPARAMETER (section 4.4)
* |slen| SHOULD be > 8 (16 is common)
* |owfnid| e.g., NID_sha256
* |itercnt| MUST be > 100 (500 is common)
* |macnid| e.g., NID_hmac_sha1
* returns pointer to OSSL_CRMF_PBMPARAMETER on success, NULL on error
*/
OSSL_CRMF_PBMPARAMETER *OSSL_CRMF_pbmp_new(size_t slen, int owfnid,
int itercnt, int macnid)
{
OSSL_CRMF_PBMPARAMETER *pbm = NULL;
unsigned char *salt = NULL;
if ((pbm = OSSL_CRMF_PBMPARAMETER_new()) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, ERR_R_MALLOC_FAILURE);
goto err;
}
/*
* salt contains a randomly generated value used in computing the key
* of the MAC process. The salt SHOULD be at least 8 octets (64
* bits) long.
*/
if ((salt = OPENSSL_malloc(slen)) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, ERR_R_MALLOC_FAILURE);
goto err;
}
if (RAND_bytes(salt, (int)slen) <= 0) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, CRMF_R_FAILURE_OBTAINING_RANDOM);
goto err;
}
if (!ASN1_OCTET_STRING_set(pbm->salt, salt, (int)slen))
goto err;
/*
* owf identifies the hash algorithm and associated parameters used to
* compute the key used in the MAC process. All implementations MUST
* support SHA-1.
*/
if (!X509_ALGOR_set0(pbm->owf, OBJ_nid2obj(owfnid), V_ASN1_UNDEF, NULL)) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, CRMF_R_SETTING_OWF_ALGOR_FAILURE);
goto err;
}
/*
* iterationCount identifies the number of times the hash is applied
* during the key computation process. The iterationCount MUST be a
* minimum of 100. Many people suggest using values as high as 1000
* iterations as the minimum value. The trade off here is between
* protection of the password from attacks and the time spent by the
* server processing all of the different iterations in deriving
* passwords. Hashing is generally considered a cheap operation but
* this may not be true with all hash functions in the future.
*/
if (itercnt < 100) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, CRMF_R_ITERATIONCOUNT_BELOW_100);
goto err;
}
if (!ASN1_INTEGER_set(pbm->iterationCount, itercnt)) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, CRMF_R_CRMFERROR);
goto err;
}
/*
* mac identifies the algorithm and associated parameters of the MAC
* function to be used. All implementations MUST support HMAC-SHA1 [HMAC].
* All implementations SHOULD support DES-MAC and Triple-DES-MAC [PKCS11].
*/
if (!X509_ALGOR_set0(pbm->mac, OBJ_nid2obj(macnid), V_ASN1_UNDEF, NULL)) {
CRMFerr(CRMF_F_OSSL_CRMF_PBMP_NEW, CRMF_R_SETTING_MAC_ALGOR_FAILURE);
goto err;
}
OPENSSL_free(salt);
return pbm;
err:
OPENSSL_free(salt);
OSSL_CRMF_PBMPARAMETER_free(pbm);
return NULL;
}
/*-
* calculates the PBM based on the settings of the given OSSL_CRMF_PBMPARAMETER
* |pbmp| identifies the algorithms, salt to use
* |msg| message to apply the PBM for
* |msglen| length of the message
* |sec| key to use
* |seclen| length of the key
* |mac| pointer to the computed mac, will be set on success
* |maclen| if not NULL, will set variable to the length of the mac on success
* returns 1 on success, 0 on error
*/
int OSSL_CRMF_pbm_new(const OSSL_CRMF_PBMPARAMETER *pbmp,
const unsigned char *msg, size_t msglen,
const unsigned char *sec, size_t seclen,
unsigned char **mac, size_t *maclen)
{
int mac_nid, hmac_md_nid = NID_undef;
const EVP_MD *m = NULL;
EVP_MD_CTX *ctx = NULL;
unsigned char basekey[EVP_MAX_MD_SIZE];
unsigned int bklen = EVP_MAX_MD_SIZE;
int64_t iterations;
unsigned char *mac_res = 0;
int ok = 0;
EVP_MAC_CTX *mctx = NULL;
if (mac == NULL || pbmp == NULL || pbmp->mac == NULL
|| pbmp->mac->algorithm == NULL || msg == NULL || sec == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_PBM_NEW, CRMF_R_NULL_ARGUMENT);
goto err;
}
if ((mac_res = OPENSSL_malloc(EVP_MAX_MD_SIZE)) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_PBM_NEW, ERR_R_MALLOC_FAILURE);
goto err;
}
/*
* owf identifies the hash algorithm and associated parameters used to
* compute the key used in the MAC process. All implementations MUST
* support SHA-1.
*/
if ((m = EVP_get_digestbyobj(pbmp->owf->algorithm)) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_PBM_NEW, CRMF_R_UNSUPPORTED_ALGORITHM);
goto err;
}
if ((ctx = EVP_MD_CTX_new()) == NULL) {
CRMFerr(CRMF_F_OSSL_CRMF_PBM_NEW, ERR_R_MALLOC_FAILURE);
goto err;
}
/* compute the basekey of the salted secret */
if (!EVP_DigestInit_ex(ctx, m, NULL))
goto err;
/* first the secret */
if (!EVP_DigestUpdate(ctx, sec, seclen))
goto err;
/* then the salt */
if (!EVP_DigestUpdate(ctx, pbmp->salt->data, pbmp->salt->length))
goto err;
if (!EVP_DigestFinal_ex(ctx, basekey, &bklen))
goto err;
if (!ASN1_INTEGER_get_int64(&iterations, pbmp->iterationCount)
|| iterations < 100 /* min from RFC */
|| iterations > OSSL_CRMF_PBM_MAX_ITERATION_COUNT) {
CRMFerr(CRMF_F_OSSL_CRMF_PBM_NEW, CRMF_R_BAD_PBM_ITERATIONCOUNT);
goto err;
}
/* the first iteration was already done above */
while (--iterations > 0) {
if (!EVP_DigestInit_ex(ctx, m, NULL))
goto err;
if (!EVP_DigestUpdate(ctx, basekey, bklen))
goto err;
if (!EVP_DigestFinal_ex(ctx, basekey, &bklen))
goto err;
}
/*
* mac identifies the algorithm and associated parameters of the MAC
* function to be used. All implementations MUST support HMAC-SHA1 [HMAC].
* All implementations SHOULD support DES-MAC and Triple-DES-MAC [PKCS11].
*/
mac_nid = OBJ_obj2nid(pbmp->mac->algorithm);
if (!EVP_PBE_find(EVP_PBE_TYPE_PRF, mac_nid, NULL, &hmac_md_nid, NULL)
|| ((m = EVP_get_digestbynid(hmac_md_nid)) == NULL)) {
CRMFerr(CRMF_F_OSSL_CRMF_PBM_NEW, CRMF_R_UNSUPPORTED_ALGORITHM);
goto err;
}
if ((mctx = EVP_MAC_CTX_new(EVP_get_macbyname("HMAC"))) == NULL
|| EVP_MAC_ctrl(mctx, EVP_MAC_CTRL_SET_MD, m) <= 0
|| EVP_MAC_ctrl(mctx, EVP_MAC_CTRL_SET_KEY, basekey, bklen) <= 0
|| !EVP_MAC_init(mctx)
|| !EVP_MAC_update(mctx, msg, msglen)
|| !EVP_MAC_final(mctx, mac_res, maclen))
goto err;
ok = 1;
err:
/* cleanup */
OPENSSL_cleanse(basekey, bklen);
EVP_MAC_CTX_free(mctx);
EVP_MD_CTX_free(ctx);
if (ok == 1) {
*mac = mac_res;
return 1;
}
OPENSSL_free(mac_res);
if (pbmp != NULL && pbmp->mac != NULL) {
char buf[128];
if (OBJ_obj2txt(buf, sizeof(buf), pbmp->mac->algorithm, 0))
ERR_add_error_data(1, buf);
}
return 0;
}
+2 -2
View File
@@ -27,8 +27,8 @@
static const curve448_scalar_t precomputed_scalarmul_adjustment = {
{
{
SC_LIMB(0xc873d6d54a7bb0cf), SC_LIMB(0xe933d8d723a70aad),
SC_LIMB(0xbb124b65129c96fd), SC_LIMB(0x00000008335dc163)
SC_LIMB(0xc873d6d54a7bb0cfULL), SC_LIMB(0xe933d8d723a70aadULL),
SC_LIMB(0xbb124b65129c96fdULL), SC_LIMB(0x00000008335dc163ULL)
}
}
};
+1423 -415
View File
@@ -16,325 +16,1045 @@
static const curve448_precomputed_s curve448_precomputed_base_table = {
{
{{
{FIELD_LITERAL(0x00cc3b062366f4cc,0x003d6e34e314aa3c,0x00d51c0a7521774d,0x0094e060eec6ab8b,0x00d21291b4d80082,0x00befed12b55ef1e,0x00c3dd2df5c94518,0x00e0a7b112b8d4e6)},
{FIELD_LITERAL(0x0019eb5608d8723a,0x00d1bab52fb3aedb,0x00270a7311ebc90c,0x0037c12b91be7f13,0x005be16cd8b5c704,0x003e181acda888e1,0x00bc1f00fc3fc6d0,0x00d3839bfa319e20)},
{FIELD_LITERAL(0x003caeb88611909f,0x00ea8b378c4df3d4,0x00b3295b95a5a19a,0x00a65f97514bdfb5,0x00b39efba743cab1,0x0016ba98b862fd2d,0x0001508812ee71d7,0x000a75740eea114a)},
}}, {{
{FIELD_LITERAL(0x00ebcf0eb649f823,0x00166d332e98ea03,0x0059ddf64f5cd5f6,0x0047763123d9471b,0x00a64065c53ef62f,0x00978e44c480153d,0x000b5b2a0265f194,0x0046a24b9f32965a)},
{FIELD_LITERAL(0x00b9eef787034df0,0x0020bc24de3390cd,0x000022160bae99bb,0x00ae66e886e97946,0x0048d4bbe02cbb8b,0x0072ba97b34e38d4,0x00eae7ec8f03e85a,0x005ba92ecf808b2c)},
{FIELD_LITERAL(0x00c9cfbbe74258fd,0x00843a979ea9eaa7,0x000cbb4371cfbe90,0x0059bac8f7f0a628,0x004b3dff882ff530,0x0011869df4d90733,0x00595aa71f4abfc2,0x0070e2d38990c2e6)},
}}, {{
{FIELD_LITERAL(0x00de2010c0a01733,0x00c739a612e24297,0x00a7212643141d7c,0x00f88444f6b67c11,0x00484b7b16ec28f2,0x009c1b8856af9c68,0x00ff4669591fe9d6,0x0054974be08a32c8)},
{FIELD_LITERAL(0x0010de3fd682ceed,0x008c07642d83ca4e,0x0013bb064e00a1cc,0x009411ae27870e11,0x00ea8e5b4d531223,0x0032fe7d2aaece2e,0x00d989e243e7bb41,0x000fe79a508e9b8b)},
{FIELD_LITERAL(0x005e0426b9bfc5b1,0x0041a5b1d29ee4fa,0x0015b0def7774391,0x00bc164f1f51af01,0x00d543b0942797b9,0x003c129b6398099c,0x002b114c6e5adf18,0x00b4e630e4018a7b)},
}}, {{
{FIELD_LITERAL(0x00d490afc95f8420,0x00b096bf50c1d9b9,0x00799fd707679866,0x007c74d9334afbea,0x00efaa8be80ff4ed,0x0075c4943bb81694,0x00c21c2fca161f36,0x00e77035d492bfee)},
{FIELD_LITERAL(0x006658a190dd6661,0x00e0e9bab38609a6,0x0028895c802237ed,0x006a0229c494f587,0x002dcde96c9916b7,0x00d158822de16218,0x00173b917a06856f,0x00ca78a79ae07326)},
{FIELD_LITERAL(0x00e35bfc79caced4,0x0087238a3e1fe3bb,0x00bcbf0ff4ceff5b,0x00a19c1c94099b91,0x0071e102b49db976,0x0059e3d004eada1e,0x008da78afa58a47e,0x00579c8ebf269187)},
}}, {{
{FIELD_LITERAL(0x00a16c2905eee75f,0x009d4bcaea2c7e1d,0x00d3bd79bfad19df,0x0050da745193342c,0x006abdb8f6b29ab1,0x00a24fe0a4fef7ef,0x0063730da1057dfb,0x00a08c312c8eb108)},
{FIELD_LITERAL(0x00b583be005375be,0x00a40c8f8a4e3df4,0x003fac4a8f5bdbf7,0x00d4481d872cd718,0x004dc8749cdbaefe,0x00cce740d5e5c975,0x000b1c1f4241fd21,0x00a76de1b4e1cd07)},
{FIELD_LITERAL(0x007a076500d30b62,0x000a6e117b7f090f,0x00c8712ae7eebd9a,0x000fbd6c1d5f6ff7,0x003a7977246ebf11,0x00166ed969c6600e,0x00aa42e469c98bec,0x00dc58f307cf0666)},
}}, {{
{FIELD_LITERAL(0x004b491f65a9a28b,0x006a10309e8a55b7,0x00b67210185187ef,0x00cf6497b12d9b8f,0x0085778c56e2b1ba,0x0015b4c07a814d85,0x00686479e62da561,0x008de5d88f114916)},
{FIELD_LITERAL(0x00e37c88d6bba7b1,0x003e4577e1b8d433,0x0050d8ea5f510ec0,0x0042fc9f2da9ef59,0x003bd074c1141420,0x00561b8b7b68774e,0x00232e5e5d1013a3,0x006b7f2cb3d7e73f)},
{FIELD_LITERAL(0x004bdd0f0b41e6a0,0x001773057c405d24,0x006029f99915bd97,0x006a5ba70a17fe2f,0x0046111977df7e08,0x004d8124c89fb6b7,0x00580983b2bb2724,0x00207bf330d6f3fe)},
}}, {{
{FIELD_LITERAL(0x007efdc93972a48b,0x002f5e50e78d5fee,0x0080dc11d61c7fe5,0x0065aa598707245b,0x009abba2300641be,0x000c68787656543a,0x00ffe0fef2dc0a17,0x00007ffbd6cb4f3a)},
{FIELD_LITERAL(0x0036012f2b836efc,0x00458c126d6b5fbc,0x00a34436d719ad1e,0x0097be6167117dea,0x0009c219c879cff3,0x0065564493e60755,0x00993ac94a8cdec0,0x002d4885a4d0dbaf)},
{FIELD_LITERAL(0x00598b60b4c068ba,0x00c547a0be7f1afd,0x009582164acf12af,0x00af4acac4fbbe40,0x005f6ca7c539121a,0x003b6e752ebf9d66,0x00f08a30d5cac5d4,0x00e399bb5f97c5a9)},
}}, {{
{FIELD_LITERAL(0x007445a0409c0a66,0x00a65c369f3829c0,0x0031d248a4f74826,0x006817f34defbe8e,0x00649741d95ebf2e,0x00d46466ab16b397,0x00fdc35703bee414,0x00343b43334525f8)},
{FIELD_LITERAL(0x001796bea93f6401,0x00090c5a42e85269,0x00672412ba1252ed,0x001201d47b6de7de,0x006877bccfe66497,0x00b554fd97a4c161,0x009753f42dbac3cf,0x00e983e3e378270a)},
{FIELD_LITERAL(0x00ac3eff18849872,0x00f0eea3bff05690,0x00a6d72c21dd505d,0x001b832642424169,0x00a6813017b540e5,0x00a744bd71b385cd,0x0022a7d089130a7b,0x004edeec9a133486)},
}}, {{
{FIELD_LITERAL(0x00b2d6729196e8a9,0x0088a9bb2031cef4,0x00579e7787dc1567,0x0030f49feb059190,0x00a0b1d69c7f7d8f,0x0040bdcc6d9d806f,0x00d76c4037edd095,0x00bbf24376415dd7)},
{FIELD_LITERAL(0x00240465ff5a7197,0x00bb97e76caf27d0,0x004b4edbf8116d39,0x001d8586f708cbaa,0x000f8ee8ff8e4a50,0x00dde5a1945dd622,0x00e6fc1c0957e07c,0x0041c9cdabfd88a0)},
{FIELD_LITERAL(0x005344b0bf5b548c,0x002957d0b705cc99,0x00f586a70390553d,0x0075b3229f583cc3,0x00a1aa78227490e4,0x001bf09cf7957717,0x00cf6bf344325f52,0x0065bd1c23ca3ecf)},
}}, {{
{FIELD_LITERAL(0x009bff3b3239363c,0x00e17368796ef7c0,0x00528b0fe0971f3a,0x0008014fc8d4a095,0x00d09f2e8a521ec4,0x006713ab5dde5987,0x0003015758e0dbb1,0x00215999f1ba212d)},
{FIELD_LITERAL(0x002c88e93527da0e,0x0077c78f3456aad5,0x0071087a0a389d1c,0x00934dac1fb96dbd,0x008470e801162697,0x005bc2196cd4ad49,0x00e535601d5087c3,0x00769888700f497f)},
{FIELD_LITERAL(0x00da7a4b557298ad,0x0019d2589ea5df76,0x00ef3e38be0c6497,0x00a9644e1312609a,0x004592f61b2558da,0x0082c1df510d7e46,0x0042809a535c0023,0x00215bcb5afd7757)},
}}, {{
{FIELD_LITERAL(0x002b9df55a1a4213,0x00dcfc3b464a26be,0x00c4f9e07a8144d5,0x00c8e0617a92b602,0x008e3c93accafae0,0x00bf1bcb95b2ca60,0x004ce2426a613bf3,0x00266cac58e40921)},
{FIELD_LITERAL(0x008456d5db76e8f0,0x0032ca9cab2ce163,0x0059f2b8bf91abcf,0x0063c2a021712788,0x00f86155af22f72d,0x00db98b2a6c005a0,0x00ac6e416a693ac4,0x007a93572af53226)},
{FIELD_LITERAL(0x0087767520f0de22,0x0091f64012279fb5,0x001050f1f0644999,0x004f097a2477ad3c,0x006b37913a9947bd,0x001a3d78645af241,0x0057832bbb3008a7,0x002c1d902b80dc20)},
}}, {{
{FIELD_LITERAL(0x001a6002bf178877,0x009bce168aa5af50,0x005fc318ff04a7f5,0x0052818f55c36461,0x008768f5d4b24afb,0x0037ffbae7b69c85,0x0018195a4b61edc0,0x001e12ea088434b2)},
{FIELD_LITERAL(0x0047d3f804e7ab07,0x00a809ab5f905260,0x00b3ffc7cdaf306d,0x00746e8ec2d6e509,0x00d0dade8887a645,0x00acceeebde0dd37,0x009bc2579054686b,0x0023804f97f1c2bf)},
{FIELD_LITERAL(0x0043e2e2e50b80d7,0x00143aafe4427e0f,0x005594aaecab855b,0x008b12ccaaecbc01,0x002deeb091082bc3,0x009cca4be2ae7514,0x00142b96e696d047,0x00ad2a2b1c05256a)},
}}, {{
{FIELD_LITERAL(0x003914f2f144b78b,0x007a95dd8bee6f68,0x00c7f4384d61c8e6,0x004e51eb60f1bdb2,0x00f64be7aa4621d8,0x006797bfec2f0ac0,0x007d17aab3c75900,0x001893e73cac8bc5)},
{FIELD_LITERAL(0x00140360b768665b,0x00b68aca4967f977,0x0001089b66195ae4,0x00fe71122185e725,0x000bca2618d49637,0x00a54f0557d7e98a,0x00cdcd2f91d6f417,0x00ab8c13741fd793)},
{FIELD_LITERAL(0x00725ee6b1e549e0,0x007124a0769777fa,0x000b68fdad07ae42,0x0085b909cd4952df,0x0092d2e3c81606f4,0x009f22f6cac099a0,0x00f59da57f2799a8,0x00f06c090122f777)},
}}, {{
{FIELD_LITERAL(0x00ce0bed0a3532bc,0x001a5048a22df16b,0x00e31db4cbad8bf1,0x00e89292120cf00e,0x007d1dd1a9b00034,0x00e2a9041ff8f680,0x006a4c837ae596e7,0x00713af1068070b3)},
{FIELD_LITERAL(0x00c4fe64ce66d04b,0x00b095d52e09b3d7,0x00758bbecb1a3a8e,0x00f35cce8d0650c0,0x002b878aa5984473,0x0062e0a3b7544ddc,0x00b25b290ed116fe,0x007b0f6abe0bebf2)},
{FIELD_LITERAL(0x0081d4e3addae0a8,0x003410c836c7ffcc,0x00c8129ad89e4314,0x000e3d5a23922dcd,0x00d91e46f29c31f3,0x006c728cde8c5947,0x002bc655ba2566c0,0x002ca94721533108)},
}}, {{
{FIELD_LITERAL(0x0051e4b3f764d8a9,0x0019792d46e904a0,0x00853bc13dbc8227,0x000840208179f12d,0x0068243474879235,0x0013856fbfe374d0,0x00bda12fe8676424,0x00bbb43635926eb2)},
{FIELD_LITERAL(0x0012cdc880a93982,0x003c495b21cd1b58,0x00b7e5c93f22a26e,0x0044aa82dfb99458,0x009ba092cdffe9c0,0x00a14b3ab2083b73,0x000271c2f70e1c4b,0x00eea9cac0f66eb8)},
{FIELD_LITERAL(0x001a1847c4ac5480,0x00b1b412935bb03a,0x00f74285983bf2b2,0x00624138b5b5d0f1,0x008820c0b03d38bf,0x00b94e50a18c1572,0x0060f6934841798f,0x00c52f5d66d6ebe2)},
}}, {{
{FIELD_LITERAL(0x00da23d59f9bcea6,0x00e0f27007a06a4b,0x00128b5b43a6758c,0x000cf50190fa8b56,0x00fc877aba2b2d72,0x00623bef52edf53f,0x00e6af6b819669e2,0x00e314dc34fcaa4f)},
{FIELD_LITERAL(0x0066e5eddd164d1e,0x00418a7c6fe28238,0x0002e2f37e962c25,0x00f01f56b5975306,0x0048842fa503875c,0x0057b0e968078143,0x00ff683024f3d134,0x0082ae28fcad12e4)},
{FIELD_LITERAL(0x0011ddfd21260e42,0x00d05b0319a76892,0x00183ea4368e9b8f,0x00b0815662affc96,0x00b466a5e7ce7c88,0x00db93b07506e6ee,0x0033885f82f62401,0x0086f9090ec9b419)},
}}, {{
{FIELD_LITERAL(0x00d95d1c5fcb435a,0x0016d1ed6b5086f9,0x00792aa0b7e54d71,0x0067b65715f1925d,0x00a219755ec6176b,0x00bc3f026b12c28f,0x00700c897ffeb93e,0x0089b83f6ec50b46)},
{FIELD_LITERAL(0x003c97e6384da36e,0x00423d53eac81a09,0x00b70d68f3cdce35,0x00ee7959b354b92c,0x00f4e9718819c8ca,0x009349f12acbffe9,0x005aee7b62cb7da6,0x00d97764154ffc86)},
{FIELD_LITERAL(0x00526324babb46dc,0x002ee99b38d7bf9e,0x007ea51794706ef4,0x00abeb04da6e3c39,0x006b457c1d281060,0x00fe243e9a66c793,0x00378de0fb6c6ee4,0x003e4194b9c3cb93)},
}}, {{
{FIELD_LITERAL(0x00fed3cd80ca2292,0x0015b043a73ca613,0x000a9fd7bf9be227,0x003b5e03de2db983,0x005af72d46904ef7,0x00c0f1b5c49faa99,0x00dc86fc3bd305e1,0x00c92f08c1cb1797)},
{FIELD_LITERAL(0x0079680ce111ed3b,0x001a1ed82806122c,0x000c2e7466d15df3,0x002c407f6f7150fd,0x00c5e7c96b1b0ce3,0x009aa44626863ff9,0x00887b8b5b80be42,0x00b6023cec964825)},
{FIELD_LITERAL(0x00e4a8e1048970c8,0x0062887b7830a302,0x00bcf1c8cd81402b,0x0056dbb81a68f5be,0x0014eced83f12452,0x00139e1a510150df,0x00bb81140a82d1a3,0x000febcc1aaf1aa7)},
}}, {{
{FIELD_LITERAL(0x00a7527958238159,0x0013ec9537a84cd6,0x001d7fee7d562525,0x00b9eefa6191d5e5,0x00dbc97db70bcb8a,0x00481affc7a4d395,0x006f73d3e70c31bb,0x00183f324ed96a61)},
{FIELD_LITERAL(0x0039dd7ce7fc6860,0x00d64f6425653da1,0x003e037c7f57d0af,0x0063477a06e2bcf2,0x001727dbb7ac67e6,0x0049589f5efafe2e,0x00fc0fef2e813d54,0x008baa5d087fb50d)},
{FIELD_LITERAL(0x0024fb59d9b457c7,0x00a7d4e060223e4c,0x00c118d1b555fd80,0x0082e216c732f22a,0x00cd2a2993089504,0x003638e836a3e13d,0x000d855ee89b4729,0x008ec5b7d4810c91)},
}}, {{
{FIELD_LITERAL(0x001bf51f7d65cdfd,0x00d14cdafa16a97d,0x002c38e60fcd10e7,0x00a27446e393efbd,0x000b5d8946a71fdd,0x0063df2cde128f2f,0x006c8679569b1888,0x0059ffc4925d732d)},
{FIELD_LITERAL(0x00ece96f95f2b66f,0x00ece7952813a27b,0x0026fc36592e489e,0x007157d1a2de0f66,0x00759dc111d86ddf,0x0012881e5780bb0f,0x00c8ccc83ad29496,0x0012b9bd1929eb71)},
{FIELD_LITERAL(0x000fa15a20da5df0,0x00349ddb1a46cd31,0x002c512ad1d8e726,0x00047611f669318d,0x009e68fba591e17e,0x004320dffa803906,0x00a640874951a3d3,0x00b6353478baa24f)},
}}, {{
{FIELD_LITERAL(0x009696510000d333,0x00ec2f788bc04826,0x000e4d02b1f67ba5,0x00659aa8dace08b6,0x00d7a38a3a3ae533,0x008856defa8c746b,0x004d7a4402d3da1a,0x00ea82e06229260f)},
{FIELD_LITERAL(0x006a15bb20f75c0c,0x0079a144027a5d0c,0x00d19116ce0b4d70,0x0059b83bcb0b268e,0x005f58f63f16c127,0x0079958318ee2c37,0x00defbb063d07f82,0x00f1f0b931d2d446)},
{FIELD_LITERAL(0x00cb5e4c3c35d422,0x008df885ca43577f,0x00fa50b16ca3e471,0x005a0e58e17488c8,0x00b2ceccd6d34d19,0x00f01d5d235e36e9,0x00db2e7e4be6ca44,0x00260ab77f35fccd)},
}}, {{
{FIELD_LITERAL(0x006f6fd9baac61d5,0x002a7710a020a895,0x009de0db7fc03d4d,0x00cdedcb1875f40b,0x00050caf9b6b1e22,0x005e3a6654456ab0,0x00775fdf8c4423d4,0x0028701ea5738b5d)},
{FIELD_LITERAL(0x009ffd90abfeae96,0x00cba3c2b624a516,0x005ef08bcee46c91,0x00e6fde30afb6185,0x00f0b4db4f818ce4,0x006c54f45d2127f5,0x00040125035854c7,0x00372658a3287e13)},
{FIELD_LITERAL(0x00d7070fb1beb2ab,0x0078fc845a93896b,0x006894a4b2f224a6,0x005bdd8192b9dbde,0x00b38839874b3a9e,0x00f93618b04b7a57,0x003e3ec75fd2c67e,0x00bf5e6bfc29494a)},
}}, {{
{FIELD_LITERAL(0x00f19224ebba2aa5,0x0074f89d358e694d,0x00eea486597135ad,0x0081579a4555c7e1,0x0010b9b872930a9d,0x00f002e87a30ecc0,0x009b9d66b6de56e2,0x00a3c4f45e8004eb)},
{FIELD_LITERAL(0x0045e8dda9400888,0x002ff12e5fc05db7,0x00a7098d54afe69c,0x00cdbe846a500585,0x00879c1593ca1882,0x003f7a7fea76c8b0,0x002cd73dd0c8e0a1,0x00645d6ce96f51fe)},
{FIELD_LITERAL(0x002b7e83e123d6d6,0x00398346f7419c80,0x0042922e55940163,0x005e7fc5601886a3,0x00e88f2cee1d3103,0x00e7fab135f2e377,0x00b059984dbf0ded,0x0009ce080faa5bb8)},
}}, {{
{FIELD_LITERAL(0x0085e78af7758979,0x00275a4ee1631a3a,0x00d26bc0ed78b683,0x004f8355ea21064f,0x00d618e1a32696e5,0x008d8d7b150e5680,0x00a74cd854b278d2,0x001dd62702203ea0)},
{FIELD_LITERAL(0x00f89335c2a59286,0x00a0f5c905d55141,0x00b41fb836ee9382,0x00e235d51730ca43,0x00a5cb37b5c0a69a,0x009b966ffe136c45,0x00cb2ea10bf80ed1,0x00fb2b370b40dc35)},
{FIELD_LITERAL(0x00d687d16d4ee8ba,0x0071520bdd069dff,0x00de85c60d32355d,0x0087d2e3565102f4,0x00cde391b8dfc9aa,0x00e18d69efdfefe5,0x004a9d0591954e91,0x00fa36dd8b50eee5)},
}}, {{
{FIELD_LITERAL(0x002e788749a865f7,0x006e4dc3116861ea,0x009f1428c37276e6,0x00e7d2e0fc1e1226,0x003aeebc6b6c45f6,0x0071a8073bf500c9,0x004b22ad986b530c,0x00f439e63c0d79d4)},
{FIELD_LITERAL(0x006bc3d53011f470,0x00032d6e692b83e8,0x00059722f497cd0b,0x0009b4e6f0c497cc,0x0058a804b7cce6c0,0x002b71d3302bbd5d,0x00e2f82a36765fce,0x008dded99524c703)},
{FIELD_LITERAL(0x004d058953747d64,0x00701940fe79aa6f,0x00a620ac71c760bf,0x009532b611158b75,0x00547ed7f466f300,0x003cb5ab53a8401a,0x00c7763168ce3120,0x007e48e33e4b9ab2)},
}}, {{
{FIELD_LITERAL(0x001b2fc57bf3c738,0x006a3f918993fb80,0x0026f7a14fdec288,0x0075a2cdccef08db,0x00d3ecbc9eecdbf1,0x0048c40f06e5bf7f,0x00d63e423009896b,0x000598bc99c056a8)},
{FIELD_LITERAL(0x002f194eaafa46dc,0x008e38f57fe87613,0x00dc8e5ae25f4ab2,0x000a17809575e6bd,0x00d3ec7923ba366a,0x003a7e72e0ad75e3,0x0010024b88436e0a,0x00ed3c5444b64051)},
{FIELD_LITERAL(0x00831fc1340af342,0x00c9645669466d35,0x007692b4cc5a080f,0x009fd4a47ac9259f,0x001eeddf7d45928b,0x003c0446fc45f28b,0x002c0713aa3e2507,0x0095706935f0f41e)},
}}, {{
{FIELD_LITERAL(0x00766ae4190ec6d8,0x0065768cabc71380,0x00b902598416cdc2,0x00380021ad38df52,0x008f0b89d6551134,0x004254d4cc62c5a5,0x000d79f4484b9b94,0x00b516732ae3c50e)},
{FIELD_LITERAL(0x001fb73475c45509,0x00d2b2e5ea43345a,0x00cb3c3842077bd1,0x0029f90ad820946e,0x007c11b2380778aa,0x009e54ece62c1704,0x004bc60c41ca01c3,0x004525679a5a0b03)},
{FIELD_LITERAL(0x00c64fbddbed87b3,0x0040601d11731faa,0x009c22475b6f9d67,0x0024b79dae875f15,0x00616fed3f02c3b0,0x0000cf39f6af2d3b,0x00c46bac0aa9a688,0x00ab23e2800da204)},
}}, {{
{FIELD_LITERAL(0x000b3a37617632b0,0x00597199fe1cfb6c,0x0042a7ccdfeafdd6,0x004cc9f15ebcea17,0x00f436e596a6b4a4,0x00168861142df0d8,0x000753edfec26af5,0x000c495d7e388116)},
{FIELD_LITERAL(0x0017085f4a346148,0x00c7cf7a37f62272,0x001776e129bc5c30,0x009955134c9eef2a,0x001ba5bdf1df07be,0x00ec39497103a55c,0x006578354fda6cfb,0x005f02719d4f15ee)},
{FIELD_LITERAL(0x0052b9d9b5d9655d,0x00d4ec7ba1b461c3,0x00f95df4974f280b,0x003d8e5ca11aeb51,0x00d4981eb5a70b26,0x000af9a4f6659f29,0x004598c846faeb43,0x0049d9a183a47670)},
}}, {{
{FIELD_LITERAL(0x000a72d23dcb3f1f,0x00a3737f84011727,0x00f870c0fbbf4a47,0x00a7aadd04b5c9ca,0x000c7715c67bd072,0x00015a136afcd74e,0x0080d5caea499634,0x0026b448ec7514b7)},
{FIELD_LITERAL(0x00b60167d9e7d065,0x00e60ba0d07381e8,0x003a4f17b725c2d4,0x006c19fe176b64fa,0x003b57b31af86ccb,0x0021047c286180fd,0x00bdc8fb00c6dbb6,0x00fe4a9f4bab4f3f)},
{FIELD_LITERAL(0x0088ffc3a16111f7,0x009155e4245d0bc8,0x00851d68220572d5,0x00557ace1e514d29,0x0031d7c339d91022,0x00101d0ae2eaceea,0x00246ab3f837b66a,0x00d5216d381ff530)},
}}, {{
{FIELD_LITERAL(0x0057e7ea35f36dae,0x00f47d7ad15de22e,0x00d757ea4b105115,0x008311457d579d7e,0x00b49b75b1edd4eb,0x0081c7ff742fd63a,0x00ddda3187433df6,0x00475727d55f9c66)},
{FIELD_LITERAL(0x00a6295218dc136a,0x00563b3af0e9c012,0x00d3753b0145db1b,0x004550389c043dc1,0x00ea94ae27401bdf,0x002b0b949f2b7956,0x00c63f780ad8e23c,0x00e591c47d6bab15)},
{FIELD_LITERAL(0x00416c582b058eb6,0x004107da5b2cc695,0x00b3cd2556aeec64,0x00c0b418267e57a1,0x001799293579bd2e,0x0046ed44590e4d07,0x001d7459b3630a1e,0x00c6afba8b6696aa)},
}}, {{
{FIELD_LITERAL(0x008d6009b26da3f8,0x00898e88ca06b1ca,0x00edb22b2ed7fe62,0x00fbc93516aabe80,0x008b4b470c42ce0d,0x00e0032ba7d0dcbb,0x00d76da3a956ecc8,0x007f20fe74e3852a)},
{FIELD_LITERAL(0x002419222c607674,0x00a7f23af89188b3,0x00ad127284e73d1c,0x008bba582fae1c51,0x00fc6aa7ca9ecab1,0x003df5319eb6c2ba,0x002a05af8a8b199a,0x004bf8354558407c)},
{FIELD_LITERAL(0x00ce7d4a30f0fcbf,0x00d02c272629f03d,0x0048c001f7400bc2,0x002c21368011958d,0x0098a550391e96b5,0x002d80b66390f379,0x001fa878760cc785,0x001adfce54b613d5)},
}}, {{
{FIELD_LITERAL(0x001ed4dc71fa2523,0x005d0bff19bf9b5c,0x00c3801cee065a64,0x001ed0b504323fbf,0x0003ab9fdcbbc593,0x00df82070178b8d2,0x00a2bcaa9c251f85,0x00c628a3674bd02e)},
{FIELD_LITERAL(0x006b7a0674f9f8de,0x00a742414e5c7cff,0x0041cbf3c6e13221,0x00e3a64fd207af24,0x0087c05f15fbe8d1,0x004c50936d9e8a33,0x001306ec21042b6d,0x00a4f4137d1141c2)},
{FIELD_LITERAL(0x0009e6fb921568b0,0x00b3c60120219118,0x002a6c3460dd503a,0x009db1ef11654b54,0x0063e4bf0be79601,0x00670d34bb2592b9,0x00dcee2f6c4130ce,0x00b2682e88e77f54)},
}}, {{
{FIELD_LITERAL(0x000d5b4b3da135ab,0x00838f3e5064d81d,0x00d44eb50f6d94ed,0x0008931ab502ac6d,0x00debe01ca3d3586,0x0025c206775f0641,0x005ad4b6ae912763,0x007e2c318ad8f247)},
{FIELD_LITERAL(0x00ddbe0750dd1add,0x004b3c7b885844b8,0x00363e7ecf12f1ae,0x0062e953e6438f9d,0x0023cc73b076afe9,0x00b09fa083b4da32,0x00c7c3d2456c541d,0x005b591ec6b694d4)},
{FIELD_LITERAL(0x0028656e19d62fcf,0x0052a4af03df148d,0x00122765ddd14e42,0x00f2252904f67157,0x004741965b636f3a,0x006441d296132cb9,0x005e2106f956a5b7,0x00247029592d335c)},
}}, {{
{FIELD_LITERAL(0x003fe038eb92f894,0x000e6da1b72e8e32,0x003a1411bfcbe0fa,0x00b55d473164a9e4,0x00b9a775ac2df48d,0x0002ddf350659e21,0x00a279a69eb19cb3,0x00f844eab25cba44)},
{FIELD_LITERAL(0x00c41d1f9c1f1ac1,0x007b2df4e9f19146,0x00b469355fd5ba7a,0x00b5e1965afc852a,0x00388d5f1e2d8217,0x0022079e4c09ae93,0x0014268acd4ef518,0x00c1dd8d9640464c)},
{FIELD_LITERAL(0x0038526adeed0c55,0x00dd68c607e3fe85,0x00f746ddd48a5d57,0x0042f2952b963b7c,0x001cbbd6876d5ec2,0x005e341470bca5c2,0x00871d41e085f413,0x00e53ab098f45732)},
}}, {{
{FIELD_LITERAL(0x004d51124797c831,0x008f5ae3750347ad,0x0070ced94c1a0c8e,0x00f6db2043898e64,0x000d00c9a5750cd0,0x000741ec59bad712,0x003c9d11aab37b7f,0x00a67ba169807714)},
{FIELD_LITERAL(0x00adb2c1566e8b8f,0x0096c68a35771a9a,0x00869933356f334a,0x00ba9c93459f5962,0x009ec73fb6e8ca4b,0x003c3802c27202e1,0x0031f5b733e0c008,0x00f9058c19611fa9)},
{FIELD_LITERAL(0x00238f01814a3421,0x00c325a44b6cce28,0x002136f97aeb0e73,0x000cac8268a4afe2,0x0022fd218da471b3,0x009dcd8dfff8def9,0x00cb9f8181d999bb,0x00143ae56edea349)},
}}, {{
{FIELD_LITERAL(0x0000623bf87622c5,0x00a1966fdd069496,0x00c315b7b812f9fc,0x00bdf5efcd128b97,0x001d464f532e3e16,0x003cd94f081bfd7e,0x00ed9dae12ce4009,0x002756f5736eee70)},
{FIELD_LITERAL(0x00a5187e6ee7341b,0x00e6d52e82d83b6e,0x00df3c41323094a7,0x00b3324f444e9de9,0x00689eb21a35bfe5,0x00f16363becd548d,0x00e187cc98e7f60f,0x00127d9062f0ccab)},
{FIELD_LITERAL(0x004ad71b31c29e40,0x00a5fcace12fae29,0x004425b5597280ed,0x00e7ef5d716c3346,0x0010b53ada410ac8,0x0092310226060c9b,0x0091c26128729c7e,0x0088b42900f8ec3b)},
}}, {{
{FIELD_LITERAL(0x00f1e26e9762d4a8,0x00d9d74082183414,0x00ffec9bd57a0282,0x000919e128fd497a,0x00ab7ae7d00fe5f8,0x0054dc442851ff68,0x00c9ebeb3b861687,0x00507f7cab8b698f)},
{FIELD_LITERAL(0x00c13c5aae3ae341,0x009c6c9ed98373e7,0x00098f26864577a8,0x0015b886e9488b45,0x0037692c42aadba5,0x00b83170b8e7791c,0x001670952ece1b44,0x00fd932a39276da2)},
{FIELD_LITERAL(0x0081a3259bef3398,0x005480fff416107b,0x00ce4f607d21be98,0x003ffc084b41df9b,0x0043d0bb100502d1,0x00ec35f575ba3261,0x00ca18f677300ef3,0x00e8bb0a827d8548)},
}}, {{
{FIELD_LITERAL(0x00df76b3328ada72,0x002e20621604a7c2,0x00f910638a105b09,0x00ef4724d96ef2cd,0x00377d83d6b8a2f7,0x00b4f48805ade324,0x001cd5da8b152018,0x0045af671a20ca7f)},
{FIELD_LITERAL(0x009ae3b93a56c404,0x004a410b7a456699,0x00023a619355e6b2,0x009cdc7297387257,0x0055b94d4ae70d04,0x002cbd607f65b005,0x003208b489697166,0x00ea2aa058867370)},
{FIELD_LITERAL(0x00f29d2598ee3f32,0x00b4ac5385d82adc,0x007633eaf04df19b,0x00aa2d3d77ceab01,0x004a2302fcbb778a,0x00927f225d5afa34,0x004a8e9d5047f237,0x008224ae9dbce530)},
}}, {{
{FIELD_LITERAL(0x001cf640859b02f8,0x00758d1d5d5ce427,0x00763c784ef4604c,0x005fa81aee205270,0x00ac537bfdfc44cb,0x004b919bd342d670,0x00238508d9bf4b7a,0x00154888795644f3)},
{FIELD_LITERAL(0x00c845923c084294,0x00072419a201bc25,0x0045f408b5f8e669,0x00e9d6a186b74dfe,0x00e19108c68fa075,0x0017b91d874177b7,0x002f0ca2c7912c5a,0x009400aa385a90a2)},
{FIELD_LITERAL(0x0071110b01482184,0x00cfed0044f2bef8,0x0034f2901cf4662e,0x003b4ae2a67f9834,0x00cca9b96fe94810,0x00522507ae77abd0,0x00bac7422721e73e,0x0066622b0f3a62b0)},
}}, {{
{FIELD_LITERAL(0x00f8ac5cf4705b6a,0x00867d82dcb457e3,0x007e13ab2ccc2ce9,0x009ee9a018d3930e,0x008370f8ecb42df8,0x002d9f019add263e,0x003302385b92d196,0x00a15654536e2c0c)},
{FIELD_LITERAL(0x0026ef1614e160af,0x00c023f9edfc9c76,0x00cff090da5f57ba,0x0076db7a66643ae9,0x0019462f8c646999,0x008fec00b3854b22,0x00d55041692a0a1c,0x0065db894215ca00)},
{FIELD_LITERAL(0x00a925036e0a451c,0x002a0390c36b6cc1,0x00f27020d90894f4,0x008d90d52cbd3d7f,0x00e1d0137392f3b8,0x00f017c158b51a8f,0x00cac313d3ed7dbc,0x00b99a81e3eb42d3)},
}}, {{
{FIELD_LITERAL(0x00b54850275fe626,0x0053a3fd1ec71140,0x00e3d2d7dbe096fa,0x00e4ac7b595cce4c,0x0077bad449c0a494,0x00b7c98814afd5b3,0x0057226f58486cf9,0x00b1557154f0cc57)},
{FIELD_LITERAL(0x008cc9cd236315c0,0x0031d9c5b39fda54,0x00a5713ef37e1171,0x00293d5ae2886325,0x00c4aba3e05015e1,0x0003f35ef78e4fc6,0x0039d6bd3ac1527b,0x0019d7c3afb77106)},
{FIELD_LITERAL(0x007b162931a985af,0x00ad40a2e0daa713,0x006df27c4009f118,0x00503e9f4e2e8bec,0x00751a77c82c182d,0x000298937769245b,0x00ffb1e8fabf9ee5,0x0008334706e09abe)},
}}, {{
{FIELD_LITERAL(0x00dbca4e98a7dcd9,0x00ee29cfc78bde99,0x00e4a3b6995f52e9,0x0045d70189ae8096,0x00fd2a8a3b9b0d1b,0x00af1793b107d8e1,0x00dbf92cbe4afa20,0x00da60f798e3681d)},
{FIELD_LITERAL(0x004246bfcecc627a,0x004ba431246c03a4,0x00bd1d101872d497,0x003b73d3f185ee16,0x001feb2e2678c0e3,0x00ff13c5a89dec76,0x00ed06042e771d8f,0x00a4fd2a897a83dd)},
{FIELD_LITERAL(0x009a4a3be50d6597,0x00de3165fc5a1096,0x004f3f56e345b0c7,0x00f7bf721d5ab8bc,0x004313e47b098c50,0x00e4c7d5c0e1adbb,0x002e3e3db365051e,0x00a480c2cd6a96fb)},
}}, {{
{FIELD_LITERAL(0x00417fa30a7119ed,0x00af257758419751,0x00d358a487b463d4,0x0089703cc720b00d,0x00ce56314ff7f271,0x0064db171ade62c1,0x00640b36d4a22fed,0x00424eb88696d23f)},
{FIELD_LITERAL(0x004ede34af2813f3,0x00d4a8e11c9e8216,0x004796d5041de8a5,0x00c4c6b4d21cc987,0x00e8a433ee07fa1e,0x0055720b5abcc5a1,0x008873ea9c74b080,0x005b3fec1ab65d48)},
{FIELD_LITERAL(0x0047e5277db70ec5,0x000a096c66db7d6b,0x00b4164cc1730159,0x004a9f783fe720fe,0x00a8177b94449dbc,0x0095a24ff49a599f,0x0069c1c578250cbc,0x00452019213debf4)},
}}, {{
{FIELD_LITERAL(0x0021ce99e09ebda3,0x00fcbd9f91875ad0,0x009bbf6b7b7a0b5f,0x00388886a69b1940,0x00926a56d0f81f12,0x00e12903c3358d46,0x005dfce4e8e1ce9d,0x0044cfa94e2f7e23)},
{FIELD_LITERAL(0x001bd59c09e982ea,0x00f72daeb937b289,0x0018b76dca908e0e,0x00edb498512384ad,0x00ce0243b6cc9538,0x00f96ff690cb4e70,0x007c77bf9f673c8d,0x005bf704c088a528)},
{FIELD_LITERAL(0x0093d4628dcb33be,0x0095263d51d42582,0x0049b3222458fe06,0x00e7fce73b653a7f,0x003ca2ebce60b369,0x00c5de239a32bea4,0x0063b8b3d71fb6bf,0x0039aeeb78a1a839)},
}}, {{
{FIELD_LITERAL(0x007dc52da400336c,0x001fded1e15b9457,0x00902e00f5568e3a,0x00219bef40456d2d,0x005684161fb3dbc9,0x004a4e9be49a76ea,0x006e685ae88b78ff,0x0021c42f13042d3c)},
{FIELD_LITERAL(0x00fb22bb5fd3ce50,0x0017b48aada7ae54,0x00fd5c44ad19a536,0x000ccc4e4e55e45c,0x00fd637d45b4c3f5,0x0038914e023c37cf,0x00ac1881d6a8d898,0x00611ed8d3d943a8)},
{FIELD_LITERAL(0x0056e2259d113d2b,0x00594819b284ec16,0x00c7bf794bb36696,0x00721ee75097cdc6,0x00f71be9047a2892,0x00df6ba142564edf,0x0069580b7a184e8d,0x00f056e38fca0fee)},
}}, {{
{FIELD_LITERAL(0x009df98566a18c6d,0x00cf3a200968f219,0x0044ba60da6d9086,0x00dbc9c0e344da03,0x000f9401c4466855,0x00d46a57c5b0a8d1,0x00875a635d7ac7c6,0x00ef4a933b7e0ae6)},
{FIELD_LITERAL(0x005e8694077a1535,0x008bef75f71c8f1d,0x000a7c1316423511,0x00906e1d70604320,0x003fc46c1a2ffbd6,0x00d1d5022e68f360,0x002515fba37bbf46,0x00ca16234e023b44)},
{FIELD_LITERAL(0x00787c99561f4690,0x00a857a8c1561f27,0x00a10df9223c09fe,0x00b98a9562e3b154,0x004330b8744c3ed2,0x00e06812807ec5c4,0x00e4cf6a7db9f1e3,0x00d95b089f132a34)},
}}, {{
{FIELD_LITERAL(0x002922b39ca33eec,0x0090d12a5f3ab194,0x00ab60c02fb5f8ed,0x00188d292abba1cf,0x00e10edec9698f6e,0x0069a4d9934133c8,0x0024aac40e6d3d06,0x001702c2177661b0)},
{FIELD_LITERAL(0x00139078397030bd,0x000e3c447e859a00,0x0064a5b334c82393,0x00b8aabeb7358093,0x00020778bb9ae73b,0x0032ee94c7892a18,0x008215253cb41bda,0x005e2797593517ae)},
{FIELD_LITERAL(0x0083765a5f855d4a,0x0051b6d1351b8ee2,0x00116de548b0f7bb,0x0087bd88703affa0,0x0095b2cc34d7fdd2,0x0084cd81b53f0bc8,0x008562fc995350ed,0x00a39abb193651e3)},
}}, {{
{FIELD_LITERAL(0x0019e23f0474b114,0x00eb94c2ad3b437e,0x006ddb34683b75ac,0x00391f9209b564c6,0x00083b3bb3bff7aa,0x00eedcd0f6dceefc,0x00b50817f794fe01,0x0036474deaaa75c9)},
{FIELD_LITERAL(0x0091868594265aa2,0x00797accae98ca6d,0x0008d8c5f0f8a184,0x00d1f4f1c2b2fe6e,0x0036783dfb48a006,0x008c165120503527,0x0025fd780058ce9b,0x0068beb007be7d27)},
{FIELD_LITERAL(0x00d0ff88aa7c90c2,0x00b2c60dacf53394,0x0094a7284d9666d6,0x00bed9022ce7a19d,0x00c51553f0cd7682,0x00c3fb870b124992,0x008d0bc539956c9b,0x00fc8cf258bb8885)},
}}, {{
{FIELD_LITERAL(0x003667bf998406f8,0x0000115c43a12975,0x001e662f3b20e8fd,0x0019ffa534cb24eb,0x00016be0dc8efb45,0x00ff76a8b26243f5,0x00ae20d241a541e3,0x0069bd6af13cd430)},
{FIELD_LITERAL(0x0045fdc16487cda3,0x00b2d8e844cf2ed7,0x00612c50e88c1607,0x00a08aabc66c1672,0x006031fdcbb24d97,0x001b639525744b93,0x004409d62639ab17,0x00a1853d0347ab1d)},
{FIELD_LITERAL(0x0075a1a56ebf5c21,0x00a3e72be9ac53ed,0x00efcde1629170c2,0x0004225fe91ef535,0x0088049fc73dfda7,0x004abc74857e1288,0x0024e2434657317c,0x00d98cb3d3e5543c)},
}}, {{
{FIELD_LITERAL(0x00b4b53eab6bdb19,0x009b22d8b43711d0,0x00d948b9d961785d,0x00cb167b6f279ead,0x00191de3a678e1c9,0x00d9dd9511095c2e,0x00f284324cd43067,0x00ed74fa535151dd)},
{FIELD_LITERAL(0x007e32c049b5c477,0x009d2bfdbd9bcfd8,0x00636e93045938c6,0x007fde4af7687298,0x0046a5184fafa5d3,0x0079b1e7f13a359b,0x00875adf1fb927d6,0x00333e21c61bcad2)},
{FIELD_LITERAL(0x00048014f73d8b8d,0x0075684aa0966388,0x0092be7df06dc47c,0x0097cebcd0f5568a,0x005a7004d9c4c6a9,0x00b0ecbb659924c7,0x00d90332dd492a7c,0x0057fc14df11493d)},
}}, {{
{FIELD_LITERAL(0x0008ed8ea0ad95be,0x0041d324b9709645,0x00e25412257a19b4,0x0058df9f3423d8d2,0x00a9ab20def71304,0x009ae0dbf8ac4a81,0x00c9565977e4392a,0x003c9269444baf55)},
{FIELD_LITERAL(0x007df6cbb926830b,0x00d336058ae37865,0x007af47dac696423,0x0048d3011ec64ac8,0x006b87666e40049f,0x0036a2e0e51303d7,0x00ba319bd79dbc55,0x003e2737ecc94f53)},
{FIELD_LITERAL(0x00d296ff726272d9,0x00f6d097928fcf57,0x00e0e616a55d7013,0x00deaf454ed9eac7,0x0073a56bedef4d92,0x006ccfdf6fc92e19,0x009d1ee1371a7218,0x00ee3c2ee4462d80)},
}}, {{
{FIELD_LITERAL(0x00437bce9bccdf9d,0x00e0c8e2f85dc0a3,0x00c91a7073995a19,0x00856ec9fe294559,0x009e4b33394b156e,0x00e245b0dc497e5c,0x006a54e687eeaeff,0x00f1cd1cd00fdb7c)},
{FIELD_LITERAL(0x008132ae5c5d8cd1,0x00121d68324a1d9f,0x00d6be9dafcb8c76,0x00684d9070edf745,0x00519fbc96d7448e,0x00388182fdc1f27e,0x000235baed41f158,0x00bf6cf6f1a1796a)},
{FIELD_LITERAL(0x002adc4b4d148219,0x003084ada0d3a90a,0x0046de8aab0f2e4e,0x00452d342a67b5fd,0x00d4b50f01d4de21,0x00db6d9fc0cefb79,0x008c184c86a462cd,0x00e17c83764d42da)},
}}, {{
{FIELD_LITERAL(0x007b2743b9a1e01a,0x007847ffd42688c4,0x006c7844d610a316,0x00f0cb8b250aa4b0,0x00a19060143b3ae6,0x0014eb10b77cfd80,0x000170905729dd06,0x00063b5b9cd72477)},
{FIELD_LITERAL(0x00ce382dc7993d92,0x00021153e938b4c8,0x00096f7567f48f51,0x0058f81ddfe4b0d5,0x00cc379a56b355c7,0x002c760770d3e819,0x00ee22d1d26e5a40,0x00de6d93d5b082d7)},
{FIELD_LITERAL(0x000a91a42c52e056,0x00185f6b77fce7ea,0x000803c51962f6b5,0x0022528582ba563d,0x0043f8040e9856d6,0x0085a29ec81fb860,0x005f9a611549f5ff,0x00c1f974ecbd4b06)},
}}, {{
{FIELD_LITERAL(0x005b64c6fd65ec97,0x00c1fdd7f877bc7f,0x000d9cc6c89f841c,0x005c97b7f1aff9ad,0x0075e3c61475d47e,0x001ecb1ba8153011,0x00fe7f1c8d71d40d,0x003fa9757a229832)},
{FIELD_LITERAL(0x00ffc5c89d2b0cba,0x00d363d42e3e6fc3,0x0019a1a0118e2e8a,0x00f7baeff48882e1,0x001bd5af28c6b514,0x0055476ca2253cb2,0x00d8eb1977e2ddf3,0x00b173b1adb228a1)},
{FIELD_LITERAL(0x00f2cb99dd0ad707,0x00e1e08b6859ddd8,0x000008f2d0650bcc,0x00d7ed392f8615c3,0x00976750a94da27f,0x003e83bb0ecb69ba,0x00df8e8d15c14ac6,0x00f9f7174295d9c2)},
}}, {{
{FIELD_LITERAL(0x00f11cc8e0e70bcb,0x00e5dc689974e7dd,0x0014e409f9ee5870,0x00826e6689acbd63,0x008a6f4e3d895d88,0x00b26a8da41fd4ad,0x000fb7723f83efd7,0x009c749db0a5f6c3)},
{FIELD_LITERAL(0x002389319450f9ba,0x003677f31aa1250a,0x0092c3db642f38cb,0x00f8b64c0dfc9773,0x00cd49fe3505b795,0x0068105a4090a510,0x00df0ba2072a8bb6,0x00eb396143afd8be)},
{FIELD_LITERAL(0x00a0d4ecfb24cdff,0x00ddaf8008ba6479,0x00f0b3e36d4b0f44,0x003734bd3af1f146,0x00b87e2efc75527e,0x00d230df55ddab50,0x002613257ae56c1d,0x00bc0946d135934d)},
}}, {{
{FIELD_LITERAL(0x00468711bd994651,0x0033108fa67561bf,0x0089d760192a54b4,0x00adc433de9f1871,0x000467d05f36e050,0x007847e0f0579f7f,0x00a2314ad320052d,0x00b3a93649f0b243)},
{FIELD_LITERAL(0x0067f8f0c4fe26c9,0x0079c4a3cc8f67b9,0x0082b1e62f23550d,0x00f2d409caefd7f5,0x0080e67dcdb26e81,0x0087ae993ea1f98a,0x00aa108becf61d03,0x001acf11efb608a3)},
{FIELD_LITERAL(0x008225febbab50d9,0x00f3b605e4dd2083,0x00a32b28189e23d2,0x00d507e5e5eb4c97,0x005a1a84e302821f,0x0006f54c1c5f08c7,0x00a347c8cb2843f0,0x0009f73e9544bfa5)},
}}, {{
{FIELD_LITERAL(0x006c59c9ae744185,0x009fc32f1b4282cd,0x004d6348ca59b1ac,0x00105376881be067,0x00af4096013147dc,0x004abfb5a5cb3124,0x000d2a7f8626c354,0x009c6ed568e07431)},
{FIELD_LITERAL(0x00e828333c297f8b,0x009ef3cf8c3f7e1f,0x00ab45f8fff31cb9,0x00c8b4178cb0b013,0x00d0c50dd3260a3f,0x0097126ac257f5bc,0x0042376cc90c705a,0x001d96fdb4a1071e)},
{FIELD_LITERAL(0x00542d44d89ee1a8,0x00306642e0442d98,0x0090853872b87338,0x002362cbf22dc044,0x002c222adff663b8,0x0067c924495fcb79,0x000e621d983c977c,0x00df77a9eccb66fb)},
}}, {{
{FIELD_LITERAL(0x002809e4bbf1814a,0x00b9e854f9fafb32,0x00d35e67c10f7a67,0x008f1bcb76e748cf,0x004224d9515687d2,0x005ba0b774e620c4,0x00b5e57db5d54119,0x00e15babe5683282)},
{FIELD_LITERAL(0x00832d02369b482c,0x00cba52ff0d93450,0x003fa9c908d554db,0x008d1e357b54122f,0x00abd91c2dc950c6,0x007eff1df4c0ec69,0x003f6aeb13fb2d31,0x00002d6179fc5b2c)},
{FIELD_LITERAL(0x0046c9eda81c9c89,0x00b60cb71c8f62fc,0x0022f5a683baa558,0x00f87319fccdf997,0x009ca09b51ce6a22,0x005b12baf4af7d77,0x008a46524a1e33e2,0x00035a77e988be0d)},
}}, {{
{FIELD_LITERAL(0x00a7efe46a7dbe2f,0x002f66fd55014fe7,0x006a428afa1ff026,0x0056caaa9604ab72,0x0033f3bcd7fac8ae,0x00ccb1aa01c86764,0x00158d1edf13bf40,0x009848ee76fcf3b4)},
{FIELD_LITERAL(0x00a9e7730a819691,0x00d9cc73c4992b70,0x00e299bde067de5a,0x008c314eb705192a,0x00e7226f17e8a3cc,0x0029dfd956e65a47,0x0053a8e839073b12,0x006f942b2ab1597e)},
{FIELD_LITERAL(0x001c3d780ecd5e39,0x0094f247fbdcc5fe,0x00d5c786fd527764,0x00b6f4da74f0db2a,0x0080f1f8badcd5fc,0x00f36a373ad2e23b,0x00f804f9f4343bf2,0x00d1af40ec623982)},
}}, {{
{FIELD_LITERAL(0x0082aeace5f1b144,0x00f68b3108cf4dd3,0x00634af01dde3020,0x000beab5df5c2355,0x00e8b790d1b49b0b,0x00e48d15854e36f4,0x0040ab2d95f3db9f,0x002711c4ed9e899a)},
{FIELD_LITERAL(0x0039343746531ebe,0x00c8509d835d429d,0x00e79eceff6b0018,0x004abfd31e8efce5,0x007bbfaaa1e20210,0x00e3be89c193e179,0x001c420f4c31d585,0x00f414a315bef5ae)},
{FIELD_LITERAL(0x007c296a24990df8,0x00d5d07525a75588,0x00dd8e113e94b7e7,0x007bbc58febe0cc8,0x0029f51af9bfcad3,0x007e9311ec7ab6f3,0x009a884de1676343,0x0050d5f2dce84be9)},
}}, {{
{FIELD_LITERAL(0x005fa020cca2450a,0x00491c29db6416d8,0x0037cefe3f9f9a85,0x003d405230647066,0x0049e835f0fdbe89,0x00feb78ac1a0815c,0x00828e4b32dc9724,0x00db84f2dc8d6fd4)},
{FIELD_LITERAL(0x0098cddc8b39549a,0x006da37e3b05d22c,0x00ce633cfd4eb3cb,0x00fda288ef526acd,0x0025338878c5d30a,0x00f34438c4e5a1b4,0x00584efea7c310f1,0x0041a551f1b660ad)},
{FIELD_LITERAL(0x00d7f7a8fbd6437a,0x0062872413bf3753,0x00ad4bbcb43c584b,0x007fe49be601d7e3,0x0077c659789babf4,0x00eb45fcb06a741b,0x005ce244913f9708,0x0088426401736326)},
}}, {{
{FIELD_LITERAL(0x007bf562ca768d7c,0x006c1f3a174e387c,0x00f024b447fee939,0x007e7af75f01143f,0x003adb70b4eed89d,0x00e43544021ad79a,0x0091f7f7042011f6,0x0093c1a1ee3a0ddc)},
{FIELD_LITERAL(0x00a0b68ec1eb72d2,0x002c03235c0d45a0,0x00553627323fe8c5,0x006186e94b17af94,0x00a9906196e29f14,0x0025b3aee6567733,0x007e0dd840080517,0x0018eb5801a4ba93)},
{FIELD_LITERAL(0x00d7fe7017bf6a40,0x006e3f0624be0c42,0x00ffbba205358245,0x00f9fc2cf8194239,0x008d93b37bf15b4e,0x006ddf2e38be8e95,0x002b6e79bf5fcff9,0x00ab355da425e2de)},
}}, {{
{FIELD_LITERAL(0x00938f97e20be973,0x0099141a36aaf306,0x0057b0ca29e545a1,0x0085db571f9fbc13,0x008b333c554b4693,0x0043ab6ef3e241cb,0x0054fb20aa1e5c70,0x00be0ff852760adf)},
{FIELD_LITERAL(0x003973d8938971d6,0x002aca26fa80c1f5,0x00108af1faa6b513,0x00daae275d7924e6,0x0053634ced721308,0x00d2355fe0bbd443,0x00357612b2d22095,0x00f9bb9dd4136cf3)},
{FIELD_LITERAL(0x002bff12cf5e03a5,0x001bdb1fa8a19cf8,0x00c91c6793f84d39,0x00f869f1b2eba9af,0x0059bc547dc3236b,0x00d91611d6d38689,0x00e062daaa2c0214,0x00ed3c047cc2bc82)},
}}, {{
{FIELD_LITERAL(0x000050d70c32b31a,0x001939d576d437b3,0x00d709e598bf9fe6,0x00a885b34bd2ee9e,0x00dd4b5c08ab1a50,0x0091bebd50b55639,0x00cf79ff64acdbc6,0x006067a39d826336)},
{FIELD_LITERAL(0x0062dd0fb31be374,0x00fcc96b84c8e727,0x003f64f1375e6ae3,0x0057d9b6dd1af004,0x00d6a167b1103c7b,0x00dd28f3180fb537,0x004ff27ad7167128,0x008934c33461f2ac)},
{FIELD_LITERAL(0x0065b472b7900043,0x00ba7efd2ff1064b,0x000b67d6c4c3020f,0x0012d28469f4e46d,0x0031c32939703ec7,0x00b49f0bce133066,0x00f7e10416181d47,0x005c90f51867eecc)},
}}, {{
{FIELD_LITERAL(0x0051207abd179101,0x00fc2a5c20d9c5da,0x00fb9d5f2701b6df,0x002dd040fdea82b8,0x00f163b0738442ff,0x00d9736bd68855b8,0x00e0d8e93005e61c,0x00df5a40b3988570)},
{FIELD_LITERAL(0x0006918f5dfce6dc,0x00d4bf1c793c57fb,0x0069a3f649435364,0x00e89a50e5b0cd6e,0x00b9f6a237e973af,0x006d4ed8b104e41d,0x00498946a3924cd2,0x00c136ec5ac9d4f7)},
{FIELD_LITERAL(0x0011a9c290ac5336,0x002b9a2d4a6a6533,0x009a8a68c445d937,0x00361b27b07e5e5c,0x003c043b1755b974,0x00b7eb66cf1155ee,0x0077af5909eefff2,0x0098f609877cc806)},
}}, {{
{FIELD_LITERAL(0x00ab13af436bf8f4,0x000bcf0a0dac8574,0x00d50c864f705045,0x00c40e611debc842,0x0085010489bd5caa,0x007c5050acec026f,0x00f67d943c8da6d1,0x00de1da0278074c6)},
{FIELD_LITERAL(0x00b373076597455f,0x00e83f1af53ac0f5,0x0041f63c01dc6840,0x0097dea19b0c6f4b,0x007f9d63b4c1572c,0x00e692d492d0f5f0,0x00cbcb392e83b4ad,0x0069c0f39ed9b1a8)},
{FIELD_LITERAL(0x00861030012707c9,0x009fbbdc7fd4aafb,0x008f591d6b554822,0x00df08a41ea18ade,0x009d7d83e642abea,0x0098c71bda3b78ff,0x0022c89e7021f005,0x0044d29a3fe1e3c4)},
}}, {{
{FIELD_LITERAL(0x00e748cd7b5c52f2,0x00ea9df883f89cc3,0x0018970df156b6c7,0x00c5a46c2a33a847,0x00cbde395e32aa09,0x0072474ebb423140,0x00fb00053086a23d,0x001dafcfe22d4e1f)},
{FIELD_LITERAL(0x00c903ee6d825540,0x00add6c4cf98473e,0x007636efed4227f1,0x00905124ae55e772,0x00e6b38fab12ed53,0x0045e132b863fe55,0x003974662edb366a,0x00b1787052be8208)},
{FIELD_LITERAL(0x00a614b00d775c7c,0x00d7c78941cc7754,0x00422dd68b5dabc4,0x00a6110f0167d28b,0x00685a309c252886,0x00b439ffd5143660,0x003656e29ee7396f,0x00c7c9b9ed5ad854)},
}}, {{
{FIELD_LITERAL(0x0040f7e7c5b37bf2,0x0064e4dc81181bba,0x00a8767ae2a366b6,0x001496b4f90546f2,0x002a28493f860441,0x0021f59513049a3a,0x00852d369a8b7ee3,0x00dd2e7d8b7d30a9)},
{FIELD_LITERAL(0x00006e34a35d9fbc,0x00eee4e48b2f019a,0x006b344743003a5f,0x00541d514f04a7e3,0x00e81f9ee7647455,0x005e2b916c438f81,0x00116f8137b7eff0,0x009bd3decc7039d1)},
{FIELD_LITERAL(0x0005d226f434110d,0x00af8288b8ef21d5,0x004a7a52ef181c8c,0x00be0b781b4b06de,0x00e6e3627ded07e1,0x00e43aa342272b8b,0x00e86ab424577d84,0x00fb292c566e35bb)},
}}, {{
{FIELD_LITERAL(0x00334f5303ea1222,0x00dfb3dbeb0a5d3e,0x002940d9592335c1,0x00706a7a63e8938a,0x005a533558bc4caf,0x00558e33192022a9,0x00970d9faf74c133,0x002979fcb63493ca)},
{FIELD_LITERAL(0x00e38abece3c82ab,0x005a51f18a2c7a86,0x009dafa2e86d592e,0x00495a62eb688678,0x00b79df74c0eb212,0x0023e8cc78b75982,0x005998cb91075e13,0x00735aa9ba61bc76)},
{FIELD_LITERAL(0x00d9f7a82ddbe628,0x00a1fc782889ae0f,0x0071ffda12d14b66,0x0037cf4eca7fb3d5,0x00c80bc242c58808,0x0075bf8c2d08c863,0x008d41f31afc52a7,0x00197962ecf38741)},
}}, {{
{FIELD_LITERAL(0x006e9f475cccf2ee,0x00454b9cd506430c,0x00224a4fb79ee479,0x0062e3347ef0b5e2,0x0034fd2a3512232a,0x00b8b3cb0f457046,0x00eb20165daa38ec,0x00128eebc2d9c0f7)},
{FIELD_LITERAL(0x00bfc5fa1e4ea21f,0x00c21d7b6bb892e6,0x00cf043f3acf0291,0x00c13f2f849b3c90,0x00d1a97ebef10891,0x0061e130a445e7fe,0x0019513fdedbf22b,0x001d60c813bff841)},
{FIELD_LITERAL(0x0019561c7fcf0213,0x00e3dca6843ebd77,0x0068ea95b9ca920e,0x009bdfb70f253595,0x00c68f59186aa02a,0x005aee1cca1c3039,0x00ab79a8a937a1ce,0x00b9a0e549959e6f)},
}}, {{
{FIELD_LITERAL(0x00c79e0b6d97dfbd,0x00917c71fd2bc6e8,0x00db7529ccfb63d8,0x00be5be957f17866,0x00a9e11fdc2cdac1,0x007b91a8e1f44443,0x00a3065e4057d80f,0x004825f5b8d5f6d4)},
{FIELD_LITERAL(0x003e4964fa8a8fc8,0x00f6a1cdbcf41689,0x00943cb18fe7fda7,0x00606dafbf34440a,0x005d37a86399c789,0x00e79a2a69417403,0x00fe34f7e68b8866,0x0011f448ed2df10e)},
{FIELD_LITERAL(0x00f1f57efcc1fcc4,0x00513679117de154,0x002e5b5b7c86d8c3,0x009f6486561f9cfb,0x00169e74b0170cf7,0x00900205af4af696,0x006acfddb77853f3,0x00df184c90f31068)},
}}, {{
{FIELD_LITERAL(0x00b37396c3320791,0x00fc7b67175c5783,0x00c36d2cd73ecc38,0x0080ebcc0b328fc5,0x0043a5b22b35d35d,0x00466c9f1713c9da,0x0026ad346dcaa8da,0x007c684e701183a6)},
{FIELD_LITERAL(0x00fd579ffb691713,0x00b76af4f81c412d,0x00f239de96110f82,0x00e965fb437f0306,0x00ca7e9436900921,0x00e487f1325fa24a,0x00633907de476380,0x00721c62ac5b8ea0)},
{FIELD_LITERAL(0x00c0d54e542eb4f9,0x004ed657171c8dcf,0x00b743a4f7c2a39b,0x00fd9f93ed6cc567,0x00307fae3113e58b,0x0058aa577c93c319,0x00d254556f35b346,0x00491aada2203f0d)},
}}, {{
{FIELD_LITERAL(0x00dff3103786ff34,0x000144553b1f20c3,0x0095613baeb930e4,0x00098058275ea5d4,0x007cd1402b046756,0x0074d74e4d58aee3,0x005f93fc343ff69b,0x00873df17296b3b0)},
{FIELD_LITERAL(0x00c4a1fb48635413,0x00b5dd54423ad59f,0x009ff5d53fd24a88,0x003c98d267fc06a7,0x002db7cb20013641,0x00bd1d6716e191f2,0x006dbc8b29094241,0x0044bbf233dafa2c)},
{FIELD_LITERAL(0x0055838d41f531e6,0x00bf6a2dd03c81b2,0x005827a061c4839e,0x0000de2cbb36aac3,0x002efa29d9717478,0x00f9e928cc8a77ba,0x00c134b458def9ef,0x00958a182223fc48)},
}}, {{
{FIELD_LITERAL(0x000a9ee23c06881f,0x002c727d3d871945,0x00f47d971512d24a,0x00671e816f9ef31a,0x00883af2cfaad673,0x00601f98583d6c9a,0x00b435f5adc79655,0x00ad87b71c04bff2)},
{FIELD_LITERAL(0x007860d99db787cf,0x00fda8983018f4a8,0x008c8866bac4743c,0x00ef471f84c82a3f,0x00abea5976d3b8e7,0x00714882896cd015,0x00b49fae584ddac5,0x008e33a1a0b69c81)},
{FIELD_LITERAL(0x007b6ee2c9e8a9ec,0x002455dbbd89d622,0x006490cf4eaab038,0x00d925f6c3081561,0x00153b3047de7382,0x003b421f8bdceb6f,0x00761a4a5049da78,0x00980348c5202433)},
}}, {{
{FIELD_LITERAL(0x007f8a43da97dd5c,0x00058539c800fc7b,0x0040f3cf5a28414a,0x00d68dd0d95283d6,0x004adce9da90146e,0x00befa41c7d4f908,0x007603bc2e3c3060,0x00bdf360ab3545db)},
{FIELD_LITERAL(0x00eebfd4e2312cc3,0x00474b2564e4fc8c,0x003303ef14b1da9b,0x003c93e0e66beb1d,0x0013619b0566925a,0x008817c24d901bf3,0x00b62bd8898d218b,0x0075a7716f1e88a2)},
{FIELD_LITERAL(0x0009218da1e6890f,0x0026907f5fd02575,0x004dabed5f19d605,0x003abf181870249d,0x00b52fd048cc92c4,0x00b6dd51e415a5c5,0x00d9eb82bd2b4014,0x002c865a43b46b43)},
}}, {{
{FIELD_LITERAL(0x0070047189452f4c,0x00f7ad12e1ce78d5,0x00af1ba51ec44a8b,0x005f39f63e667cd6,0x00058eac4648425e,0x00d7fdab42bea03b,0x0028576a5688de15,0x00af973209e77c10)},
{FIELD_LITERAL(0x00c338b915d8fef0,0x00a893292045c39a,0x0028ab4f2eba6887,0x0060743cb519fd61,0x0006213964093ac0,0x007c0b7a43f6266d,0x008e3557c4fa5bda,0x002da976de7b8d9d)},
{FIELD_LITERAL(0x0048729f8a8b6dcd,0x00fe23b85cc4d323,0x00e7384d16e4db0e,0x004a423970678942,0x00ec0b763345d4ba,0x00c477b9f99ed721,0x00c29dad3777b230,0x001c517b466f7df6)},
}}, {{
{FIELD_LITERAL(0x006366c380f7b574,0x001c7d1f09ff0438,0x003e20a7301f5b22,0x00d3efb1916d28f6,0x0049f4f81060ce83,0x00c69d91ea43ced1,0x002b6f3e5cd269ed,0x005b0fb22ce9ec65)},
{FIELD_LITERAL(0x00aa2261022d883f,0x00ebcca4548010ac,0x002528512e28a437,0x0070ca7676b66082,0x0084bda170f7c6d3,0x00581b4747c9b8bb,0x005c96a01061c7e2,0x00fb7c4a362b5273)},
{FIELD_LITERAL(0x00c30020eb512d02,0x0060f288283a4d26,0x00b7ed13becde260,0x0075ebb74220f6e9,0x00701079fcfe8a1f,0x001c28fcdff58938,0x002e4544b8f4df6b,0x0060c5bc4f1a7d73)},
}}, {{
{FIELD_LITERAL(0x00ae307cf069f701,0x005859f222dd618b,0x00212d6c46ec0b0d,0x00a0fe4642afb62d,0x00420d8e4a0a8903,0x00a80ff639bdf7b0,0x0019bee1490b5d8e,0x007439e4b9c27a86)},
{FIELD_LITERAL(0x00a94700032a093f,0x0076e96c225216e7,0x00a63a4316e45f91,0x007d8bbb4645d3b2,0x00340a6ff22793eb,0x006f935d4572aeb7,0x00b1fb69f00afa28,0x009e8f3423161ed3)},
{FIELD_LITERAL(0x009ef49c6b5ced17,0x00a555e6269e9f0a,0x007e6f1d79ec73b5,0x009ac78695a32ac4,0x0001d77fbbcd5682,0x008cea1fee0aaeed,0x00f42bea82a53462,0x002e46ab96cafcc9)},
}}, {{
{FIELD_LITERAL(0x0051cfcc5885377a,0x00dce566cb1803ca,0x00430c7643f2c7d4,0x00dce1a1337bdcc0,0x0010d5bd7283c128,0x003b1b547f9b46fe,0x000f245e37e770ab,0x007b72511f022b37)},
{FIELD_LITERAL(0x0060db815bc4786c,0x006fab25beedc434,0x00c610d06084797c,0x000c48f08537bec0,0x0031aba51c5b93da,0x007968fa6e01f347,0x0030070da52840c6,0x00c043c225a4837f)},
{FIELD_LITERAL(0x001bcfd00649ee93,0x006dceb47e2a0fd5,0x00f2cebda0cf8fd0,0x00b6b9d9d1fbdec3,0x00815262e6490611,0x00ef7f5ce3176760,0x00e49cd0c998d58b,0x005fc6cc269ba57c)},
}}, {{
{FIELD_LITERAL(0x008940211aa0d633,0x00addae28136571d,0x00d68fdbba20d673,0x003bc6129bc9e21a,0x000346cf184ebe9a,0x0068774d741ebc7f,0x0019d5e9e6966557,0x0003cbd7f981b651)},
{FIELD_LITERAL(0x004a2902926f8d3f,0x00ad79b42637ab75,0x0088f60b90f2d4e8,0x0030f54ef0e398c4,0x00021dc9bf99681e,0x007ebf66fde74ee3,0x004ade654386e9a4,0x00e7485066be4c27)},
{FIELD_LITERAL(0x00445f1263983be0,0x004cf371dda45e6a,0x00744a89d5a310e7,0x001f20ce4f904833,0x00e746edebe66e29,0x000912ab1f6c153d,0x00f61d77d9b2444c,0x0001499cd6647610)},
{FIELD_LITERAL(0x00cc3b062366f4ccULL, 0x003d6e34e314aa3cULL,
0x00d51c0a7521774dULL, 0x0094e060eec6ab8bULL,
0x00d21291b4d80082ULL, 0x00befed12b55ef1eULL,
0x00c3dd2df5c94518ULL, 0x00e0a7b112b8d4e6ULL)},
{FIELD_LITERAL(0x0019eb5608d8723aULL, 0x00d1bab52fb3aedbULL,
0x00270a7311ebc90cULL, 0x0037c12b91be7f13ULL,
0x005be16cd8b5c704ULL, 0x003e181acda888e1ULL,
0x00bc1f00fc3fc6d0ULL, 0x00d3839bfa319e20ULL)},
{FIELD_LITERAL(0x003caeb88611909fULL, 0x00ea8b378c4df3d4ULL,
0x00b3295b95a5a19aULL, 0x00a65f97514bdfb5ULL,
0x00b39efba743cab1ULL, 0x0016ba98b862fd2dULL,
0x0001508812ee71d7ULL, 0x000a75740eea114aULL)},
}}, {{
{FIELD_LITERAL(0x00ebcf0eb649f823ULL, 0x00166d332e98ea03ULL,
0x0059ddf64f5cd5f6ULL, 0x0047763123d9471bULL,
0x00a64065c53ef62fULL, 0x00978e44c480153dULL,
0x000b5b2a0265f194ULL, 0x0046a24b9f32965aULL)},
{FIELD_LITERAL(0x00b9eef787034df0ULL, 0x0020bc24de3390cdULL,
0x000022160bae99bbULL, 0x00ae66e886e97946ULL,
0x0048d4bbe02cbb8bULL, 0x0072ba97b34e38d4ULL,
0x00eae7ec8f03e85aULL, 0x005ba92ecf808b2cULL)},
{FIELD_LITERAL(0x00c9cfbbe74258fdULL, 0x00843a979ea9eaa7ULL,
0x000cbb4371cfbe90ULL, 0x0059bac8f7f0a628ULL,
0x004b3dff882ff530ULL, 0x0011869df4d90733ULL,
0x00595aa71f4abfc2ULL, 0x0070e2d38990c2e6ULL)},
}}, {{
{FIELD_LITERAL(0x00de2010c0a01733ULL, 0x00c739a612e24297ULL,
0x00a7212643141d7cULL, 0x00f88444f6b67c11ULL,
0x00484b7b16ec28f2ULL, 0x009c1b8856af9c68ULL,
0x00ff4669591fe9d6ULL, 0x0054974be08a32c8ULL)},
{FIELD_LITERAL(0x0010de3fd682ceedULL, 0x008c07642d83ca4eULL,
0x0013bb064e00a1ccULL, 0x009411ae27870e11ULL,
0x00ea8e5b4d531223ULL, 0x0032fe7d2aaece2eULL,
0x00d989e243e7bb41ULL, 0x000fe79a508e9b8bULL)},
{FIELD_LITERAL(0x005e0426b9bfc5b1ULL, 0x0041a5b1d29ee4faULL,
0x0015b0def7774391ULL, 0x00bc164f1f51af01ULL,
0x00d543b0942797b9ULL, 0x003c129b6398099cULL,
0x002b114c6e5adf18ULL, 0x00b4e630e4018a7bULL)},
}}, {{
{FIELD_LITERAL(0x00d490afc95f8420ULL, 0x00b096bf50c1d9b9ULL,
0x00799fd707679866ULL, 0x007c74d9334afbeaULL,
0x00efaa8be80ff4edULL, 0x0075c4943bb81694ULL,
0x00c21c2fca161f36ULL, 0x00e77035d492bfeeULL)},
{FIELD_LITERAL(0x006658a190dd6661ULL, 0x00e0e9bab38609a6ULL,
0x0028895c802237edULL, 0x006a0229c494f587ULL,
0x002dcde96c9916b7ULL, 0x00d158822de16218ULL,
0x00173b917a06856fULL, 0x00ca78a79ae07326ULL)},
{FIELD_LITERAL(0x00e35bfc79caced4ULL, 0x0087238a3e1fe3bbULL,
0x00bcbf0ff4ceff5bULL, 0x00a19c1c94099b91ULL,
0x0071e102b49db976ULL, 0x0059e3d004eada1eULL,
0x008da78afa58a47eULL, 0x00579c8ebf269187ULL)},
}}, {{
{FIELD_LITERAL(0x00a16c2905eee75fULL, 0x009d4bcaea2c7e1dULL,
0x00d3bd79bfad19dfULL, 0x0050da745193342cULL,
0x006abdb8f6b29ab1ULL, 0x00a24fe0a4fef7efULL,
0x0063730da1057dfbULL, 0x00a08c312c8eb108ULL)},
{FIELD_LITERAL(0x00b583be005375beULL, 0x00a40c8f8a4e3df4ULL,
0x003fac4a8f5bdbf7ULL, 0x00d4481d872cd718ULL,
0x004dc8749cdbaefeULL, 0x00cce740d5e5c975ULL,
0x000b1c1f4241fd21ULL, 0x00a76de1b4e1cd07ULL)},
{FIELD_LITERAL(0x007a076500d30b62ULL, 0x000a6e117b7f090fULL,
0x00c8712ae7eebd9aULL, 0x000fbd6c1d5f6ff7ULL,
0x003a7977246ebf11ULL, 0x00166ed969c6600eULL,
0x00aa42e469c98becULL, 0x00dc58f307cf0666ULL)},
}}, {{
{FIELD_LITERAL(0x004b491f65a9a28bULL, 0x006a10309e8a55b7ULL,
0x00b67210185187efULL, 0x00cf6497b12d9b8fULL,
0x0085778c56e2b1baULL, 0x0015b4c07a814d85ULL,
0x00686479e62da561ULL, 0x008de5d88f114916ULL)},
{FIELD_LITERAL(0x00e37c88d6bba7b1ULL, 0x003e4577e1b8d433ULL,
0x0050d8ea5f510ec0ULL, 0x0042fc9f2da9ef59ULL,
0x003bd074c1141420ULL, 0x00561b8b7b68774eULL,
0x00232e5e5d1013a3ULL, 0x006b7f2cb3d7e73fULL)},
{FIELD_LITERAL(0x004bdd0f0b41e6a0ULL, 0x001773057c405d24ULL,
0x006029f99915bd97ULL, 0x006a5ba70a17fe2fULL,
0x0046111977df7e08ULL, 0x004d8124c89fb6b7ULL,
0x00580983b2bb2724ULL, 0x00207bf330d6f3feULL)},
}}, {{
{FIELD_LITERAL(0x007efdc93972a48bULL, 0x002f5e50e78d5feeULL,
0x0080dc11d61c7fe5ULL, 0x0065aa598707245bULL,
0x009abba2300641beULL, 0x000c68787656543aULL,
0x00ffe0fef2dc0a17ULL, 0x00007ffbd6cb4f3aULL)},
{FIELD_LITERAL(0x0036012f2b836efcULL, 0x00458c126d6b5fbcULL,
0x00a34436d719ad1eULL, 0x0097be6167117deaULL,
0x0009c219c879cff3ULL, 0x0065564493e60755ULL,
0x00993ac94a8cdec0ULL, 0x002d4885a4d0dbafULL)},
{FIELD_LITERAL(0x00598b60b4c068baULL, 0x00c547a0be7f1afdULL,
0x009582164acf12afULL, 0x00af4acac4fbbe40ULL,
0x005f6ca7c539121aULL, 0x003b6e752ebf9d66ULL,
0x00f08a30d5cac5d4ULL, 0x00e399bb5f97c5a9ULL)},
}}, {{
{FIELD_LITERAL(0x007445a0409c0a66ULL, 0x00a65c369f3829c0ULL,
0x0031d248a4f74826ULL, 0x006817f34defbe8eULL,
0x00649741d95ebf2eULL, 0x00d46466ab16b397ULL,
0x00fdc35703bee414ULL, 0x00343b43334525f8ULL)},
{FIELD_LITERAL(0x001796bea93f6401ULL, 0x00090c5a42e85269ULL,
0x00672412ba1252edULL, 0x001201d47b6de7deULL,
0x006877bccfe66497ULL, 0x00b554fd97a4c161ULL,
0x009753f42dbac3cfULL, 0x00e983e3e378270aULL)},
{FIELD_LITERAL(0x00ac3eff18849872ULL, 0x00f0eea3bff05690ULL,
0x00a6d72c21dd505dULL, 0x001b832642424169ULL,
0x00a6813017b540e5ULL, 0x00a744bd71b385cdULL,
0x0022a7d089130a7bULL, 0x004edeec9a133486ULL)},
}}, {{
{FIELD_LITERAL(0x00b2d6729196e8a9ULL, 0x0088a9bb2031cef4ULL,
0x00579e7787dc1567ULL, 0x0030f49feb059190ULL,
0x00a0b1d69c7f7d8fULL, 0x0040bdcc6d9d806fULL,
0x00d76c4037edd095ULL, 0x00bbf24376415dd7ULL)},
{FIELD_LITERAL(0x00240465ff5a7197ULL, 0x00bb97e76caf27d0ULL,
0x004b4edbf8116d39ULL, 0x001d8586f708cbaaULL,
0x000f8ee8ff8e4a50ULL, 0x00dde5a1945dd622ULL,
0x00e6fc1c0957e07cULL, 0x0041c9cdabfd88a0ULL)},
{FIELD_LITERAL(0x005344b0bf5b548cULL, 0x002957d0b705cc99ULL,
0x00f586a70390553dULL, 0x0075b3229f583cc3ULL,
0x00a1aa78227490e4ULL, 0x001bf09cf7957717ULL,
0x00cf6bf344325f52ULL, 0x0065bd1c23ca3ecfULL)},
}}, {{
{FIELD_LITERAL(0x009bff3b3239363cULL, 0x00e17368796ef7c0ULL,
0x00528b0fe0971f3aULL, 0x0008014fc8d4a095ULL,
0x00d09f2e8a521ec4ULL, 0x006713ab5dde5987ULL,
0x0003015758e0dbb1ULL, 0x00215999f1ba212dULL)},
{FIELD_LITERAL(0x002c88e93527da0eULL, 0x0077c78f3456aad5ULL,
0x0071087a0a389d1cULL, 0x00934dac1fb96dbdULL,
0x008470e801162697ULL, 0x005bc2196cd4ad49ULL,
0x00e535601d5087c3ULL, 0x00769888700f497fULL)},
{FIELD_LITERAL(0x00da7a4b557298adULL, 0x0019d2589ea5df76ULL,
0x00ef3e38be0c6497ULL, 0x00a9644e1312609aULL,
0x004592f61b2558daULL, 0x0082c1df510d7e46ULL,
0x0042809a535c0023ULL, 0x00215bcb5afd7757ULL)},
}}, {{
{FIELD_LITERAL(0x002b9df55a1a4213ULL, 0x00dcfc3b464a26beULL,
0x00c4f9e07a8144d5ULL, 0x00c8e0617a92b602ULL,
0x008e3c93accafae0ULL, 0x00bf1bcb95b2ca60ULL,
0x004ce2426a613bf3ULL, 0x00266cac58e40921ULL)},
{FIELD_LITERAL(0x008456d5db76e8f0ULL, 0x0032ca9cab2ce163ULL,
0x0059f2b8bf91abcfULL, 0x0063c2a021712788ULL,
0x00f86155af22f72dULL, 0x00db98b2a6c005a0ULL,
0x00ac6e416a693ac4ULL, 0x007a93572af53226ULL)},
{FIELD_LITERAL(0x0087767520f0de22ULL, 0x0091f64012279fb5ULL,
0x001050f1f0644999ULL, 0x004f097a2477ad3cULL,
0x006b37913a9947bdULL, 0x001a3d78645af241ULL,
0x0057832bbb3008a7ULL, 0x002c1d902b80dc20ULL)},
}}, {{
{FIELD_LITERAL(0x001a6002bf178877ULL, 0x009bce168aa5af50ULL,
0x005fc318ff04a7f5ULL, 0x0052818f55c36461ULL,
0x008768f5d4b24afbULL, 0x0037ffbae7b69c85ULL,
0x0018195a4b61edc0ULL, 0x001e12ea088434b2ULL)},
{FIELD_LITERAL(0x0047d3f804e7ab07ULL, 0x00a809ab5f905260ULL,
0x00b3ffc7cdaf306dULL, 0x00746e8ec2d6e509ULL,
0x00d0dade8887a645ULL, 0x00acceeebde0dd37ULL,
0x009bc2579054686bULL, 0x0023804f97f1c2bfULL)},
{FIELD_LITERAL(0x0043e2e2e50b80d7ULL, 0x00143aafe4427e0fULL,
0x005594aaecab855bULL, 0x008b12ccaaecbc01ULL,
0x002deeb091082bc3ULL, 0x009cca4be2ae7514ULL,
0x00142b96e696d047ULL, 0x00ad2a2b1c05256aULL)},
}}, {{
{FIELD_LITERAL(0x003914f2f144b78bULL, 0x007a95dd8bee6f68ULL,
0x00c7f4384d61c8e6ULL, 0x004e51eb60f1bdb2ULL,
0x00f64be7aa4621d8ULL, 0x006797bfec2f0ac0ULL,
0x007d17aab3c75900ULL, 0x001893e73cac8bc5ULL)},
{FIELD_LITERAL(0x00140360b768665bULL, 0x00b68aca4967f977ULL,
0x0001089b66195ae4ULL, 0x00fe71122185e725ULL,
0x000bca2618d49637ULL, 0x00a54f0557d7e98aULL,
0x00cdcd2f91d6f417ULL, 0x00ab8c13741fd793ULL)},
{FIELD_LITERAL(0x00725ee6b1e549e0ULL, 0x007124a0769777faULL,
0x000b68fdad07ae42ULL, 0x0085b909cd4952dfULL,
0x0092d2e3c81606f4ULL, 0x009f22f6cac099a0ULL,
0x00f59da57f2799a8ULL, 0x00f06c090122f777ULL)},
}}, {{
{FIELD_LITERAL(0x00ce0bed0a3532bcULL, 0x001a5048a22df16bULL,
0x00e31db4cbad8bf1ULL, 0x00e89292120cf00eULL,
0x007d1dd1a9b00034ULL, 0x00e2a9041ff8f680ULL,
0x006a4c837ae596e7ULL, 0x00713af1068070b3ULL)},
{FIELD_LITERAL(0x00c4fe64ce66d04bULL, 0x00b095d52e09b3d7ULL,
0x00758bbecb1a3a8eULL, 0x00f35cce8d0650c0ULL,
0x002b878aa5984473ULL, 0x0062e0a3b7544ddcULL,
0x00b25b290ed116feULL, 0x007b0f6abe0bebf2ULL)},
{FIELD_LITERAL(0x0081d4e3addae0a8ULL, 0x003410c836c7ffccULL,
0x00c8129ad89e4314ULL, 0x000e3d5a23922dcdULL,
0x00d91e46f29c31f3ULL, 0x006c728cde8c5947ULL,
0x002bc655ba2566c0ULL, 0x002ca94721533108ULL)},
}}, {{
{FIELD_LITERAL(0x0051e4b3f764d8a9ULL, 0x0019792d46e904a0ULL,
0x00853bc13dbc8227ULL, 0x000840208179f12dULL,
0x0068243474879235ULL, 0x0013856fbfe374d0ULL,
0x00bda12fe8676424ULL, 0x00bbb43635926eb2ULL)},
{FIELD_LITERAL(0x0012cdc880a93982ULL, 0x003c495b21cd1b58ULL,
0x00b7e5c93f22a26eULL, 0x0044aa82dfb99458ULL,
0x009ba092cdffe9c0ULL, 0x00a14b3ab2083b73ULL,
0x000271c2f70e1c4bULL, 0x00eea9cac0f66eb8ULL)},
{FIELD_LITERAL(0x001a1847c4ac5480ULL, 0x00b1b412935bb03aULL,
0x00f74285983bf2b2ULL, 0x00624138b5b5d0f1ULL,
0x008820c0b03d38bfULL, 0x00b94e50a18c1572ULL,
0x0060f6934841798fULL, 0x00c52f5d66d6ebe2ULL)},
}}, {{
{FIELD_LITERAL(0x00da23d59f9bcea6ULL, 0x00e0f27007a06a4bULL,
0x00128b5b43a6758cULL, 0x000cf50190fa8b56ULL,
0x00fc877aba2b2d72ULL, 0x00623bef52edf53fULL,
0x00e6af6b819669e2ULL, 0x00e314dc34fcaa4fULL)},
{FIELD_LITERAL(0x0066e5eddd164d1eULL, 0x00418a7c6fe28238ULL,
0x0002e2f37e962c25ULL, 0x00f01f56b5975306ULL,
0x0048842fa503875cULL, 0x0057b0e968078143ULL,
0x00ff683024f3d134ULL, 0x0082ae28fcad12e4ULL)},
{FIELD_LITERAL(0x0011ddfd21260e42ULL, 0x00d05b0319a76892ULL,
0x00183ea4368e9b8fULL, 0x00b0815662affc96ULL,
0x00b466a5e7ce7c88ULL, 0x00db93b07506e6eeULL,
0x0033885f82f62401ULL, 0x0086f9090ec9b419ULL)},
}}, {{
{FIELD_LITERAL(0x00d95d1c5fcb435aULL, 0x0016d1ed6b5086f9ULL,
0x00792aa0b7e54d71ULL, 0x0067b65715f1925dULL,
0x00a219755ec6176bULL, 0x00bc3f026b12c28fULL,
0x00700c897ffeb93eULL, 0x0089b83f6ec50b46ULL)},
{FIELD_LITERAL(0x003c97e6384da36eULL, 0x00423d53eac81a09ULL,
0x00b70d68f3cdce35ULL, 0x00ee7959b354b92cULL,
0x00f4e9718819c8caULL, 0x009349f12acbffe9ULL,
0x005aee7b62cb7da6ULL, 0x00d97764154ffc86ULL)},
{FIELD_LITERAL(0x00526324babb46dcULL, 0x002ee99b38d7bf9eULL,
0x007ea51794706ef4ULL, 0x00abeb04da6e3c39ULL,
0x006b457c1d281060ULL, 0x00fe243e9a66c793ULL,
0x00378de0fb6c6ee4ULL, 0x003e4194b9c3cb93ULL)},
}}, {{
{FIELD_LITERAL(0x00fed3cd80ca2292ULL, 0x0015b043a73ca613ULL,
0x000a9fd7bf9be227ULL, 0x003b5e03de2db983ULL,
0x005af72d46904ef7ULL, 0x00c0f1b5c49faa99ULL,
0x00dc86fc3bd305e1ULL, 0x00c92f08c1cb1797ULL)},
{FIELD_LITERAL(0x0079680ce111ed3bULL, 0x001a1ed82806122cULL,
0x000c2e7466d15df3ULL, 0x002c407f6f7150fdULL,
0x00c5e7c96b1b0ce3ULL, 0x009aa44626863ff9ULL,
0x00887b8b5b80be42ULL, 0x00b6023cec964825ULL)},
{FIELD_LITERAL(0x00e4a8e1048970c8ULL, 0x0062887b7830a302ULL,
0x00bcf1c8cd81402bULL, 0x0056dbb81a68f5beULL,
0x0014eced83f12452ULL, 0x00139e1a510150dfULL,
0x00bb81140a82d1a3ULL, 0x000febcc1aaf1aa7ULL)},
}}, {{
{FIELD_LITERAL(0x00a7527958238159ULL, 0x0013ec9537a84cd6ULL,
0x001d7fee7d562525ULL, 0x00b9eefa6191d5e5ULL,
0x00dbc97db70bcb8aULL, 0x00481affc7a4d395ULL,
0x006f73d3e70c31bbULL, 0x00183f324ed96a61ULL)},
{FIELD_LITERAL(0x0039dd7ce7fc6860ULL, 0x00d64f6425653da1ULL,
0x003e037c7f57d0afULL, 0x0063477a06e2bcf2ULL,
0x001727dbb7ac67e6ULL, 0x0049589f5efafe2eULL,
0x00fc0fef2e813d54ULL, 0x008baa5d087fb50dULL)},
{FIELD_LITERAL(0x0024fb59d9b457c7ULL, 0x00a7d4e060223e4cULL,
0x00c118d1b555fd80ULL, 0x0082e216c732f22aULL,
0x00cd2a2993089504ULL, 0x003638e836a3e13dULL,
0x000d855ee89b4729ULL, 0x008ec5b7d4810c91ULL)},
}}, {{
{FIELD_LITERAL(0x001bf51f7d65cdfdULL, 0x00d14cdafa16a97dULL,
0x002c38e60fcd10e7ULL, 0x00a27446e393efbdULL,
0x000b5d8946a71fddULL, 0x0063df2cde128f2fULL,
0x006c8679569b1888ULL, 0x0059ffc4925d732dULL)},
{FIELD_LITERAL(0x00ece96f95f2b66fULL, 0x00ece7952813a27bULL,
0x0026fc36592e489eULL, 0x007157d1a2de0f66ULL,
0x00759dc111d86ddfULL, 0x0012881e5780bb0fULL,
0x00c8ccc83ad29496ULL, 0x0012b9bd1929eb71ULL)},
{FIELD_LITERAL(0x000fa15a20da5df0ULL, 0x00349ddb1a46cd31ULL,
0x002c512ad1d8e726ULL, 0x00047611f669318dULL,
0x009e68fba591e17eULL, 0x004320dffa803906ULL,
0x00a640874951a3d3ULL, 0x00b6353478baa24fULL)},
}}, {{
{FIELD_LITERAL(0x009696510000d333ULL, 0x00ec2f788bc04826ULL,
0x000e4d02b1f67ba5ULL, 0x00659aa8dace08b6ULL,
0x00d7a38a3a3ae533ULL, 0x008856defa8c746bULL,
0x004d7a4402d3da1aULL, 0x00ea82e06229260fULL)},
{FIELD_LITERAL(0x006a15bb20f75c0cULL, 0x0079a144027a5d0cULL,
0x00d19116ce0b4d70ULL, 0x0059b83bcb0b268eULL,
0x005f58f63f16c127ULL, 0x0079958318ee2c37ULL,
0x00defbb063d07f82ULL, 0x00f1f0b931d2d446ULL)},
{FIELD_LITERAL(0x00cb5e4c3c35d422ULL, 0x008df885ca43577fULL,
0x00fa50b16ca3e471ULL, 0x005a0e58e17488c8ULL,
0x00b2ceccd6d34d19ULL, 0x00f01d5d235e36e9ULL,
0x00db2e7e4be6ca44ULL, 0x00260ab77f35fccdULL)},
}}, {{
{FIELD_LITERAL(0x006f6fd9baac61d5ULL, 0x002a7710a020a895ULL,
0x009de0db7fc03d4dULL, 0x00cdedcb1875f40bULL,
0x00050caf9b6b1e22ULL, 0x005e3a6654456ab0ULL,
0x00775fdf8c4423d4ULL, 0x0028701ea5738b5dULL)},
{FIELD_LITERAL(0x009ffd90abfeae96ULL, 0x00cba3c2b624a516ULL,
0x005ef08bcee46c91ULL, 0x00e6fde30afb6185ULL,
0x00f0b4db4f818ce4ULL, 0x006c54f45d2127f5ULL,
0x00040125035854c7ULL, 0x00372658a3287e13ULL)},
{FIELD_LITERAL(0x00d7070fb1beb2abULL, 0x0078fc845a93896bULL,
0x006894a4b2f224a6ULL, 0x005bdd8192b9dbdeULL,
0x00b38839874b3a9eULL, 0x00f93618b04b7a57ULL,
0x003e3ec75fd2c67eULL, 0x00bf5e6bfc29494aULL)},
}}, {{
{FIELD_LITERAL(0x00f19224ebba2aa5ULL, 0x0074f89d358e694dULL,
0x00eea486597135adULL, 0x0081579a4555c7e1ULL,
0x0010b9b872930a9dULL, 0x00f002e87a30ecc0ULL,
0x009b9d66b6de56e2ULL, 0x00a3c4f45e8004ebULL)},
{FIELD_LITERAL(0x0045e8dda9400888ULL, 0x002ff12e5fc05db7ULL,
0x00a7098d54afe69cULL, 0x00cdbe846a500585ULL,
0x00879c1593ca1882ULL, 0x003f7a7fea76c8b0ULL,
0x002cd73dd0c8e0a1ULL, 0x00645d6ce96f51feULL)},
{FIELD_LITERAL(0x002b7e83e123d6d6ULL, 0x00398346f7419c80ULL,
0x0042922e55940163ULL, 0x005e7fc5601886a3ULL,
0x00e88f2cee1d3103ULL, 0x00e7fab135f2e377ULL,
0x00b059984dbf0dedULL, 0x0009ce080faa5bb8ULL)},
}}, {{
{FIELD_LITERAL(0x0085e78af7758979ULL, 0x00275a4ee1631a3aULL,
0x00d26bc0ed78b683ULL, 0x004f8355ea21064fULL,
0x00d618e1a32696e5ULL, 0x008d8d7b150e5680ULL,
0x00a74cd854b278d2ULL, 0x001dd62702203ea0ULL)},
{FIELD_LITERAL(0x00f89335c2a59286ULL, 0x00a0f5c905d55141ULL,
0x00b41fb836ee9382ULL, 0x00e235d51730ca43ULL,
0x00a5cb37b5c0a69aULL, 0x009b966ffe136c45ULL,
0x00cb2ea10bf80ed1ULL, 0x00fb2b370b40dc35ULL)},
{FIELD_LITERAL(0x00d687d16d4ee8baULL, 0x0071520bdd069dffULL,
0x00de85c60d32355dULL, 0x0087d2e3565102f4ULL,
0x00cde391b8dfc9aaULL, 0x00e18d69efdfefe5ULL,
0x004a9d0591954e91ULL, 0x00fa36dd8b50eee5ULL)},
}}, {{
{FIELD_LITERAL(0x002e788749a865f7ULL, 0x006e4dc3116861eaULL,
0x009f1428c37276e6ULL, 0x00e7d2e0fc1e1226ULL,
0x003aeebc6b6c45f6ULL, 0x0071a8073bf500c9ULL,
0x004b22ad986b530cULL, 0x00f439e63c0d79d4ULL)},
{FIELD_LITERAL(0x006bc3d53011f470ULL, 0x00032d6e692b83e8ULL,
0x00059722f497cd0bULL, 0x0009b4e6f0c497ccULL,
0x0058a804b7cce6c0ULL, 0x002b71d3302bbd5dULL,
0x00e2f82a36765fceULL, 0x008dded99524c703ULL)},
{FIELD_LITERAL(0x004d058953747d64ULL, 0x00701940fe79aa6fULL,
0x00a620ac71c760bfULL, 0x009532b611158b75ULL,
0x00547ed7f466f300ULL, 0x003cb5ab53a8401aULL,
0x00c7763168ce3120ULL, 0x007e48e33e4b9ab2ULL)},
}}, {{
{FIELD_LITERAL(0x001b2fc57bf3c738ULL, 0x006a3f918993fb80ULL,
0x0026f7a14fdec288ULL, 0x0075a2cdccef08dbULL,
0x00d3ecbc9eecdbf1ULL, 0x0048c40f06e5bf7fULL,
0x00d63e423009896bULL, 0x000598bc99c056a8ULL)},
{FIELD_LITERAL(0x002f194eaafa46dcULL, 0x008e38f57fe87613ULL,
0x00dc8e5ae25f4ab2ULL, 0x000a17809575e6bdULL,
0x00d3ec7923ba366aULL, 0x003a7e72e0ad75e3ULL,
0x0010024b88436e0aULL, 0x00ed3c5444b64051ULL)},
{FIELD_LITERAL(0x00831fc1340af342ULL, 0x00c9645669466d35ULL,
0x007692b4cc5a080fULL, 0x009fd4a47ac9259fULL,
0x001eeddf7d45928bULL, 0x003c0446fc45f28bULL,
0x002c0713aa3e2507ULL, 0x0095706935f0f41eULL)},
}}, {{
{FIELD_LITERAL(0x00766ae4190ec6d8ULL, 0x0065768cabc71380ULL,
0x00b902598416cdc2ULL, 0x00380021ad38df52ULL,
0x008f0b89d6551134ULL, 0x004254d4cc62c5a5ULL,
0x000d79f4484b9b94ULL, 0x00b516732ae3c50eULL)},
{FIELD_LITERAL(0x001fb73475c45509ULL, 0x00d2b2e5ea43345aULL,
0x00cb3c3842077bd1ULL, 0x0029f90ad820946eULL,
0x007c11b2380778aaULL, 0x009e54ece62c1704ULL,
0x004bc60c41ca01c3ULL, 0x004525679a5a0b03ULL)},
{FIELD_LITERAL(0x00c64fbddbed87b3ULL, 0x0040601d11731faaULL,
0x009c22475b6f9d67ULL, 0x0024b79dae875f15ULL,
0x00616fed3f02c3b0ULL, 0x0000cf39f6af2d3bULL,
0x00c46bac0aa9a688ULL, 0x00ab23e2800da204ULL)},
}}, {{
{FIELD_LITERAL(0x000b3a37617632b0ULL, 0x00597199fe1cfb6cULL,
0x0042a7ccdfeafdd6ULL, 0x004cc9f15ebcea17ULL,
0x00f436e596a6b4a4ULL, 0x00168861142df0d8ULL,
0x000753edfec26af5ULL, 0x000c495d7e388116ULL)},
{FIELD_LITERAL(0x0017085f4a346148ULL, 0x00c7cf7a37f62272ULL,
0x001776e129bc5c30ULL, 0x009955134c9eef2aULL,
0x001ba5bdf1df07beULL, 0x00ec39497103a55cULL,
0x006578354fda6cfbULL, 0x005f02719d4f15eeULL)},
{FIELD_LITERAL(0x0052b9d9b5d9655dULL, 0x00d4ec7ba1b461c3ULL,
0x00f95df4974f280bULL, 0x003d8e5ca11aeb51ULL,
0x00d4981eb5a70b26ULL, 0x000af9a4f6659f29ULL,
0x004598c846faeb43ULL, 0x0049d9a183a47670ULL)},
}}, {{
{FIELD_LITERAL(0x000a72d23dcb3f1fULL, 0x00a3737f84011727ULL,
0x00f870c0fbbf4a47ULL, 0x00a7aadd04b5c9caULL,
0x000c7715c67bd072ULL, 0x00015a136afcd74eULL,
0x0080d5caea499634ULL, 0x0026b448ec7514b7ULL)},
{FIELD_LITERAL(0x00b60167d9e7d065ULL, 0x00e60ba0d07381e8ULL,
0x003a4f17b725c2d4ULL, 0x006c19fe176b64faULL,
0x003b57b31af86ccbULL, 0x0021047c286180fdULL,
0x00bdc8fb00c6dbb6ULL, 0x00fe4a9f4bab4f3fULL)},
{FIELD_LITERAL(0x0088ffc3a16111f7ULL, 0x009155e4245d0bc8ULL,
0x00851d68220572d5ULL, 0x00557ace1e514d29ULL,
0x0031d7c339d91022ULL, 0x00101d0ae2eaceeaULL,
0x00246ab3f837b66aULL, 0x00d5216d381ff530ULL)},
}}, {{
{FIELD_LITERAL(0x0057e7ea35f36daeULL, 0x00f47d7ad15de22eULL,
0x00d757ea4b105115ULL, 0x008311457d579d7eULL,
0x00b49b75b1edd4ebULL, 0x0081c7ff742fd63aULL,
0x00ddda3187433df6ULL, 0x00475727d55f9c66ULL)},
{FIELD_LITERAL(0x00a6295218dc136aULL, 0x00563b3af0e9c012ULL,
0x00d3753b0145db1bULL, 0x004550389c043dc1ULL,
0x00ea94ae27401bdfULL, 0x002b0b949f2b7956ULL,
0x00c63f780ad8e23cULL, 0x00e591c47d6bab15ULL)},
{FIELD_LITERAL(0x00416c582b058eb6ULL, 0x004107da5b2cc695ULL,
0x00b3cd2556aeec64ULL, 0x00c0b418267e57a1ULL,
0x001799293579bd2eULL, 0x0046ed44590e4d07ULL,
0x001d7459b3630a1eULL, 0x00c6afba8b6696aaULL)},
}}, {{
{FIELD_LITERAL(0x008d6009b26da3f8ULL, 0x00898e88ca06b1caULL,
0x00edb22b2ed7fe62ULL, 0x00fbc93516aabe80ULL,
0x008b4b470c42ce0dULL, 0x00e0032ba7d0dcbbULL,
0x00d76da3a956ecc8ULL, 0x007f20fe74e3852aULL)},
{FIELD_LITERAL(0x002419222c607674ULL, 0x00a7f23af89188b3ULL,
0x00ad127284e73d1cULL, 0x008bba582fae1c51ULL,
0x00fc6aa7ca9ecab1ULL, 0x003df5319eb6c2baULL,
0x002a05af8a8b199aULL, 0x004bf8354558407cULL)},
{FIELD_LITERAL(0x00ce7d4a30f0fcbfULL, 0x00d02c272629f03dULL,
0x0048c001f7400bc2ULL, 0x002c21368011958dULL,
0x0098a550391e96b5ULL, 0x002d80b66390f379ULL,
0x001fa878760cc785ULL, 0x001adfce54b613d5ULL)},
}}, {{
{FIELD_LITERAL(0x001ed4dc71fa2523ULL, 0x005d0bff19bf9b5cULL,
0x00c3801cee065a64ULL, 0x001ed0b504323fbfULL,
0x0003ab9fdcbbc593ULL, 0x00df82070178b8d2ULL,
0x00a2bcaa9c251f85ULL, 0x00c628a3674bd02eULL)},
{FIELD_LITERAL(0x006b7a0674f9f8deULL, 0x00a742414e5c7cffULL,
0x0041cbf3c6e13221ULL, 0x00e3a64fd207af24ULL,
0x0087c05f15fbe8d1ULL, 0x004c50936d9e8a33ULL,
0x001306ec21042b6dULL, 0x00a4f4137d1141c2ULL)},
{FIELD_LITERAL(0x0009e6fb921568b0ULL, 0x00b3c60120219118ULL,
0x002a6c3460dd503aULL, 0x009db1ef11654b54ULL,
0x0063e4bf0be79601ULL, 0x00670d34bb2592b9ULL,
0x00dcee2f6c4130ceULL, 0x00b2682e88e77f54ULL)},
}}, {{
{FIELD_LITERAL(0x000d5b4b3da135abULL, 0x00838f3e5064d81dULL,
0x00d44eb50f6d94edULL, 0x0008931ab502ac6dULL,
0x00debe01ca3d3586ULL, 0x0025c206775f0641ULL,
0x005ad4b6ae912763ULL, 0x007e2c318ad8f247ULL)},
{FIELD_LITERAL(0x00ddbe0750dd1addULL, 0x004b3c7b885844b8ULL,
0x00363e7ecf12f1aeULL, 0x0062e953e6438f9dULL,
0x0023cc73b076afe9ULL, 0x00b09fa083b4da32ULL,
0x00c7c3d2456c541dULL, 0x005b591ec6b694d4ULL)},
{FIELD_LITERAL(0x0028656e19d62fcfULL, 0x0052a4af03df148dULL,
0x00122765ddd14e42ULL, 0x00f2252904f67157ULL,
0x004741965b636f3aULL, 0x006441d296132cb9ULL,
0x005e2106f956a5b7ULL, 0x00247029592d335cULL)},
}}, {{
{FIELD_LITERAL(0x003fe038eb92f894ULL, 0x000e6da1b72e8e32ULL,
0x003a1411bfcbe0faULL, 0x00b55d473164a9e4ULL,
0x00b9a775ac2df48dULL, 0x0002ddf350659e21ULL,
0x00a279a69eb19cb3ULL, 0x00f844eab25cba44ULL)},
{FIELD_LITERAL(0x00c41d1f9c1f1ac1ULL, 0x007b2df4e9f19146ULL,
0x00b469355fd5ba7aULL, 0x00b5e1965afc852aULL,
0x00388d5f1e2d8217ULL, 0x0022079e4c09ae93ULL,
0x0014268acd4ef518ULL, 0x00c1dd8d9640464cULL)},
{FIELD_LITERAL(0x0038526adeed0c55ULL, 0x00dd68c607e3fe85ULL,
0x00f746ddd48a5d57ULL, 0x0042f2952b963b7cULL,
0x001cbbd6876d5ec2ULL, 0x005e341470bca5c2ULL,
0x00871d41e085f413ULL, 0x00e53ab098f45732ULL)},
}}, {{
{FIELD_LITERAL(0x004d51124797c831ULL, 0x008f5ae3750347adULL,
0x0070ced94c1a0c8eULL, 0x00f6db2043898e64ULL,
0x000d00c9a5750cd0ULL, 0x000741ec59bad712ULL,
0x003c9d11aab37b7fULL, 0x00a67ba169807714ULL)},
{FIELD_LITERAL(0x00adb2c1566e8b8fULL, 0x0096c68a35771a9aULL,
0x00869933356f334aULL, 0x00ba9c93459f5962ULL,
0x009ec73fb6e8ca4bULL, 0x003c3802c27202e1ULL,
0x0031f5b733e0c008ULL, 0x00f9058c19611fa9ULL)},
{FIELD_LITERAL(0x00238f01814a3421ULL, 0x00c325a44b6cce28ULL,
0x002136f97aeb0e73ULL, 0x000cac8268a4afe2ULL,
0x0022fd218da471b3ULL, 0x009dcd8dfff8def9ULL,
0x00cb9f8181d999bbULL, 0x00143ae56edea349ULL)},
}}, {{
{FIELD_LITERAL(0x0000623bf87622c5ULL, 0x00a1966fdd069496ULL,
0x00c315b7b812f9fcULL, 0x00bdf5efcd128b97ULL,
0x001d464f532e3e16ULL, 0x003cd94f081bfd7eULL,
0x00ed9dae12ce4009ULL, 0x002756f5736eee70ULL)},
{FIELD_LITERAL(0x00a5187e6ee7341bULL, 0x00e6d52e82d83b6eULL,
0x00df3c41323094a7ULL, 0x00b3324f444e9de9ULL,
0x00689eb21a35bfe5ULL, 0x00f16363becd548dULL,
0x00e187cc98e7f60fULL, 0x00127d9062f0ccabULL)},
{FIELD_LITERAL(0x004ad71b31c29e40ULL, 0x00a5fcace12fae29ULL,
0x004425b5597280edULL, 0x00e7ef5d716c3346ULL,
0x0010b53ada410ac8ULL, 0x0092310226060c9bULL,
0x0091c26128729c7eULL, 0x0088b42900f8ec3bULL)},
}}, {{
{FIELD_LITERAL(0x00f1e26e9762d4a8ULL, 0x00d9d74082183414ULL,
0x00ffec9bd57a0282ULL, 0x000919e128fd497aULL,
0x00ab7ae7d00fe5f8ULL, 0x0054dc442851ff68ULL,
0x00c9ebeb3b861687ULL, 0x00507f7cab8b698fULL)},
{FIELD_LITERAL(0x00c13c5aae3ae341ULL, 0x009c6c9ed98373e7ULL,
0x00098f26864577a8ULL, 0x0015b886e9488b45ULL,
0x0037692c42aadba5ULL, 0x00b83170b8e7791cULL,
0x001670952ece1b44ULL, 0x00fd932a39276da2ULL)},
{FIELD_LITERAL(0x0081a3259bef3398ULL, 0x005480fff416107bULL,
0x00ce4f607d21be98ULL, 0x003ffc084b41df9bULL,
0x0043d0bb100502d1ULL, 0x00ec35f575ba3261ULL,
0x00ca18f677300ef3ULL, 0x00e8bb0a827d8548ULL)},
}}, {{
{FIELD_LITERAL(0x00df76b3328ada72ULL, 0x002e20621604a7c2ULL,
0x00f910638a105b09ULL, 0x00ef4724d96ef2cdULL,
0x00377d83d6b8a2f7ULL, 0x00b4f48805ade324ULL,
0x001cd5da8b152018ULL, 0x0045af671a20ca7fULL)},
{FIELD_LITERAL(0x009ae3b93a56c404ULL, 0x004a410b7a456699ULL,
0x00023a619355e6b2ULL, 0x009cdc7297387257ULL,
0x0055b94d4ae70d04ULL, 0x002cbd607f65b005ULL,
0x003208b489697166ULL, 0x00ea2aa058867370ULL)},
{FIELD_LITERAL(0x00f29d2598ee3f32ULL, 0x00b4ac5385d82adcULL,
0x007633eaf04df19bULL, 0x00aa2d3d77ceab01ULL,
0x004a2302fcbb778aULL, 0x00927f225d5afa34ULL,
0x004a8e9d5047f237ULL, 0x008224ae9dbce530ULL)},
}}, {{
{FIELD_LITERAL(0x001cf640859b02f8ULL, 0x00758d1d5d5ce427ULL,
0x00763c784ef4604cULL, 0x005fa81aee205270ULL,
0x00ac537bfdfc44cbULL, 0x004b919bd342d670ULL,
0x00238508d9bf4b7aULL, 0x00154888795644f3ULL)},
{FIELD_LITERAL(0x00c845923c084294ULL, 0x00072419a201bc25ULL,
0x0045f408b5f8e669ULL, 0x00e9d6a186b74dfeULL,
0x00e19108c68fa075ULL, 0x0017b91d874177b7ULL,
0x002f0ca2c7912c5aULL, 0x009400aa385a90a2ULL)},
{FIELD_LITERAL(0x0071110b01482184ULL, 0x00cfed0044f2bef8ULL,
0x0034f2901cf4662eULL, 0x003b4ae2a67f9834ULL,
0x00cca9b96fe94810ULL, 0x00522507ae77abd0ULL,
0x00bac7422721e73eULL, 0x0066622b0f3a62b0ULL)},
}}, {{
{FIELD_LITERAL(0x00f8ac5cf4705b6aULL, 0x00867d82dcb457e3ULL,
0x007e13ab2ccc2ce9ULL, 0x009ee9a018d3930eULL,
0x008370f8ecb42df8ULL, 0x002d9f019add263eULL,
0x003302385b92d196ULL, 0x00a15654536e2c0cULL)},
{FIELD_LITERAL(0x0026ef1614e160afULL, 0x00c023f9edfc9c76ULL,
0x00cff090da5f57baULL, 0x0076db7a66643ae9ULL,
0x0019462f8c646999ULL, 0x008fec00b3854b22ULL,
0x00d55041692a0a1cULL, 0x0065db894215ca00ULL)},
{FIELD_LITERAL(0x00a925036e0a451cULL, 0x002a0390c36b6cc1ULL,
0x00f27020d90894f4ULL, 0x008d90d52cbd3d7fULL,
0x00e1d0137392f3b8ULL, 0x00f017c158b51a8fULL,
0x00cac313d3ed7dbcULL, 0x00b99a81e3eb42d3ULL)},
}}, {{
{FIELD_LITERAL(0x00b54850275fe626ULL, 0x0053a3fd1ec71140ULL,
0x00e3d2d7dbe096faULL, 0x00e4ac7b595cce4cULL,
0x0077bad449c0a494ULL, 0x00b7c98814afd5b3ULL,
0x0057226f58486cf9ULL, 0x00b1557154f0cc57ULL)},
{FIELD_LITERAL(0x008cc9cd236315c0ULL, 0x0031d9c5b39fda54ULL,
0x00a5713ef37e1171ULL, 0x00293d5ae2886325ULL,
0x00c4aba3e05015e1ULL, 0x0003f35ef78e4fc6ULL,
0x0039d6bd3ac1527bULL, 0x0019d7c3afb77106ULL)},
{FIELD_LITERAL(0x007b162931a985afULL, 0x00ad40a2e0daa713ULL,
0x006df27c4009f118ULL, 0x00503e9f4e2e8becULL,
0x00751a77c82c182dULL, 0x000298937769245bULL,
0x00ffb1e8fabf9ee5ULL, 0x0008334706e09abeULL)},
}}, {{
{FIELD_LITERAL(0x00dbca4e98a7dcd9ULL, 0x00ee29cfc78bde99ULL,
0x00e4a3b6995f52e9ULL, 0x0045d70189ae8096ULL,
0x00fd2a8a3b9b0d1bULL, 0x00af1793b107d8e1ULL,
0x00dbf92cbe4afa20ULL, 0x00da60f798e3681dULL)},
{FIELD_LITERAL(0x004246bfcecc627aULL, 0x004ba431246c03a4ULL,
0x00bd1d101872d497ULL, 0x003b73d3f185ee16ULL,
0x001feb2e2678c0e3ULL, 0x00ff13c5a89dec76ULL,
0x00ed06042e771d8fULL, 0x00a4fd2a897a83ddULL)},
{FIELD_LITERAL(0x009a4a3be50d6597ULL, 0x00de3165fc5a1096ULL,
0x004f3f56e345b0c7ULL, 0x00f7bf721d5ab8bcULL,
0x004313e47b098c50ULL, 0x00e4c7d5c0e1adbbULL,
0x002e3e3db365051eULL, 0x00a480c2cd6a96fbULL)},
}}, {{
{FIELD_LITERAL(0x00417fa30a7119edULL, 0x00af257758419751ULL,
0x00d358a487b463d4ULL, 0x0089703cc720b00dULL,
0x00ce56314ff7f271ULL, 0x0064db171ade62c1ULL,
0x00640b36d4a22fedULL, 0x00424eb88696d23fULL)},
{FIELD_LITERAL(0x004ede34af2813f3ULL, 0x00d4a8e11c9e8216ULL,
0x004796d5041de8a5ULL, 0x00c4c6b4d21cc987ULL,
0x00e8a433ee07fa1eULL, 0x0055720b5abcc5a1ULL,
0x008873ea9c74b080ULL, 0x005b3fec1ab65d48ULL)},
{FIELD_LITERAL(0x0047e5277db70ec5ULL, 0x000a096c66db7d6bULL,
0x00b4164cc1730159ULL, 0x004a9f783fe720feULL,
0x00a8177b94449dbcULL, 0x0095a24ff49a599fULL,
0x0069c1c578250cbcULL, 0x00452019213debf4ULL)},
}}, {{
{FIELD_LITERAL(0x0021ce99e09ebda3ULL, 0x00fcbd9f91875ad0ULL,
0x009bbf6b7b7a0b5fULL, 0x00388886a69b1940ULL,
0x00926a56d0f81f12ULL, 0x00e12903c3358d46ULL,
0x005dfce4e8e1ce9dULL, 0x0044cfa94e2f7e23ULL)},
{FIELD_LITERAL(0x001bd59c09e982eaULL, 0x00f72daeb937b289ULL,
0x0018b76dca908e0eULL, 0x00edb498512384adULL,
0x00ce0243b6cc9538ULL, 0x00f96ff690cb4e70ULL,
0x007c77bf9f673c8dULL, 0x005bf704c088a528ULL)},
{FIELD_LITERAL(0x0093d4628dcb33beULL, 0x0095263d51d42582ULL,
0x0049b3222458fe06ULL, 0x00e7fce73b653a7fULL,
0x003ca2ebce60b369ULL, 0x00c5de239a32bea4ULL,
0x0063b8b3d71fb6bfULL, 0x0039aeeb78a1a839ULL)},
}}, {{
{FIELD_LITERAL(0x007dc52da400336cULL, 0x001fded1e15b9457ULL,
0x00902e00f5568e3aULL, 0x00219bef40456d2dULL,
0x005684161fb3dbc9ULL, 0x004a4e9be49a76eaULL,
0x006e685ae88b78ffULL, 0x0021c42f13042d3cULL)},
{FIELD_LITERAL(0x00fb22bb5fd3ce50ULL, 0x0017b48aada7ae54ULL,
0x00fd5c44ad19a536ULL, 0x000ccc4e4e55e45cULL,
0x00fd637d45b4c3f5ULL, 0x0038914e023c37cfULL,
0x00ac1881d6a8d898ULL, 0x00611ed8d3d943a8ULL)},
{FIELD_LITERAL(0x0056e2259d113d2bULL, 0x00594819b284ec16ULL,
0x00c7bf794bb36696ULL, 0x00721ee75097cdc6ULL,
0x00f71be9047a2892ULL, 0x00df6ba142564edfULL,
0x0069580b7a184e8dULL, 0x00f056e38fca0feeULL)},
}}, {{
{FIELD_LITERAL(0x009df98566a18c6dULL, 0x00cf3a200968f219ULL,
0x0044ba60da6d9086ULL, 0x00dbc9c0e344da03ULL,
0x000f9401c4466855ULL, 0x00d46a57c5b0a8d1ULL,
0x00875a635d7ac7c6ULL, 0x00ef4a933b7e0ae6ULL)},
{FIELD_LITERAL(0x005e8694077a1535ULL, 0x008bef75f71c8f1dULL,
0x000a7c1316423511ULL, 0x00906e1d70604320ULL,
0x003fc46c1a2ffbd6ULL, 0x00d1d5022e68f360ULL,
0x002515fba37bbf46ULL, 0x00ca16234e023b44ULL)},
{FIELD_LITERAL(0x00787c99561f4690ULL, 0x00a857a8c1561f27ULL,
0x00a10df9223c09feULL, 0x00b98a9562e3b154ULL,
0x004330b8744c3ed2ULL, 0x00e06812807ec5c4ULL,
0x00e4cf6a7db9f1e3ULL, 0x00d95b089f132a34ULL)},
}}, {{
{FIELD_LITERAL(0x002922b39ca33eecULL, 0x0090d12a5f3ab194ULL,
0x00ab60c02fb5f8edULL, 0x00188d292abba1cfULL,
0x00e10edec9698f6eULL, 0x0069a4d9934133c8ULL,
0x0024aac40e6d3d06ULL, 0x001702c2177661b0ULL)},
{FIELD_LITERAL(0x00139078397030bdULL, 0x000e3c447e859a00ULL,
0x0064a5b334c82393ULL, 0x00b8aabeb7358093ULL,
0x00020778bb9ae73bULL, 0x0032ee94c7892a18ULL,
0x008215253cb41bdaULL, 0x005e2797593517aeULL)},
{FIELD_LITERAL(0x0083765a5f855d4aULL, 0x0051b6d1351b8ee2ULL,
0x00116de548b0f7bbULL, 0x0087bd88703affa0ULL,
0x0095b2cc34d7fdd2ULL, 0x0084cd81b53f0bc8ULL,
0x008562fc995350edULL, 0x00a39abb193651e3ULL)},
}}, {{
{FIELD_LITERAL(0x0019e23f0474b114ULL, 0x00eb94c2ad3b437eULL,
0x006ddb34683b75acULL, 0x00391f9209b564c6ULL,
0x00083b3bb3bff7aaULL, 0x00eedcd0f6dceefcULL,
0x00b50817f794fe01ULL, 0x0036474deaaa75c9ULL)},
{FIELD_LITERAL(0x0091868594265aa2ULL, 0x00797accae98ca6dULL,
0x0008d8c5f0f8a184ULL, 0x00d1f4f1c2b2fe6eULL,
0x0036783dfb48a006ULL, 0x008c165120503527ULL,
0x0025fd780058ce9bULL, 0x0068beb007be7d27ULL)},
{FIELD_LITERAL(0x00d0ff88aa7c90c2ULL, 0x00b2c60dacf53394ULL,
0x0094a7284d9666d6ULL, 0x00bed9022ce7a19dULL,
0x00c51553f0cd7682ULL, 0x00c3fb870b124992ULL,
0x008d0bc539956c9bULL, 0x00fc8cf258bb8885ULL)},
}}, {{
{FIELD_LITERAL(0x003667bf998406f8ULL, 0x0000115c43a12975ULL,
0x001e662f3b20e8fdULL, 0x0019ffa534cb24ebULL,
0x00016be0dc8efb45ULL, 0x00ff76a8b26243f5ULL,
0x00ae20d241a541e3ULL, 0x0069bd6af13cd430ULL)},
{FIELD_LITERAL(0x0045fdc16487cda3ULL, 0x00b2d8e844cf2ed7ULL,
0x00612c50e88c1607ULL, 0x00a08aabc66c1672ULL,
0x006031fdcbb24d97ULL, 0x001b639525744b93ULL,
0x004409d62639ab17ULL, 0x00a1853d0347ab1dULL)},
{FIELD_LITERAL(0x0075a1a56ebf5c21ULL, 0x00a3e72be9ac53edULL,
0x00efcde1629170c2ULL, 0x0004225fe91ef535ULL,
0x0088049fc73dfda7ULL, 0x004abc74857e1288ULL,
0x0024e2434657317cULL, 0x00d98cb3d3e5543cULL)},
}}, {{
{FIELD_LITERAL(0x00b4b53eab6bdb19ULL, 0x009b22d8b43711d0ULL,
0x00d948b9d961785dULL, 0x00cb167b6f279eadULL,
0x00191de3a678e1c9ULL, 0x00d9dd9511095c2eULL,
0x00f284324cd43067ULL, 0x00ed74fa535151ddULL)},
{FIELD_LITERAL(0x007e32c049b5c477ULL, 0x009d2bfdbd9bcfd8ULL,
0x00636e93045938c6ULL, 0x007fde4af7687298ULL,
0x0046a5184fafa5d3ULL, 0x0079b1e7f13a359bULL,
0x00875adf1fb927d6ULL, 0x00333e21c61bcad2ULL)},
{FIELD_LITERAL(0x00048014f73d8b8dULL, 0x0075684aa0966388ULL,
0x0092be7df06dc47cULL, 0x0097cebcd0f5568aULL,
0x005a7004d9c4c6a9ULL, 0x00b0ecbb659924c7ULL,
0x00d90332dd492a7cULL, 0x0057fc14df11493dULL)},
}}, {{
{FIELD_LITERAL(0x0008ed8ea0ad95beULL, 0x0041d324b9709645ULL,
0x00e25412257a19b4ULL, 0x0058df9f3423d8d2ULL,
0x00a9ab20def71304ULL, 0x009ae0dbf8ac4a81ULL,
0x00c9565977e4392aULL, 0x003c9269444baf55ULL)},
{FIELD_LITERAL(0x007df6cbb926830bULL, 0x00d336058ae37865ULL,
0x007af47dac696423ULL, 0x0048d3011ec64ac8ULL,
0x006b87666e40049fULL, 0x0036a2e0e51303d7ULL,
0x00ba319bd79dbc55ULL, 0x003e2737ecc94f53ULL)},
{FIELD_LITERAL(0x00d296ff726272d9ULL, 0x00f6d097928fcf57ULL,
0x00e0e616a55d7013ULL, 0x00deaf454ed9eac7ULL,
0x0073a56bedef4d92ULL, 0x006ccfdf6fc92e19ULL,
0x009d1ee1371a7218ULL, 0x00ee3c2ee4462d80ULL)},
}}, {{
{FIELD_LITERAL(0x00437bce9bccdf9dULL, 0x00e0c8e2f85dc0a3ULL,
0x00c91a7073995a19ULL, 0x00856ec9fe294559ULL,
0x009e4b33394b156eULL, 0x00e245b0dc497e5cULL,
0x006a54e687eeaeffULL, 0x00f1cd1cd00fdb7cULL)},
{FIELD_LITERAL(0x008132ae5c5d8cd1ULL, 0x00121d68324a1d9fULL,
0x00d6be9dafcb8c76ULL, 0x00684d9070edf745ULL,
0x00519fbc96d7448eULL, 0x00388182fdc1f27eULL,
0x000235baed41f158ULL, 0x00bf6cf6f1a1796aULL)},
{FIELD_LITERAL(0x002adc4b4d148219ULL, 0x003084ada0d3a90aULL,
0x0046de8aab0f2e4eULL, 0x00452d342a67b5fdULL,
0x00d4b50f01d4de21ULL, 0x00db6d9fc0cefb79ULL,
0x008c184c86a462cdULL, 0x00e17c83764d42daULL)},
}}, {{
{FIELD_LITERAL(0x007b2743b9a1e01aULL, 0x007847ffd42688c4ULL,
0x006c7844d610a316ULL, 0x00f0cb8b250aa4b0ULL,
0x00a19060143b3ae6ULL, 0x0014eb10b77cfd80ULL,
0x000170905729dd06ULL, 0x00063b5b9cd72477ULL)},
{FIELD_LITERAL(0x00ce382dc7993d92ULL, 0x00021153e938b4c8ULL,
0x00096f7567f48f51ULL, 0x0058f81ddfe4b0d5ULL,
0x00cc379a56b355c7ULL, 0x002c760770d3e819ULL,
0x00ee22d1d26e5a40ULL, 0x00de6d93d5b082d7ULL)},
{FIELD_LITERAL(0x000a91a42c52e056ULL, 0x00185f6b77fce7eaULL,
0x000803c51962f6b5ULL, 0x0022528582ba563dULL,
0x0043f8040e9856d6ULL, 0x0085a29ec81fb860ULL,
0x005f9a611549f5ffULL, 0x00c1f974ecbd4b06ULL)},
}}, {{
{FIELD_LITERAL(0x005b64c6fd65ec97ULL, 0x00c1fdd7f877bc7fULL,
0x000d9cc6c89f841cULL, 0x005c97b7f1aff9adULL,
0x0075e3c61475d47eULL, 0x001ecb1ba8153011ULL,
0x00fe7f1c8d71d40dULL, 0x003fa9757a229832ULL)},
{FIELD_LITERAL(0x00ffc5c89d2b0cbaULL, 0x00d363d42e3e6fc3ULL,
0x0019a1a0118e2e8aULL, 0x00f7baeff48882e1ULL,
0x001bd5af28c6b514ULL, 0x0055476ca2253cb2ULL,
0x00d8eb1977e2ddf3ULL, 0x00b173b1adb228a1ULL)},
{FIELD_LITERAL(0x00f2cb99dd0ad707ULL, 0x00e1e08b6859ddd8ULL,
0x000008f2d0650bccULL, 0x00d7ed392f8615c3ULL,
0x00976750a94da27fULL, 0x003e83bb0ecb69baULL,
0x00df8e8d15c14ac6ULL, 0x00f9f7174295d9c2ULL)},
}}, {{
{FIELD_LITERAL(0x00f11cc8e0e70bcbULL, 0x00e5dc689974e7ddULL,
0x0014e409f9ee5870ULL, 0x00826e6689acbd63ULL,
0x008a6f4e3d895d88ULL, 0x00b26a8da41fd4adULL,
0x000fb7723f83efd7ULL, 0x009c749db0a5f6c3ULL)},
{FIELD_LITERAL(0x002389319450f9baULL, 0x003677f31aa1250aULL,
0x0092c3db642f38cbULL, 0x00f8b64c0dfc9773ULL,
0x00cd49fe3505b795ULL, 0x0068105a4090a510ULL,
0x00df0ba2072a8bb6ULL, 0x00eb396143afd8beULL)},
{FIELD_LITERAL(0x00a0d4ecfb24cdffULL, 0x00ddaf8008ba6479ULL,
0x00f0b3e36d4b0f44ULL, 0x003734bd3af1f146ULL,
0x00b87e2efc75527eULL, 0x00d230df55ddab50ULL,
0x002613257ae56c1dULL, 0x00bc0946d135934dULL)},
}}, {{
{FIELD_LITERAL(0x00468711bd994651ULL, 0x0033108fa67561bfULL,
0x0089d760192a54b4ULL, 0x00adc433de9f1871ULL,
0x000467d05f36e050ULL, 0x007847e0f0579f7fULL,
0x00a2314ad320052dULL, 0x00b3a93649f0b243ULL)},
{FIELD_LITERAL(0x0067f8f0c4fe26c9ULL, 0x0079c4a3cc8f67b9ULL,
0x0082b1e62f23550dULL, 0x00f2d409caefd7f5ULL,
0x0080e67dcdb26e81ULL, 0x0087ae993ea1f98aULL,
0x00aa108becf61d03ULL, 0x001acf11efb608a3ULL)},
{FIELD_LITERAL(0x008225febbab50d9ULL, 0x00f3b605e4dd2083ULL,
0x00a32b28189e23d2ULL, 0x00d507e5e5eb4c97ULL,
0x005a1a84e302821fULL, 0x0006f54c1c5f08c7ULL,
0x00a347c8cb2843f0ULL, 0x0009f73e9544bfa5ULL)},
}}, {{
{FIELD_LITERAL(0x006c59c9ae744185ULL, 0x009fc32f1b4282cdULL,
0x004d6348ca59b1acULL, 0x00105376881be067ULL,
0x00af4096013147dcULL, 0x004abfb5a5cb3124ULL,
0x000d2a7f8626c354ULL, 0x009c6ed568e07431ULL)},
{FIELD_LITERAL(0x00e828333c297f8bULL, 0x009ef3cf8c3f7e1fULL,
0x00ab45f8fff31cb9ULL, 0x00c8b4178cb0b013ULL,
0x00d0c50dd3260a3fULL, 0x0097126ac257f5bcULL,
0x0042376cc90c705aULL, 0x001d96fdb4a1071eULL)},
{FIELD_LITERAL(0x00542d44d89ee1a8ULL, 0x00306642e0442d98ULL,
0x0090853872b87338ULL, 0x002362cbf22dc044ULL,
0x002c222adff663b8ULL, 0x0067c924495fcb79ULL,
0x000e621d983c977cULL, 0x00df77a9eccb66fbULL)},
}}, {{
{FIELD_LITERAL(0x002809e4bbf1814aULL, 0x00b9e854f9fafb32ULL,
0x00d35e67c10f7a67ULL, 0x008f1bcb76e748cfULL,
0x004224d9515687d2ULL, 0x005ba0b774e620c4ULL,
0x00b5e57db5d54119ULL, 0x00e15babe5683282ULL)},
{FIELD_LITERAL(0x00832d02369b482cULL, 0x00cba52ff0d93450ULL,
0x003fa9c908d554dbULL, 0x008d1e357b54122fULL,
0x00abd91c2dc950c6ULL, 0x007eff1df4c0ec69ULL,
0x003f6aeb13fb2d31ULL, 0x00002d6179fc5b2cULL)},
{FIELD_LITERAL(0x0046c9eda81c9c89ULL, 0x00b60cb71c8f62fcULL,
0x0022f5a683baa558ULL, 0x00f87319fccdf997ULL,
0x009ca09b51ce6a22ULL, 0x005b12baf4af7d77ULL,
0x008a46524a1e33e2ULL, 0x00035a77e988be0dULL)},
}}, {{
{FIELD_LITERAL(0x00a7efe46a7dbe2fULL, 0x002f66fd55014fe7ULL,
0x006a428afa1ff026ULL, 0x0056caaa9604ab72ULL,
0x0033f3bcd7fac8aeULL, 0x00ccb1aa01c86764ULL,
0x00158d1edf13bf40ULL, 0x009848ee76fcf3b4ULL)},
{FIELD_LITERAL(0x00a9e7730a819691ULL, 0x00d9cc73c4992b70ULL,
0x00e299bde067de5aULL, 0x008c314eb705192aULL,
0x00e7226f17e8a3ccULL, 0x0029dfd956e65a47ULL,
0x0053a8e839073b12ULL, 0x006f942b2ab1597eULL)},
{FIELD_LITERAL(0x001c3d780ecd5e39ULL, 0x0094f247fbdcc5feULL,
0x00d5c786fd527764ULL, 0x00b6f4da74f0db2aULL,
0x0080f1f8badcd5fcULL, 0x00f36a373ad2e23bULL,
0x00f804f9f4343bf2ULL, 0x00d1af40ec623982ULL)},
}}, {{
{FIELD_LITERAL(0x0082aeace5f1b144ULL, 0x00f68b3108cf4dd3ULL,
0x00634af01dde3020ULL, 0x000beab5df5c2355ULL,
0x00e8b790d1b49b0bULL, 0x00e48d15854e36f4ULL,
0x0040ab2d95f3db9fULL, 0x002711c4ed9e899aULL)},
{FIELD_LITERAL(0x0039343746531ebeULL, 0x00c8509d835d429dULL,
0x00e79eceff6b0018ULL, 0x004abfd31e8efce5ULL,
0x007bbfaaa1e20210ULL, 0x00e3be89c193e179ULL,
0x001c420f4c31d585ULL, 0x00f414a315bef5aeULL)},
{FIELD_LITERAL(0x007c296a24990df8ULL, 0x00d5d07525a75588ULL,
0x00dd8e113e94b7e7ULL, 0x007bbc58febe0cc8ULL,
0x0029f51af9bfcad3ULL, 0x007e9311ec7ab6f3ULL,
0x009a884de1676343ULL, 0x0050d5f2dce84be9ULL)},
}}, {{
{FIELD_LITERAL(0x005fa020cca2450aULL, 0x00491c29db6416d8ULL,
0x0037cefe3f9f9a85ULL, 0x003d405230647066ULL,
0x0049e835f0fdbe89ULL, 0x00feb78ac1a0815cULL,
0x00828e4b32dc9724ULL, 0x00db84f2dc8d6fd4ULL)},
{FIELD_LITERAL(0x0098cddc8b39549aULL, 0x006da37e3b05d22cULL,
0x00ce633cfd4eb3cbULL, 0x00fda288ef526acdULL,
0x0025338878c5d30aULL, 0x00f34438c4e5a1b4ULL,
0x00584efea7c310f1ULL, 0x0041a551f1b660adULL)},
{FIELD_LITERAL(0x00d7f7a8fbd6437aULL, 0x0062872413bf3753ULL,
0x00ad4bbcb43c584bULL, 0x007fe49be601d7e3ULL,
0x0077c659789babf4ULL, 0x00eb45fcb06a741bULL,
0x005ce244913f9708ULL, 0x0088426401736326ULL)},
}}, {{
{FIELD_LITERAL(0x007bf562ca768d7cULL, 0x006c1f3a174e387cULL,
0x00f024b447fee939ULL, 0x007e7af75f01143fULL,
0x003adb70b4eed89dULL, 0x00e43544021ad79aULL,
0x0091f7f7042011f6ULL, 0x0093c1a1ee3a0ddcULL)},
{FIELD_LITERAL(0x00a0b68ec1eb72d2ULL, 0x002c03235c0d45a0ULL,
0x00553627323fe8c5ULL, 0x006186e94b17af94ULL,
0x00a9906196e29f14ULL, 0x0025b3aee6567733ULL,
0x007e0dd840080517ULL, 0x0018eb5801a4ba93ULL)},
{FIELD_LITERAL(0x00d7fe7017bf6a40ULL, 0x006e3f0624be0c42ULL,
0x00ffbba205358245ULL, 0x00f9fc2cf8194239ULL,
0x008d93b37bf15b4eULL, 0x006ddf2e38be8e95ULL,
0x002b6e79bf5fcff9ULL, 0x00ab355da425e2deULL)},
}}, {{
{FIELD_LITERAL(0x00938f97e20be973ULL, 0x0099141a36aaf306ULL,
0x0057b0ca29e545a1ULL, 0x0085db571f9fbc13ULL,
0x008b333c554b4693ULL, 0x0043ab6ef3e241cbULL,
0x0054fb20aa1e5c70ULL, 0x00be0ff852760adfULL)},
{FIELD_LITERAL(0x003973d8938971d6ULL, 0x002aca26fa80c1f5ULL,
0x00108af1faa6b513ULL, 0x00daae275d7924e6ULL,
0x0053634ced721308ULL, 0x00d2355fe0bbd443ULL,
0x00357612b2d22095ULL, 0x00f9bb9dd4136cf3ULL)},
{FIELD_LITERAL(0x002bff12cf5e03a5ULL, 0x001bdb1fa8a19cf8ULL,
0x00c91c6793f84d39ULL, 0x00f869f1b2eba9afULL,
0x0059bc547dc3236bULL, 0x00d91611d6d38689ULL,
0x00e062daaa2c0214ULL, 0x00ed3c047cc2bc82ULL)},
}}, {{
{FIELD_LITERAL(0x000050d70c32b31aULL, 0x001939d576d437b3ULL,
0x00d709e598bf9fe6ULL, 0x00a885b34bd2ee9eULL,
0x00dd4b5c08ab1a50ULL, 0x0091bebd50b55639ULL,
0x00cf79ff64acdbc6ULL, 0x006067a39d826336ULL)},
{FIELD_LITERAL(0x0062dd0fb31be374ULL, 0x00fcc96b84c8e727ULL,
0x003f64f1375e6ae3ULL, 0x0057d9b6dd1af004ULL,
0x00d6a167b1103c7bULL, 0x00dd28f3180fb537ULL,
0x004ff27ad7167128ULL, 0x008934c33461f2acULL)},
{FIELD_LITERAL(0x0065b472b7900043ULL, 0x00ba7efd2ff1064bULL,
0x000b67d6c4c3020fULL, 0x0012d28469f4e46dULL,
0x0031c32939703ec7ULL, 0x00b49f0bce133066ULL,
0x00f7e10416181d47ULL, 0x005c90f51867eeccULL)},
}}, {{
{FIELD_LITERAL(0x0051207abd179101ULL, 0x00fc2a5c20d9c5daULL,
0x00fb9d5f2701b6dfULL, 0x002dd040fdea82b8ULL,
0x00f163b0738442ffULL, 0x00d9736bd68855b8ULL,
0x00e0d8e93005e61cULL, 0x00df5a40b3988570ULL)},
{FIELD_LITERAL(0x0006918f5dfce6dcULL, 0x00d4bf1c793c57fbULL,
0x0069a3f649435364ULL, 0x00e89a50e5b0cd6eULL,
0x00b9f6a237e973afULL, 0x006d4ed8b104e41dULL,
0x00498946a3924cd2ULL, 0x00c136ec5ac9d4f7ULL)},
{FIELD_LITERAL(0x0011a9c290ac5336ULL, 0x002b9a2d4a6a6533ULL,
0x009a8a68c445d937ULL, 0x00361b27b07e5e5cULL,
0x003c043b1755b974ULL, 0x00b7eb66cf1155eeULL,
0x0077af5909eefff2ULL, 0x0098f609877cc806ULL)},
}}, {{
{FIELD_LITERAL(0x00ab13af436bf8f4ULL, 0x000bcf0a0dac8574ULL,
0x00d50c864f705045ULL, 0x00c40e611debc842ULL,
0x0085010489bd5caaULL, 0x007c5050acec026fULL,
0x00f67d943c8da6d1ULL, 0x00de1da0278074c6ULL)},
{FIELD_LITERAL(0x00b373076597455fULL, 0x00e83f1af53ac0f5ULL,
0x0041f63c01dc6840ULL, 0x0097dea19b0c6f4bULL,
0x007f9d63b4c1572cULL, 0x00e692d492d0f5f0ULL,
0x00cbcb392e83b4adULL, 0x0069c0f39ed9b1a8ULL)},
{FIELD_LITERAL(0x00861030012707c9ULL, 0x009fbbdc7fd4aafbULL,
0x008f591d6b554822ULL, 0x00df08a41ea18adeULL,
0x009d7d83e642abeaULL, 0x0098c71bda3b78ffULL,
0x0022c89e7021f005ULL, 0x0044d29a3fe1e3c4ULL)},
}}, {{
{FIELD_LITERAL(0x00e748cd7b5c52f2ULL, 0x00ea9df883f89cc3ULL,
0x0018970df156b6c7ULL, 0x00c5a46c2a33a847ULL,
0x00cbde395e32aa09ULL, 0x0072474ebb423140ULL,
0x00fb00053086a23dULL, 0x001dafcfe22d4e1fULL)},
{FIELD_LITERAL(0x00c903ee6d825540ULL, 0x00add6c4cf98473eULL,
0x007636efed4227f1ULL, 0x00905124ae55e772ULL,
0x00e6b38fab12ed53ULL, 0x0045e132b863fe55ULL,
0x003974662edb366aULL, 0x00b1787052be8208ULL)},
{FIELD_LITERAL(0x00a614b00d775c7cULL, 0x00d7c78941cc7754ULL,
0x00422dd68b5dabc4ULL, 0x00a6110f0167d28bULL,
0x00685a309c252886ULL, 0x00b439ffd5143660ULL,
0x003656e29ee7396fULL, 0x00c7c9b9ed5ad854ULL)},
}}, {{
{FIELD_LITERAL(0x0040f7e7c5b37bf2ULL, 0x0064e4dc81181bbaULL,
0x00a8767ae2a366b6ULL, 0x001496b4f90546f2ULL,
0x002a28493f860441ULL, 0x0021f59513049a3aULL,
0x00852d369a8b7ee3ULL, 0x00dd2e7d8b7d30a9ULL)},
{FIELD_LITERAL(0x00006e34a35d9fbcULL, 0x00eee4e48b2f019aULL,
0x006b344743003a5fULL, 0x00541d514f04a7e3ULL,
0x00e81f9ee7647455ULL, 0x005e2b916c438f81ULL,
0x00116f8137b7eff0ULL, 0x009bd3decc7039d1ULL)},
{FIELD_LITERAL(0x0005d226f434110dULL, 0x00af8288b8ef21d5ULL,
0x004a7a52ef181c8cULL, 0x00be0b781b4b06deULL,
0x00e6e3627ded07e1ULL, 0x00e43aa342272b8bULL,
0x00e86ab424577d84ULL, 0x00fb292c566e35bbULL)},
}}, {{
{FIELD_LITERAL(0x00334f5303ea1222ULL, 0x00dfb3dbeb0a5d3eULL,
0x002940d9592335c1ULL, 0x00706a7a63e8938aULL,
0x005a533558bc4cafULL, 0x00558e33192022a9ULL,
0x00970d9faf74c133ULL, 0x002979fcb63493caULL)},
{FIELD_LITERAL(0x00e38abece3c82abULL, 0x005a51f18a2c7a86ULL,
0x009dafa2e86d592eULL, 0x00495a62eb688678ULL,
0x00b79df74c0eb212ULL, 0x0023e8cc78b75982ULL,
0x005998cb91075e13ULL, 0x00735aa9ba61bc76ULL)},
{FIELD_LITERAL(0x00d9f7a82ddbe628ULL, 0x00a1fc782889ae0fULL,
0x0071ffda12d14b66ULL, 0x0037cf4eca7fb3d5ULL,
0x00c80bc242c58808ULL, 0x0075bf8c2d08c863ULL,
0x008d41f31afc52a7ULL, 0x00197962ecf38741ULL)},
}}, {{
{FIELD_LITERAL(0x006e9f475cccf2eeULL, 0x00454b9cd506430cULL,
0x00224a4fb79ee479ULL, 0x0062e3347ef0b5e2ULL,
0x0034fd2a3512232aULL, 0x00b8b3cb0f457046ULL,
0x00eb20165daa38ecULL, 0x00128eebc2d9c0f7ULL)},
{FIELD_LITERAL(0x00bfc5fa1e4ea21fULL, 0x00c21d7b6bb892e6ULL,
0x00cf043f3acf0291ULL, 0x00c13f2f849b3c90ULL,
0x00d1a97ebef10891ULL, 0x0061e130a445e7feULL,
0x0019513fdedbf22bULL, 0x001d60c813bff841ULL)},
{FIELD_LITERAL(0x0019561c7fcf0213ULL, 0x00e3dca6843ebd77ULL,
0x0068ea95b9ca920eULL, 0x009bdfb70f253595ULL,
0x00c68f59186aa02aULL, 0x005aee1cca1c3039ULL,
0x00ab79a8a937a1ceULL, 0x00b9a0e549959e6fULL)},
}}, {{
{FIELD_LITERAL(0x00c79e0b6d97dfbdULL, 0x00917c71fd2bc6e8ULL,
0x00db7529ccfb63d8ULL, 0x00be5be957f17866ULL,
0x00a9e11fdc2cdac1ULL, 0x007b91a8e1f44443ULL,
0x00a3065e4057d80fULL, 0x004825f5b8d5f6d4ULL)},
{FIELD_LITERAL(0x003e4964fa8a8fc8ULL, 0x00f6a1cdbcf41689ULL,
0x00943cb18fe7fda7ULL, 0x00606dafbf34440aULL,
0x005d37a86399c789ULL, 0x00e79a2a69417403ULL,
0x00fe34f7e68b8866ULL, 0x0011f448ed2df10eULL)},
{FIELD_LITERAL(0x00f1f57efcc1fcc4ULL, 0x00513679117de154ULL,
0x002e5b5b7c86d8c3ULL, 0x009f6486561f9cfbULL,
0x00169e74b0170cf7ULL, 0x00900205af4af696ULL,
0x006acfddb77853f3ULL, 0x00df184c90f31068ULL)},
}}, {{
{FIELD_LITERAL(0x00b37396c3320791ULL, 0x00fc7b67175c5783ULL,
0x00c36d2cd73ecc38ULL, 0x0080ebcc0b328fc5ULL,
0x0043a5b22b35d35dULL, 0x00466c9f1713c9daULL,
0x0026ad346dcaa8daULL, 0x007c684e701183a6ULL)},
{FIELD_LITERAL(0x00fd579ffb691713ULL, 0x00b76af4f81c412dULL,
0x00f239de96110f82ULL, 0x00e965fb437f0306ULL,
0x00ca7e9436900921ULL, 0x00e487f1325fa24aULL,
0x00633907de476380ULL, 0x00721c62ac5b8ea0ULL)},
{FIELD_LITERAL(0x00c0d54e542eb4f9ULL, 0x004ed657171c8dcfULL,
0x00b743a4f7c2a39bULL, 0x00fd9f93ed6cc567ULL,
0x00307fae3113e58bULL, 0x0058aa577c93c319ULL,
0x00d254556f35b346ULL, 0x00491aada2203f0dULL)},
}}, {{
{FIELD_LITERAL(0x00dff3103786ff34ULL, 0x000144553b1f20c3ULL,
0x0095613baeb930e4ULL, 0x00098058275ea5d4ULL,
0x007cd1402b046756ULL, 0x0074d74e4d58aee3ULL,
0x005f93fc343ff69bULL, 0x00873df17296b3b0ULL)},
{FIELD_LITERAL(0x00c4a1fb48635413ULL, 0x00b5dd54423ad59fULL,
0x009ff5d53fd24a88ULL, 0x003c98d267fc06a7ULL,
0x002db7cb20013641ULL, 0x00bd1d6716e191f2ULL,
0x006dbc8b29094241ULL, 0x0044bbf233dafa2cULL)},
{FIELD_LITERAL(0x0055838d41f531e6ULL, 0x00bf6a2dd03c81b2ULL,
0x005827a061c4839eULL, 0x0000de2cbb36aac3ULL,
0x002efa29d9717478ULL, 0x00f9e928cc8a77baULL,
0x00c134b458def9efULL, 0x00958a182223fc48ULL)},
}}, {{
{FIELD_LITERAL(0x000a9ee23c06881fULL, 0x002c727d3d871945ULL,
0x00f47d971512d24aULL, 0x00671e816f9ef31aULL,
0x00883af2cfaad673ULL, 0x00601f98583d6c9aULL,
0x00b435f5adc79655ULL, 0x00ad87b71c04bff2ULL)},
{FIELD_LITERAL(0x007860d99db787cfULL, 0x00fda8983018f4a8ULL,
0x008c8866bac4743cULL, 0x00ef471f84c82a3fULL,
0x00abea5976d3b8e7ULL, 0x00714882896cd015ULL,
0x00b49fae584ddac5ULL, 0x008e33a1a0b69c81ULL)},
{FIELD_LITERAL(0x007b6ee2c9e8a9ecULL, 0x002455dbbd89d622ULL,
0x006490cf4eaab038ULL, 0x00d925f6c3081561ULL,
0x00153b3047de7382ULL, 0x003b421f8bdceb6fULL,
0x00761a4a5049da78ULL, 0x00980348c5202433ULL)},
}}, {{
{FIELD_LITERAL(0x007f8a43da97dd5cULL, 0x00058539c800fc7bULL,
0x0040f3cf5a28414aULL, 0x00d68dd0d95283d6ULL,
0x004adce9da90146eULL, 0x00befa41c7d4f908ULL,
0x007603bc2e3c3060ULL, 0x00bdf360ab3545dbULL)},
{FIELD_LITERAL(0x00eebfd4e2312cc3ULL, 0x00474b2564e4fc8cULL,
0x003303ef14b1da9bULL, 0x003c93e0e66beb1dULL,
0x0013619b0566925aULL, 0x008817c24d901bf3ULL,
0x00b62bd8898d218bULL, 0x0075a7716f1e88a2ULL)},
{FIELD_LITERAL(0x0009218da1e6890fULL, 0x0026907f5fd02575ULL,
0x004dabed5f19d605ULL, 0x003abf181870249dULL,
0x00b52fd048cc92c4ULL, 0x00b6dd51e415a5c5ULL,
0x00d9eb82bd2b4014ULL, 0x002c865a43b46b43ULL)},
}}, {{
{FIELD_LITERAL(0x0070047189452f4cULL, 0x00f7ad12e1ce78d5ULL,
0x00af1ba51ec44a8bULL, 0x005f39f63e667cd6ULL,
0x00058eac4648425eULL, 0x00d7fdab42bea03bULL,
0x0028576a5688de15ULL, 0x00af973209e77c10ULL)},
{FIELD_LITERAL(0x00c338b915d8fef0ULL, 0x00a893292045c39aULL,
0x0028ab4f2eba6887ULL, 0x0060743cb519fd61ULL,
0x0006213964093ac0ULL, 0x007c0b7a43f6266dULL,
0x008e3557c4fa5bdaULL, 0x002da976de7b8d9dULL)},
{FIELD_LITERAL(0x0048729f8a8b6dcdULL, 0x00fe23b85cc4d323ULL,
0x00e7384d16e4db0eULL, 0x004a423970678942ULL,
0x00ec0b763345d4baULL, 0x00c477b9f99ed721ULL,
0x00c29dad3777b230ULL, 0x001c517b466f7df6ULL)},
}}, {{
{FIELD_LITERAL(0x006366c380f7b574ULL, 0x001c7d1f09ff0438ULL,
0x003e20a7301f5b22ULL, 0x00d3efb1916d28f6ULL,
0x0049f4f81060ce83ULL, 0x00c69d91ea43ced1ULL,
0x002b6f3e5cd269edULL, 0x005b0fb22ce9ec65ULL)},
{FIELD_LITERAL(0x00aa2261022d883fULL, 0x00ebcca4548010acULL,
0x002528512e28a437ULL, 0x0070ca7676b66082ULL,
0x0084bda170f7c6d3ULL, 0x00581b4747c9b8bbULL,
0x005c96a01061c7e2ULL, 0x00fb7c4a362b5273ULL)},
{FIELD_LITERAL(0x00c30020eb512d02ULL, 0x0060f288283a4d26ULL,
0x00b7ed13becde260ULL, 0x0075ebb74220f6e9ULL,
0x00701079fcfe8a1fULL, 0x001c28fcdff58938ULL,
0x002e4544b8f4df6bULL, 0x0060c5bc4f1a7d73ULL)},
}}, {{
{FIELD_LITERAL(0x00ae307cf069f701ULL, 0x005859f222dd618bULL,
0x00212d6c46ec0b0dULL, 0x00a0fe4642afb62dULL,
0x00420d8e4a0a8903ULL, 0x00a80ff639bdf7b0ULL,
0x0019bee1490b5d8eULL, 0x007439e4b9c27a86ULL)},
{FIELD_LITERAL(0x00a94700032a093fULL, 0x0076e96c225216e7ULL,
0x00a63a4316e45f91ULL, 0x007d8bbb4645d3b2ULL,
0x00340a6ff22793ebULL, 0x006f935d4572aeb7ULL,
0x00b1fb69f00afa28ULL, 0x009e8f3423161ed3ULL)},
{FIELD_LITERAL(0x009ef49c6b5ced17ULL, 0x00a555e6269e9f0aULL,
0x007e6f1d79ec73b5ULL, 0x009ac78695a32ac4ULL,
0x0001d77fbbcd5682ULL, 0x008cea1fee0aaeedULL,
0x00f42bea82a53462ULL, 0x002e46ab96cafcc9ULL)},
}}, {{
{FIELD_LITERAL(0x0051cfcc5885377aULL, 0x00dce566cb1803caULL,
0x00430c7643f2c7d4ULL, 0x00dce1a1337bdcc0ULL,
0x0010d5bd7283c128ULL, 0x003b1b547f9b46feULL,
0x000f245e37e770abULL, 0x007b72511f022b37ULL)},
{FIELD_LITERAL(0x0060db815bc4786cULL, 0x006fab25beedc434ULL,
0x00c610d06084797cULL, 0x000c48f08537bec0ULL,
0x0031aba51c5b93daULL, 0x007968fa6e01f347ULL,
0x0030070da52840c6ULL, 0x00c043c225a4837fULL)},
{FIELD_LITERAL(0x001bcfd00649ee93ULL, 0x006dceb47e2a0fd5ULL,
0x00f2cebda0cf8fd0ULL, 0x00b6b9d9d1fbdec3ULL,
0x00815262e6490611ULL, 0x00ef7f5ce3176760ULL,
0x00e49cd0c998d58bULL, 0x005fc6cc269ba57cULL)},
}}, {{
{FIELD_LITERAL(0x008940211aa0d633ULL, 0x00addae28136571dULL,
0x00d68fdbba20d673ULL, 0x003bc6129bc9e21aULL,
0x000346cf184ebe9aULL, 0x0068774d741ebc7fULL,
0x0019d5e9e6966557ULL, 0x0003cbd7f981b651ULL)},
{FIELD_LITERAL(0x004a2902926f8d3fULL, 0x00ad79b42637ab75ULL,
0x0088f60b90f2d4e8ULL, 0x0030f54ef0e398c4ULL,
0x00021dc9bf99681eULL, 0x007ebf66fde74ee3ULL,
0x004ade654386e9a4ULL, 0x00e7485066be4c27ULL)},
{FIELD_LITERAL(0x00445f1263983be0ULL, 0x004cf371dda45e6aULL,
0x00744a89d5a310e7ULL, 0x001f20ce4f904833ULL,
0x00e746edebe66e29ULL, 0x000912ab1f6c153dULL,
0x00f61d77d9b2444cULL, 0x0001499cd6647610ULL)},
}}
}
};
@@ -343,133 +1063,421 @@ const struct curve448_precomputed_s *curve448_precomputed_base
static const niels_t curve448_wnaf_base_table[32] = {
{{
{FIELD_LITERAL(0x00303cda6feea532,0x00860f1d5a3850e4,0x00226b9fa4728ccd,0x00e822938a0a0c0c,0x00263a61c9ea9216,0x001204029321b828,0x006a468360983c65,0x0002846f0a782143)},
{FIELD_LITERAL(0x00303cda6feea532,0x00860f1d5a3850e4,0x00226b9fa4728ccd,0x006822938a0a0c0c,0x00263a61c9ea9215,0x001204029321b828,0x006a468360983c65,0x0082846f0a782143)},
{FIELD_LITERAL(0x00ef8e22b275198d,0x00b0eb141a0b0e8b,0x001f6789da3cb38c,0x006d2ff8ed39073e,0x00610bdb69a167f3,0x00571f306c9689b4,0x00f557e6f84b2df8,0x002affd38b2c86db)},
{FIELD_LITERAL(0x00303cda6feea532ULL, 0x00860f1d5a3850e4ULL,
0x00226b9fa4728ccdULL, 0x00e822938a0a0c0cULL,
0x00263a61c9ea9216ULL, 0x001204029321b828ULL,
0x006a468360983c65ULL, 0x0002846f0a782143ULL)},
{FIELD_LITERAL(0x00303cda6feea532ULL, 0x00860f1d5a3850e4ULL,
0x00226b9fa4728ccdULL, 0x006822938a0a0c0cULL,
0x00263a61c9ea9215ULL, 0x001204029321b828ULL,
0x006a468360983c65ULL, 0x0082846f0a782143ULL)},
{FIELD_LITERAL(0x00ef8e22b275198dULL, 0x00b0eb141a0b0e8bULL,
0x001f6789da3cb38cULL, 0x006d2ff8ed39073eULL,
0x00610bdb69a167f3ULL, 0x00571f306c9689b4ULL,
0x00f557e6f84b2df8ULL, 0x002affd38b2c86dbULL)},
}}, {{
{FIELD_LITERAL(0x00cea0fc8d2e88b5,0x00821612d69f1862,0x0074c283b3e67522,0x005a195ba05a876d,0x000cddfe557feea4,0x008046c795bcc5e5,0x00540969f4d6e119,0x00d27f96d6b143d5)},
{FIELD_LITERAL(0x000c3b1019d474e8,0x00e19533e4952284,0x00cc9810ba7c920a,0x00f103d2785945ac,0x00bfa5696cc69b34,0x00a8d3d51e9ca839,0x005623cb459586b9,0x00eae7ce1cd52e9e)},
{FIELD_LITERAL(0x0005a178751dd7d8,0x002cc3844c69c42f,0x00acbfe5efe10539,0x009c20f43431a65a,0x008435d96374a7b3,0x009ee57566877bd3,0x0044691725ed4757,0x001e87bb2fe2c6b2)},
{FIELD_LITERAL(0x00cea0fc8d2e88b5ULL, 0x00821612d69f1862ULL,
0x0074c283b3e67522ULL, 0x005a195ba05a876dULL,
0x000cddfe557feea4ULL, 0x008046c795bcc5e5ULL,
0x00540969f4d6e119ULL, 0x00d27f96d6b143d5ULL)},
{FIELD_LITERAL(0x000c3b1019d474e8ULL, 0x00e19533e4952284ULL,
0x00cc9810ba7c920aULL, 0x00f103d2785945acULL,
0x00bfa5696cc69b34ULL, 0x00a8d3d51e9ca839ULL,
0x005623cb459586b9ULL, 0x00eae7ce1cd52e9eULL)},
{FIELD_LITERAL(0x0005a178751dd7d8ULL, 0x002cc3844c69c42fULL,
0x00acbfe5efe10539ULL, 0x009c20f43431a65aULL,
0x008435d96374a7b3ULL, 0x009ee57566877bd3ULL,
0x0044691725ed4757ULL, 0x001e87bb2fe2c6b2ULL)},
}}, {{
{FIELD_LITERAL(0x000cedc4debf7a04,0x002ffa45000470ac,0x002e9f9678201915,0x0017da1208c4fe72,0x007d558cc7d656cb,0x0037a827287cf289,0x00142472d3441819,0x009c21f166cf8dd1)},
{FIELD_LITERAL(0x003ef83af164b2f2,0x000949a5a0525d0d,0x00f4498186cac051,0x00e77ac09ef126d2,0x0073ae0b2c9296e9,0x001c163f6922e3ed,0x0062946159321bea,0x00cfb79b22990b39)},
{FIELD_LITERAL(0x00b001431ca9e654,0x002d7e5eabcc9a3a,0x0052e8114c2f6747,0x0079ac4f94487f92,0x00bffd919b5d749c,0x00261f92ad15e620,0x00718397b7a97895,0x00c1443e6ebbc0c4)},
{FIELD_LITERAL(0x000cedc4debf7a04ULL, 0x002ffa45000470acULL,
0x002e9f9678201915ULL, 0x0017da1208c4fe72ULL,
0x007d558cc7d656cbULL, 0x0037a827287cf289ULL,
0x00142472d3441819ULL, 0x009c21f166cf8dd1ULL)},
{FIELD_LITERAL(0x003ef83af164b2f2ULL, 0x000949a5a0525d0dULL,
0x00f4498186cac051ULL, 0x00e77ac09ef126d2ULL,
0x0073ae0b2c9296e9ULL, 0x001c163f6922e3edULL,
0x0062946159321beaULL, 0x00cfb79b22990b39ULL)},
{FIELD_LITERAL(0x00b001431ca9e654ULL, 0x002d7e5eabcc9a3aULL,
0x0052e8114c2f6747ULL, 0x0079ac4f94487f92ULL,
0x00bffd919b5d749cULL, 0x00261f92ad15e620ULL,
0x00718397b7a97895ULL, 0x00c1443e6ebbc0c4ULL)},
}}, {{
{FIELD_LITERAL(0x00eacd90c1e0a049,0x008977935b149fbe,0x0004cb9ba11c93dc,0x009fbd5b3470844d,0x004bc18c9bfc22cf,0x0057679a991839f3,0x00ef15b76fb4092e,0x0074a5173a225041)},
{FIELD_LITERAL(0x003f5f9d7ec4777b,0x00ab2e733c919c94,0x001bb6c035245ae5,0x00a325a49a883630,0x0033e9a9ea3cea2f,0x00e442a1eaa0e844,0x00b2116d5b0e71b8,0x00c16abed6d64047)},
{FIELD_LITERAL(0x00c560b5ed051165,0x001945adc5d65094,0x00e221865710f910,0x00cc12bc9e9b8ceb,0x004faa9518914e35,0x0017476d89d42f6d,0x00b8f637c8fa1c8b,0x0088c7d2790864b8)},
{FIELD_LITERAL(0x00eacd90c1e0a049ULL, 0x008977935b149fbeULL,
0x0004cb9ba11c93dcULL, 0x009fbd5b3470844dULL,
0x004bc18c9bfc22cfULL, 0x0057679a991839f3ULL,
0x00ef15b76fb4092eULL, 0x0074a5173a225041ULL)},
{FIELD_LITERAL(0x003f5f9d7ec4777bULL, 0x00ab2e733c919c94ULL,
0x001bb6c035245ae5ULL, 0x00a325a49a883630ULL,
0x0033e9a9ea3cea2fULL, 0x00e442a1eaa0e844ULL,
0x00b2116d5b0e71b8ULL, 0x00c16abed6d64047ULL)},
{FIELD_LITERAL(0x00c560b5ed051165ULL, 0x001945adc5d65094ULL,
0x00e221865710f910ULL, 0x00cc12bc9e9b8cebULL,
0x004faa9518914e35ULL, 0x0017476d89d42f6dULL,
0x00b8f637c8fa1c8bULL, 0x0088c7d2790864b8ULL)},
}}, {{
{FIELD_LITERAL(0x00ef7eafc1c69be6,0x0085d3855778fbea,0x002c8d5b450cb6f5,0x004e77de5e1e7fec,0x0047c057893abded,0x001b430b85d51e16,0x00965c7b45640c3c,0x00487b2bb1162b97)},
{FIELD_LITERAL(0x0099c73a311beec2,0x00a3eff38d8912ad,0x002efa9d1d7e8972,0x00f717ae1e14d126,0x002833f795850c8b,0x0066c12ad71486bd,0x00ae9889da4820eb,0x00d6044309555c08)},
{FIELD_LITERAL(0x004b1c5283d15e41,0x00669d8ea308ff75,0x0004390233f762a1,0x00e1d67b83cb6cec,0x003eebaa964c78b1,0x006b0aff965eb664,0x00b313d4470bdc37,0x008814ffcb3cb9d8)},
{FIELD_LITERAL(0x00ef7eafc1c69be6ULL, 0x0085d3855778fbeaULL,
0x002c8d5b450cb6f5ULL, 0x004e77de5e1e7fecULL,
0x0047c057893abdedULL, 0x001b430b85d51e16ULL,
0x00965c7b45640c3cULL, 0x00487b2bb1162b97ULL)},
{FIELD_LITERAL(0x0099c73a311beec2ULL, 0x00a3eff38d8912adULL,
0x002efa9d1d7e8972ULL, 0x00f717ae1e14d126ULL,
0x002833f795850c8bULL, 0x0066c12ad71486bdULL,
0x00ae9889da4820ebULL, 0x00d6044309555c08ULL)},
{FIELD_LITERAL(0x004b1c5283d15e41ULL, 0x00669d8ea308ff75ULL,
0x0004390233f762a1ULL, 0x00e1d67b83cb6cecULL,
0x003eebaa964c78b1ULL, 0x006b0aff965eb664ULL,
0x00b313d4470bdc37ULL, 0x008814ffcb3cb9d8ULL)},
}}, {{
{FIELD_LITERAL(0x009724b8ce68db70,0x007678b5ed006f3d,0x00bdf4b89c0abd73,0x00299748e04c7c6d,0x00ddd86492c3c977,0x00c5a7febfa30a99,0x00ed84715b4b02bb,0x00319568adf70486)},
{FIELD_LITERAL(0x0070ff2d864de5bb,0x005a37eeb637ee95,0x0033741c258de160,0x00e6ca5cb1988f46,0x001ceabd92a24661,0x0030957bd500fe40,0x001c3362afe912c5,0x005187889f678bd2)},
{FIELD_LITERAL(0x0086835fc62bbdc7,0x009c3516ca4910a1,0x00956c71f8d00783,0x0095c78fcf63235f,0x00fc7ff6ba05c222,0x00cdd8b3f8d74a52,0x00ac5ae16de8256e,0x00e9d4be8ed48624)},
{FIELD_LITERAL(0x009724b8ce68db70ULL, 0x007678b5ed006f3dULL,
0x00bdf4b89c0abd73ULL, 0x00299748e04c7c6dULL,
0x00ddd86492c3c977ULL, 0x00c5a7febfa30a99ULL,
0x00ed84715b4b02bbULL, 0x00319568adf70486ULL)},
{FIELD_LITERAL(0x0070ff2d864de5bbULL, 0x005a37eeb637ee95ULL,
0x0033741c258de160ULL, 0x00e6ca5cb1988f46ULL,
0x001ceabd92a24661ULL, 0x0030957bd500fe40ULL,
0x001c3362afe912c5ULL, 0x005187889f678bd2ULL)},
{FIELD_LITERAL(0x0086835fc62bbdc7ULL, 0x009c3516ca4910a1ULL,
0x00956c71f8d00783ULL, 0x0095c78fcf63235fULL,
0x00fc7ff6ba05c222ULL, 0x00cdd8b3f8d74a52ULL,
0x00ac5ae16de8256eULL, 0x00e9d4be8ed48624ULL)},
}}, {{
{FIELD_LITERAL(0x00c0ce11405df2d8,0x004e3f37b293d7b6,0x002410172e1ac6db,0x00b8dbff4bf8143d,0x003a7b409d56eb66,0x003e0f6a0dfef9af,0x0081c4e4d3645be1,0x00ce76076b127623)},
{FIELD_LITERAL(0x00f6ee0f98974239,0x0042d89af07d3a4f,0x00846b7fe84346b5,0x006a21fc6a8d39a1,0x00ac8bc2541ff2d9,0x006d4e2a77732732,0x009a39b694cc3f2f,0x0085c0aa2a404c8f)},
{FIELD_LITERAL(0x00b261101a218548,0x00c1cae96424277b,0x00869da0a77dd268,0x00bc0b09f8ec83ea,0x00d61027f8e82ba9,0x00aa4c85999dce67,0x00eac3132b9f3fe1,0x00fb9b0cf1c695d2)},
{FIELD_LITERAL(0x00c0ce11405df2d8ULL, 0x004e3f37b293d7b6ULL,
0x002410172e1ac6dbULL, 0x00b8dbff4bf8143dULL,
0x003a7b409d56eb66ULL, 0x003e0f6a0dfef9afULL,
0x0081c4e4d3645be1ULL, 0x00ce76076b127623ULL)},
{FIELD_LITERAL(0x00f6ee0f98974239ULL, 0x0042d89af07d3a4fULL,
0x00846b7fe84346b5ULL, 0x006a21fc6a8d39a1ULL,
0x00ac8bc2541ff2d9ULL, 0x006d4e2a77732732ULL,
0x009a39b694cc3f2fULL, 0x0085c0aa2a404c8fULL)},
{FIELD_LITERAL(0x00b261101a218548ULL, 0x00c1cae96424277bULL,
0x00869da0a77dd268ULL, 0x00bc0b09f8ec83eaULL,
0x00d61027f8e82ba9ULL, 0x00aa4c85999dce67ULL,
0x00eac3132b9f3fe1ULL, 0x00fb9b0cf1c695d2ULL)},
}}, {{
{FIELD_LITERAL(0x0043079295512f0d,0x0046a009861758e0,0x003ee2842a807378,0x0034cc9d1298e4fa,0x009744eb4d31b3ee,0x00afacec96650cd0,0x00ac891b313761ae,0x00e864d6d26e708a)},
{FIELD_LITERAL(0x00a84d7c8a23b491,0x0088e19aa868b27f,0x0005986d43e78ce9,0x00f28012f0606d28,0x0017ded7e10249b3,0x005ed4084b23af9b,0x00b9b0a940564472,0x00ad9056cceeb1f4)},
{FIELD_LITERAL(0x00db91b357fe755e,0x00a1aa544b15359c,0x00af4931a0195574,0x007686124fe11aef,0x00d1ead3c7b9ef7e,0x00aaf5fc580f8c15,0x00e727be147ee1ec,0x003c61c1e1577b86)},
{FIELD_LITERAL(0x0043079295512f0dULL, 0x0046a009861758e0ULL,
0x003ee2842a807378ULL, 0x0034cc9d1298e4faULL,
0x009744eb4d31b3eeULL, 0x00afacec96650cd0ULL,
0x00ac891b313761aeULL, 0x00e864d6d26e708aULL)},
{FIELD_LITERAL(0x00a84d7c8a23b491ULL, 0x0088e19aa868b27fULL,
0x0005986d43e78ce9ULL, 0x00f28012f0606d28ULL,
0x0017ded7e10249b3ULL, 0x005ed4084b23af9bULL,
0x00b9b0a940564472ULL, 0x00ad9056cceeb1f4ULL)},
{FIELD_LITERAL(0x00db91b357fe755eULL, 0x00a1aa544b15359cULL,
0x00af4931a0195574ULL, 0x007686124fe11aefULL,
0x00d1ead3c7b9ef7eULL, 0x00aaf5fc580f8c15ULL,
0x00e727be147ee1ecULL, 0x003c61c1e1577b86ULL)},
}}, {{
{FIELD_LITERAL(0x009d3fca983220cf,0x00cd11acbc853dc4,0x0017590409d27f1d,0x00d2176698082802,0x00fa01251b2838c8,0x00dd297a0d9b51c6,0x00d76c92c045820a,0x00534bc7c46c9033)},
{FIELD_LITERAL(0x0080ed9bc9b07338,0x00fceac7745d2652,0x008a9d55f5f2cc69,0x0096ce72df301ac5,0x00f53232e7974d87,0x0071728c7ae73947,0x0090507602570778,0x00cb81cfd883b1b2)},
{FIELD_LITERAL(0x005011aadea373da,0x003a8578ec896034,0x00f20a6535fa6d71,0x005152d31e5a87cf,0x002bac1c8e68ca31,0x00b0e323db4c1381,0x00f1d596b7d5ae25,0x00eae458097cb4e0)},
{FIELD_LITERAL(0x009d3fca983220cfULL, 0x00cd11acbc853dc4ULL,
0x0017590409d27f1dULL, 0x00d2176698082802ULL,
0x00fa01251b2838c8ULL, 0x00dd297a0d9b51c6ULL,
0x00d76c92c045820aULL, 0x00534bc7c46c9033ULL)},
{FIELD_LITERAL(0x0080ed9bc9b07338ULL, 0x00fceac7745d2652ULL,
0x008a9d55f5f2cc69ULL, 0x0096ce72df301ac5ULL,
0x00f53232e7974d87ULL, 0x0071728c7ae73947ULL,
0x0090507602570778ULL, 0x00cb81cfd883b1b2ULL)},
{FIELD_LITERAL(0x005011aadea373daULL, 0x003a8578ec896034ULL,
0x00f20a6535fa6d71ULL, 0x005152d31e5a87cfULL,
0x002bac1c8e68ca31ULL, 0x00b0e323db4c1381ULL,
0x00f1d596b7d5ae25ULL, 0x00eae458097cb4e0ULL)},
}}, {{
{FIELD_LITERAL(0x00920ac80f9b0d21,0x00f80f7f73401246,0x0086d37849b557d6,0x0002bd4b317b752e,0x00b26463993a42bb,0x002070422a73b129,0x00341acaa0380cb3,0x00541914dd66a1b2)},
{FIELD_LITERAL(0x00c1513cd66abe8c,0x000139e01118944d,0x0064abbcb8080bbb,0x00b3b08202473142,0x00c629ef25da2403,0x00f0aec3310d9b7f,0x0050b2227472d8cd,0x00f6c8a922d41fb4)},
{FIELD_LITERAL(0x001075ccf26b7b1f,0x00bb6bb213170433,0x00e9491ad262da79,0x009ef4f48d2d384c,0x008992770766f09d,0x001584396b6b1101,0x00af3f8676c9feef,0x0024603c40269118)},
{FIELD_LITERAL(0x00920ac80f9b0d21ULL, 0x00f80f7f73401246ULL,
0x0086d37849b557d6ULL, 0x0002bd4b317b752eULL,
0x00b26463993a42bbULL, 0x002070422a73b129ULL,
0x00341acaa0380cb3ULL, 0x00541914dd66a1b2ULL)},
{FIELD_LITERAL(0x00c1513cd66abe8cULL, 0x000139e01118944dULL,
0x0064abbcb8080bbbULL, 0x00b3b08202473142ULL,
0x00c629ef25da2403ULL, 0x00f0aec3310d9b7fULL,
0x0050b2227472d8cdULL, 0x00f6c8a922d41fb4ULL)},
{FIELD_LITERAL(0x001075ccf26b7b1fULL, 0x00bb6bb213170433ULL,
0x00e9491ad262da79ULL, 0x009ef4f48d2d384cULL,
0x008992770766f09dULL, 0x001584396b6b1101ULL,
0x00af3f8676c9feefULL, 0x0024603c40269118ULL)},
}}, {{
{FIELD_LITERAL(0x009dd7b31319527c,0x001e7ac948d873a9,0x00fa54b46ef9673a,0x0066efb8d5b02fe6,0x00754b1d3928aeae,0x0004262ac72a6f6b,0x0079b7d49a6eb026,0x003126a753540102)},
{FIELD_LITERAL(0x009666e24f693947,0x00f714311269d45f,0x0010ffac1d0c851c,0x0066e80c37363497,0x00f1f4ad010c60b0,0x0015c87408470ff7,0x00651d5e9c7766a4,0x008138819d7116de)},
{FIELD_LITERAL(0x003934b11c57253b,0x00ef308edf21f46e,0x00e54e99c7a16198,0x0080d57135764e63,0x00751c27b946bc24,0x00dd389ce4e9e129,0x00a1a2bfd1cd84dc,0x002fae73e5149b32)},
{FIELD_LITERAL(0x009dd7b31319527cULL, 0x001e7ac948d873a9ULL,
0x00fa54b46ef9673aULL, 0x0066efb8d5b02fe6ULL,
0x00754b1d3928aeaeULL, 0x0004262ac72a6f6bULL,
0x0079b7d49a6eb026ULL, 0x003126a753540102ULL)},
{FIELD_LITERAL(0x009666e24f693947ULL, 0x00f714311269d45fULL,
0x0010ffac1d0c851cULL, 0x0066e80c37363497ULL,
0x00f1f4ad010c60b0ULL, 0x0015c87408470ff7ULL,
0x00651d5e9c7766a4ULL, 0x008138819d7116deULL)},
{FIELD_LITERAL(0x003934b11c57253bULL, 0x00ef308edf21f46eULL,
0x00e54e99c7a16198ULL, 0x0080d57135764e63ULL,
0x00751c27b946bc24ULL, 0x00dd389ce4e9e129ULL,
0x00a1a2bfd1cd84dcULL, 0x002fae73e5149b32ULL)},
}}, {{
{FIELD_LITERAL(0x00911657dffb4cdd,0x00c100b7cc553d06,0x00449d075ec467cc,0x007062100bc64e70,0x0043cf86f7bd21e7,0x00f401dc4b797dea,0x005224afb2f62e65,0x00d1ede3fb5a42be)},
{FIELD_LITERAL(0x00f2ba36a41aa144,0x00a0c22d946ee18f,0x008aae8ef9a14f99,0x00eef4d79b19bb36,0x008e75ce3d27b1fc,0x00a65daa03b29a27,0x00d9cc83684eb145,0x009e1ed80cc2ed74)},
{FIELD_LITERAL(0x00bed953d1997988,0x00b93ed175a24128,0x00871c5963fb6365,0x00ca2df20014a787,0x00f5d9c1d0b34322,0x00f6f5942818db0a,0x004cc091f49c9906,0x00e8a188a60bff9f)},
{FIELD_LITERAL(0x00911657dffb4cddULL, 0x00c100b7cc553d06ULL,
0x00449d075ec467ccULL, 0x007062100bc64e70ULL,
0x0043cf86f7bd21e7ULL, 0x00f401dc4b797deaULL,
0x005224afb2f62e65ULL, 0x00d1ede3fb5a42beULL)},
{FIELD_LITERAL(0x00f2ba36a41aa144ULL, 0x00a0c22d946ee18fULL,
0x008aae8ef9a14f99ULL, 0x00eef4d79b19bb36ULL,
0x008e75ce3d27b1fcULL, 0x00a65daa03b29a27ULL,
0x00d9cc83684eb145ULL, 0x009e1ed80cc2ed74ULL)},
{FIELD_LITERAL(0x00bed953d1997988ULL, 0x00b93ed175a24128ULL,
0x00871c5963fb6365ULL, 0x00ca2df20014a787ULL,
0x00f5d9c1d0b34322ULL, 0x00f6f5942818db0aULL,
0x004cc091f49c9906ULL, 0x00e8a188a60bff9fULL)},
}}, {{
{FIELD_LITERAL(0x0032c7762032fae8,0x00e4087232e0bc21,0x00f767344b6e8d85,0x00bbf369b76c2aa2,0x008a1f46c6e1570c,0x001368cd9780369f,0x007359a39d079430,0x0003646512921434)},
{FIELD_LITERAL(0x007c4b47ca7c73e7,0x005396221039734b,0x008b64ddf0e45d7e,0x00bfad5af285e6c2,0x008ec711c5b1a1a8,0x00cf663301237f98,0x00917ee3f1655126,0x004152f337efedd8)},
{FIELD_LITERAL(0x0007c7edc9305daa,0x000a6664f273701c,0x00f6e78795e200b1,0x005d05b9ecd2473e,0x0014f5f17c865786,0x00c7fd2d166fa995,0x004939a2d8eb80e0,0x002244ba0942c199)},
{FIELD_LITERAL(0x0032c7762032fae8ULL, 0x00e4087232e0bc21ULL,
0x00f767344b6e8d85ULL, 0x00bbf369b76c2aa2ULL,
0x008a1f46c6e1570cULL, 0x001368cd9780369fULL,
0x007359a39d079430ULL, 0x0003646512921434ULL)},
{FIELD_LITERAL(0x007c4b47ca7c73e7ULL, 0x005396221039734bULL,
0x008b64ddf0e45d7eULL, 0x00bfad5af285e6c2ULL,
0x008ec711c5b1a1a8ULL, 0x00cf663301237f98ULL,
0x00917ee3f1655126ULL, 0x004152f337efedd8ULL)},
{FIELD_LITERAL(0x0007c7edc9305daaULL, 0x000a6664f273701cULL,
0x00f6e78795e200b1ULL, 0x005d05b9ecd2473eULL,
0x0014f5f17c865786ULL, 0x00c7fd2d166fa995ULL,
0x004939a2d8eb80e0ULL, 0x002244ba0942c199ULL)},
}}, {{
{FIELD_LITERAL(0x00321e767f0262cf,0x002e57d776caf68e,0x00bf2c94814f0437,0x00c339196acd622f,0x001db4cce71e2770,0x001ded5ddba6eee2,0x0078608ab1554c8d,0x00067fe0ab76365b)},
{FIELD_LITERAL(0x00f09758e11e3985,0x00169efdbd64fad3,0x00e8889b7d6dacd6,0x0035cdd58ea88209,0x00bcda47586d7f49,0x003cdddcb2879088,0x0016da70187e954b,0x009556ea2e92aacd)},
{FIELD_LITERAL(0x008cab16bd1ff897,0x00b389972cdf753f,0x00ea8ed1e46dfdc0,0x004fe7ef94c589f4,0x002b8ae9b805ecf3,0x0025c08d892874a5,0x0023938e98d44c4c,0x00f759134cabf69c)},
{FIELD_LITERAL(0x00321e767f0262cfULL, 0x002e57d776caf68eULL,
0x00bf2c94814f0437ULL, 0x00c339196acd622fULL,
0x001db4cce71e2770ULL, 0x001ded5ddba6eee2ULL,
0x0078608ab1554c8dULL, 0x00067fe0ab76365bULL)},
{FIELD_LITERAL(0x00f09758e11e3985ULL, 0x00169efdbd64fad3ULL,
0x00e8889b7d6dacd6ULL, 0x0035cdd58ea88209ULL,
0x00bcda47586d7f49ULL, 0x003cdddcb2879088ULL,
0x0016da70187e954bULL, 0x009556ea2e92aacdULL)},
{FIELD_LITERAL(0x008cab16bd1ff897ULL, 0x00b389972cdf753fULL,
0x00ea8ed1e46dfdc0ULL, 0x004fe7ef94c589f4ULL,
0x002b8ae9b805ecf3ULL, 0x0025c08d892874a5ULL,
0x0023938e98d44c4cULL, 0x00f759134cabf69cULL)},
}}, {{
{FIELD_LITERAL(0x006c2a84678e4b3b,0x007a194aacd1868f,0x00ed0225af424761,0x00da0a6f293c64b8,0x001062ac5c6a7a18,0x0030f5775a8aeef4,0x0002acaad76b7af0,0x00410b8fd63a579f)},
{FIELD_LITERAL(0x001ec59db3d9590e,0x001e9e3f1c3f182d,0x0045a9c3ec2cab14,0x0008198572aeb673,0x00773b74068bd167,0x0012535eaa395434,0x0044dba9e3bbb74a,0x002fba4d3c74bd0e)},
{FIELD_LITERAL(0x0042bf08fe66922c,0x003318b8fbb49e8c,0x00d75946004aa14c,0x00f601586b42bf1c,0x00c74cf1d912fe66,0x00abcb36974b30ad,0x007eb78720c9d2b8,0x009f54ab7bd4df85)},
{FIELD_LITERAL(0x006c2a84678e4b3bULL, 0x007a194aacd1868fULL,
0x00ed0225af424761ULL, 0x00da0a6f293c64b8ULL,
0x001062ac5c6a7a18ULL, 0x0030f5775a8aeef4ULL,
0x0002acaad76b7af0ULL, 0x00410b8fd63a579fULL)},
{FIELD_LITERAL(0x001ec59db3d9590eULL, 0x001e9e3f1c3f182dULL,
0x0045a9c3ec2cab14ULL, 0x0008198572aeb673ULL,
0x00773b74068bd167ULL, 0x0012535eaa395434ULL,
0x0044dba9e3bbb74aULL, 0x002fba4d3c74bd0eULL)},
{FIELD_LITERAL(0x0042bf08fe66922cULL, 0x003318b8fbb49e8cULL,
0x00d75946004aa14cULL, 0x00f601586b42bf1cULL,
0x00c74cf1d912fe66ULL, 0x00abcb36974b30adULL,
0x007eb78720c9d2b8ULL, 0x009f54ab7bd4df85ULL)},
}}, {{
{FIELD_LITERAL(0x00db9fc948f73826,0x00fa8b3746ed8ee9,0x00132cb65aafbeb2,0x00c36ff3fe7925b8,0x00837daed353d2fe,0x00ec661be0667cf4,0x005beb8ed2e90204,0x00d77dd69e564967)},
{FIELD_LITERAL(0x0042e6268b861751,0x0008dd0469500c16,0x00b51b57c338a3fd,0x00cc4497d85cff6b,0x002f13d6b57c34a4,0x0083652eaf301105,0x00cc344294cc93a8,0x0060f4d02810e270)},
{FIELD_LITERAL(0x00a8954363cd518b,0x00ad171124bccb7b,0x0065f46a4adaae00,0x001b1a5b2a96e500,0x0043fe24f8233285,0x0066996d8ae1f2c3,0x00c530f3264169f9,0x00c0f92d07cf6a57)},
{FIELD_LITERAL(0x00db9fc948f73826ULL, 0x00fa8b3746ed8ee9ULL,
0x00132cb65aafbeb2ULL, 0x00c36ff3fe7925b8ULL,
0x00837daed353d2feULL, 0x00ec661be0667cf4ULL,
0x005beb8ed2e90204ULL, 0x00d77dd69e564967ULL)},
{FIELD_LITERAL(0x0042e6268b861751ULL, 0x0008dd0469500c16ULL,
0x00b51b57c338a3fdULL, 0x00cc4497d85cff6bULL,
0x002f13d6b57c34a4ULL, 0x0083652eaf301105ULL,
0x00cc344294cc93a8ULL, 0x0060f4d02810e270ULL)},
{FIELD_LITERAL(0x00a8954363cd518bULL, 0x00ad171124bccb7bULL,
0x0065f46a4adaae00ULL, 0x001b1a5b2a96e500ULL,
0x0043fe24f8233285ULL, 0x0066996d8ae1f2c3ULL,
0x00c530f3264169f9ULL, 0x00c0f92d07cf6a57ULL)},
}}, {{
{FIELD_LITERAL(0x0036a55c6815d943,0x008c8d1def993db3,0x002e0e1e8ff7318f,0x00d883a4b92db00a,0x002f5e781ae33906,0x001a72adb235c06d,0x00f2e59e736e9caa,0x001a4b58e3031914)},
{FIELD_LITERAL(0x00d73bfae5e00844,0x00bf459766fb5f52,0x0061b4f5a5313cde,0x004392d4c3b95514,0x000d3551b1077523,0x0000998840ee5d71,0x006de6e340448b7b,0x00251aa504875d6e)},
{FIELD_LITERAL(0x003bf343427ac342,0x00adc0a78642b8c5,0x0003b893175a8314,0x0061a34ade5703bc,0x00ea3ea8bb71d632,0x00be0df9a1f198c2,0x0046dd8e7c1635fb,0x00f1523fdd25d5e5)},
{FIELD_LITERAL(0x0036a55c6815d943ULL, 0x008c8d1def993db3ULL,
0x002e0e1e8ff7318fULL, 0x00d883a4b92db00aULL,
0x002f5e781ae33906ULL, 0x001a72adb235c06dULL,
0x00f2e59e736e9caaULL, 0x001a4b58e3031914ULL)},
{FIELD_LITERAL(0x00d73bfae5e00844ULL, 0x00bf459766fb5f52ULL,
0x0061b4f5a5313cdeULL, 0x004392d4c3b95514ULL,
0x000d3551b1077523ULL, 0x0000998840ee5d71ULL,
0x006de6e340448b7bULL, 0x00251aa504875d6eULL)},
{FIELD_LITERAL(0x003bf343427ac342ULL, 0x00adc0a78642b8c5ULL,
0x0003b893175a8314ULL, 0x0061a34ade5703bcULL,
0x00ea3ea8bb71d632ULL, 0x00be0df9a1f198c2ULL,
0x0046dd8e7c1635fbULL, 0x00f1523fdd25d5e5ULL)},
}}, {{
{FIELD_LITERAL(0x00633f63fc9dd406,0x00e713ff80e04a43,0x0060c6e970f2d621,0x00a57cd7f0df1891,0x00f2406a550650bb,0x00b064290efdc684,0x001eab0144d17916,0x00cd15f863c293ab)},
{FIELD_LITERAL(0x0029cec55273f70d,0x007044ee275c6340,0x0040f637a93015e2,0x00338bb78db5aae9,0x001491b2a6132147,0x00a125d6cfe6bde3,0x005f7ac561ba8669,0x001d5eaea3fbaacf)},
{FIELD_LITERAL(0x00054e9635e3be31,0x000e43f31e2872be,0x00d05b1c9e339841,0x006fac50bd81fd98,0x00cdc7852eaebb09,0x004ff519b061991b,0x009099e8107d4c85,0x00273e24c36a4a61)},
{FIELD_LITERAL(0x00633f63fc9dd406ULL, 0x00e713ff80e04a43ULL,
0x0060c6e970f2d621ULL, 0x00a57cd7f0df1891ULL,
0x00f2406a550650bbULL, 0x00b064290efdc684ULL,
0x001eab0144d17916ULL, 0x00cd15f863c293abULL)},
{FIELD_LITERAL(0x0029cec55273f70dULL, 0x007044ee275c6340ULL,
0x0040f637a93015e2ULL, 0x00338bb78db5aae9ULL,
0x001491b2a6132147ULL, 0x00a125d6cfe6bde3ULL,
0x005f7ac561ba8669ULL, 0x001d5eaea3fbaacfULL)},
{FIELD_LITERAL(0x00054e9635e3be31ULL, 0x000e43f31e2872beULL,
0x00d05b1c9e339841ULL, 0x006fac50bd81fd98ULL,
0x00cdc7852eaebb09ULL, 0x004ff519b061991bULL,
0x009099e8107d4c85ULL, 0x00273e24c36a4a61ULL)},
}}, {{
{FIELD_LITERAL(0x00070b4441ef2c46,0x00efa5b02801a109,0x00bf0b8c3ee64adf,0x008a67e0b3452e98,0x001916b1f2fa7a74,0x00d781a78ff6cdc3,0x008682ce57e5c919,0x00cc1109dd210da3)},
{FIELD_LITERAL(0x00cae8aaff388663,0x005e983a35dda1c7,0x007ab1030d8e37f4,0x00e48940f5d032fe,0x006a36f9ef30b331,0x009be6f03958c757,0x0086231ceba91400,0x008bd0f7b823e7aa)},
{FIELD_LITERAL(0x00cf881ebef5a45a,0x004ebea78e7c6f2c,0x0090da9209cf26a0,0x00de2b2e4c775b84,0x0071d6031c3c15ae,0x00d9e927ef177d70,0x00894ee8c23896fd,0x00e3b3b401e41aad)},
{FIELD_LITERAL(0x00070b4441ef2c46ULL, 0x00efa5b02801a109ULL,
0x00bf0b8c3ee64adfULL, 0x008a67e0b3452e98ULL,
0x001916b1f2fa7a74ULL, 0x00d781a78ff6cdc3ULL,
0x008682ce57e5c919ULL, 0x00cc1109dd210da3ULL)},
{FIELD_LITERAL(0x00cae8aaff388663ULL, 0x005e983a35dda1c7ULL,
0x007ab1030d8e37f4ULL, 0x00e48940f5d032feULL,
0x006a36f9ef30b331ULL, 0x009be6f03958c757ULL,
0x0086231ceba91400ULL, 0x008bd0f7b823e7aaULL)},
{FIELD_LITERAL(0x00cf881ebef5a45aULL, 0x004ebea78e7c6f2cULL,
0x0090da9209cf26a0ULL, 0x00de2b2e4c775b84ULL,
0x0071d6031c3c15aeULL, 0x00d9e927ef177d70ULL,
0x00894ee8c23896fdULL, 0x00e3b3b401e41aadULL)},
}}, {{
{FIELD_LITERAL(0x00204fef26864170,0x00819269c5dee0f8,0x00bfb4713ec97966,0x0026339a6f34df78,0x001f26e64c761dc2,0x00effe3af313cb60,0x00e17b70138f601b,0x00f16e1ccd9ede5e)},
{FIELD_LITERAL(0x005d9a8353fdb2db,0x0055cc2048c698f0,0x00f6c4ac89657218,0x00525034d73faeb2,0x00435776fbda3c7d,0x0070ea5312323cbc,0x007a105d44d069fb,0x006dbc8d6dc786aa)},
{FIELD_LITERAL(0x0017cff19cd394ec,0x00fef7b810922587,0x00e6483970dff548,0x00ddf36ad6874264,0x00e61778523fcce2,0x0093a66c0c93b24a,0x00fd367114db7f86,0x007652d7ddce26dd)},
{FIELD_LITERAL(0x00204fef26864170ULL, 0x00819269c5dee0f8ULL,
0x00bfb4713ec97966ULL, 0x0026339a6f34df78ULL,
0x001f26e64c761dc2ULL, 0x00effe3af313cb60ULL,
0x00e17b70138f601bULL, 0x00f16e1ccd9ede5eULL)},
{FIELD_LITERAL(0x005d9a8353fdb2dbULL, 0x0055cc2048c698f0ULL,
0x00f6c4ac89657218ULL, 0x00525034d73faeb2ULL,
0x00435776fbda3c7dULL, 0x0070ea5312323cbcULL,
0x007a105d44d069fbULL, 0x006dbc8d6dc786aaULL)},
{FIELD_LITERAL(0x0017cff19cd394ecULL, 0x00fef7b810922587ULL,
0x00e6483970dff548ULL, 0x00ddf36ad6874264ULL,
0x00e61778523fcce2ULL, 0x0093a66c0c93b24aULL,
0x00fd367114db7f86ULL, 0x007652d7ddce26ddULL)},
}}, {{
{FIELD_LITERAL(0x00d92ced7ba12843,0x00aea9c7771e86e7,0x0046639693354f7b,0x00a628dbb6a80c47,0x003a0b0507372953,0x00421113ab45c0d9,0x00e545f08362ab7a,0x0028ce087b4d6d96)},
{FIELD_LITERAL(0x00a67ee7cf9f99eb,0x005713b275f2ff68,0x00f1d536a841513d,0x00823b59b024712e,0x009c46b9d0d38cec,0x00cdb1595aa2d7d4,0x008375b3423d9af8,0x000ab0b516d978f7)},
{FIELD_LITERAL(0x00428dcb3c510b0f,0x00585607ea24bb4e,0x003736bf1603687a,0x00c47e568c4fe3c7,0x003cd00282848605,0x0043a487c3b91939,0x004ffc04e1095a06,0x00a4c989a3d4b918)},
{FIELD_LITERAL(0x00d92ced7ba12843ULL, 0x00aea9c7771e86e7ULL,
0x0046639693354f7bULL, 0x00a628dbb6a80c47ULL,
0x003a0b0507372953ULL, 0x00421113ab45c0d9ULL,
0x00e545f08362ab7aULL, 0x0028ce087b4d6d96ULL)},
{FIELD_LITERAL(0x00a67ee7cf9f99ebULL, 0x005713b275f2ff68ULL,
0x00f1d536a841513dULL, 0x00823b59b024712eULL,
0x009c46b9d0d38cecULL, 0x00cdb1595aa2d7d4ULL,
0x008375b3423d9af8ULL, 0x000ab0b516d978f7ULL)},
{FIELD_LITERAL(0x00428dcb3c510b0fULL, 0x00585607ea24bb4eULL,
0x003736bf1603687aULL, 0x00c47e568c4fe3c7ULL,
0x003cd00282848605ULL, 0x0043a487c3b91939ULL,
0x004ffc04e1095a06ULL, 0x00a4c989a3d4b918ULL)},
}}, {{
{FIELD_LITERAL(0x00a8778d0e429f7a,0x004c02b059105a68,0x0016653b609da3ff,0x00d5107bd1a12d27,0x00b4708f9a771cab,0x00bb63b662033f69,0x0072f322240e7215,0x0019445b59c69222)},
{FIELD_LITERAL(0x00cf4f6069a658e6,0x0053ca52859436a6,0x0064b994d7e3e117,0x00cb469b9a07f534,0x00cfb68f399e9d47,0x00f0dcb8dac1c6e7,0x00f2ab67f538b3a5,0x0055544f178ab975)},
{FIELD_LITERAL(0x0099b7a2685d538c,0x00e2f1897b7c0018,0x003adac8ce48dae3,0x00089276d5c50c0c,0x00172fca07ad6717,0x00cb1a72f54069e5,0x004ee42f133545b3,0x00785f8651362f16)},
{FIELD_LITERAL(0x00a8778d0e429f7aULL, 0x004c02b059105a68ULL,
0x0016653b609da3ffULL, 0x00d5107bd1a12d27ULL,
0x00b4708f9a771cabULL, 0x00bb63b662033f69ULL,
0x0072f322240e7215ULL, 0x0019445b59c69222ULL)},
{FIELD_LITERAL(0x00cf4f6069a658e6ULL, 0x0053ca52859436a6ULL,
0x0064b994d7e3e117ULL, 0x00cb469b9a07f534ULL,
0x00cfb68f399e9d47ULL, 0x00f0dcb8dac1c6e7ULL,
0x00f2ab67f538b3a5ULL, 0x0055544f178ab975ULL)},
{FIELD_LITERAL(0x0099b7a2685d538cULL, 0x00e2f1897b7c0018ULL,
0x003adac8ce48dae3ULL, 0x00089276d5c50c0cULL,
0x00172fca07ad6717ULL, 0x00cb1a72f54069e5ULL,
0x004ee42f133545b3ULL, 0x00785f8651362f16ULL)},
}}, {{
{FIELD_LITERAL(0x0049cbac38509e11,0x0015234505d42cdf,0x00794fb0b5840f1c,0x00496437344045a5,0x0031b6d944e4f9b0,0x00b207318ac1f5d8,0x0000c840da7f5c5d,0x00526f373a5c8814)},
{FIELD_LITERAL(0x002c7b7742d1dfd9,0x002cabeb18623c01,0x00055f5e3e044446,0x006c20f3b4ef54ba,0x00c600141ec6b35f,0x00354f437f1a32a3,0x00bac4624a3520f9,0x00c483f734a90691)},
{FIELD_LITERAL(0x0053a737d422918d,0x00f7fca1d8758625,0x00c360336dadb04c,0x00f38e3d9158a1b8,0x0069ce3b418e84c6,0x005d1697eca16ead,0x00f8bd6a35ece13d,0x007885dfc2b5afea)},
{FIELD_LITERAL(0x0049cbac38509e11ULL, 0x0015234505d42cdfULL,
0x00794fb0b5840f1cULL, 0x00496437344045a5ULL,
0x0031b6d944e4f9b0ULL, 0x00b207318ac1f5d8ULL,
0x0000c840da7f5c5dULL, 0x00526f373a5c8814ULL)},
{FIELD_LITERAL(0x002c7b7742d1dfd9ULL, 0x002cabeb18623c01ULL,
0x00055f5e3e044446ULL, 0x006c20f3b4ef54baULL,
0x00c600141ec6b35fULL, 0x00354f437f1a32a3ULL,
0x00bac4624a3520f9ULL, 0x00c483f734a90691ULL)},
{FIELD_LITERAL(0x0053a737d422918dULL, 0x00f7fca1d8758625ULL,
0x00c360336dadb04cULL, 0x00f38e3d9158a1b8ULL,
0x0069ce3b418e84c6ULL, 0x005d1697eca16eadULL,
0x00f8bd6a35ece13dULL, 0x007885dfc2b5afeaULL)},
}}, {{
{FIELD_LITERAL(0x00c3617ae260776c,0x00b20dc3e96922d7,0x00a1a7802246706a,0x00ca6505a5240244,0x002246b62d919782,0x001439102d7aa9b3,0x00e8af1139e6422c,0x00c888d1b52f2b05)},
{FIELD_LITERAL(0x005b67690ffd41d9,0x005294f28df516f9,0x00a879272412fcb9,0x00098b629a6d1c8d,0x00fabd3c8050865a,0x00cd7e5b0a3879c5,0x00153238210f3423,0x00357cac101e9f42)},
{FIELD_LITERAL(0x008917b454444fb7,0x00f59247c97e441b,0x00a6200a6815152d,0x0009a4228601d254,0x001c0360559bd374,0x007563362039cb36,0x00bd75b48d74e32b,0x0017f515ac3499e8)},
{FIELD_LITERAL(0x00c3617ae260776cULL, 0x00b20dc3e96922d7ULL,
0x00a1a7802246706aULL, 0x00ca6505a5240244ULL,
0x002246b62d919782ULL, 0x001439102d7aa9b3ULL,
0x00e8af1139e6422cULL, 0x00c888d1b52f2b05ULL)},
{FIELD_LITERAL(0x005b67690ffd41d9ULL, 0x005294f28df516f9ULL,
0x00a879272412fcb9ULL, 0x00098b629a6d1c8dULL,
0x00fabd3c8050865aULL, 0x00cd7e5b0a3879c5ULL,
0x00153238210f3423ULL, 0x00357cac101e9f42ULL)},
{FIELD_LITERAL(0x008917b454444fb7ULL, 0x00f59247c97e441bULL,
0x00a6200a6815152dULL, 0x0009a4228601d254ULL,
0x001c0360559bd374ULL, 0x007563362039cb36ULL,
0x00bd75b48d74e32bULL, 0x0017f515ac3499e8ULL)},
}}, {{
{FIELD_LITERAL(0x001532a7ffe41c5a,0x00eb1edce358d6bf,0x00ddbacc7b678a7b,0x008a7b70f3c841a3,0x00f1923bf27d3f4c,0x000b2713ed8f7873,0x00aaf67e29047902,0x0044994a70b3976d)},
{FIELD_LITERAL(0x00d54e802082d42c,0x00a55aa0dce7cc6c,0x006477b96073f146,0x0082efe4ceb43594,0x00a922bcba026845,0x0077f19d1ab75182,0x00c2bb2737846e59,0x0004d7eec791dd33)},
{FIELD_LITERAL(0x0044588d1a81d680,0x00b0a9097208e4f8,0x00212605350dc57e,0x0028717cd2871123,0x00fb083c100fd979,0x0045a056ce063fdf,0x00a5d604b4dd6a41,0x001dabc08ba4e236)},
{FIELD_LITERAL(0x001532a7ffe41c5aULL, 0x00eb1edce358d6bfULL,
0x00ddbacc7b678a7bULL, 0x008a7b70f3c841a3ULL,
0x00f1923bf27d3f4cULL, 0x000b2713ed8f7873ULL,
0x00aaf67e29047902ULL, 0x0044994a70b3976dULL)},
{FIELD_LITERAL(0x00d54e802082d42cULL, 0x00a55aa0dce7cc6cULL,
0x006477b96073f146ULL, 0x0082efe4ceb43594ULL,
0x00a922bcba026845ULL, 0x0077f19d1ab75182ULL,
0x00c2bb2737846e59ULL, 0x0004d7eec791dd33ULL)},
{FIELD_LITERAL(0x0044588d1a81d680ULL, 0x00b0a9097208e4f8ULL,
0x00212605350dc57eULL, 0x0028717cd2871123ULL,
0x00fb083c100fd979ULL, 0x0045a056ce063fdfULL,
0x00a5d604b4dd6a41ULL, 0x001dabc08ba4e236ULL)},
}}, {{
{FIELD_LITERAL(0x00c4887198d7a7fa,0x00244f98fb45784a,0x0045911e15a15d01,0x001d323d374c0966,0x00967c3915196562,0x0039373abd2f3c67,0x000d2c5614312423,0x0041cf2215442ce3)},
{FIELD_LITERAL(0x008ede889ada7f06,0x001611e91de2e135,0x00fdb9a458a471b9,0x00563484e03710d1,0x0031cc81925e3070,0x0062c97b3af80005,0x00fa733eea28edeb,0x00e82457e1ebbc88)},
{FIELD_LITERAL(0x006a0df5fe9b6f59,0x00a0d4ff46040d92,0x004a7cedb6f93250,0x00d1df8855b8c357,0x00e73a46086fd058,0x0048fb0add6dfe59,0x001e03a28f1b4e3d,0x00a871c993308d76)},
{FIELD_LITERAL(0x00c4887198d7a7faULL, 0x00244f98fb45784aULL,
0x0045911e15a15d01ULL, 0x001d323d374c0966ULL,
0x00967c3915196562ULL, 0x0039373abd2f3c67ULL,
0x000d2c5614312423ULL, 0x0041cf2215442ce3ULL)},
{FIELD_LITERAL(0x008ede889ada7f06ULL, 0x001611e91de2e135ULL,
0x00fdb9a458a471b9ULL, 0x00563484e03710d1ULL,
0x0031cc81925e3070ULL, 0x0062c97b3af80005ULL,
0x00fa733eea28edebULL, 0x00e82457e1ebbc88ULL)},
{FIELD_LITERAL(0x006a0df5fe9b6f59ULL, 0x00a0d4ff46040d92ULL,
0x004a7cedb6f93250ULL, 0x00d1df8855b8c357ULL,
0x00e73a46086fd058ULL, 0x0048fb0add6dfe59ULL,
0x001e03a28f1b4e3dULL, 0x00a871c993308d76ULL)},
}}, {{
{FIELD_LITERAL(0x0030dbb2d1766ec8,0x00586c0ad138555e,0x00d1a34f9e91c77c,0x0063408ad0e89014,0x00d61231b05f6f5b,0x0009abf569f5fd8a,0x00aec67a110f1c43,0x0031d1a790938dd7)},
{FIELD_LITERAL(0x006cded841e2a862,0x00198d60af0ab6fb,0x0018f09db809e750,0x004e6ac676016263,0x00eafcd1620969cb,0x002c9784ca34917d,0x0054f00079796de7,0x00d9fab5c5972204)},
{FIELD_LITERAL(0x004bd0fee2438a83,0x00b571e62b0f83bd,0x0059287d7ce74800,0x00fb3631b645c3f0,0x00a018e977f78494,0x0091e27065c27b12,0x007696c1817165e0,0x008c40be7c45ba3a)},
{FIELD_LITERAL(0x0030dbb2d1766ec8ULL, 0x00586c0ad138555eULL,
0x00d1a34f9e91c77cULL, 0x0063408ad0e89014ULL,
0x00d61231b05f6f5bULL, 0x0009abf569f5fd8aULL,
0x00aec67a110f1c43ULL, 0x0031d1a790938dd7ULL)},
{FIELD_LITERAL(0x006cded841e2a862ULL, 0x00198d60af0ab6fbULL,
0x0018f09db809e750ULL, 0x004e6ac676016263ULL,
0x00eafcd1620969cbULL, 0x002c9784ca34917dULL,
0x0054f00079796de7ULL, 0x00d9fab5c5972204ULL)},
{FIELD_LITERAL(0x004bd0fee2438a83ULL, 0x00b571e62b0f83bdULL,
0x0059287d7ce74800ULL, 0x00fb3631b645c3f0ULL,
0x00a018e977f78494ULL, 0x0091e27065c27b12ULL,
0x007696c1817165e0ULL, 0x008c40be7c45ba3aULL)},
}}, {{
{FIELD_LITERAL(0x00a0f326327cb684,0x001c7d0f672680ff,0x008c1c81ffb112d1,0x00f8f801674eddc8,0x00e926d5d48c2a9d,0x005bd6d954c6fe9a,0x004c6b24b4e33703,0x00d05eb5c09105cc)},
{FIELD_LITERAL(0x00d61731caacf2cf,0x002df0c7609e01c5,0x00306172208b1e2b,0x00b413fe4fb2b686,0x00826d360902a221,0x003f8d056e67e7f7,0x0065025b0175e989,0x00369add117865eb)},
{FIELD_LITERAL(0x00aaf895aec2fa11,0x000f892bc313eb52,0x005b1c794dad050b,0x003f8ec4864cec14,0x00af81058d0b90e5,0x00ebe43e183997bb,0x00a9d610f9f3e615,0x007acd8eec2e88d3)},
{FIELD_LITERAL(0x00a0f326327cb684ULL, 0x001c7d0f672680ffULL,
0x008c1c81ffb112d1ULL, 0x00f8f801674eddc8ULL,
0x00e926d5d48c2a9dULL, 0x005bd6d954c6fe9aULL,
0x004c6b24b4e33703ULL, 0x00d05eb5c09105ccULL)},
{FIELD_LITERAL(0x00d61731caacf2cfULL, 0x002df0c7609e01c5ULL,
0x00306172208b1e2bULL, 0x00b413fe4fb2b686ULL,
0x00826d360902a221ULL, 0x003f8d056e67e7f7ULL,
0x0065025b0175e989ULL, 0x00369add117865ebULL)},
{FIELD_LITERAL(0x00aaf895aec2fa11ULL, 0x000f892bc313eb52ULL,
0x005b1c794dad050bULL, 0x003f8ec4864cec14ULL,
0x00af81058d0b90e5ULL, 0x00ebe43e183997bbULL,
0x00a9d610f9f3e615ULL, 0x007acd8eec2e88d3ULL)},
}}, {{
{FIELD_LITERAL(0x0049b2fab13812a3,0x00846db32cd60431,0x000177fa578c8d6c,0x00047d0e2ad4bc51,0x00b158ba38d1e588,0x006a45daad79e3f3,0x000997b93cab887b,0x00c47ea42fa23dc3)},
{FIELD_LITERAL(0x0012b6fef7aeb1ca,0x009412768194b6a7,0x00ff0d351f23ab93,0x007e8a14c1aff71b,0x006c1c0170c512bc,0x0016243ea02ab2e5,0x007bb6865b303f3e,0x0015ce6b29b159f4)},
{FIELD_LITERAL(0x009961cd02e68108,0x00e2035d3a1d0836,0x005d51f69b5e1a1d,0x004bccb4ea36edcd,0x0069be6a7aeef268,0x0063f4dd9de8d5a7,0x006283783092ca35,0x0075a31af2c35409)},
{FIELD_LITERAL(0x0049b2fab13812a3ULL, 0x00846db32cd60431ULL,
0x000177fa578c8d6cULL, 0x00047d0e2ad4bc51ULL,
0x00b158ba38d1e588ULL, 0x006a45daad79e3f3ULL,
0x000997b93cab887bULL, 0x00c47ea42fa23dc3ULL)},
{FIELD_LITERAL(0x0012b6fef7aeb1caULL, 0x009412768194b6a7ULL,
0x00ff0d351f23ab93ULL, 0x007e8a14c1aff71bULL,
0x006c1c0170c512bcULL, 0x0016243ea02ab2e5ULL,
0x007bb6865b303f3eULL, 0x0015ce6b29b159f4ULL)},
{FIELD_LITERAL(0x009961cd02e68108ULL, 0x00e2035d3a1d0836ULL,
0x005d51f69b5e1a1dULL, 0x004bccb4ea36edcdULL,
0x0069be6a7aeef268ULL, 0x0063f4dd9de8d5a7ULL,
0x006283783092ca35ULL, 0x0075a31af2c35409ULL)},
}}, {{
{FIELD_LITERAL(0x00c412365162e8cf,0x00012283fb34388a,0x003e6543babf39e2,0x00eead6b3a804978,0x0099c0314e8b326f,0x00e98e0a8d477a4f,0x00d2eb96b127a687,0x00ed8d7df87571bb)},
{FIELD_LITERAL(0x00777463e308cacf,0x00c8acb93950132d,0x00ebddbf4ca48b2c,0x0026ad7ca0795a0a,0x00f99a3d9a715064,0x000d60bcf9d4dfcc,0x005e65a73a437a06,0x0019d536a8db56c8)},
{FIELD_LITERAL(0x00192d7dd558d135,0x0027cd6a8323ffa7,0x00239f1a412dc1e7,0x0046b4b3be74fc5c,0x0020c47a2bef5bce,0x00aa17e48f43862b,0x00f7e26c96342e5f,0x0008011c530f39a9)},
{FIELD_LITERAL(0x00c412365162e8cfULL, 0x00012283fb34388aULL,
0x003e6543babf39e2ULL, 0x00eead6b3a804978ULL,
0x0099c0314e8b326fULL, 0x00e98e0a8d477a4fULL,
0x00d2eb96b127a687ULL, 0x00ed8d7df87571bbULL)},
{FIELD_LITERAL(0x00777463e308cacfULL, 0x00c8acb93950132dULL,
0x00ebddbf4ca48b2cULL, 0x0026ad7ca0795a0aULL,
0x00f99a3d9a715064ULL, 0x000d60bcf9d4dfccULL,
0x005e65a73a437a06ULL, 0x0019d536a8db56c8ULL)},
{FIELD_LITERAL(0x00192d7dd558d135ULL, 0x0027cd6a8323ffa7ULL,
0x00239f1a412dc1e7ULL, 0x0046b4b3be74fc5cULL,
0x0020c47a2bef5bceULL, 0x00aa17e48f43862bULL,
0x00f7e26c96342e5fULL, 0x0008011c530f39a9ULL)},
}}, {{
{FIELD_LITERAL(0x00aad4ac569bf0f1,0x00a67adc90b27740,0x0048551369a5751a,0x0031252584a3306a,0x0084e15df770e6fc,0x00d7bba1c74b5805,0x00a80ef223af1012,0x0089c85ceb843a34)},
{FIELD_LITERAL(0x00c4545be4a54004,0x0099e11f60357e6c,0x001f3936d19515a6,0x007793df84341a6e,0x0051061886717ffa,0x00e9b0a660b28f85,0x0044ea685892de0d,0x000257d2a1fda9d9)},
{FIELD_LITERAL(0x007e8b01b24ac8a8,0x006cf3b0b5ca1337,0x00f1607d3e36a570,0x0039b7fab82991a1,0x00231777065840c5,0x00998e5afdd346f9,0x00b7dc3e64acc85f,0x00baacc748013ad6)},
{FIELD_LITERAL(0x00aad4ac569bf0f1ULL, 0x00a67adc90b27740ULL,
0x0048551369a5751aULL, 0x0031252584a3306aULL,
0x0084e15df770e6fcULL, 0x00d7bba1c74b5805ULL,
0x00a80ef223af1012ULL, 0x0089c85ceb843a34ULL)},
{FIELD_LITERAL(0x00c4545be4a54004ULL, 0x0099e11f60357e6cULL,
0x001f3936d19515a6ULL, 0x007793df84341a6eULL,
0x0051061886717ffaULL, 0x00e9b0a660b28f85ULL,
0x0044ea685892de0dULL, 0x000257d2a1fda9d9ULL)},
{FIELD_LITERAL(0x007e8b01b24ac8a8ULL, 0x006cf3b0b5ca1337ULL,
0x00f1607d3e36a570ULL, 0x0039b7fab82991a1ULL,
0x00231777065840c5ULL, 0x00998e5afdd346f9ULL,
0x00b7dc3e64acc85fULL, 0x00baacc748013ad6ULL)},
}}, {{
{FIELD_LITERAL(0x008ea6a4177580bf,0x005fa1953e3f0378,0x005fe409ac74d614,0x00452327f477e047,0x00a4018507fb6073,0x007b6e71951caac8,0x0012b42ab8a6ce91,0x0080eca677294ab7)},
{FIELD_LITERAL(0x00a53edc023ba69b,0x00c6afa83ddde2e8,0x00c3f638b307b14e,0x004a357a64414062,0x00e4d94d8b582dc9,0x001739caf71695b7,0x0012431b2ae28de1,0x003b6bc98682907c)},
{FIELD_LITERAL(0x008a9a93be1f99d6,0x0079fa627cc699c8,0x00b0cfb134ba84c8,0x001c4b778249419a,0x00df4ab3d9c44f40,0x009f596e6c1a9e3c,0x001979c0df237316,0x00501e953a919b87)},
{FIELD_LITERAL(0x008ea6a4177580bfULL, 0x005fa1953e3f0378ULL,
0x005fe409ac74d614ULL, 0x00452327f477e047ULL,
0x00a4018507fb6073ULL, 0x007b6e71951caac8ULL,
0x0012b42ab8a6ce91ULL, 0x0080eca677294ab7ULL)},
{FIELD_LITERAL(0x00a53edc023ba69bULL, 0x00c6afa83ddde2e8ULL,
0x00c3f638b307b14eULL, 0x004a357a64414062ULL,
0x00e4d94d8b582dc9ULL, 0x001739caf71695b7ULL,
0x0012431b2ae28de1ULL, 0x003b6bc98682907cULL)},
{FIELD_LITERAL(0x008a9a93be1f99d6ULL, 0x0079fa627cc699c8ULL,
0x00b0cfb134ba84c8ULL, 0x001c4b778249419aULL,
0x00df4ab3d9c44f40ULL, 0x009f596e6c1a9e3cULL,
0x001979c0df237316ULL, 0x00501e953a919b87ULL)},
}}
};
const niels_t *curve448_wnaf_base = curve448_wnaf_base_table;
+3 -3
View File
@@ -12,9 +12,9 @@
#include "field.h"
static const gf MODULUS = {
FIELD_LITERAL(0xffffffffffffff, 0xffffffffffffff, 0xffffffffffffff,
0xffffffffffffff, 0xfffffffffffffe, 0xffffffffffffff,
0xffffffffffffff, 0xffffffffffffff)
FIELD_LITERAL(0xffffffffffffffULL, 0xffffffffffffffULL, 0xffffffffffffffULL,
0xffffffffffffffULL, 0xfffffffffffffeULL, 0xffffffffffffffULL,
0xffffffffffffffULL, 0xffffffffffffffULL)
};
/* Serialize to wire format. */
+9 -9
View File
@@ -14,24 +14,24 @@
#include "word.h"
#include "point_448.h"
static const c448_word_t MONTGOMERY_FACTOR = (c448_word_t) 0x3bd440fae918bc5;
static const c448_word_t MONTGOMERY_FACTOR = (c448_word_t) 0x3bd440fae918bc5ULL;
static const curve448_scalar_t sc_p = {
{
{
SC_LIMB(0x2378c292ab5844f3), SC_LIMB(0x216cc2728dc58f55),
SC_LIMB(0xc44edb49aed63690), SC_LIMB(0xffffffff7cca23e9),
SC_LIMB(0xffffffffffffffff), SC_LIMB(0xffffffffffffffff),
SC_LIMB(0x3fffffffffffffff)
SC_LIMB(0x2378c292ab5844f3ULL), SC_LIMB(0x216cc2728dc58f55ULL),
SC_LIMB(0xc44edb49aed63690ULL), SC_LIMB(0xffffffff7cca23e9ULL),
SC_LIMB(0xffffffffffffffffULL), SC_LIMB(0xffffffffffffffffULL),
SC_LIMB(0x3fffffffffffffffULL)
}
}
}, sc_r2 = {
{
{
SC_LIMB(0xe3539257049b9b60), SC_LIMB(0x7af32c4bc1b195d9),
SC_LIMB(0x0d66de2388ea1859), SC_LIMB(0xae17cf725ee4d838),
SC_LIMB(0x1a9cc14ba3c47c44), SC_LIMB(0x2052bcb7e4d070af),
SC_LIMB(0x3402a939f823b729)
SC_LIMB(0xe3539257049b9b60ULL), SC_LIMB(0x7af32c4bc1b195d9ULL),
SC_LIMB(0x0d66de2388ea1859ULL), SC_LIMB(0xae17cf725ee4d838ULL),
SC_LIMB(0x1a9cc14ba3c47c44ULL), SC_LIMB(0x2052bcb7e4d070afULL),
SC_LIMB(0x3402a939f823b729ULL)
}
}
};
+8 -3
View File
@@ -357,10 +357,15 @@ static void felem_diff64(felem out, const felem in)
static void felem_diff_128_64(largefelem out, const felem in)
{
/*
* In order to prevent underflow, we add 0 mod p before subtracting.
* In order to prevent underflow, we add 64p mod p (which is equivalent
* to 0 mod p) before subtracting. p is 2^521 - 1, i.e. in binary a 521
* digit number with all bits set to 1. See "The representation of field
* elements" comment above for a description of how limbs are used to
* represent a number. 64p is represented with 8 limbs containing a number
* with 58 bits set and one limb with a number with 57 bits set.
*/
static const limb two63m6 = (((limb) 1) << 62) - (((limb) 1) << 5);
static const limb two63m5 = (((limb) 1) << 62) - (((limb) 1) << 4);
static const limb two63m6 = (((limb) 1) << 63) - (((limb) 1) << 6);
static const limb two63m5 = (((limb) 1) << 63) - (((limb) 1) << 5);
out[0] += two63m6 - in[0];
out[1] += two63m5 - in[1];
+1
View File
@@ -58,6 +58,7 @@ static ERR_STRING_DATA ERR_str_libraries[] = {
{ERR_PACK(ERR_LIB_UI, 0, 0), "UI routines"},
{ERR_PACK(ERR_LIB_FIPS, 0, 0), "FIPS routines"},
{ERR_PACK(ERR_LIB_CMS, 0, 0), "CMS routines"},
{ERR_PACK(ERR_LIB_CRMF, 0, 0), "CRMF routines"},
{ERR_PACK(ERR_LIB_HMAC, 0, 0), "HMAC routines"},
{ERR_PACK(ERR_LIB_CT, 0, 0), "CT routines"},
{ERR_PACK(ERR_LIB_ASYNC, 0, 0), "ASYNC routines"},
+4
View File
@@ -34,6 +34,7 @@
#include <openssl/err.h>
#include <openssl/tserr.h>
#include <openssl/cmserr.h>
#include <openssl/crmferr.h>
#include <openssl/cterr.h>
#include <openssl/asyncerr.h>
#include <openssl/kdferr.h>
@@ -90,6 +91,9 @@ int err_load_crypto_strings_int(void)
# ifndef OPENSSL_NO_CMS
ERR_load_CMS_strings() == 0 ||
# endif
# ifndef OPENSSL_NO_CMP
ERR_load_CRMF_strings() == 0 ||
# endif
# ifndef OPENSSL_NO_CT
ERR_load_CT_strings() == 0 ||
# endif
+1
View File
@@ -29,6 +29,7 @@ L UI include/openssl/ui.h crypto/ui/ui_err.c
L COMP include/openssl/comp.h crypto/comp/comp_err.c
L TS include/openssl/ts.h crypto/ts/ts_err.c
L CMS include/openssl/cms.h crypto/cms/cms_err.c
L CRMF include/openssl/crmf.h crypto/crmf/crmf_err.c
L CT include/openssl/ct.h crypto/ct/ct_err.c
L ASYNC include/openssl/async.h crypto/async/async_err.c
L KDF include/openssl/kdf.h crypto/kdf/kdf_err.c
+60
View File
@@ -348,6 +348,28 @@ CONF_F_NCONF_NEW:111:NCONF_new
CONF_F_PROCESS_INCLUDE:116:process_include
CONF_F_SSL_MODULE_INIT:123:ssl_module_init
CONF_F_STR_COPY:101:str_copy
CRMF_F_CRMF_POPOSIGNINGKEY_INIT:100:CRMF_poposigningkey_init
CRMF_F_OSSL_CRMF_CERTID_GEN:101:OSSL_CRMF_CERTID_gen
CRMF_F_OSSL_CRMF_CERTTEMPLATE_FILL:102:OSSL_CRMF_CERTTEMPLATE_fill
CRMF_F_OSSL_CRMF_ENCRYPTEDVALUE_GET1_ENCCERT:103:\
OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert
CRMF_F_OSSL_CRMF_MSGS_VERIFY_POPO:104:OSSL_CRMF_MSGS_verify_popo
CRMF_F_OSSL_CRMF_MSG_CREATE_POPO:105:OSSL_CRMF_MSG_create_popo
CRMF_F_OSSL_CRMF_MSG_GET0_TMPL:106:OSSL_CRMF_MSG_get0_tmpl
CRMF_F_OSSL_CRMF_MSG_GET_CERTREQID:107:OSSL_CRMF_MSG_get_certReqId
CRMF_F_OSSL_CRMF_MSG_PKIPUBLICATIONINFO_PUSH0_SINGLEPUBINFO:108:\
OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo
CRMF_F_OSSL_CRMF_MSG_PUSH0_EXTENSION:109:OSSL_CRMF_MSG_push0_extension
CRMF_F_OSSL_CRMF_MSG_PUSH0_REGCTRL:110:OSSL_CRMF_MSG_push0_regCtrl
CRMF_F_OSSL_CRMF_MSG_PUSH0_REGINFO:111:OSSL_CRMF_MSG_push0_regInfo
CRMF_F_OSSL_CRMF_MSG_SET0_EXTENSIONS:112:OSSL_CRMF_MSG_set0_extensions
CRMF_F_OSSL_CRMF_MSG_SET0_SINGLEPUBINFO:113:OSSL_CRMF_MSG_set0_SinglePubInfo
CRMF_F_OSSL_CRMF_MSG_SET_CERTREQID:114:OSSL_CRMF_MSG_set_certReqId
CRMF_F_OSSL_CRMF_MSG_SET_PKIPUBLICATIONINFO_ACTION:115:\
OSSL_CRMF_MSG_set_PKIPublicationInfo_action
CRMF_F_OSSL_CRMF_MSG_SET_VALIDITY:116:OSSL_CRMF_MSG_set_validity
CRMF_F_OSSL_CRMF_PBMP_NEW:117:OSSL_CRMF_pbmp_new
CRMF_F_OSSL_CRMF_PBM_NEW:118:OSSL_CRMF_pbm_new
CRYPTO_F_CMAC_CTX_NEW:120:CMAC_CTX_new
CRYPTO_F_CRYPTO_DUP_EX_DATA:110:CRYPTO_dup_ex_data
CRYPTO_F_CRYPTO_FREE_EX_DATA:111:CRYPTO_free_ex_data
@@ -359,6 +381,7 @@ CRYPTO_F_CRYPTO_OCB128_INIT:122:CRYPTO_ocb128_init
CRYPTO_F_CRYPTO_SET_EX_DATA:102:CRYPTO_set_ex_data
CRYPTO_F_FIPS_MODE_SET:109:FIPS_mode_set
CRYPTO_F_GET_AND_LOCK:113:get_and_lock
CRYPTO_F_GET_PROVIDER_STORE:133:get_provider_store
CRYPTO_F_OPENSSL_ATEXIT:114:OPENSSL_atexit
CRYPTO_F_OPENSSL_BUF2HEXSTR:117:OPENSSL_buf2hexstr
CRYPTO_F_OPENSSL_FOPEN:119:openssl_fopen
@@ -367,6 +390,9 @@ CRYPTO_F_OPENSSL_INIT_CRYPTO:116:OPENSSL_init_crypto
CRYPTO_F_OPENSSL_LH_NEW:126:OPENSSL_LH_new
CRYPTO_F_OPENSSL_SK_DEEP_COPY:127:OPENSSL_sk_deep_copy
CRYPTO_F_OPENSSL_SK_DUP:128:OPENSSL_sk_dup
CRYPTO_F_OSSL_PROVIDER_ACTIVATE:130:ossl_provider_activate
CRYPTO_F_OSSL_PROVIDER_ADD_BUILTIN:132:OSSL_PROVIDER_add_builtin
CRYPTO_F_OSSL_PROVIDER_NEW:131:ossl_provider_new
CRYPTO_F_PKEY_HMAC_INIT:123:pkey_hmac_init
CRYPTO_F_PKEY_POLY1305_INIT:124:pkey_poly1305_init
CRYPTO_F_PKEY_SIPHASH_INIT:125:pkey_siphash_init
@@ -1097,6 +1123,7 @@ RSA_F_RSA_CHECK_KEY:123:RSA_check_key
RSA_F_RSA_CHECK_KEY_EX:160:RSA_check_key_ex
RSA_F_RSA_CMS_DECRYPT:159:rsa_cms_decrypt
RSA_F_RSA_CMS_VERIFY:158:rsa_cms_verify
RSA_F_RSA_FIPS186_4_GEN_PROB_PRIMES:168:rsa_fips186_4_gen_prob_primes
RSA_F_RSA_ITEM_VERIFY:148:rsa_item_verify
RSA_F_RSA_METH_DUP:161:RSA_meth_dup
RSA_F_RSA_METH_NEW:162:RSA_meth_new
@@ -1140,6 +1167,10 @@ RSA_F_RSA_PUB_DECODE:139:rsa_pub_decode
RSA_F_RSA_SETUP_BLINDING:136:RSA_setup_blinding
RSA_F_RSA_SIGN:117:RSA_sign
RSA_F_RSA_SIGN_ASN1_OCTET_STRING:118:RSA_sign_ASN1_OCTET_STRING
RSA_F_RSA_SP800_56B_CHECK_KEYPAIR:169:rsa_sp800_56b_check_keypair
RSA_F_RSA_SP800_56B_CHECK_PUBLIC:170:rsa_sp800_56b_check_public
RSA_F_RSA_SP800_56B_PAIRWISE_TEST:171:rsa_sp800_56b_pairwise_test
RSA_F_RSA_SP800_56B_VALIDATE_STRENGTH:172:rsa_sp800_56b_validate_strength
RSA_F_RSA_VERIFY:119:RSA_verify
RSA_F_RSA_VERIFY_ASN1_OCTET_STRING:120:RSA_verify_ASN1_OCTET_STRING
RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1:126:RSA_verify_PKCS1_PSS_mgf1
@@ -1803,8 +1834,10 @@ X509_F_X509_STORE_NEW:158:X509_STORE_new
X509_F_X509_TO_X509_REQ:126:X509_to_X509_REQ
X509_F_X509_TRUST_ADD:133:X509_TRUST_add
X509_F_X509_TRUST_SET:141:X509_TRUST_set
X509_F_X509_VERIFY:161:X509_verify
X509_F_X509_VERIFY_CERT:127:X509_verify_cert
X509_F_X509_VERIFY_PARAM_NEW:159:X509_VERIFY_PARAM_new
X509_F_X509_VERIFY_SM2:162:x509_verify_sm2
#Reason codes
ASN1_R_ADDING_OBJECT:171:adding object
@@ -2094,9 +2127,29 @@ CONF_R_UNABLE_TO_CREATE_NEW_SECTION:103:unable to create new section
CONF_R_UNKNOWN_MODULE_NAME:113:unknown module name
CONF_R_VARIABLE_EXPANSION_TOO_LONG:116:variable expansion too long
CONF_R_VARIABLE_HAS_NO_VALUE:104:variable has no value
CRMF_R_BAD_PBM_ITERATIONCOUNT:100:bad pbm iterationcount
CRMF_R_CRMFERROR:102:crmferror
CRMF_R_ERROR:103:error
CRMF_R_ERROR_DECODING_CERTIFICATE:104:error decoding certificate
CRMF_R_ERROR_DECRYPTING_CERTIFICATE:105:error decrypting certificate
CRMF_R_ERROR_DECRYPTING_SYMMETRIC_KEY:106:error decrypting symmetric key
CRMF_R_FAILURE_OBTAINING_RANDOM:107:failure obtaining random
CRMF_R_ITERATIONCOUNT_BELOW_100:108:iterationcount below 100
CRMF_R_MALFORMED_IV:101:malformed iv
CRMF_R_NULL_ARGUMENT:109:null argument
CRMF_R_SETTING_MAC_ALGOR_FAILURE:110:setting mac algor failure
CRMF_R_SETTING_OWF_ALGOR_FAILURE:111:setting owf algor failure
CRMF_R_UNSUPPORTED_ALGORITHM:112:unsupported algorithm
CRMF_R_UNSUPPORTED_ALG_FOR_POPSIGNINGKEY:113:unsupported alg for popsigningkey
CRMF_R_UNSUPPORTED_CIPHER:114:unsupported cipher
CRMF_R_UNSUPPORTED_METHOD_FOR_CREATING_POPO:115:\
unsupported method for creating popo
CRMF_R_UNSUPPORTED_POPO_METHOD:116:unsupported popo method
CRMF_R_UNSUPPORTED_POPO_NOT_ACCEPTED:117:unsupported popo not accepted
CRYPTO_R_FIPS_MODE_NOT_SUPPORTED:101:fips mode not supported
CRYPTO_R_ILLEGAL_HEX_DIGIT:102:illegal hex digit
CRYPTO_R_ODD_NUMBER_OF_DIGITS:103:odd number of digits
CRYPTO_R_PROVIDER_ALREADY_EXISTS:104:provider already exists
CT_R_BASE64_DECODE_ERROR:108:base64 decode error
CT_R_INVALID_LOG_ID_LENGTH:100:invalid log id length
CT_R_LOG_CONF_INVALID:109:log conf invalid
@@ -2586,16 +2639,21 @@ RSA_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE:144:\
RSA_R_INVALID_DIGEST:157:invalid digest
RSA_R_INVALID_DIGEST_LENGTH:143:invalid digest length
RSA_R_INVALID_HEADER:137:invalid header
RSA_R_INVALID_KEYPAIR:171:invalid keypair
RSA_R_INVALID_KEY_LENGTH:173:invalid key length
RSA_R_INVALID_LABEL:160:invalid label
RSA_R_INVALID_MESSAGE_LENGTH:131:invalid message length
RSA_R_INVALID_MGF1_MD:156:invalid mgf1 md
RSA_R_INVALID_MODULUS:174:invalid modulus
RSA_R_INVALID_MULTI_PRIME_KEY:167:invalid multi prime key
RSA_R_INVALID_OAEP_PARAMETERS:161:invalid oaep parameters
RSA_R_INVALID_PADDING:138:invalid padding
RSA_R_INVALID_PADDING_MODE:141:invalid padding mode
RSA_R_INVALID_PSS_PARAMETERS:149:invalid pss parameters
RSA_R_INVALID_PSS_SALTLEN:146:invalid pss saltlen
RSA_R_INVALID_REQUEST:175:invalid request
RSA_R_INVALID_SALT_LENGTH:150:invalid salt length
RSA_R_INVALID_STRENGTH:176:invalid strength
RSA_R_INVALID_TRAILER:139:invalid trailer
RSA_R_INVALID_X931_DIGEST:142:invalid x931 digest
RSA_R_IQMP_NOT_INVERSE_OF_Q:126:iqmp not inverse of q
@@ -2615,8 +2673,10 @@ RSA_R_OAEP_DECODING_ERROR:121:oaep decoding error
RSA_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE:148:\
operation not supported for this keytype
RSA_R_PADDING_CHECK_FAILED:114:padding check failed
RSA_R_PAIRWISE_TEST_FAILURE:177:pairwise test failure
RSA_R_PKCS_DECODING_ERROR:159:pkcs decoding error
RSA_R_PSS_SALTLEN_TOO_SMALL:164:pss saltlen too small
RSA_R_PUB_EXPONENT_OUT_OF_RANGE:178:pub exponent out of range
RSA_R_P_NOT_PRIME:128:p not prime
RSA_R_Q_NOT_PRIME:129:q not prime
RSA_R_RSA_OPERATIONS_NOT_SUPPORTED:130:rsa operations not supported
+27
View File
@@ -87,4 +87,31 @@ int bn_rshift_fixed_top(BIGNUM *r, const BIGNUM *a, int n);
int bn_div_fixed_top(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
const BIGNUM *d, BN_CTX *ctx);
#define BN_PRIMETEST_COMPOSITE 0
#define BN_PRIMETEST_COMPOSITE_WITH_FACTOR 1
#define BN_PRIMETEST_COMPOSITE_NOT_POWER_OF_PRIME 2
#define BN_PRIMETEST_PROBABLY_PRIME 3
int bn_miller_rabin_is_prime(const BIGNUM *w, int iterations, BN_CTX *ctx,
BN_GENCB *cb, int enhanced, int *status);
const BIGNUM *bn_get0_small_factors(void);
int bn_rsa_fips186_4_prime_MR_min_checks(int nbits);
int bn_rsa_fips186_4_gen_prob_primes(BIGNUM *p, BIGNUM *Xpout,
BIGNUM *p1, BIGNUM *p2,
const BIGNUM *Xp, const BIGNUM *Xp1,
const BIGNUM *Xp2, int nlen,
const BIGNUM *e, BN_CTX *ctx,
BN_GENCB *cb);
int bn_rsa_fips186_4_derive_prime(BIGNUM *Y, BIGNUM *X, const BIGNUM *Xin,
const BIGNUM *r1, const BIGNUM *r2, int nlen,
const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb);
#ifdef __cplusplus
}
#endif
#endif
+4 -1
View File
@@ -175,7 +175,7 @@ struct x509_st {
STACK_OF(DIST_POINT) *crldp;
STACK_OF(GENERAL_NAME) *altname;
NAME_CONSTRAINTS *nc;
#ifndef OPENSSL_NO_RFC3779
# ifndef OPENSSL_NO_RFC3779
STACK_OF(IPAddressFamily) *rfc3779_addr;
struct ASIdentifiers_st *rfc3779_asid;
# endif
@@ -183,6 +183,9 @@ struct x509_st {
X509_CERT_AUX *aux;
CRYPTO_RWLOCK *lock;
volatile int ex_cached;
# ifndef OPENSSL_NO_SM2
ASN1_OCTET_STRING sm2_id;
# endif
} /* X509 */ ;
/*
+12 -7
View File
@@ -10,7 +10,7 @@
*/
/* Serialized OID's */
static const unsigned char so[7767] = {
static const unsigned char so[7775] = {
0x2A,0x86,0x48,0x86,0xF7,0x0D, /* [ 0] OBJ_rsadsi */
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, /* [ 6] OBJ_pkcs */
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x02, /* [ 13] OBJ_md2 */
@@ -1077,9 +1077,10 @@ static const unsigned char so[7767] = {
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x0C, /* [ 7745] OBJ_hmacWithSHA512_224 */
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x0D, /* [ 7753] OBJ_hmacWithSHA512_256 */
0x28,0xCC,0x45,0x03,0x04, /* [ 7761] OBJ_gmac */
0x2A,0x81,0x1C,0xCF,0x55,0x01,0x83,0x75, /* [ 7766] OBJ_SM2_with_SM3 */
};
#define NUM_NID 1205
#define NUM_NID 1206
static const ASN1_OBJECT nid_objs[NUM_NID] = {
{"UNDEF", "undefined", NID_undef},
{"rsadsi", "RSA Data Security, Inc.", NID_rsadsi, 6, &so[0]},
@@ -2285,10 +2286,11 @@ static const ASN1_OBJECT nid_objs[NUM_NID] = {
{"BLAKE2BMAC", "blake2bmac", NID_blake2bmac},
{"BLAKE2SMAC", "blake2smac", NID_blake2smac},
{"SSHKDF", "sshkdf", NID_sshkdf},
{"SM2-SM3", "SM2-with-SM3", NID_SM2_with_SM3, 8, &so[7766]},
{"ChaCha20-Poly1305-D", "chacha20-poly1305-draft", NID_chacha20_poly1305_draft},
};
#define NUM_SN 1196
#define NUM_SN 1197
static const unsigned int sn_objs[NUM_SN] = {
364, /* "AD_DVCS" */
419, /* "AES-128-CBC" */
@@ -2411,7 +2413,7 @@ static const unsigned int sn_objs[NUM_SN] = {
417, /* "CSPName" */
1019, /* "ChaCha20" */
1018, /* "ChaCha20-Poly1305" */
1204, /* "ChaCha20-Poly1305-D" */
1205, /* "ChaCha20-Poly1305-D" */
367, /* "CrlID" */
391, /* "DC" */
31, /* "DES-CBC" */
@@ -2563,6 +2565,7 @@ static const unsigned int sn_objs[NUM_SN] = {
1100, /* "SHAKE128" */
1101, /* "SHAKE256" */
1172, /* "SM2" */
1204, /* "SM2-SM3" */
1143, /* "SM3" */
1134, /* "SM4-CBC" */
1137, /* "SM4-CFB" */
@@ -3488,7 +3491,7 @@ static const unsigned int sn_objs[NUM_SN] = {
1093, /* "x509ExtAdmission" */
};
#define NUM_LN 1196
#define NUM_LN 1197
static const unsigned int ln_objs[NUM_LN] = {
363, /* "AD Time Stamping" */
405, /* "ANSI X9.62" */
@@ -3644,6 +3647,7 @@ static const unsigned int ln_objs[NUM_LN] = {
1119, /* "RSA-SHA3-512" */
188, /* "S/MIME" */
167, /* "S/MIME Capabilities" */
1204, /* "SM2-with-SM3" */
1006, /* "SNILS" */
387, /* "SNMPv2" */
1025, /* "SSH Client" */
@@ -3872,7 +3876,7 @@ static const unsigned int ln_objs[NUM_LN] = {
883, /* "certificateRevocationList" */
1019, /* "chacha20" */
1018, /* "chacha20-poly1305" */
1204, /* "chacha20-poly1305-draft" */
1205, /* "chacha20-poly1305-draft" */
54, /* "challengePassword" */
407, /* "characteristic-two-field" */
395, /* "clearance" */
@@ -4688,7 +4692,7 @@ static const unsigned int ln_objs[NUM_LN] = {
125, /* "zlib compression" */
};
#define NUM_OBJ 1072
#define NUM_OBJ 1073
static const unsigned int obj_objs[NUM_OBJ] = {
0, /* OBJ_undef 0 */
181, /* OBJ_iso 1 */
@@ -5158,6 +5162,7 @@ static const unsigned int obj_objs[NUM_OBJ] = {
1139, /* OBJ_sm4_ctr 1 2 156 10197 1 104 7 */
1172, /* OBJ_sm2 1 2 156 10197 1 301 */
1143, /* OBJ_sm3 1 2 156 10197 1 401 */
1204, /* OBJ_SM2_with_SM3 1 2 156 10197 1 501 */
1144, /* OBJ_sm3WithRSAEncryption 1 2 156 10197 1 504 */
776, /* OBJ_seed_ecb 1 2 410 200004 1 3 */
777, /* OBJ_seed_cbc 1 2 410 200004 1 4 */
+2 -1
View File
@@ -1201,4 +1201,5 @@ aes_256_siv 1200
blake2bmac 1201
blake2smac 1202
sshkdf 1203
chacha20_poly1305_draft 1204
SM2_with_SM3 1204
chacha20_poly1305_draft 1205
+2
View File
@@ -79,6 +79,7 @@ static const nid_triple sigoid_srt[] = {
{NID_RSA_SHA3_256, NID_sha3_256, NID_rsaEncryption},
{NID_RSA_SHA3_384, NID_sha3_384, NID_rsaEncryption},
{NID_RSA_SHA3_512, NID_sha3_512, NID_rsaEncryption},
{NID_SM2_with_SM3, NID_sm3, NID_sm2},
};
static const nid_triple *const sigoid_srt_xref[] = {
@@ -125,4 +126,5 @@ static const nid_triple *const sigoid_srt_xref[] = {
&sigoid_srt[45],
&sigoid_srt[46],
&sigoid_srt[47],
&sigoid_srt[48],
};
+2
View File
@@ -64,3 +64,5 @@ dhSinglePass_cofactorDH_sha224kdf_scheme sha224 dh_cofactor_kdf
dhSinglePass_cofactorDH_sha256kdf_scheme sha256 dh_cofactor_kdf
dhSinglePass_cofactorDH_sha384kdf_scheme sha384 dh_cofactor_kdf
dhSinglePass_cofactorDH_sha512kdf_scheme sha512 dh_cofactor_kdf
SM2_with_SM3 sm3 sm2
+2
View File
@@ -394,6 +394,8 @@ sm-scheme 301 : SM2 : sm2
sm-scheme 401 : SM3 : sm3
sm-scheme 504 : RSA-SM3 : sm3WithRSAEncryption
sm-scheme 501 : SM2-SM3 : SM2-with-SM3
# From RFC4231
rsadsi 2 8 : : hmacWithSHA224
rsadsi 2 9 : : hmacWithSHA256
+725
View File
@@ -0,0 +1,725 @@
/*
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <string.h>
#include <openssl/params.h>
#include "internal/thread_once.h"
#define SET_RETURN_SIZE(p, sz) \
if ((p)->return_size != NULL) \
*(p)->return_size = (sz)
const OSSL_PARAM *OSSL_PARAM_locate(const OSSL_PARAM *p, const char *key)
{
if (p != NULL && key != NULL)
for (; p->key != NULL; p++)
if (strcmp(key, p->key) == 0)
return p;
return NULL;
}
static OSSL_PARAM ossl_param_construct(const char *key, unsigned int data_type,
void *data, size_t data_size,
size_t *return_size)
{
OSSL_PARAM res;
res.key = key;
res.data_type = data_type;
res.data = data;
res.data_size = data_size;
res.return_size = return_size;
return res;
}
int OSSL_PARAM_get_int(const OSSL_PARAM *p, int *val)
{
if (val == NULL || p == NULL || p->data_type != OSSL_PARAM_INTEGER)
return 0;
switch (p->data_size) {
case sizeof(int32_t):
if (sizeof(int) >= sizeof(int32_t)) {
*val = (int)*(const int32_t *)p->data;
return 1;
}
break;
case sizeof(int64_t):
if (sizeof(int) >= sizeof(int64_t)) {
*val = (int)*(const int64_t *)p->data;
return 1;
}
break;
}
return 0;
}
int OSSL_PARAM_set_int(const OSSL_PARAM *p, int val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(int)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(int32_t):
if (sizeof(int32_t) >= sizeof(int)) {
SET_RETURN_SIZE(p, sizeof(int32_t));
*(int32_t *)p->data = (int32_t)val;
return 1;
}
break;
case sizeof(int64_t):
if (sizeof(int64_t) >= sizeof(int)) {
SET_RETURN_SIZE(p, sizeof(int64_t));
*(int64_t *)p->data = (int64_t)val;
return 1;
}
break;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_int(const char *key, int *buf, size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(int),
rsize);
}
int OSSL_PARAM_get_uint(const OSSL_PARAM *p, unsigned int *val)
{
if (val == NULL
|| p == NULL
|| (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER))
return 0;
switch (p->data_size) {
case sizeof(uint32_t):
if (sizeof(unsigned int) >= sizeof(uint32_t)) {
*val = (unsigned int)*(const uint32_t *)p->data;
return 1;
}
break;
case sizeof(uint64_t):
if (sizeof(unsigned int) >= sizeof(uint64_t)) {
*val = (unsigned int)*(const uint64_t *)p->data;
return 1;
}
break;
}
return 0;
}
int OSSL_PARAM_set_uint(const OSSL_PARAM *p, unsigned int val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(unsigned int)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(uint32_t):
if (sizeof(uint32_t) >= sizeof(unsigned int)) {
SET_RETURN_SIZE(p, sizeof(uint32_t));
*(uint32_t *)p->data = (uint32_t)val;
return 1;
}
break;
case sizeof(uint64_t):
if (sizeof(uint64_t) >= sizeof(unsigned int)) {
SET_RETURN_SIZE(p, sizeof(uint64_t));
*(uint64_t *)p->data = (uint64_t)val;
return 1;
}
break;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_uint(const char *key, unsigned int *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
sizeof(unsigned int), rsize);
}
int OSSL_PARAM_get_long(const OSSL_PARAM *p, long int *val)
{
if (val == NULL || p == NULL || (p->data_type != OSSL_PARAM_INTEGER))
return 0;
switch (p->data_size) {
case sizeof(int32_t):
if (sizeof(long int) >= sizeof(int32_t)) {
*val = (long int)*(const int32_t *)p->data;
return 1;
} break;
case sizeof(int64_t):
if (sizeof(long int) >= sizeof(int64_t)) {
*val = (long int)*(const int64_t *)p->data;
return 1;
}
break;
}
return 0;
}
int OSSL_PARAM_set_long(const OSSL_PARAM *p, long int val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(long int)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(int32_t):
if (sizeof(int32_t) >= sizeof(long int)) {
SET_RETURN_SIZE(p, sizeof(int32_t));
*(int32_t *)p->data = (int32_t)val;
return 1;
}
break;
case sizeof(int64_t):
if (sizeof(int64_t) >= sizeof(long int)) {
SET_RETURN_SIZE(p, sizeof(int64_t));
*(int64_t *)p->data = (int64_t)val;
return 1;
}
break;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_long(const char *key, long int *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(long int),
rsize);
}
int OSSL_PARAM_get_ulong(const OSSL_PARAM *p, unsigned long int *val)
{
if (val == NULL
|| p == NULL
|| (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER))
return 0;
switch (p->data_size) {
case sizeof(uint32_t):
if (sizeof(unsigned long int) >= sizeof(uint32_t)) {
*val = (unsigned long int)*(const uint32_t *)p->data;
return 1;
}
break;
case sizeof(uint64_t):
if (sizeof(unsigned long int) >= sizeof(uint64_t)) {
*val = (unsigned long int)*(const uint64_t *)p->data;
return 1;
}
break;
}
return 0;
}
int OSSL_PARAM_set_ulong(const OSSL_PARAM *p, unsigned long int val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(unsigned long int)); /* Minimum exp size */
switch (p->data_size) {
case sizeof(uint32_t):
if (sizeof(uint32_t) >= sizeof(unsigned long int)) {
SET_RETURN_SIZE(p, sizeof(uint32_t));
*(uint32_t *)p->data = (uint32_t)val;
return 1;
}
break;
case sizeof(uint64_t):
if (sizeof(uint64_t) >= sizeof(unsigned long int)) {
SET_RETURN_SIZE(p, sizeof(uint64_t));
*(uint64_t *)p->data = (uint64_t)val;
return 1;
}
break;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_ulong(const char *key, unsigned long int *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
sizeof(unsigned long int), rsize);
}
int OSSL_PARAM_get_int32(const OSSL_PARAM *p, int32_t *val)
{
if (val == NULL || p == NULL || (p->data_type != OSSL_PARAM_INTEGER))
return 0;
if (p->data_size == sizeof(int32_t)) {
*val = *(const int32_t *)p->data;
return 1;
}
return 0;
}
int OSSL_PARAM_set_int32(const OSSL_PARAM *p, int32_t val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(int32_t)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(int32_t):
SET_RETURN_SIZE(p, sizeof(int32_t));
*(int32_t *)p->data = val;
return 1;
case sizeof(int64_t):
SET_RETURN_SIZE(p, sizeof(int64_t));
*(int64_t *)p->data = (int64_t)val;
return 1;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_int32(const char *key, int32_t *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf,
sizeof(int32_t), rsize);
}
int OSSL_PARAM_get_uint32(const OSSL_PARAM *p, uint32_t *val)
{
if (val == NULL
|| p == NULL
|| (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER))
return 0;
if (p->data_size == sizeof(uint32_t)) {
*val = *(const uint32_t *)p->data;
return 1;
}
return 0;
}
int OSSL_PARAM_set_uint32(const OSSL_PARAM *p, uint32_t val)
{
if (p == NULL) return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(uint32_t)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(uint32_t):
SET_RETURN_SIZE(p, sizeof(uint32_t));
*(uint32_t *)p->data = val;
return 1;
case sizeof(uint64_t):
SET_RETURN_SIZE(p, sizeof(uint64_t));
*(uint64_t *)p->data = (uint64_t)val;
return 1;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_uint32(const char *key, uint32_t *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
sizeof(uint32_t), rsize);
}
int OSSL_PARAM_get_int64(const OSSL_PARAM *p, int64_t *val)
{
if (val == NULL || p == NULL || (p->data_type != OSSL_PARAM_INTEGER))
return 0;
switch (p->data_size) {
case sizeof(int32_t):
*val = (int64_t)*(const int32_t *)p->data;
return 1;
case sizeof(int64_t):
*val = *(const int64_t *)p->data;
return 1;
}
return 0;
}
int OSSL_PARAM_set_int64(const OSSL_PARAM *p, int64_t val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(int64_t)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(int64_t):
SET_RETURN_SIZE(p, sizeof(int64_t));
*(int64_t *)p->data = val;
return 1;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_int64(const char *key, int64_t *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_INTEGER, buf, sizeof(int64_t),
rsize);
}
int OSSL_PARAM_get_uint64(const OSSL_PARAM *p, uint64_t *val)
{
if (val == NULL
|| p == NULL
|| (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER))
return 0;
switch (p->data_size) {
case sizeof(uint32_t):
*val = (uint64_t)*(const uint32_t *)p->data;
return 1;
case sizeof(uint64_t):
*val = *(const uint64_t *)p->data;
return 1;
}
return 0;
}
int OSSL_PARAM_set_uint64(const OSSL_PARAM *p, uint64_t val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(uint64_t)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(uint64_t):
SET_RETURN_SIZE(p, sizeof(uint64_t));
*(uint64_t *)p->data = val;
return 1;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_uint64(const char *key, uint64_t *buf,
size_t *rsize) {
return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
sizeof(uint64_t), rsize);
}
int OSSL_PARAM_get_size_t(const OSSL_PARAM *p, size_t *val)
{
if (val == NULL
|| p == NULL
|| p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
switch (p->data_size) {
case sizeof(uint32_t):
if (sizeof(size_t) >= sizeof(uint32_t)) {
*val = (size_t)*(const uint32_t *)p->data;
return 1;
}
break;
case sizeof(uint64_t):
if (sizeof(size_t) >= sizeof(uint64_t)) {
*val = (size_t)*(const uint64_t *)p->data;
return 1;
}
break;
}
return 0;
}
int OSSL_PARAM_set_size_t(const OSSL_PARAM *p, size_t val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
SET_RETURN_SIZE(p, sizeof(size_t)); /* Minimum expected size */
switch (p->data_size) {
case sizeof(uint32_t):
if (sizeof(uint32_t) >= sizeof(size_t)) {
SET_RETURN_SIZE(p, sizeof(uint32_t));
*(uint32_t *)p->data = (uint32_t)val;
return 1;
}
break;
case sizeof(uint64_t):
SET_RETURN_SIZE(p, sizeof(uint64_t));
if (sizeof(uint64_t) >= sizeof(size_t)) {
*(uint64_t *)p->data = (uint64_t)val;
return 1;
}
break;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_size_t(const char *key, size_t *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER, buf,
sizeof(size_t), rsize); }
int OSSL_PARAM_get_BN(const OSSL_PARAM *p, BIGNUM **val)
{
BIGNUM *b;
if (val == NULL
|| p == NULL
|| p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
b = BN_native2bn(p->data, (int)p->data_size, *val);
if (b != NULL) {
*val = b;
return 1;
}
return 0;
}
int OSSL_PARAM_set_BN(const OSSL_PARAM *p, const BIGNUM *val)
{
size_t bytes;
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (val == NULL || p->data_type != OSSL_PARAM_UNSIGNED_INTEGER)
return 0;
bytes = (size_t)BN_num_bytes(val);
SET_RETURN_SIZE(p, bytes);
return p->data_size >= bytes
&& BN_bn2nativepad(val, p->data, bytes) >= 0;
}
OSSL_PARAM OSSL_PARAM_construct_BN(const char *key, unsigned char *buf,
size_t bsize, size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UNSIGNED_INTEGER,
buf, bsize, rsize);
}
int OSSL_PARAM_get_double(const OSSL_PARAM *p, double *val)
{
if (val == NULL || p == NULL || p->data_type != OSSL_PARAM_REAL)
return 0;
switch (p->data_size) {
case sizeof(double):
*val = *(const double *)p->data;
return 1;
}
return 0;
}
int OSSL_PARAM_set_double(const OSSL_PARAM *p, double val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (p->data_type != OSSL_PARAM_REAL)
return 0;
switch (p->data_size) {
case sizeof(double):
SET_RETURN_SIZE(p, sizeof(double));
*(double *)p->data = val;
return 1;
}
return 0;
}
OSSL_PARAM OSSL_PARAM_construct_double(const char *key, double *buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_REAL, buf, sizeof(double),
rsize);
}
static int get_string_internal(const OSSL_PARAM *p, void **val, size_t max_len,
size_t *used_len, unsigned int type)
{
size_t sz;
if (val == NULL || p == NULL || p->data_type != type)
return 0;
sz = p->data_size;
if (used_len != NULL)
*used_len = sz;
if (*val == NULL) {
char *const q = OPENSSL_malloc(sz);
if (q == NULL)
return 0;
*val = q;
memcpy(q, p->data, sz);
return 1;
}
if (max_len < sz)
return 0;
memcpy(*val, p->data, sz);
return 1;
}
int OSSL_PARAM_get_utf8_string(const OSSL_PARAM *p, char **val, size_t max_len)
{
return get_string_internal(p, (void **)val, max_len, NULL,
OSSL_PARAM_UTF8_STRING);
}
int OSSL_PARAM_get_octet_string(const OSSL_PARAM *p, void **val, size_t max_len,
size_t *used_len)
{
return get_string_internal(p, val, max_len, used_len,
OSSL_PARAM_OCTET_STRING);
}
static int set_string_internal(const OSSL_PARAM *p, const void *val, size_t len,
unsigned int type)
{
SET_RETURN_SIZE(p, len);
if (p->data_type != type || p->data_size < len)
return 0;
memcpy(p->data, val, len);
return 1;
}
int OSSL_PARAM_set_utf8_string(const OSSL_PARAM *p, const char *val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (val == NULL)
return 0;
return set_string_internal(p, val, strlen(val) + 1, OSSL_PARAM_UTF8_STRING);
}
int OSSL_PARAM_set_octet_string(const OSSL_PARAM *p, const void *val,
size_t len)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (val == NULL)
return 0;
return set_string_internal(p, val, len, OSSL_PARAM_OCTET_STRING);
}
OSSL_PARAM OSSL_PARAM_construct_utf8_string(const char *key, char *buf,
size_t bsize, size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UTF8_STRING, buf, bsize,
rsize);
}
OSSL_PARAM OSSL_PARAM_construct_octet_string(const char *key, void *buf,
size_t bsize, size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_OCTET_STRING, buf, bsize,
rsize);
}
static int get_ptr_internal(const OSSL_PARAM *p, const void **val,
size_t *used_len, unsigned int type)
{
if (val == NULL || p == NULL || p->data_type != type)
return 0;
if (used_len != NULL)
*used_len = p->data_size;
*val = *(const void **)p->data;
return 1;
}
int OSSL_PARAM_get_utf8_ptr(const OSSL_PARAM *p, const char **val)
{
return get_ptr_internal(p, (const void **)val, NULL, OSSL_PARAM_UTF8_PTR);
}
int OSSL_PARAM_get_octet_ptr(const OSSL_PARAM *p, const void **val,
size_t *used_len)
{
return get_ptr_internal(p, val, used_len, OSSL_PARAM_OCTET_PTR);
}
static int set_ptr_internal(const OSSL_PARAM *p, const void *val,
unsigned int type, size_t len)
{
SET_RETURN_SIZE(p, len);
if (p->data_type != type)
return 0;
*(const void **)p->data = val;
return 1;
}
int OSSL_PARAM_set_utf8_ptr(const OSSL_PARAM *p, const char *val)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (val == NULL)
return 0;
return set_ptr_internal(p, val, OSSL_PARAM_UTF8_PTR, strlen(val) + 1);
}
int OSSL_PARAM_set_octet_ptr(const OSSL_PARAM *p, const void *val,
size_t used_len)
{
if (p == NULL)
return 0;
SET_RETURN_SIZE(p, 0);
if (val == NULL)
return 0;
return set_ptr_internal(p, val, OSSL_PARAM_OCTET_PTR, used_len);
}
OSSL_PARAM OSSL_PARAM_construct_utf8_ptr(const char *key, char **buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_UTF8_PTR, buf, 0, rsize);
}
OSSL_PARAM OSSL_PARAM_construct_octet_ptr(const char *key, void **buf,
size_t *rsize)
{
return ossl_param_construct(key, OSSL_PARAM_OCTET_PTR, buf, 0, rsize);
}
+70
View File
@@ -0,0 +1,70 @@
/*
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <openssl/err.h>
#include <openssl/cryptoerr.h>
#include <openssl/provider.h>
#include "internal/provider.h"
OSSL_PROVIDER *OSSL_PROVIDER_load(OPENSSL_CTX *libctx, const char *name)
{
OSSL_PROVIDER *prov = NULL;
/* Find it or create it */
if ((prov = ossl_provider_find(libctx, name)) == NULL
&& (prov = ossl_provider_new(libctx, name, NULL)) == NULL)
return NULL;
if (!ossl_provider_activate(prov)) {
ossl_provider_free(prov);
return NULL;
}
return prov;
}
int OSSL_PROVIDER_unload(OSSL_PROVIDER *prov)
{
ossl_provider_free(prov);
return 1;
}
const OSSL_ITEM *OSSL_PROVIDER_get_param_types(OSSL_PROVIDER *prov)
{
return ossl_provider_get_param_types(prov);
}
int OSSL_PROVIDER_get_params(OSSL_PROVIDER *prov, const OSSL_PARAM params[])
{
return ossl_provider_get_params(prov, params);
}
int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *libctx, const char *name,
OSSL_provider_init_fn *init_fn)
{
OSSL_PROVIDER *prov = NULL;
if (name == NULL || init_fn == NULL) {
CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_ADD_BUILTIN,
ERR_R_PASSED_NULL_PARAMETER);
return 0;
}
/* Create it */
if ((prov = ossl_provider_new(libctx, name, init_fn)) == NULL)
return 0;
/*
* It's safely stored in the internal store at this point,
* free the returned extra reference
*/
ossl_provider_free(prov);
return 1;
}
+451
View File
@@ -0,0 +1,451 @@
/*
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <openssl/core.h>
#include <openssl/core_numbers.h>
#include <openssl/opensslv.h>
#include "internal/cryptlib.h"
#include "internal/thread_once.h"
#include "internal/provider.h"
#include "internal/refcount.h"
/*-
* Provider Object structure
* =========================
*/
struct provider_store_st; /* Forward declaration */
struct ossl_provider_st {
/* Flag bits */
unsigned int flag_initialized:1;
/* OpenSSL library side data */
CRYPTO_REF_COUNT refcnt;
CRYPTO_RWLOCK *refcnt_lock; /* For the ref counter */
char *name;
DSO *module;
OSSL_provider_init_fn *init_function;
/* Provider side functions */
OSSL_provider_teardown_fn *teardown;
OSSL_provider_get_param_types_fn *get_param_types;
OSSL_provider_get_params_fn *get_params;
OSSL_provider_query_operation_fn *query_operation;
};
DEFINE_STACK_OF(OSSL_PROVIDER)
static int ossl_provider_cmp(const OSSL_PROVIDER * const *a,
const OSSL_PROVIDER * const *b)
{
return strcmp((*a)->name, (*b)->name);
}
/*-
* Provider Object store
* =====================
*
* The Provider Object store is a library context object, and therefore needs
* an index.
*/
struct provider_store_st {
STACK_OF(OSSL_PROVIDER) *providers;
CRYPTO_RWLOCK *lock;
};
static int provider_store_index = -1;
static void provider_store_free(void *vstore)
{
struct provider_store_st *store = vstore;
if (store == NULL)
return;
sk_OSSL_PROVIDER_pop_free(store->providers, ossl_provider_free);
CRYPTO_THREAD_lock_free(store->lock);
OPENSSL_free(store);
}
static void *provider_store_new(void)
{
struct provider_store_st *store = OPENSSL_zalloc(sizeof(*store));
if (store == NULL
|| (store->providers = sk_OSSL_PROVIDER_new(ossl_provider_cmp)) == NULL
|| (store->lock = CRYPTO_THREAD_lock_new()) == NULL) {
provider_store_free(store);
store = NULL;
}
return store;
}
static const OPENSSL_CTX_METHOD provider_store_method = {
provider_store_new,
provider_store_free,
};
static CRYPTO_ONCE provider_store_init_flag = CRYPTO_ONCE_STATIC_INIT;
DEFINE_RUN_ONCE_STATIC(do_provider_store_init)
{
return OPENSSL_init_crypto(0, NULL)
&& (provider_store_index =
openssl_ctx_new_index(&provider_store_method)) != -1;
}
static struct provider_store_st *get_provider_store(OPENSSL_CTX *libctx)
{
struct provider_store_st *store = NULL;
if (!RUN_ONCE(&provider_store_init_flag, do_provider_store_init))
return NULL;
store = openssl_ctx_get_data(libctx, provider_store_index);
if (store == NULL)
CRYPTOerr(CRYPTO_F_GET_PROVIDER_STORE, ERR_R_INTERNAL_ERROR);
return store;
}
/*-
* Provider Object methods
* =======================
*/
int ossl_provider_upref(OSSL_PROVIDER *prov)
{
int ref = 0;
CRYPTO_UP_REF(&prov->refcnt, &ref, prov->refcnt_lock);
return ref;
}
/* Finder, constructor and destructor */
OSSL_PROVIDER *ossl_provider_find(OPENSSL_CTX *libctx, const char *name)
{
struct provider_store_st *store = NULL;
OSSL_PROVIDER *prov = NULL;
if ((store = get_provider_store(libctx)) != NULL) {
OSSL_PROVIDER tmpl = { 0, };
int i;
tmpl.name = (char *)name;
CRYPTO_THREAD_write_lock(store->lock);
if ((i = sk_OSSL_PROVIDER_find(store->providers, &tmpl)) == -1
|| (prov = sk_OSSL_PROVIDER_value(store->providers, i)) == NULL
|| !ossl_provider_upref(prov))
prov = NULL;
CRYPTO_THREAD_unlock(store->lock);
}
return prov;
}
OSSL_PROVIDER *ossl_provider_new(OPENSSL_CTX *libctx, const char *name,
OSSL_provider_init_fn *init_function)
{
struct provider_store_st *store = NULL;
OSSL_PROVIDER *prov = NULL;
if ((store = get_provider_store(libctx)) == NULL)
return NULL;
if ((prov = ossl_provider_find(libctx, name)) != NULL) { /* refcount +1 */
ossl_provider_free(prov); /* refcount -1 */
CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_NEW,
CRYPTO_R_PROVIDER_ALREADY_EXISTS);
ERR_add_error_data(2, "name=", name);
return NULL;
}
if ((prov = OPENSSL_zalloc(sizeof(*prov))) == NULL
#ifndef HAVE_ATOMICS
|| (prov->refcnt_lock = CRYPTO_THREAD_lock_new()) == NULL
#endif
|| !ossl_provider_upref(prov) /* +1 One reference to be returned */
|| (prov->name = OPENSSL_strdup(name)) == NULL) {
ossl_provider_free(prov);
CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_NEW, ERR_R_MALLOC_FAILURE);
return NULL;
}
prov->init_function = init_function;
CRYPTO_THREAD_write_lock(store->lock);
if (!ossl_provider_upref(prov)) { /* +1 One reference for the store */
ossl_provider_free(prov); /* -1 Reference that was to be returned */
prov = NULL;
} else if (sk_OSSL_PROVIDER_push(store->providers, prov) == 0) {
ossl_provider_free(prov); /* -1 Store reference */
ossl_provider_free(prov); /* -1 Reference that was to be returned */
prov = NULL;
}
CRYPTO_THREAD_unlock(store->lock);
if (prov == NULL)
CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_NEW, ERR_R_MALLOC_FAILURE);
/*
* At this point, the provider is only partially "loaded". To be
* fully "loaded", ossl_provider_activate() must also be called.
*/
return prov;
}
void ossl_provider_free(OSSL_PROVIDER *prov)
{
if (prov != NULL) {
int ref = 0;
CRYPTO_DOWN_REF(&prov->refcnt, &ref, prov->refcnt_lock);
/*
* When the refcount drops down to one, there is only one reference,
* the store.
* When that happens, the provider is inactivated.
*/
if (ref == 1 && prov->flag_initialized) {
if (prov->teardown != NULL)
prov->teardown();
prov->flag_initialized = 0;
}
/*
* When the refcount drops to zero, it has been taken out of
* the store. All we have to do here is clean it out.
*/
if (ref == 0) {
DSO_free(prov->module);
OPENSSL_free(prov->name);
#ifndef HAVE_ATOMICS
CRYPTO_THREAD_lock_free(prov->refcnt_lock);
#endif
OPENSSL_free(prov);
}
}
}
/*
* Provider activation.
*
* What "activation" means depends on the provider form; for built in
* providers (in the library or the application alike), the provider
* can already be considered to be loaded, all that's needed is to
* initialize it. However, for dynamically loadable provider modules,
* we must first load that module.
*
* Built in modules are distinguished from dynamically loaded modules
* with an already assigned init function.
*/
static const OSSL_DISPATCH *core_dispatch; /* Define further down */
int ossl_provider_activate(OSSL_PROVIDER *prov)
{
const OSSL_DISPATCH *provider_dispatch = NULL;
if (prov->flag_initialized)
return 1;
/*
* If the init function isn't set, it indicates that this provider is
* a loadable module.
*/
if (prov->init_function == NULL) {
if (prov->module == NULL) {
char *platform_module_name = NULL;
char *module_path = NULL;
const char *load_dir = ossl_safe_getenv("OPENSSL_MODULES");
if ((prov->module = DSO_new()) == NULL) {
/* DSO_new() generates an error already */
return 0;
}
if (load_dir == NULL)
load_dir = MODULESDIR;
DSO_ctrl(prov->module, DSO_CTRL_SET_FLAGS,
DSO_FLAG_NAME_TRANSLATION_EXT_ONLY, NULL);
if ((platform_module_name =
DSO_convert_filename(prov->module, prov->name)) == NULL
|| (module_path =
DSO_merge(prov->module, platform_module_name,
load_dir)) == NULL
|| DSO_load(prov->module, module_path, NULL,
DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == NULL) {
DSO_free(prov->module);
prov->module = NULL;
}
OPENSSL_free(platform_module_name);
OPENSSL_free(module_path);
}
if (prov->module != NULL)
prov->init_function = (OSSL_provider_init_fn *)
DSO_bind_func(prov->module, "OSSL_provider_init");
}
if (prov->init_function == NULL
|| !prov->init_function(prov, core_dispatch, &provider_dispatch)) {
CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_ACTIVATE, ERR_R_INIT_FAIL);
ERR_add_error_data(2, "name=", prov->name);
DSO_free(prov->module);
prov->module = NULL;
return 0;
}
for (; provider_dispatch->function_id != 0; provider_dispatch++) {
switch (provider_dispatch->function_id) {
case OSSL_FUNC_PROVIDER_TEARDOWN:
prov->teardown =
OSSL_get_provider_teardown(provider_dispatch);
break;
case OSSL_FUNC_PROVIDER_GET_PARAM_TYPES:
prov->get_param_types =
OSSL_get_provider_get_param_types(provider_dispatch);
break;
case OSSL_FUNC_PROVIDER_GET_PARAMS:
prov->get_params =
OSSL_get_provider_get_params(provider_dispatch);
break;
case OSSL_FUNC_PROVIDER_QUERY_OPERATION:
prov->query_operation =
OSSL_get_provider_query_operation(provider_dispatch);
break;
}
}
/* With this flag set, this provider has become fully "loaded". */
prov->flag_initialized = 1;
return 1;
}
int ossl_provider_forall_loaded(OPENSSL_CTX *ctx,
int (*cb)(OSSL_PROVIDER *provider,
void *cbdata),
void *cbdata)
{
int ret = 1;
int i;
struct provider_store_st *store = get_provider_store(ctx);
if (store != NULL) {
CRYPTO_THREAD_read_lock(store->lock);
for (i = 0; i < sk_OSSL_PROVIDER_num(store->providers); i++) {
OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(store->providers, i);
if (prov->flag_initialized
&& !(ret = cb(prov, cbdata)))
break;
}
CRYPTO_THREAD_unlock(store->lock);
}
return ret;
}
/* Getters of Provider Object data */
const char *ossl_provider_name(OSSL_PROVIDER *prov)
{
return prov->name;
}
const DSO *ossl_provider_dso(OSSL_PROVIDER *prov)
{
return prov->module;
}
const char *ossl_provider_module_name(OSSL_PROVIDER *prov)
{
return DSO_get_filename(prov->module);
}
const char *ossl_provider_module_path(OSSL_PROVIDER *prov)
{
/* FIXME: Ensure it's a full path */
return DSO_get_filename(prov->module);
}
/* Wrappers around calls to the provider */
void ossl_provider_teardown(const OSSL_PROVIDER *prov)
{
if (prov->teardown != NULL)
prov->teardown();
}
const OSSL_ITEM *ossl_provider_get_param_types(const OSSL_PROVIDER *prov)
{
return prov->get_param_types == NULL ? NULL : prov->get_param_types(prov);
}
int ossl_provider_get_params(const OSSL_PROVIDER *prov,
const OSSL_PARAM params[])
{
return prov->get_params == NULL ? 0 : prov->get_params(prov, params);
}
const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
int operation_id,
int *no_cache)
{
return prov->query_operation(prov, operation_id, no_cache);
}
/*-
* Core functions for the provider
* ===============================
*
* This is the set of functions that the core makes available to the provider
*/
/*
* This returns a list of Provider Object parameters with their types, for
* discovery. We do not expect that many providers will use this, but one
* never knows.
*/
static const OSSL_ITEM param_types[] = {
{ OSSL_PARAM_UTF8_PTR, "openssl-version" },
{ OSSL_PARAM_UTF8_PTR, "provider-name" },
{ 0, NULL }
};
static const OSSL_ITEM *core_get_param_types(const OSSL_PROVIDER *prov)
{
return param_types;
}
static int core_get_params(const OSSL_PROVIDER *prov, const OSSL_PARAM params[])
{
int i;
for (i = 0; params[i].key != NULL; i++) {
if (strcmp(params[i].key, "openssl-version") == 0) {
*(void **)params[i].data = OPENSSL_VERSION_STR;
if (params[i].return_size)
*params[i].return_size = sizeof(OPENSSL_VERSION_STR);
} else if (strcmp(params[i].key, "provider-name") == 0) {
*(void **)params[i].data = prov->name;
if (params[i].return_size)
*params[i].return_size = strlen(prov->name) + 1;
}
}
return 1;
}
static const OSSL_DISPATCH core_dispatch_[] = {
{ OSSL_FUNC_CORE_GET_PARAM_TYPES, (void (*)(void))core_get_param_types },
{ OSSL_FUNC_CORE_GET_PARAMS, (void (*)(void))core_get_params },
{ 0, NULL }
};
static const OSSL_DISPATCH *core_dispatch = core_dispatch_;
+4
View File
@@ -507,7 +507,11 @@ int rand_pool_add_additional_data(RAND_POOL *pool)
* concurrently (which is the case for the <master> drbg).
*/
data.tid = CRYPTO_THREAD_get_current_id();
#if __CRTL_VER >= 80400000
sys$gettim_prec(&data.time);
#else
sys$gettim((void*)&data.time);
#endif
return rand_pool_add(pool, (unsigned char *)&data, sizeof(data), 0);
}
+2 -1
View File
@@ -3,4 +3,5 @@ SOURCE[../../libcrypto]=\
rsa_ossl.c rsa_gen.c rsa_lib.c rsa_sign.c rsa_saos.c rsa_err.c \
rsa_pk1.c rsa_ssl.c rsa_none.c rsa_oaep.c rsa_chk.c \
rsa_pss.c rsa_x931.c rsa_asn1.c rsa_depr.c rsa_ameth.c rsa_prn.c \
rsa_pmeth.c rsa_crpt.c rsa_x931g.c rsa_meth.c rsa_mp.c
rsa_pmeth.c rsa_crpt.c rsa_x931g.c rsa_meth.c rsa_mp.c \
rsa_sp800_56b_gen.c rsa_sp800_56b_check.c
+14
View File
@@ -16,8 +16,21 @@ int RSA_check_key(const RSA *key)
return RSA_check_key_ex(key, NULL);
}
/*
* NOTE: Key validation requires separate checks to be able to be accessed
* individually. These should be visible from the PKEY API..
* See rsa_sp800_56b_check_public, rsa_sp800_56b_check_private and
* rsa_sp800_56b_check_keypair.
*/
int RSA_check_key_ex(const RSA *key, BN_GENCB *cb)
{
#ifdef FIPS_MODE
if (!(rsa_sp800_56b_check_public(key)
&& rsa_sp800_56b_check_private(key)
&& rsa_sp800_56b_check_keypair(key, NULL, -1, RSA_bits(key))
return 0;
#else
BIGNUM *i, *j, *k, *l, *m;
BN_CTX *ctx;
int ret = 1, ex_primes = 0, idx;
@@ -225,4 +238,5 @@ int RSA_check_key_ex(const RSA *key, BN_GENCB *cb)
BN_free(m);
BN_CTX_free(ctx);
return ret;
#endif /* FIPS_MODE */
}
+20 -1
View File
@@ -1,6 +1,6 @@
/*
* Generated by util/mkerr.pl DO NOT EDIT
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -32,6 +32,8 @@ static const ERR_STRING_DATA RSA_str_functs[] = {
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_CHECK_KEY_EX, 0), "RSA_check_key_ex"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_CMS_DECRYPT, 0), "rsa_cms_decrypt"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_CMS_VERIFY, 0), "rsa_cms_verify"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_FIPS186_4_GEN_PROB_PRIMES, 0),
"rsa_fips186_4_gen_prob_primes"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_ITEM_VERIFY, 0), "rsa_item_verify"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_METH_DUP, 0), "RSA_meth_dup"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_METH_NEW, 0), "RSA_meth_new"},
@@ -97,6 +99,14 @@ static const ERR_STRING_DATA RSA_str_functs[] = {
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_SIGN, 0), "RSA_sign"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_SIGN_ASN1_OCTET_STRING, 0),
"RSA_sign_ASN1_OCTET_STRING"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_SP800_56B_CHECK_KEYPAIR, 0),
"rsa_sp800_56b_check_keypair"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_SP800_56B_CHECK_PUBLIC, 0),
"rsa_sp800_56b_check_public"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_SP800_56B_PAIRWISE_TEST, 0),
"rsa_sp800_56b_pairwise_test"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_SP800_56B_VALIDATE_STRENGTH, 0),
"rsa_sp800_56b_validate_strength"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_VERIFY, 0), "RSA_verify"},
{ERR_PACK(ERR_LIB_RSA, RSA_F_RSA_VERIFY_ASN1_OCTET_STRING, 0),
"RSA_verify_ASN1_OCTET_STRING"},
@@ -146,10 +156,13 @@ static const ERR_STRING_DATA RSA_str_reasons[] = {
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_DIGEST_LENGTH),
"invalid digest length"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_HEADER), "invalid header"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_KEYPAIR), "invalid keypair"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_KEY_LENGTH), "invalid key length"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_LABEL), "invalid label"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_MESSAGE_LENGTH),
"invalid message length"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_MGF1_MD), "invalid mgf1 md"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_MODULUS), "invalid modulus"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_MULTI_PRIME_KEY),
"invalid multi prime key"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_OAEP_PARAMETERS),
@@ -161,8 +174,10 @@ static const ERR_STRING_DATA RSA_str_reasons[] = {
"invalid pss parameters"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_PSS_SALTLEN),
"invalid pss saltlen"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_REQUEST), "invalid request"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_SALT_LENGTH),
"invalid salt length"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_STRENGTH), "invalid strength"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_TRAILER), "invalid trailer"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_INVALID_X931_DIGEST),
"invalid x931 digest"},
@@ -193,10 +208,14 @@ static const ERR_STRING_DATA RSA_str_reasons[] = {
"operation not supported for this keytype"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_PADDING_CHECK_FAILED),
"padding check failed"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_PAIRWISE_TEST_FAILURE),
"pairwise test failure"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_PKCS_DECODING_ERROR),
"pkcs decoding error"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_PSS_SALTLEN_TOO_SMALL),
"pss saltlen too small"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_PUB_EXPONENT_OUT_OF_RANGE),
"pub exponent out of range"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_P_NOT_PRIME), "p not prime"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_Q_NOT_PRIME), "q not prime"},
{ERR_PACK(ERR_LIB_RSA, 0, RSA_R_RSA_OPERATIONS_NOT_SUPPORTED),
+8 -1
View File
@@ -41,6 +41,7 @@ int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes,
BIGNUM *e_value, BN_GENCB *cb)
{
#ifndef FIPS_MODE
/* multi-prime is only supported with the builtin key generation */
if (rsa->meth->rsa_multi_prime_keygen != NULL) {
return rsa->meth->rsa_multi_prime_keygen(rsa, bits, primes,
@@ -57,13 +58,18 @@ int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes,
else
return 0;
}
#endif /* FIPS_MODE */
return rsa_builtin_keygen(rsa, bits, primes, e_value, cb);
}
static int rsa_builtin_keygen(RSA *rsa, int bits, int primes, BIGNUM *e_value,
BN_GENCB *cb)
{
#ifdef FIPS_MODE
if (primes != 2)
return 0;
return rsa_sp800_56b_generate_key(rsa, bits, e_value, cb);
#else
BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL, *tmp, *prime;
int ok = -1, n = 0, bitsr[RSA_MAX_PRIME_NUM], bitse = 0;
int i = 0, quo = 0, rmd = 0, adj = 0, retries = 0;
@@ -391,4 +397,5 @@ static int rsa_builtin_keygen(RSA *rsa, int bits, int primes, BIGNUM *e_value,
BN_CTX_end(ctx);
BN_CTX_free(ctx);
return ok;
#endif /* FIPS_MODE */
}
+1 -1
View File
@@ -253,7 +253,7 @@ static uint32_t ilog_e(uint64_t v)
* \cdot(log_e(nBits \cdot log_e(2))^{2/3} - 4.69}{log_e(2)}
* The two cube roots are merged together here.
*/
static uint16_t rsa_compute_security_bits(int n)
uint16_t rsa_compute_security_bits(int n)
{
uint64_t x;
uint32_t lx;
+38
View File
@@ -7,6 +7,9 @@
* https://www.openssl.org/source/license.html
*/
#ifndef RSA_LOCAL_HEADER_H
#define RSA_LOCAL_HEADER_H
#include <openssl/rsa.h>
#include "internal/refcount.h"
@@ -130,3 +133,38 @@ void rsa_multip_info_free(RSA_PRIME_INFO *pinfo);
RSA_PRIME_INFO *rsa_multip_info_new(void);
int rsa_multip_calc_product(RSA *rsa);
int rsa_multip_cap(int bits);
uint16_t rsa_compute_security_bits(int n);
int rsa_sp800_56b_validate_strength(int nbits, int strength);
int rsa_check_pminusq_diff(BIGNUM *diff, const BIGNUM *p, const BIGNUM *q,
int nbits);
int rsa_get_lcm(BN_CTX *ctx, const BIGNUM *p, const BIGNUM *q,
BIGNUM *lcm, BIGNUM *gcd, BIGNUM *p1, BIGNUM *q1,
BIGNUM *p1q1);
int rsa_check_public_exponent(const BIGNUM *e);
int rsa_check_private_exponent(const RSA *rsa, int nbits, BN_CTX *ctx);
int rsa_check_prime_factor(BIGNUM *p, BIGNUM *e, int nbits, BN_CTX *ctx);
int rsa_check_prime_factor_range(const BIGNUM *p, int nbits, BN_CTX *ctx);
int rsa_check_crt_components(const RSA *rsa, BN_CTX *ctx);
int rsa_sp800_56b_pairwise_test(RSA *rsa, BN_CTX *ctx);
int rsa_sp800_56b_check_public(const RSA *rsa);
int rsa_sp800_56b_check_private(const RSA *rsa);
int rsa_sp800_56b_check_keypair(const RSA *rsa, const BIGNUM *efixed,
int strength, int nbits);
int rsa_sp800_56b_generate_key(RSA *rsa, int nbits, const BIGNUM *efixed,
BN_GENCB *cb);
int rsa_sp800_56b_derive_params_from_pq(RSA *rsa, int nbits,
const BIGNUM *e, BN_CTX *ctx);
int rsa_fips186_4_gen_prob_primes(RSA *rsa, BIGNUM *p1, BIGNUM *p2,
BIGNUM *Xpout, const BIGNUM *Xp,
const BIGNUM *Xp1, const BIGNUM *Xp2,
BIGNUM *q1, BIGNUM *q2, BIGNUM *Xqout,
const BIGNUM *Xq, const BIGNUM *Xq1,
const BIGNUM *Xq2, int nbits,
const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb);
#endif /* RSA_LOCAL_HEADER_H */
+13 -13
View File
@@ -1,5 +1,5 @@
/*
* Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1999-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -143,7 +143,7 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
* |num| is the length of the modulus; |flen| is the length of the
* encoded message. Therefore, for any |from| that was obtained by
* decrypting a ciphertext, we must have |flen| <= |num|. Similarly,
* num < 2 * mdlen + 2 must hold for the modulus irrespective of
* |num| >= 2 * |mdlen| + 2 must hold for the modulus irrespective of
* the ciphertext, see PKCS #1 v2.2, section 7.1.2.
* This does not leak any side-channel information.
*/
@@ -179,17 +179,16 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
from -= 1 & mask;
*--em = *from & mask;
}
from = em;
/*
* The first byte must be zero, however we must not leak if this is
* true. See James H. Manger, "A Chosen Ciphertext Attack on RSA
* Optimal Asymmetric Encryption Padding (OAEP) [...]", CRYPTO 2001).
*/
good = constant_time_is_zero(from[0]);
good = constant_time_is_zero(em[0]);
maskedseed = from + 1;
maskeddb = from + 1 + mdlen;
maskedseed = em + 1;
maskeddb = em + 1 + mdlen;
if (PKCS1_MGF1(seed, mdlen, maskeddb, dblen, mgf1md))
goto cleanup;
@@ -230,7 +229,7 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
mlen = dblen - msg_index;
/*
* For good measure, do this check in constant tine as well.
* For good measure, do this check in constant time as well.
*/
good &= constant_time_ge(tlen, mlen);
@@ -244,15 +243,16 @@ int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
* should be noted that failure is indistinguishable from normal
* operation if |tlen| is fixed by protocol.
*/
tlen = constant_time_select_int(constant_time_lt(dblen, tlen), dblen, tlen);
tlen = constant_time_select_int(constant_time_lt(dblen - mdlen - 1, tlen),
dblen - mdlen - 1, tlen);
msg_index = constant_time_select_int(good, msg_index, dblen - tlen);
mlen = dblen - msg_index;
for (from = db + msg_index, mask = good, i = 0; i < tlen; i++) {
unsigned int equals = constant_time_eq(i, mlen);
for (mask = good, i = 0; i < tlen; i++) {
unsigned int equals = constant_time_eq(msg_index, dblen);
from -= dblen & equals; /* if (i == dblen) rewind */
mask &= mask ^ equals; /* if (i == dblen) mask = 0 */
to[i] = constant_time_select_8(mask, from[i], to[i]);
msg_index -= tlen & equals; /* rewind at EOF */
mask &= ~equals; /* mask = 0 at EOF */
to[i] = constant_time_select_8(mask, db[msg_index++], to[i]);
}
/*
+12 -12
View File
@@ -1,5 +1,5 @@
/*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -192,15 +192,14 @@ int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
from -= 1 & mask;
*--em = *from & mask;
}
from = em;
good = constant_time_is_zero(from[0]);
good &= constant_time_eq(from[1], 2);
good = constant_time_is_zero(em[0]);
good &= constant_time_eq(em[1], 2);
/* scan over padding data */
found_zero_byte = 0;
for (i = 2; i < num; i++) {
unsigned int equals0 = constant_time_is_zero(from[i]);
unsigned int equals0 = constant_time_is_zero(em[i]);
zero_index = constant_time_select_int(~found_zero_byte & equals0,
i, zero_index);
@@ -208,7 +207,7 @@ int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
}
/*
* PS must be at least 8 bytes long, and it starts two bytes into |from|.
* PS must be at least 8 bytes long, and it starts two bytes into |em|.
* If we never found a 0-byte, then |zero_index| is 0 and the check
* also fails.
*/
@@ -236,15 +235,16 @@ int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
* should be noted that failure is indistinguishable from normal
* operation if |tlen| is fixed by protocol.
*/
tlen = constant_time_select_int(constant_time_lt(num, tlen), num, tlen);
tlen = constant_time_select_int(constant_time_lt(num - 11, tlen),
num - 11, tlen);
msg_index = constant_time_select_int(good, msg_index, num - tlen);
mlen = num - msg_index;
for (from += msg_index, mask = good, i = 0; i < tlen; i++) {
unsigned int equals = constant_time_eq(i, mlen);
for (mask = good, i = 0; i < tlen; i++) {
unsigned int equals = constant_time_eq(msg_index, num);
from -= tlen & equals; /* if (i == mlen) rewind */
mask &= mask ^ equals; /* if (i == mlen) mask = 0 */
to[i] = constant_time_select_8(mask, from[i], to[i]);
msg_index -= tlen & equals; /* rewind at EOF */
mask &= ~equals; /* mask = 0 at EOF */
to[i] = constant_time_select_8(mask, em[msg_index++], to[i]);
}
OPENSSL_clear_free(em, num);
+6 -5
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 2006-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -7,6 +7,8 @@
* https://www.openssl.org/source/license.html
*/
#include "internal/constant_time_locl.h"
#include <stdio.h>
#include "internal/cryptlib.h"
#include <openssl/asn1t.h>
@@ -340,10 +342,9 @@ static int pkey_rsa_decrypt(EVP_PKEY_CTX *ctx,
ret = RSA_private_decrypt(inlen, in, out, ctx->pkey->pkey.rsa,
rctx->pad_mode);
}
if (ret < 0)
return ret;
*outlen = ret;
return 1;
*outlen = constant_time_select_s(constant_time_msb_s(ret), *outlen, ret);
ret = constant_time_select_int(constant_time_msb(ret), ret, 1);
return ret;
}
static int check_padding_md(const EVP_MD *md, int padding)
+386
View File
@@ -0,0 +1,386 @@
/*
* Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <openssl/err.h>
#include <openssl/bn.h>
#include "internal/bn_int.h"
#include "rsa_locl.h"
/*
* Part of the RSA keypair test.
* Check the Chinese Remainder Theorem components are valid.
*
* See SP800-5bBr1
* 6.4.1.2.3: rsakpv1-crt Step 7
* 6.4.1.3.3: rsakpv2-crt Step 7
*/
int rsa_check_crt_components(const RSA *rsa, BN_CTX *ctx)
{
int ret = 0;
BIGNUM *r = NULL, *p1 = NULL, *q1 = NULL;
/* check if only some of the crt components are set */
if (rsa->dmp1 == NULL || rsa->dmq1 == NULL || rsa->iqmp == NULL) {
if (rsa->dmp1 != NULL || rsa->dmq1 != NULL || rsa->iqmp != NULL)
return 0;
return 1; /* return ok if all components are NULL */
}
BN_CTX_start(ctx);
r = BN_CTX_get(ctx);
p1 = BN_CTX_get(ctx);
q1 = BN_CTX_get(ctx);
ret = (q1 != NULL)
/* p1 = p -1 */
&& (BN_copy(p1, rsa->p) != NULL)
&& BN_sub_word(p1, 1)
/* q1 = q - 1 */
&& (BN_copy(q1, rsa->q) != NULL)
&& BN_sub_word(q1, 1)
/* (a) 1 < dP < (p 1). */
&& (BN_cmp(rsa->dmp1, BN_value_one()) > 0)
&& (BN_cmp(rsa->dmp1, p1) < 0)
/* (b) 1 < dQ < (q - 1). */
&& (BN_cmp(rsa->dmq1, BN_value_one()) > 0)
&& (BN_cmp(rsa->dmq1, q1) < 0)
/* (c) 1 < qInv < p */
&& (BN_cmp(rsa->iqmp, BN_value_one()) > 0)
&& (BN_cmp(rsa->iqmp, rsa->p) < 0)
/* (d) 1 = (dP . e) mod (p - 1)*/
&& BN_mod_mul(r, rsa->dmp1, rsa->e, p1, ctx)
&& BN_is_one(r)
/* (e) 1 = (dQ . e) mod (q - 1) */
&& BN_mod_mul(r, rsa->dmq1, rsa->e, q1, ctx)
&& BN_is_one(r)
/* (f) 1 = (qInv . q) mod p */
&& BN_mod_mul(r, rsa->iqmp, rsa->q, rsa->p, ctx)
&& BN_is_one(r);
BN_clear(p1);
BN_clear(q1);
BN_CTX_end(ctx);
return ret;
}
/*
* Part of the RSA keypair test.
* Check that (2)(2^(nbits/2 - 1) <= p <= 2^(nbits/2) - 1
*
* See SP800-5bBr1 6.4.1.2.1 Part 5 (c) & (g) - used for both p and q.
*
* (2)(2^(nbits/2 - 1) = (2/2)(2^(nbits/2))
* 2/2 = 0.707106781186547524400 = 0.B504F333F9DE6484597D8
* 0.B504F334 gives an approximation to 11 decimal places.
* The range is then from
* 0xB504F334_0000.......................000 to
* 0xFFFFFFFF_FFFF.......................FFF
*/
int rsa_check_prime_factor_range(const BIGNUM *p, int nbits, BN_CTX *ctx)
{
int ret = 0;
BIGNUM *tmp, *low;
nbits >>= 1;
/* Upper bound check */
if (BN_num_bits(p) != nbits)
return 0;
BN_CTX_start(ctx);
tmp = BN_CTX_get(ctx);
low = BN_CTX_get(ctx);
/* set low = (√2)(2^(nbits/2 - 1) */
if (low == NULL || !BN_set_word(tmp, 0xB504F334))
goto err;
if (nbits >= 32) {
if (!BN_lshift(low, tmp, nbits - 32))
goto err;
} else if (!BN_rshift(low, tmp, 32 - nbits)) {
goto err;
}
if (BN_cmp(p, low) < 0)
goto err;
ret = 1;
err:
BN_CTX_end(ctx);
return ret;
}
/*
* Part of the RSA keypair test.
* Check the prime factor (for either p or q)
* i.e: p is prime AND GCD(p - 1, e) = 1
*
* See SP800-5bBr1 6.4.1.2.3 Step 5 (a to d) & (e to h).
*/
int rsa_check_prime_factor(BIGNUM *p, BIGNUM *e, int nbits, BN_CTX *ctx)
{
int checks = bn_rsa_fips186_4_prime_MR_min_checks(nbits);
int ret = 0;
BIGNUM *p1 = NULL, *gcd = NULL;
/* (Steps 5 a-b) prime test */
if (BN_is_prime_fasttest_ex(p, checks, ctx, 1, NULL) != 1
/* (Step 5c) (√2)(2^(nbits/2 - 1) <= p <= 2^(nbits/2 - 1) */
|| rsa_check_prime_factor_range(p, nbits, ctx) != 1)
return 0;
BN_CTX_start(ctx);
p1 = BN_CTX_get(ctx);
gcd = BN_CTX_get(ctx);
ret = (gcd != NULL)
/* (Step 5d) GCD(p-1, e) = 1 */
&& (BN_copy(p1, p) != NULL)
&& BN_sub_word(p1, 1)
&& BN_gcd(gcd, p1, e, ctx)
&& BN_is_one(gcd);
BN_clear(p1);
BN_CTX_end(ctx);
return ret;
}
/*
* See SP800-56Br1 6.4.1.2.3 Part 6(a-b) Check the private exponent d
* satisfies:
* (Step 6a) 2^(nBit/2) < d < LCM(p1, q1).
* (Step 6b) 1 = (d*e) mod LCM(p1, q1)
*/
int rsa_check_private_exponent(const RSA *rsa, int nbits, BN_CTX *ctx)
{
int ret;
BIGNUM *r, *p1, *q1, *lcm, *p1q1, *gcd;
/* (Step 6a) 2^(nbits/2) < d */
if (BN_num_bits(rsa->d) <= (nbits >> 1))
return 0;
BN_CTX_start(ctx);
r = BN_CTX_get(ctx);
p1 = BN_CTX_get(ctx);
q1 = BN_CTX_get(ctx);
lcm = BN_CTX_get(ctx);
p1q1 = BN_CTX_get(ctx);
gcd = BN_CTX_get(ctx);
ret = (gcd != NULL
/* LCM(p - 1, q - 1) */
&& (rsa_get_lcm(ctx, rsa->p, rsa->q, lcm, gcd, p1, q1, p1q1) == 1)
/* (Step 6a) d < LCM(p - 1, q - 1) */
&& (BN_cmp(rsa->d, lcm) < 0)
/* (Step 6b) 1 = (e . d) mod LCM(p - 1, q - 1) */
&& BN_mod_mul(r, rsa->e, rsa->d, lcm, ctx)
&& BN_is_one(r));
BN_clear(p1);
BN_clear(q1);
BN_clear(lcm);
BN_clear(gcd);
BN_CTX_end(ctx);
return ret;
}
/* Check exponent is odd, and has a bitlen ranging from [17..256] */
int rsa_check_public_exponent(const BIGNUM *e)
{
int bitlen = BN_num_bits(e);
return (BN_is_odd(e) && bitlen > 16 && bitlen < 257);
}
/*
* SP800-56Br1 6.4.1.2.1 (Step 5i): |p - q| > 2^(nbits/2 - 100)
* i.e- numbits(p-q-1) > (nbits/2 -100)
*/
int rsa_check_pminusq_diff(BIGNUM *diff, const BIGNUM *p, const BIGNUM *q,
int nbits)
{
int bitlen = (nbits >> 1) - 100;
if (!BN_sub(diff, p, q))
return -1;
BN_set_negative(diff, 0);
if (BN_is_zero(diff))
return 0;
if (!BN_sub_word(diff, 1))
return -1;
return (BN_num_bits(diff) > bitlen);
}
/* return LCM(p-1, q-1) */
int rsa_get_lcm(BN_CTX *ctx, const BIGNUM *p, const BIGNUM *q,
BIGNUM *lcm, BIGNUM *gcd, BIGNUM *p1, BIGNUM *q1,
BIGNUM *p1q1)
{
return BN_sub(p1, p, BN_value_one()) /* p-1 */
&& BN_sub(q1, q, BN_value_one()) /* q-1 */
&& BN_mul(p1q1, p1, q1, ctx) /* (p-1)(q-1) */
&& BN_gcd(gcd, p1, q1, ctx)
&& BN_div(lcm, NULL, p1q1, gcd, ctx); /* LCM((p-1, q-1)) */
}
/*
* SP800-56Br1 6.4.2.2 Partial Public Key Validation for RSA refers to
* SP800-89 5.3.3 (Explicit) Partial Public Key Validation for RSA
* caveat is that the modulus must be as specified in SP800-56Br1
*/
int rsa_sp800_56b_check_public(const RSA *rsa)
{
int ret = 0, nbits, iterations, status;
BN_CTX *ctx = NULL;
BIGNUM *gcd = NULL;
if (rsa->n == NULL || rsa->e == NULL)
return 0;
/*
* (Step a): modulus must be 2048 or 3072 (caveat from SP800-56Br1)
* NOTE: changed to allow keys >= 2048
*/
nbits = BN_num_bits(rsa->n);
if (!rsa_sp800_56b_validate_strength(nbits, -1)) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_PUBLIC, RSA_R_INVALID_KEY_LENGTH);
return 0;
}
if (!BN_is_odd(rsa->n)) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_PUBLIC, RSA_R_INVALID_MODULUS);
return 0;
}
/* (Steps b-c): 2^16 < e < 2^256, n and e must be odd */
if (!rsa_check_public_exponent(rsa->e)) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_PUBLIC,
RSA_R_PUB_EXPONENT_OUT_OF_RANGE);
return 0;
}
ctx = BN_CTX_new();
gcd = BN_new();
if (ctx == NULL || gcd == NULL)
goto err;
iterations = bn_rsa_fips186_4_prime_MR_min_checks(nbits);
/* (Steps d-f):
* The modulus is composite, but not a power of a prime.
* The modulus has no factors smaller than 752.
*/
if (!BN_gcd(gcd, rsa->n, bn_get0_small_factors(), ctx) || !BN_is_one(gcd)) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_PUBLIC, RSA_R_INVALID_MODULUS);
goto err;
}
ret = bn_miller_rabin_is_prime(rsa->n, iterations, ctx, NULL, 1, &status);
if (ret != 1 || status != BN_PRIMETEST_COMPOSITE_NOT_POWER_OF_PRIME) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_PUBLIC, RSA_R_INVALID_MODULUS);
ret = 0;
goto err;
}
ret = 1;
err:
BN_free(gcd);
BN_CTX_free(ctx);
return ret;
}
/*
* Perform validation of the RSA private key to check that 0 < D < N.
*/
int rsa_sp800_56b_check_private(const RSA *rsa)
{
if (rsa->d == NULL || rsa->n == NULL)
return 0;
return BN_cmp(rsa->d, BN_value_one()) >= 0 && BN_cmp(rsa->d, rsa->n) < 0;
}
/*
* RSA key pair validation.
*
* SP800-56Br1.
* 6.4.1.2 "RSAKPV1 Family: RSA Key - Pair Validation with a Fixed Exponent"
* 6.4.1.3 "RSAKPV2 Family: RSA Key - Pair Validation with a Random Exponent"
*
* It uses:
* 6.4.1.2.3 "rsakpv1 - crt"
* 6.4.1.3.3 "rsakpv2 - crt"
*/
int rsa_sp800_56b_check_keypair(const RSA *rsa, const BIGNUM *efixed,
int strength, int nbits)
{
int ret = 0;
BN_CTX *ctx = NULL;
BIGNUM *r = NULL;
if (rsa->p == NULL
|| rsa->q == NULL
|| rsa->e == NULL
|| rsa->d == NULL
|| rsa->n == NULL) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_KEYPAIR, RSA_R_INVALID_REQUEST);
return 0;
}
/* (Step 1): Check Ranges */
if (!rsa_sp800_56b_validate_strength(nbits, strength))
return 0;
/* If the exponent is known */
if (efixed != NULL) {
/* (2): Check fixed exponent matches public exponent. */
if (BN_cmp(efixed, rsa->e) != 0) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_KEYPAIR, RSA_R_INVALID_REQUEST);
return 0;
}
}
/* (Step 1.c): e is odd integer 65537 <= e < 2^256 */
if (!rsa_check_public_exponent(rsa->e)) {
/* exponent out of range */
RSAerr(RSA_F_RSA_SP800_56B_CHECK_KEYPAIR,
RSA_R_PUB_EXPONENT_OUT_OF_RANGE);
return 0;
}
/* (Step 3.b): check the modulus */
if (nbits != BN_num_bits(rsa->n)) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_KEYPAIR, RSA_R_INVALID_KEYPAIR);
return 0;
}
ctx = BN_CTX_new();
if (ctx == NULL)
return 0;
BN_CTX_start(ctx);
r = BN_CTX_get(ctx);
if (r == NULL || !BN_mul(r, rsa->p, rsa->q, ctx))
goto err;
/* (Step 4.c): Check n = pq */
if (BN_cmp(rsa->n, r) != 0) {
RSAerr(RSA_F_RSA_SP800_56B_CHECK_KEYPAIR, RSA_R_INVALID_REQUEST);
goto err;
}
/* (Step 5): check prime factors p & q */
ret = rsa_check_prime_factor(rsa->p, rsa->e, nbits, ctx)
&& rsa_check_prime_factor(rsa->q, rsa->e, nbits, ctx)
&& (rsa_check_pminusq_diff(r, rsa->p, rsa->q, nbits) > 0)
/* (Step 6): Check the private exponent d */
&& rsa_check_private_exponent(rsa, nbits, ctx)
/* 6.4.1.2.3 (Step 7): Check the CRT components */
&& rsa_check_crt_components(rsa, ctx);
if (ret != 1)
RSAerr(RSA_F_RSA_SP800_56B_CHECK_KEYPAIR, RSA_R_INVALID_KEYPAIR);
err:
BN_clear(r);
BN_CTX_end(ctx);
BN_CTX_free(ctx);
return ret;
}
+362
View File
@@ -0,0 +1,362 @@
/*
* Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved.
*
* Licensed under the OpenSSL license (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <openssl/err.h>
#include <openssl/bn.h>
#include "internal/bn_int.h"
#include "rsa_locl.h"
#define RSA_FIPS1864_MIN_KEYGEN_KEYSIZE 2048
#define RSA_FIPS1864_MIN_KEYGEN_STRENGTH 112
#define RSA_FIPS1864_MAX_KEYGEN_STRENGTH 256
/*
* Generate probable primes 'p' & 'q'. See FIPS 186-4 Section B.3.6
* "Generation of Probable Primes with Conditions Based on Auxiliary Probable
* Primes".
*
* Params:
* rsa Object used to store primes p & q.
* p1, p2 The returned auxiliary primes for p. If NULL they are not returned.
* Xpout An optionally returned random number used during generation of p.
* Xp An optional passed in value (that is random number used during
* generation of p).
* Xp1, Xp2 Optionally passed in randomly generated numbers from which
* auxiliary primes p1 & p2 are calculated. If NULL these values
* are generated internally.
* q1, q2 The returned auxiliary primes for q. If NULL they are not returned.
* Xqout An optionally returned random number used during generation of q.
* Xq An optional passed in value (that is random number used during
* generation of q).
* Xq1, Xq2 Optionally passed in randomly generated numbers from which
* auxiliary primes q1 & q2 are calculated. If NULL these values
* are generated internally.
* nbits The key size in bits (The size of the modulus n).
* e The public exponent.
* ctx A BN_CTX object.
* cb An optional BIGNUM callback.
* Returns: 1 if successful, or 0 otherwise.
* Notes:
* p1, p2, q1, q2, Xpout, Xqout are returned if they are not NULL.
* Xp, Xp1, Xp2, Xq, Xq1, Xq2 are optionally passed in.
* (Required for CAVS testing).
*/
int rsa_fips186_4_gen_prob_primes(RSA *rsa, BIGNUM *p1, BIGNUM *p2,
BIGNUM *Xpout, const BIGNUM *Xp,
const BIGNUM *Xp1, const BIGNUM *Xp2,
BIGNUM *q1, BIGNUM *q2, BIGNUM *Xqout,
const BIGNUM *Xq, const BIGNUM *Xq1,
const BIGNUM *Xq2, int nbits,
const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb)
{
int ret = 0, ok;
BIGNUM *Xpo = NULL, *Xqo = NULL, *tmp = NULL;
/* (Step 1) Check key length
* NOTE: SP800-131A Rev1 Disallows key lengths of < 2048 bits for RSA
* Signature Generation and Key Agree/Transport.
*/
if (nbits < RSA_FIPS1864_MIN_KEYGEN_KEYSIZE) {
RSAerr(RSA_F_RSA_FIPS186_4_GEN_PROB_PRIMES, RSA_R_INVALID_KEY_LENGTH);
return 0;
}
if (!rsa_check_public_exponent(e)) {
RSAerr(RSA_F_RSA_FIPS186_4_GEN_PROB_PRIMES,
RSA_R_PUB_EXPONENT_OUT_OF_RANGE);
goto err;
}
/* (Step 3) Determine strength and check rand generator strength is ok -
* this step is redundant because the generator always returns a higher
* strength than is required.
*/
BN_CTX_start(ctx);
tmp = BN_CTX_get(ctx);
Xpo = (Xpout != NULL) ? Xpout : BN_CTX_get(ctx);
Xqo = (Xqout != NULL) ? Xqout : BN_CTX_get(ctx);
if (tmp == NULL || Xpo == NULL || Xqo == NULL)
goto err;
if (rsa->p == NULL)
rsa->p = BN_secure_new();
if (rsa->q == NULL)
rsa->q = BN_secure_new();
if (rsa->p == NULL || rsa->q == NULL)
goto err;
/* (Step 4) Generate p, Xp */
if (!bn_rsa_fips186_4_gen_prob_primes(rsa->p, Xpo, p1, p2, Xp, Xp1, Xp2,
nbits, e, ctx, cb))
goto err;
for(;;) {
/* (Step 5) Generate q, Xq*/
if (!bn_rsa_fips186_4_gen_prob_primes(rsa->q, Xqo, q1, q2, Xq, Xq1,
Xq2, nbits, e, ctx, cb))
goto err;
/* (Step 6) |Xp - Xq| > 2^(nbitlen/2 - 100) */
ok = rsa_check_pminusq_diff(tmp, Xpo, Xqo, nbits);
if (ok < 0)
goto err;
if (ok == 0)
continue;
/* (Step 6) |p - q| > 2^(nbitlen/2 - 100) */
ok = rsa_check_pminusq_diff(tmp, rsa->p, rsa->q, nbits);
if (ok < 0)
goto err;
if (ok == 0)
continue;
break; /* successfully finished */
}
ret = 1;
err:
/* Zeroize any internally generated values that are not returned */
if (Xpo != Xpout)
BN_clear(Xpo);
if (Xqo != Xqout)
BN_clear(Xqo);
BN_clear(tmp);
BN_CTX_end(ctx);
return ret;
}
/*
* Validates the RSA key size based on the target strength.
* See SP800-56Br1 6.3.1.1 (Steps 1a-1b)
*
* Params:
* nbits The key size in bits.
* strength The target strength in bits. -1 means the target
* strength is unknown.
* Returns: 1 if the key size matches the target strength, or 0 otherwise.
*/
int rsa_sp800_56b_validate_strength(int nbits, int strength)
{
int s = (int)rsa_compute_security_bits(nbits);
if (s < RSA_FIPS1864_MIN_KEYGEN_STRENGTH
|| s > RSA_FIPS1864_MAX_KEYGEN_STRENGTH) {
RSAerr(RSA_F_RSA_SP800_56B_VALIDATE_STRENGTH, RSA_R_INVALID_MODULUS);
return 0;
}
if (strength != -1 && s != strength) {
RSAerr(RSA_F_RSA_SP800_56B_VALIDATE_STRENGTH, RSA_R_INVALID_STRENGTH);
return 0;
}
return 1;
}
/*
*
* Using p & q, calculate other required parameters such as n, d.
* as well as the CRT parameters dP, dQ, qInv.
*
* See SP800-56Br1
* 6.3.1.1 rsakpg1 - basic (Steps 3-4)
* 6.3.1.3 rsakpg1 - crt (Step 5)
*
* Params:
* rsa An rsa object.
* nbits The key size.
* e The public exponent.
* ctx A BN_CTX object.
* Notes:
* There is a small chance that the generated d will be too small.
* Returns: -1 = error,
* 0 = d is too small,
* 1 = success.
*/
int rsa_sp800_56b_derive_params_from_pq(RSA *rsa, int nbits,
const BIGNUM *e, BN_CTX *ctx)
{
int ret = -1;
BIGNUM *p1, *q1, *lcm, *p1q1, *gcd;
BN_CTX_start(ctx);
p1 = BN_CTX_get(ctx);
q1 = BN_CTX_get(ctx);
lcm = BN_CTX_get(ctx);
p1q1 = BN_CTX_get(ctx);
gcd = BN_CTX_get(ctx);
if (gcd == NULL)
goto err;
/* LCM((p-1, q-1)) */
if (rsa_get_lcm(ctx, rsa->p, rsa->q, lcm, gcd, p1, q1, p1q1) != 1)
goto err;
/* copy e */
BN_free(rsa->e);
rsa->e = BN_dup(e);
if (rsa->e == NULL)
goto err;
BN_clear_free(rsa->d);
/* (Step 3) d = (e^-1) mod (LCM(p-1, q-1)) */
rsa->d = BN_secure_new();
if (rsa->d == NULL || BN_mod_inverse(rsa->d, e, lcm, ctx) == NULL)
goto err;
/* (Step 3) return an error if d is too small */
if (BN_num_bits(rsa->d) <= (nbits >> 1)) {
ret = 0;
goto err;
}
/* (Step 4) n = pq */
if (rsa->n == NULL)
rsa->n = BN_new();
if (rsa->n == NULL || !BN_mul(rsa->n, rsa->p, rsa->q, ctx))
goto err;
/* (Step 5a) dP = d mod (p-1) */
if (rsa->dmp1 == NULL)
rsa->dmp1 = BN_new();
if (rsa->dmp1 == NULL || !BN_mod(rsa->dmp1, rsa->d, p1, ctx))
goto err;
/* (Step 5b) dQ = d mod (q-1) */
if (rsa->dmq1 == NULL)
rsa->dmq1 = BN_secure_new();
if (rsa->dmq1 == NULL || !BN_mod(rsa->dmq1, rsa->d, q1, ctx))
goto err;
/* (Step 5c) qInv = (inverse of q) mod p */
BN_free(rsa->iqmp);
rsa->iqmp = BN_secure_new();
if (rsa->iqmp == NULL
|| BN_mod_inverse(rsa->iqmp, rsa->q, rsa->p, ctx) == NULL)
goto err;
ret = 1;
err:
if (ret != 1) {
BN_free(rsa->e);
rsa->e = NULL;
BN_free(rsa->d);
rsa->d = NULL;
BN_free(rsa->n);
rsa->n = NULL;
BN_free(rsa->iqmp);
rsa->iqmp = NULL;
BN_free(rsa->dmq1);
rsa->dmq1 = NULL;
BN_free(rsa->dmp1);
rsa->dmp1 = NULL;
}
BN_clear(p1);
BN_clear(q1);
BN_clear(lcm);
BN_clear(p1q1);
BN_clear(gcd);
BN_CTX_end(ctx);
return ret;
}
/*
* Generate a SP800-56B RSA key.
*
* See SP800-56Br1 6.3.1 "RSA Key-Pair Generation with a Fixed Public Exponent"
* 6.3.1.1 rsakpg1 - basic
* 6.3.1.3 rsakpg1 - crt
*
* See also FIPS 186-4 Section B.3.6
* "Generation of Probable Primes with Conditions Based on Auxiliary
* Probable Primes."
*
* Params:
* rsa The rsa object.
* nbits The intended key size in bits.
* efixed The public exponent. If NULL a default of 65537 is used.
* cb An optional BIGNUM callback.
* Returns: 1 if successfully generated otherwise it returns 0.
*/
int rsa_sp800_56b_generate_key(RSA *rsa, int nbits, const BIGNUM *efixed,
BN_GENCB *cb)
{
int ret = 0;
int ok;
BN_CTX *ctx = NULL;
BIGNUM *e = NULL;
/* (Steps 1a-1b) : Currently ignores the strength check */
if (!rsa_sp800_56b_validate_strength(nbits, -1))
return 0;
ctx = BN_CTX_new();
if (ctx == NULL)
return 0;
/* Set default if e is not passed in */
if (efixed == NULL) {
e = BN_new();
if (e == NULL || !BN_set_word(e, 65537))
goto err;
} else {
e = (BIGNUM *)efixed;
}
/* (Step 1c) fixed exponent is checked later . */
for (;;) {
/* (Step 2) Generate prime factors */
if (!rsa_fips186_4_gen_prob_primes(rsa, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, nbits, e, ctx, cb))
goto err;
/* (Steps 3-5) Compute params d, n, dP, dQ, qInv */
ok = rsa_sp800_56b_derive_params_from_pq(rsa, nbits, e, ctx);
if (ok < 0)
goto err;
if (ok > 0)
break;
/* Gets here if computed d is too small - so try again */
}
/* (Step 6) Do pairwise test - optional validity test has been omitted */
ret = rsa_sp800_56b_pairwise_test(rsa, ctx);
err:
if (efixed == NULL)
BN_free(e);
BN_CTX_free(ctx);
return ret;
}
/*
* See SP800-56Br1 6.3.1.3 (Step 6) Perform a pair-wise consistency test by
* verifying that: k = (k^e)^d mod n for some integer k where 1 < k < n-1.
*
* Returns 1 if the RSA key passes the pairwise test or 0 it it fails.
*/
int rsa_sp800_56b_pairwise_test(RSA *rsa, BN_CTX *ctx)
{
int ret = 0;
BIGNUM *k, *tmp;
BN_CTX_start(ctx);
tmp = BN_CTX_get(ctx);
k = BN_CTX_get(ctx);
if (k == NULL)
goto err;
ret = (BN_set_word(k, 2)
&& BN_mod_exp(tmp, k, rsa->e, rsa->n, ctx)
&& BN_mod_exp(tmp, tmp, rsa->d, rsa->n, ctx)
&& BN_cmp(k, tmp) == 0);
if (ret == 0)
RSAerr(RSA_F_RSA_SP800_56B_PAIRWISE_TEST, RSA_R_PAIRWISE_TEST_FAILURE);
err:
BN_CTX_end(ctx);
return ret;
}
+19 -16
View File
@@ -1,5 +1,5 @@
/*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -55,7 +55,7 @@ int RSA_padding_add_SSLv23(unsigned char *to, int tlen,
/*
* Copy of RSA_padding_check_PKCS1_type_2 with a twist that rejects padding
* if nul delimiter is preceded by 8 consecutive 0x03 bytes. It also
* if nul delimiter is not preceded by 8 consecutive 0x03 bytes. It also
* preserves error code reporting for backward compatibility.
*/
int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
@@ -67,7 +67,10 @@ int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
unsigned int good, found_zero_byte, mask, threes_in_row;
int zero_index = 0, msg_index, mlen = -1, err;
if (flen < 10) {
if (tlen <= 0 || flen <= 0)
return -1;
if (flen > num || num < 11) {
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23, RSA_R_DATA_TOO_SMALL);
return -1;
}
@@ -89,10 +92,9 @@ int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
from -= 1 & mask;
*--em = *from & mask;
}
from = em;
good = constant_time_is_zero(from[0]);
good &= constant_time_eq(from[1], 2);
good = constant_time_is_zero(em[0]);
good &= constant_time_eq(em[1], 2);
err = constant_time_select_int(good, 0, RSA_R_BLOCK_TYPE_IS_NOT_02);
mask = ~good;
@@ -100,18 +102,18 @@ int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
found_zero_byte = 0;
threes_in_row = 0;
for (i = 2; i < num; i++) {
unsigned int equals0 = constant_time_is_zero(from[i]);
unsigned int equals0 = constant_time_is_zero(em[i]);
zero_index = constant_time_select_int(~found_zero_byte & equals0,
i, zero_index);
found_zero_byte |= equals0;
threes_in_row += 1 & ~found_zero_byte;
threes_in_row &= found_zero_byte | constant_time_eq(from[i], 3);
threes_in_row &= found_zero_byte | constant_time_eq(em[i], 3);
}
/*
* PS must be at least 8 bytes long, and it starts two bytes into |from|.
* PS must be at least 8 bytes long, and it starts two bytes into |em|.
* If we never found a 0-byte, then |zero_index| is 0 and the check
* also fails.
*/
@@ -120,7 +122,7 @@ int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
RSA_R_NULL_BEFORE_BLOCK_MISSING);
mask = ~good;
good &= constant_time_lt(threes_in_row, 8);
good &= constant_time_ge(threes_in_row, 8);
err = constant_time_select_int(mask | good, err,
RSA_R_SSLV3_ROLLBACK_ATTACK);
mask = ~good;
@@ -148,15 +150,16 @@ int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
* should be noted that failure is indistinguishable from normal
* operation if |tlen| is fixed by protocol.
*/
tlen = constant_time_select_int(constant_time_lt(num, tlen), num, tlen);
tlen = constant_time_select_int(constant_time_lt(num - 11, tlen),
num - 11, tlen);
msg_index = constant_time_select_int(good, msg_index, num - tlen);
mlen = num - msg_index;
for (from += msg_index, mask = good, i = 0; i < tlen; i++) {
unsigned int equals = constant_time_eq(i, mlen);
for (mask = good, i = 0; i < tlen; i++) {
unsigned int equals = constant_time_eq(msg_index, num);
from -= tlen & equals; /* if (i == mlen) rewind */
mask &= mask ^ equals; /* if (i == mlen) mask = 0 */
to[i] = constant_time_select_8(mask, from[i], to[i]);
msg_index -= tlen & equals; /* rewind at EOF */
mask &= ~equals; /* mask = 0 at EOF */
to[i] = constant_time_select_8(mask, em[msg_index++], to[i]);
}
OPENSSL_clear_free(em, num);
+20 -20
View File
@@ -27,10 +27,10 @@
#
# r=1088(*)
#
# PPC970/G5 14.6/+120%
# POWER7 10.3/+100%
# POWER8 11.5/+85%
# POWER9 9.4/+45%
# PPC970/G5 14.0/+130%
# POWER7 9.7/+110%
# POWER8 10.6/+100%
# POWER9 8.2/+66%
#
# (*) Corresponds to SHA3-256. Percentage after slash is improvement
# over gcc-4.x-generated KECCAK_1X_ALT code. Newer compilers do
@@ -384,19 +384,19 @@ KeccakF1600:
.type dword_le_load,\@function
.align 5
dword_le_load:
lbzu r0,1(r3)
lbzu r4,1(r3)
lbzu r5,1(r3)
lbz r0,1(r3)
lbz r4,2(r3)
lbz r5,3(r3)
insrdi r0,r4,8,48
lbzu r4,1(r3)
lbz r4,4(r3)
insrdi r0,r5,8,40
lbzu r5,1(r3)
lbz r5,5(r3)
insrdi r0,r4,8,32
lbzu r4,1(r3)
lbz r4,6(r3)
insrdi r0,r5,8,24
lbzu r5,1(r3)
lbz r5,7(r3)
insrdi r0,r4,8,16
lbzu r4,1(r3)
lbzu r4,8(r3)
insrdi r0,r5,8,8
insrdi r0,r4,8,0
blr
@@ -657,21 +657,21 @@ SHA3_squeeze:
${UCMP}i $len,8
blt .Lsqueeze_tail
stbu r0,1($out)
stb r0,1($out)
srdi r0,r0,8
stbu r0,1($out)
stb r0,2($out)
srdi r0,r0,8
stbu r0,1($out)
stb r0,3($out)
srdi r0,r0,8
stbu r0,1($out)
stb r0,4($out)
srdi r0,r0,8
stbu r0,1($out)
stb r0,5($out)
srdi r0,r0,8
stbu r0,1($out)
stb r0,6($out)
srdi r0,r0,8
stbu r0,1($out)
stb r0,7($out)
srdi r0,r0,8
stbu r0,1($out)
stbu r0,8($out)
subic. $len,$len,8
beq .Lsqueeze_done
+24 -24
View File
@@ -85,30 +85,30 @@ static const unsigned char rhotates[5][5] = {
};
static const uint64_t iotas[] = {
BIT_INTERLEAVE ? 0x0000000000000001U : 0x0000000000000001U,
BIT_INTERLEAVE ? 0x0000008900000000U : 0x0000000000008082U,
BIT_INTERLEAVE ? 0x8000008b00000000U : 0x800000000000808aU,
BIT_INTERLEAVE ? 0x8000808000000000U : 0x8000000080008000U,
BIT_INTERLEAVE ? 0x0000008b00000001U : 0x000000000000808bU,
BIT_INTERLEAVE ? 0x0000800000000001U : 0x0000000080000001U,
BIT_INTERLEAVE ? 0x8000808800000001U : 0x8000000080008081U,
BIT_INTERLEAVE ? 0x8000008200000001U : 0x8000000000008009U,
BIT_INTERLEAVE ? 0x0000000b00000000U : 0x000000000000008aU,
BIT_INTERLEAVE ? 0x0000000a00000000U : 0x0000000000000088U,
BIT_INTERLEAVE ? 0x0000808200000001U : 0x0000000080008009U,
BIT_INTERLEAVE ? 0x0000800300000000U : 0x000000008000000aU,
BIT_INTERLEAVE ? 0x0000808b00000001U : 0x000000008000808bU,
BIT_INTERLEAVE ? 0x8000000b00000001U : 0x800000000000008bU,
BIT_INTERLEAVE ? 0x8000008a00000001U : 0x8000000000008089U,
BIT_INTERLEAVE ? 0x8000008100000001U : 0x8000000000008003U,
BIT_INTERLEAVE ? 0x8000008100000000U : 0x8000000000008002U,
BIT_INTERLEAVE ? 0x8000000800000000U : 0x8000000000000080U,
BIT_INTERLEAVE ? 0x0000008300000000U : 0x000000000000800aU,
BIT_INTERLEAVE ? 0x8000800300000000U : 0x800000008000000aU,
BIT_INTERLEAVE ? 0x8000808800000001U : 0x8000000080008081U,
BIT_INTERLEAVE ? 0x8000008800000000U : 0x8000000000008080U,
BIT_INTERLEAVE ? 0x0000800000000001U : 0x0000000080000001U,
BIT_INTERLEAVE ? 0x8000808200000000U : 0x8000000080008008U
BIT_INTERLEAVE ? 0x0000000000000001ULL : 0x0000000000000001ULL,
BIT_INTERLEAVE ? 0x0000008900000000ULL : 0x0000000000008082ULL,
BIT_INTERLEAVE ? 0x8000008b00000000ULL : 0x800000000000808aULL,
BIT_INTERLEAVE ? 0x8000808000000000ULL : 0x8000000080008000ULL,
BIT_INTERLEAVE ? 0x0000008b00000001ULL : 0x000000000000808bULL,
BIT_INTERLEAVE ? 0x0000800000000001ULL : 0x0000000080000001ULL,
BIT_INTERLEAVE ? 0x8000808800000001ULL : 0x8000000080008081ULL,
BIT_INTERLEAVE ? 0x8000008200000001ULL : 0x8000000000008009ULL,
BIT_INTERLEAVE ? 0x0000000b00000000ULL : 0x000000000000008aULL,
BIT_INTERLEAVE ? 0x0000000a00000000ULL : 0x0000000000000088ULL,
BIT_INTERLEAVE ? 0x0000808200000001ULL : 0x0000000080008009ULL,
BIT_INTERLEAVE ? 0x0000800300000000ULL : 0x000000008000000aULL,
BIT_INTERLEAVE ? 0x0000808b00000001ULL : 0x000000008000808bULL,
BIT_INTERLEAVE ? 0x8000000b00000001ULL : 0x800000000000008bULL,
BIT_INTERLEAVE ? 0x8000008a00000001ULL : 0x8000000000008089ULL,
BIT_INTERLEAVE ? 0x8000008100000001ULL : 0x8000000000008003ULL,
BIT_INTERLEAVE ? 0x8000008100000000ULL : 0x8000000000008002ULL,
BIT_INTERLEAVE ? 0x8000000800000000ULL : 0x8000000000000080ULL,
BIT_INTERLEAVE ? 0x0000008300000000ULL : 0x000000000000800aULL,
BIT_INTERLEAVE ? 0x8000800300000000ULL : 0x800000008000000aULL,
BIT_INTERLEAVE ? 0x8000808800000001ULL : 0x8000000080008081ULL,
BIT_INTERLEAVE ? 0x8000008800000000ULL : 0x8000000000008080ULL,
BIT_INTERLEAVE ? 0x0000800000000001ULL : 0x0000000080000001ULL,
BIT_INTERLEAVE ? 0x8000808200000000ULL : 0x8000000080008008ULL
};
#if defined(KECCAK_REF)
+4
View File
@@ -220,6 +220,10 @@ static int pkey_sm2_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
*(size_t *)p2 = smctx->id_len;
return 1;
case EVP_PKEY_CTRL_DIGESTINIT:
/* nothing to be inited, this is to suppress the error... */
return 1;
default:
return -2;
}
+55 -47
View File
@@ -65,7 +65,7 @@ static int trace_write(BIO *channel,
const char *buf, size_t num, size_t *written)
{
struct trace_data_st *ctx = BIO_get_data(channel);
size_t cnt = ctx->callback(buf, num, ctx->category, OSSL_TRACE_CTRL_DURING,
size_t cnt = ctx->callback(buf, num, ctx->category, OSSL_TRACE_CTRL_WRITE,
ctx->data);
*written = cnt;
@@ -158,7 +158,7 @@ int OSSL_trace_get_category_num(const char *name)
/* We use one trace channel for each trace category */
static struct {
enum { t_channel, t_callback } type;
enum { SIMPLE_CHANNEL, CALLBACK_CHANNEL } type;
BIO *bio;
char *prefix;
char *suffix;
@@ -169,18 +169,25 @@ static struct {
#endif
#ifndef OPENSSL_NO_TRACE
enum {
CHANNEL,
PREFIX,
SUFFIX
};
static int trace_attach_cb(int category, int type, const void *data)
{
switch (type) {
case 0: /* Channel */
case CHANNEL:
OSSL_TRACE2(TRACE, "Attach channel %p to category '%s'\n",
data, trace_categories[category].name);
break;
case 1: /* Prefix */
case PREFIX:
OSSL_TRACE2(TRACE, "Attach prefix \"%s\" to category '%s'\n",
(const char *)data, trace_categories[category].name);
break;
case 2: /* Suffix */
case SUFFIX:
OSSL_TRACE2(TRACE, "Attach suffix \"%s\" to category '%s'\n",
(const char *)data, trace_categories[category].name);
break;
@@ -193,15 +200,15 @@ static int trace_attach_cb(int category, int type, const void *data)
static int trace_detach_cb(int category, int type, const void *data)
{
switch (type) {
case 0: /* Channel */
case CHANNEL:
OSSL_TRACE2(TRACE, "Detach channel %p from category '%s'\n",
data, trace_categories[category].name);
break;
case 1: /* Prefix */
case PREFIX:
OSSL_TRACE2(TRACE, "Detach prefix \"%s\" from category '%s'\n",
(const char *)data, trace_categories[category].name);
break;
case 2: /* Suffix */
case SUFFIX:
OSSL_TRACE2(TRACE, "Detach suffix \"%s\" from category '%s'\n",
(const char *)data, trace_categories[category].name);
break;
@@ -211,7 +218,7 @@ static int trace_detach_cb(int category, int type, const void *data)
return 1;
}
static int set_trace_data(int category, BIO **channel,
static int set_trace_data(int category, int type, BIO **channel,
const char **prefix, const char **suffix,
int (*attach_cb)(int, int, const void *),
int (*detach_cb)(int, int, const void *))
@@ -222,15 +229,15 @@ static int set_trace_data(int category, BIO **channel,
/* Make sure to run the detach callback first on all data */
if (prefix != NULL && curr_prefix != NULL) {
detach_cb(category, 1, curr_prefix);
detach_cb(category, PREFIX, curr_prefix);
}
if (suffix != NULL && curr_suffix != NULL) {
detach_cb(category, 2, curr_suffix);
detach_cb(category, SUFFIX, curr_suffix);
}
if (channel != NULL && curr_channel != NULL) {
detach_cb(category, 0, curr_channel);
detach_cb(category, CHANNEL, curr_channel);
}
/* After detach callbacks are done, clear data where appropriate */
@@ -246,11 +253,13 @@ static int set_trace_data(int category, BIO **channel,
if (channel != NULL && curr_channel != NULL) {
BIO_free(curr_channel);
trace_channels[category].type = 0;
trace_channels[category].bio = NULL;
}
/* Before running callbacks are done, set new data where appropriate */
if (channel != NULL && *channel != NULL) {
trace_channels[category].type = type;
trace_channels[category].bio = *channel;
}
@@ -268,15 +277,15 @@ static int set_trace_data(int category, BIO **channel,
/* Finally, run the attach callback on the new data */
if (channel != NULL && *channel != NULL) {
attach_cb(category, 0, *channel);
attach_cb(category, CHANNEL, *channel);
}
if (prefix != NULL && *prefix != NULL) {
attach_cb(category, 1, *prefix);
attach_cb(category, PREFIX, *prefix);
}
if (suffix != NULL && *suffix != NULL) {
attach_cb(category, 2, *suffix);
attach_cb(category, SUFFIX, *suffix);
}
return 1;
@@ -287,11 +296,11 @@ int ossl_trace_init(void)
{
#ifndef OPENSSL_NO_TRACE
trace_lock = CRYPTO_THREAD_lock_new();
if (trace_lock != NULL)
return 1;
if (trace_lock == NULL)
return 0;
#endif
return 0;
return 1;
}
void ossl_trace_cleanup(void)
@@ -306,10 +315,11 @@ void ossl_trace_cleanup(void)
/* We force the TRACE category to be treated last */
if (category == OSSL_TRACE_CATEGORY_TRACE)
continue;
set_trace_data(category, &channel, &prefix, &suffix,
set_trace_data(category, 0, &channel, &prefix, &suffix,
trace_attach_cb, trace_detach_cb);
}
set_trace_data(OSSL_TRACE_CATEGORY_TRACE, &channel, &prefix, &suffix,
set_trace_data(OSSL_TRACE_CATEGORY_TRACE, 0, &channel,
&prefix, &suffix,
trace_attach_cb, trace_detach_cb);
CRYPTO_THREAD_lock_free(trace_lock);
#endif
@@ -319,33 +329,27 @@ int OSSL_trace_set_channel(int category, BIO *channel)
{
#ifndef OPENSSL_NO_TRACE
if (category < 0 || category >= OSSL_TRACE_CATEGORY_NUM
|| !set_trace_data(category, &channel, NULL, NULL,
|| !set_trace_data(category, SIMPLE_CHANNEL, &channel, NULL, NULL,
trace_attach_cb, trace_detach_cb))
goto err;
trace_channels[category].type = t_channel;
return 1;
err:
return 0;
#endif
return 0;
return 1;
}
#ifndef OPENSSL_NO_TRACE
static int trace_attach_w_callback_cb(int category, int type, const void *data)
{
switch (type) {
case 0: /* Channel */
case CHANNEL:
OSSL_TRACE2(TRACE,
"Attach channel %p to category '%s' (with callback)\n",
data, trace_categories[category].name);
break;
case 1: /* Prefix */
case PREFIX:
OSSL_TRACE2(TRACE, "Attach prefix \"%s\" to category '%s'\n",
(const char *)data, trace_categories[category].name);
break;
case 2: /* Suffix */
case SUFFIX:
OSSL_TRACE2(TRACE, "Attach suffix \"%s\" to category '%s'\n",
(const char *)data, trace_categories[category].name);
break;
@@ -378,41 +382,45 @@ int OSSL_trace_set_callback(int category, OSSL_trace_cb callback, void *data)
BIO_set_data(channel, trace_data);
}
if (!set_trace_data(category, &channel, NULL, NULL,
if (!set_trace_data(category, CALLBACK_CHANNEL, &channel, NULL, NULL,
trace_attach_w_callback_cb, trace_detach_cb))
goto err;
trace_channels[category].type = t_callback;
return 1;
goto done;
err:
BIO_free(channel);
OPENSSL_free(trace_data);
#endif
return 0;
done:
#endif
return 1;
}
int OSSL_trace_set_prefix(int category, const char *prefix)
{
int rv = 1;
#ifndef OPENSSL_NO_TRACE
if (category >= 0 || category < OSSL_TRACE_CATEGORY_NUM)
return set_trace_data(category, NULL, &prefix, NULL,
return set_trace_data(category, 0, NULL, &prefix, NULL,
trace_attach_cb, trace_detach_cb);
rv = 0;
#endif
return 0;
return rv;
}
int OSSL_trace_set_suffix(int category, const char *suffix)
{
int rv = 1;
#ifndef OPENSSL_NO_TRACE
if (category >= 0 || category < OSSL_TRACE_CATEGORY_NUM)
return set_trace_data(category, NULL, NULL, &suffix,
return set_trace_data(category, 0, NULL, NULL, &suffix,
trace_attach_cb, trace_detach_cb);
rv = 0;
#endif
return 0;
return rv;
}
#ifndef OPENSSL_NO_TRACE
@@ -450,13 +458,13 @@ BIO *OSSL_trace_begin(int category)
CRYPTO_THREAD_write_lock(trace_lock);
current_channel = channel;
switch (trace_channels[category].type) {
case t_channel:
case SIMPLE_CHANNEL:
if (prefix != NULL) {
(void)BIO_puts(channel, prefix);
(void)BIO_puts(channel, "\n");
}
break;
case t_callback:
case CALLBACK_CHANNEL:
(void)BIO_ctrl(channel, OSSL_TRACE_CTRL_BEGIN,
prefix == NULL ? 0 : strlen(prefix), prefix);
break;
@@ -477,13 +485,13 @@ void OSSL_trace_end(int category, BIO * channel)
&& ossl_assert(channel == current_channel)) {
(void)BIO_flush(channel);
switch (trace_channels[category].type) {
case t_channel:
case SIMPLE_CHANNEL:
if (suffix != NULL) {
(void)BIO_puts(channel, suffix);
(void)BIO_puts(channel, "\n");
}
break;
case t_callback:
case CALLBACK_CHANNEL:
(void)BIO_ctrl(channel, OSSL_TRACE_CTRL_END,
suffix == NULL ? 0 : strlen(suffix), suffix);
break;
+3 -1
View File
@@ -1,6 +1,6 @@
/*
* Generated by util/mkerr.pl DO NOT EDIT
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -104,9 +104,11 @@ static const ERR_STRING_DATA X509_str_functs[] = {
{ERR_PACK(ERR_LIB_X509, X509_F_X509_TO_X509_REQ, 0), "X509_to_X509_REQ"},
{ERR_PACK(ERR_LIB_X509, X509_F_X509_TRUST_ADD, 0), "X509_TRUST_add"},
{ERR_PACK(ERR_LIB_X509, X509_F_X509_TRUST_SET, 0), "X509_TRUST_set"},
{ERR_PACK(ERR_LIB_X509, X509_F_X509_VERIFY, 0), "X509_verify"},
{ERR_PACK(ERR_LIB_X509, X509_F_X509_VERIFY_CERT, 0), "X509_verify_cert"},
{ERR_PACK(ERR_LIB_X509, X509_F_X509_VERIFY_PARAM_NEW, 0),
"X509_VERIFY_PARAM_new"},
{ERR_PACK(ERR_LIB_X509, X509_F_X509_VERIFY_SM2, 0), "x509_verify_sm2"},
{0, NULL}
};
+110
View File
@@ -19,10 +19,120 @@
#include <openssl/dsa.h>
#include <openssl/x509v3.h>
#ifndef OPENSSL_NO_SM2
# include "internal/asn1_int.h"
# include "internal/evp_int.h"
static int x509_verify_sm2(X509 *x, EVP_PKEY *pkey, int mdnid, int pknid)
{
EVP_MD_CTX *ctx = NULL;
unsigned char *buf_in = NULL;
int ret = -1, inl = 0;
size_t inll = 0;
EVP_PKEY_CTX *pctx = NULL;
const EVP_MD *type = EVP_get_digestbynid(mdnid);
if (type == NULL) {
X509err(X509_F_X509_VERIFY_SM2,
ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
goto err;
}
if (pkey == NULL) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_PASSED_NULL_PARAMETER);
return -1;
}
if (x->signature.type == V_ASN1_BIT_STRING && x->signature.flags & 0x7) {
X509err(X509_F_X509_VERIFY_SM2, ASN1_R_INVALID_BIT_STRING_BITS_LEFT);
return -1;
}
ctx = EVP_MD_CTX_new();
if (ctx == NULL) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_MALLOC_FAILURE);
goto err;
}
/* Check public key OID matches public key type */
if (EVP_PKEY_type(pknid) != pkey->ameth->pkey_id) {
X509err(X509_F_X509_VERIFY_SM2, ASN1_R_WRONG_PUBLIC_KEY_TYPE);
goto err;
}
if (!EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2)) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_EVP_LIB);
ret = 0;
goto err;
}
pctx = EVP_PKEY_CTX_new(pkey, NULL);
if (pctx == NULL) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_EVP_LIB);
ret = 0;
goto err;
}
if (EVP_PKEY_CTX_set1_id(pctx, x->sm2_id.data, x->sm2_id.length) != 1) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_EVP_LIB);
ret = 0;
goto err;
}
EVP_MD_CTX_set_pkey_ctx(ctx, pctx);
if (!EVP_DigestVerifyInit(ctx, NULL, type, NULL, pkey)) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_EVP_LIB);
ret = 0;
goto err;
}
inl = ASN1_item_i2d((ASN1_VALUE *)&x->cert_info, &buf_in,
ASN1_ITEM_rptr(X509_CINF));
if (inl <= 0) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_INTERNAL_ERROR);
goto err;
}
if (buf_in == NULL) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_MALLOC_FAILURE);
goto err;
}
inll = inl;
ret = EVP_DigestVerify(ctx, x->signature.data,
(size_t)x->signature.length, buf_in, inl);
if (ret <= 0) {
X509err(X509_F_X509_VERIFY_SM2, ERR_R_EVP_LIB);
goto err;
}
ret = 1;
err:
OPENSSL_clear_free(buf_in, inll);
EVP_MD_CTX_free(ctx);
EVP_PKEY_CTX_free(pctx);
return ret;
}
#endif
int X509_verify(X509 *a, EVP_PKEY *r)
{
#ifndef OPENSSL_NO_SM2
int mdnid, pknid;
#endif
if (X509_ALGOR_cmp(&a->sig_alg, &a->cert_info.signature))
return 0;
#ifndef OPENSSL_NO_SM2
/* Convert signature OID into digest and public key OIDs */
if (!OBJ_find_sigid_algs(OBJ_obj2nid(a->sig_alg.algorithm),
&mdnid, &pknid)) {
X509err(X509_F_X509_VERIFY, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
return 0;
}
if (pknid == NID_sm2)
return x509_verify_sm2(a, r, mdnid, pknid);
#endif
return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), &a->sig_alg,
&a->signature, &a->cert_info, r));
}
+12
View File
@@ -244,3 +244,15 @@ int X509_get_signature_nid(const X509 *x)
{
return OBJ_obj2nid(x->sig_alg.algorithm);
}
#ifndef OPENSSL_NO_SM2
void X509_set_sm2_id(X509 *x, ASN1_OCTET_STRING *sm2_id)
{
x->sm2_id = *sm2_id;
}
ASN1_OCTET_STRING *X509_get0_sm2_id(X509 *x)
{
return &x->sm2_id;
}
#endif