1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <string.h> 11e1051a39Sopenharmony_ci#include <openssl/evp.h> 12e1051a39Sopenharmony_ci#include <openssl/kdf.h> 13e1051a39Sopenharmony_ci#include <openssl/core_names.h> 14e1051a39Sopenharmony_ci#include <openssl/param_build.h> 15e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 16e1051a39Sopenharmony_ci#include "internal/nelem.h" 17e1051a39Sopenharmony_ci#include "self_test.h" 18e1051a39Sopenharmony_ci#include "self_test_data.inc" 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_cistatic int self_test_digest(const ST_KAT_DIGEST *t, OSSL_SELF_TEST *st, 21e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx) 22e1051a39Sopenharmony_ci{ 23e1051a39Sopenharmony_ci int ok = 0; 24e1051a39Sopenharmony_ci unsigned char out[EVP_MAX_MD_SIZE]; 25e1051a39Sopenharmony_ci unsigned int out_len = 0; 26e1051a39Sopenharmony_ci EVP_MD_CTX *ctx = EVP_MD_CTX_new(); 27e1051a39Sopenharmony_ci EVP_MD *md = EVP_MD_fetch(libctx, t->algorithm, NULL); 28e1051a39Sopenharmony_ci 29e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_KAT_DIGEST, t->desc); 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ci if (ctx == NULL 32e1051a39Sopenharmony_ci || md == NULL 33e1051a39Sopenharmony_ci || !EVP_DigestInit_ex(ctx, md, NULL) 34e1051a39Sopenharmony_ci || !EVP_DigestUpdate(ctx, t->pt, t->pt_len) 35e1051a39Sopenharmony_ci || !EVP_DigestFinal(ctx, out, &out_len)) 36e1051a39Sopenharmony_ci goto err; 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ci /* Optional corruption */ 39e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, out); 40e1051a39Sopenharmony_ci 41e1051a39Sopenharmony_ci if (out_len != t->expected_len 42e1051a39Sopenharmony_ci || memcmp(out, t->expected, out_len) != 0) 43e1051a39Sopenharmony_ci goto err; 44e1051a39Sopenharmony_ci ok = 1; 45e1051a39Sopenharmony_cierr: 46e1051a39Sopenharmony_ci EVP_MD_free(md); 47e1051a39Sopenharmony_ci EVP_MD_CTX_free(ctx); 48e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ok); 49e1051a39Sopenharmony_ci return ok; 50e1051a39Sopenharmony_ci} 51e1051a39Sopenharmony_ci 52e1051a39Sopenharmony_ci/* 53e1051a39Sopenharmony_ci * Helper function to setup a EVP_CipherInit 54e1051a39Sopenharmony_ci * Used to hide the complexity of Authenticated ciphers. 55e1051a39Sopenharmony_ci */ 56e1051a39Sopenharmony_cistatic int cipher_init(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, 57e1051a39Sopenharmony_ci const ST_KAT_CIPHER *t, int enc) 58e1051a39Sopenharmony_ci{ 59e1051a39Sopenharmony_ci unsigned char *in_tag = NULL; 60e1051a39Sopenharmony_ci int pad = 0, tmp; 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ci /* Flag required for Key wrapping */ 63e1051a39Sopenharmony_ci EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW); 64e1051a39Sopenharmony_ci if (t->tag == NULL) { 65e1051a39Sopenharmony_ci /* Use a normal cipher init */ 66e1051a39Sopenharmony_ci return EVP_CipherInit_ex(ctx, cipher, NULL, t->key, t->iv, enc) 67e1051a39Sopenharmony_ci && EVP_CIPHER_CTX_set_padding(ctx, pad); 68e1051a39Sopenharmony_ci } 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_ci /* The authenticated cipher init */ 71e1051a39Sopenharmony_ci if (!enc) 72e1051a39Sopenharmony_ci in_tag = (unsigned char *)t->tag; 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci return EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc) 75e1051a39Sopenharmony_ci && (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, t->iv_len, NULL) > 0) 76e1051a39Sopenharmony_ci && (in_tag == NULL 77e1051a39Sopenharmony_ci || EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, t->tag_len, 78e1051a39Sopenharmony_ci in_tag) > 0) 79e1051a39Sopenharmony_ci && EVP_CipherInit_ex(ctx, NULL, NULL, t->key, t->iv, enc) 80e1051a39Sopenharmony_ci && EVP_CIPHER_CTX_set_padding(ctx, pad) 81e1051a39Sopenharmony_ci && EVP_CipherUpdate(ctx, NULL, &tmp, t->aad, t->aad_len); 82e1051a39Sopenharmony_ci} 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ci/* Test a single KAT for encrypt/decrypt */ 85e1051a39Sopenharmony_cistatic int self_test_cipher(const ST_KAT_CIPHER *t, OSSL_SELF_TEST *st, 86e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx) 87e1051a39Sopenharmony_ci{ 88e1051a39Sopenharmony_ci int ret = 0, encrypt = 1, len = 0, ct_len = 0, pt_len = 0; 89e1051a39Sopenharmony_ci EVP_CIPHER_CTX *ctx = NULL; 90e1051a39Sopenharmony_ci EVP_CIPHER *cipher = NULL; 91e1051a39Sopenharmony_ci unsigned char ct_buf[256] = { 0 }; 92e1051a39Sopenharmony_ci unsigned char pt_buf[256] = { 0 }; 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_KAT_CIPHER, t->base.desc); 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_ci ctx = EVP_CIPHER_CTX_new(); 97e1051a39Sopenharmony_ci if (ctx == NULL) 98e1051a39Sopenharmony_ci goto err; 99e1051a39Sopenharmony_ci cipher = EVP_CIPHER_fetch(libctx, t->base.algorithm, NULL); 100e1051a39Sopenharmony_ci if (cipher == NULL) 101e1051a39Sopenharmony_ci goto err; 102e1051a39Sopenharmony_ci 103e1051a39Sopenharmony_ci /* Encrypt plain text message */ 104e1051a39Sopenharmony_ci if ((t->mode & CIPHER_MODE_ENCRYPT) != 0) { 105e1051a39Sopenharmony_ci if (!cipher_init(ctx, cipher, t, encrypt) 106e1051a39Sopenharmony_ci || !EVP_CipherUpdate(ctx, ct_buf, &len, t->base.pt, 107e1051a39Sopenharmony_ci t->base.pt_len) 108e1051a39Sopenharmony_ci || !EVP_CipherFinal_ex(ctx, ct_buf + len, &ct_len)) 109e1051a39Sopenharmony_ci goto err; 110e1051a39Sopenharmony_ci 111e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, ct_buf); 112e1051a39Sopenharmony_ci ct_len += len; 113e1051a39Sopenharmony_ci if (ct_len != (int)t->base.expected_len 114e1051a39Sopenharmony_ci || memcmp(t->base.expected, ct_buf, ct_len) != 0) 115e1051a39Sopenharmony_ci goto err; 116e1051a39Sopenharmony_ci 117e1051a39Sopenharmony_ci if (t->tag != NULL) { 118e1051a39Sopenharmony_ci unsigned char tag[16] = { 0 }; 119e1051a39Sopenharmony_ci 120e1051a39Sopenharmony_ci if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, t->tag_len, 121e1051a39Sopenharmony_ci tag) <= 0 122e1051a39Sopenharmony_ci || memcmp(tag, t->tag, t->tag_len) != 0) 123e1051a39Sopenharmony_ci goto err; 124e1051a39Sopenharmony_ci } 125e1051a39Sopenharmony_ci } 126e1051a39Sopenharmony_ci 127e1051a39Sopenharmony_ci /* Decrypt cipher text */ 128e1051a39Sopenharmony_ci if ((t->mode & CIPHER_MODE_DECRYPT) != 0) { 129e1051a39Sopenharmony_ci if (!(cipher_init(ctx, cipher, t, !encrypt) 130e1051a39Sopenharmony_ci && EVP_CipherUpdate(ctx, pt_buf, &len, 131e1051a39Sopenharmony_ci t->base.expected, t->base.expected_len) 132e1051a39Sopenharmony_ci && EVP_CipherFinal_ex(ctx, pt_buf + len, &pt_len))) 133e1051a39Sopenharmony_ci goto err; 134e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, pt_buf); 135e1051a39Sopenharmony_ci pt_len += len; 136e1051a39Sopenharmony_ci if (pt_len != (int)t->base.pt_len 137e1051a39Sopenharmony_ci || memcmp(pt_buf, t->base.pt, pt_len) != 0) 138e1051a39Sopenharmony_ci goto err; 139e1051a39Sopenharmony_ci } 140e1051a39Sopenharmony_ci 141e1051a39Sopenharmony_ci ret = 1; 142e1051a39Sopenharmony_cierr: 143e1051a39Sopenharmony_ci EVP_CIPHER_free(cipher); 144e1051a39Sopenharmony_ci EVP_CIPHER_CTX_free(ctx); 145e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ret); 146e1051a39Sopenharmony_ci return ret; 147e1051a39Sopenharmony_ci} 148e1051a39Sopenharmony_ci 149e1051a39Sopenharmony_cistatic int add_params(OSSL_PARAM_BLD *bld, const ST_KAT_PARAM *params, 150e1051a39Sopenharmony_ci BN_CTX *ctx) 151e1051a39Sopenharmony_ci{ 152e1051a39Sopenharmony_ci int ret = 0; 153e1051a39Sopenharmony_ci const ST_KAT_PARAM *p; 154e1051a39Sopenharmony_ci 155e1051a39Sopenharmony_ci if (params == NULL) 156e1051a39Sopenharmony_ci return 1; 157e1051a39Sopenharmony_ci for (p = params; p->data != NULL; ++p) 158e1051a39Sopenharmony_ci { 159e1051a39Sopenharmony_ci switch (p->type) { 160e1051a39Sopenharmony_ci case OSSL_PARAM_UNSIGNED_INTEGER: { 161e1051a39Sopenharmony_ci BIGNUM *bn = BN_CTX_get(ctx); 162e1051a39Sopenharmony_ci 163e1051a39Sopenharmony_ci if (bn == NULL 164e1051a39Sopenharmony_ci || (BN_bin2bn(p->data, p->data_len, bn) == NULL) 165e1051a39Sopenharmony_ci || !OSSL_PARAM_BLD_push_BN(bld, p->name, bn)) 166e1051a39Sopenharmony_ci goto err; 167e1051a39Sopenharmony_ci break; 168e1051a39Sopenharmony_ci } 169e1051a39Sopenharmony_ci case OSSL_PARAM_UTF8_STRING: { 170e1051a39Sopenharmony_ci if (!OSSL_PARAM_BLD_push_utf8_string(bld, p->name, p->data, 171e1051a39Sopenharmony_ci p->data_len)) 172e1051a39Sopenharmony_ci goto err; 173e1051a39Sopenharmony_ci break; 174e1051a39Sopenharmony_ci } 175e1051a39Sopenharmony_ci case OSSL_PARAM_OCTET_STRING: { 176e1051a39Sopenharmony_ci if (!OSSL_PARAM_BLD_push_octet_string(bld, p->name, p->data, 177e1051a39Sopenharmony_ci p->data_len)) 178e1051a39Sopenharmony_ci goto err; 179e1051a39Sopenharmony_ci break; 180e1051a39Sopenharmony_ci } 181e1051a39Sopenharmony_ci case OSSL_PARAM_INTEGER: { 182e1051a39Sopenharmony_ci if (!OSSL_PARAM_BLD_push_int(bld, p->name, *(int *)p->data)) 183e1051a39Sopenharmony_ci goto err; 184e1051a39Sopenharmony_ci break; 185e1051a39Sopenharmony_ci } 186e1051a39Sopenharmony_ci default: 187e1051a39Sopenharmony_ci break; 188e1051a39Sopenharmony_ci } 189e1051a39Sopenharmony_ci } 190e1051a39Sopenharmony_ci ret = 1; 191e1051a39Sopenharmony_cierr: 192e1051a39Sopenharmony_ci return ret; 193e1051a39Sopenharmony_ci} 194e1051a39Sopenharmony_ci 195e1051a39Sopenharmony_cistatic int self_test_kdf(const ST_KAT_KDF *t, OSSL_SELF_TEST *st, 196e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx) 197e1051a39Sopenharmony_ci{ 198e1051a39Sopenharmony_ci int ret = 0; 199e1051a39Sopenharmony_ci unsigned char out[128]; 200e1051a39Sopenharmony_ci EVP_KDF *kdf = NULL; 201e1051a39Sopenharmony_ci EVP_KDF_CTX *ctx = NULL; 202e1051a39Sopenharmony_ci BN_CTX *bnctx = NULL; 203e1051a39Sopenharmony_ci OSSL_PARAM *params = NULL; 204e1051a39Sopenharmony_ci OSSL_PARAM_BLD *bld = NULL; 205e1051a39Sopenharmony_ci 206e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_KAT_KDF, t->desc); 207e1051a39Sopenharmony_ci 208e1051a39Sopenharmony_ci bld = OSSL_PARAM_BLD_new(); 209e1051a39Sopenharmony_ci if (bld == NULL) 210e1051a39Sopenharmony_ci goto err; 211e1051a39Sopenharmony_ci 212e1051a39Sopenharmony_ci kdf = EVP_KDF_fetch(libctx, t->algorithm, ""); 213e1051a39Sopenharmony_ci if (kdf == NULL) 214e1051a39Sopenharmony_ci goto err; 215e1051a39Sopenharmony_ci 216e1051a39Sopenharmony_ci ctx = EVP_KDF_CTX_new(kdf); 217e1051a39Sopenharmony_ci if (ctx == NULL) 218e1051a39Sopenharmony_ci goto err; 219e1051a39Sopenharmony_ci 220e1051a39Sopenharmony_ci bnctx = BN_CTX_new_ex(libctx); 221e1051a39Sopenharmony_ci if (bnctx == NULL) 222e1051a39Sopenharmony_ci goto err; 223e1051a39Sopenharmony_ci if (!add_params(bld, t->params, bnctx)) 224e1051a39Sopenharmony_ci goto err; 225e1051a39Sopenharmony_ci params = OSSL_PARAM_BLD_to_param(bld); 226e1051a39Sopenharmony_ci if (params == NULL) 227e1051a39Sopenharmony_ci goto err; 228e1051a39Sopenharmony_ci 229e1051a39Sopenharmony_ci if (t->expected_len > sizeof(out)) 230e1051a39Sopenharmony_ci goto err; 231e1051a39Sopenharmony_ci if (EVP_KDF_derive(ctx, out, t->expected_len, params) <= 0) 232e1051a39Sopenharmony_ci goto err; 233e1051a39Sopenharmony_ci 234e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, out); 235e1051a39Sopenharmony_ci 236e1051a39Sopenharmony_ci if (memcmp(out, t->expected, t->expected_len) != 0) 237e1051a39Sopenharmony_ci goto err; 238e1051a39Sopenharmony_ci 239e1051a39Sopenharmony_ci ret = 1; 240e1051a39Sopenharmony_cierr: 241e1051a39Sopenharmony_ci EVP_KDF_free(kdf); 242e1051a39Sopenharmony_ci EVP_KDF_CTX_free(ctx); 243e1051a39Sopenharmony_ci BN_CTX_free(bnctx); 244e1051a39Sopenharmony_ci OSSL_PARAM_free(params); 245e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(bld); 246e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ret); 247e1051a39Sopenharmony_ci return ret; 248e1051a39Sopenharmony_ci} 249e1051a39Sopenharmony_ci 250e1051a39Sopenharmony_cistatic int self_test_drbg(const ST_KAT_DRBG *t, OSSL_SELF_TEST *st, 251e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx) 252e1051a39Sopenharmony_ci{ 253e1051a39Sopenharmony_ci int ret = 0; 254e1051a39Sopenharmony_ci unsigned char out[256]; 255e1051a39Sopenharmony_ci EVP_RAND *rand; 256e1051a39Sopenharmony_ci EVP_RAND_CTX *test = NULL, *drbg = NULL; 257e1051a39Sopenharmony_ci unsigned int strength = 256; 258e1051a39Sopenharmony_ci int prediction_resistance = 1; /* Causes a reseed */ 259e1051a39Sopenharmony_ci OSSL_PARAM drbg_params[3] = { 260e1051a39Sopenharmony_ci OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END 261e1051a39Sopenharmony_ci }; 262e1051a39Sopenharmony_ci 263e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_DRBG, t->desc); 264e1051a39Sopenharmony_ci 265e1051a39Sopenharmony_ci rand = EVP_RAND_fetch(libctx, "TEST-RAND", NULL); 266e1051a39Sopenharmony_ci if (rand == NULL) 267e1051a39Sopenharmony_ci goto err; 268e1051a39Sopenharmony_ci 269e1051a39Sopenharmony_ci test = EVP_RAND_CTX_new(rand, NULL); 270e1051a39Sopenharmony_ci EVP_RAND_free(rand); 271e1051a39Sopenharmony_ci if (test == NULL) 272e1051a39Sopenharmony_ci goto err; 273e1051a39Sopenharmony_ci 274e1051a39Sopenharmony_ci drbg_params[0] = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_STRENGTH, 275e1051a39Sopenharmony_ci &strength); 276e1051a39Sopenharmony_ci if (!EVP_RAND_CTX_set_params(test, drbg_params)) 277e1051a39Sopenharmony_ci goto err; 278e1051a39Sopenharmony_ci 279e1051a39Sopenharmony_ci rand = EVP_RAND_fetch(libctx, t->algorithm, NULL); 280e1051a39Sopenharmony_ci if (rand == NULL) 281e1051a39Sopenharmony_ci goto err; 282e1051a39Sopenharmony_ci 283e1051a39Sopenharmony_ci drbg = EVP_RAND_CTX_new(rand, test); 284e1051a39Sopenharmony_ci EVP_RAND_free(rand); 285e1051a39Sopenharmony_ci if (drbg == NULL) 286e1051a39Sopenharmony_ci goto err; 287e1051a39Sopenharmony_ci 288e1051a39Sopenharmony_ci strength = EVP_RAND_get_strength(drbg); 289e1051a39Sopenharmony_ci 290e1051a39Sopenharmony_ci drbg_params[0] = OSSL_PARAM_construct_utf8_string(t->param_name, 291e1051a39Sopenharmony_ci t->param_value, 0); 292e1051a39Sopenharmony_ci /* This is only used by HMAC-DRBG but it is ignored by the others */ 293e1051a39Sopenharmony_ci drbg_params[1] = 294e1051a39Sopenharmony_ci OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_MAC, "HMAC", 0); 295e1051a39Sopenharmony_ci if (!EVP_RAND_CTX_set_params(drbg, drbg_params)) 296e1051a39Sopenharmony_ci goto err; 297e1051a39Sopenharmony_ci 298e1051a39Sopenharmony_ci drbg_params[0] = 299e1051a39Sopenharmony_ci OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY, 300e1051a39Sopenharmony_ci (void *)t->entropyin, 301e1051a39Sopenharmony_ci t->entropyinlen); 302e1051a39Sopenharmony_ci drbg_params[1] = 303e1051a39Sopenharmony_ci OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_NONCE, 304e1051a39Sopenharmony_ci (void *)t->nonce, t->noncelen); 305e1051a39Sopenharmony_ci if (!EVP_RAND_instantiate(test, strength, 0, NULL, 0, drbg_params)) 306e1051a39Sopenharmony_ci goto err; 307e1051a39Sopenharmony_ci if (!EVP_RAND_instantiate(drbg, strength, 0, t->persstr, t->persstrlen, 308e1051a39Sopenharmony_ci NULL)) 309e1051a39Sopenharmony_ci goto err; 310e1051a39Sopenharmony_ci 311e1051a39Sopenharmony_ci drbg_params[0] = 312e1051a39Sopenharmony_ci OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY, 313e1051a39Sopenharmony_ci (void *)t->entropyinpr1, 314e1051a39Sopenharmony_ci t->entropyinpr1len); 315e1051a39Sopenharmony_ci if (!EVP_RAND_CTX_set_params(test, drbg_params)) 316e1051a39Sopenharmony_ci goto err; 317e1051a39Sopenharmony_ci 318e1051a39Sopenharmony_ci if (!EVP_RAND_generate(drbg, out, t->expectedlen, strength, 319e1051a39Sopenharmony_ci prediction_resistance, 320e1051a39Sopenharmony_ci t->entropyaddin1, t->entropyaddin1len)) 321e1051a39Sopenharmony_ci goto err; 322e1051a39Sopenharmony_ci 323e1051a39Sopenharmony_ci drbg_params[0] = 324e1051a39Sopenharmony_ci OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY, 325e1051a39Sopenharmony_ci (void *)t->entropyinpr2, 326e1051a39Sopenharmony_ci t->entropyinpr2len); 327e1051a39Sopenharmony_ci if (!EVP_RAND_CTX_set_params(test, drbg_params)) 328e1051a39Sopenharmony_ci goto err; 329e1051a39Sopenharmony_ci 330e1051a39Sopenharmony_ci /* 331e1051a39Sopenharmony_ci * This calls ossl_prov_drbg_reseed() internally when 332e1051a39Sopenharmony_ci * prediction_resistance = 1 333e1051a39Sopenharmony_ci */ 334e1051a39Sopenharmony_ci if (!EVP_RAND_generate(drbg, out, t->expectedlen, strength, 335e1051a39Sopenharmony_ci prediction_resistance, 336e1051a39Sopenharmony_ci t->entropyaddin2, t->entropyaddin2len)) 337e1051a39Sopenharmony_ci goto err; 338e1051a39Sopenharmony_ci 339e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, out); 340e1051a39Sopenharmony_ci 341e1051a39Sopenharmony_ci if (memcmp(out, t->expected, t->expectedlen) != 0) 342e1051a39Sopenharmony_ci goto err; 343e1051a39Sopenharmony_ci 344e1051a39Sopenharmony_ci if (!EVP_RAND_uninstantiate(drbg)) 345e1051a39Sopenharmony_ci goto err; 346e1051a39Sopenharmony_ci /* 347e1051a39Sopenharmony_ci * Check that the DRBG data has been zeroized after 348e1051a39Sopenharmony_ci * ossl_prov_drbg_uninstantiate. 349e1051a39Sopenharmony_ci */ 350e1051a39Sopenharmony_ci if (!EVP_RAND_verify_zeroization(drbg)) 351e1051a39Sopenharmony_ci goto err; 352e1051a39Sopenharmony_ci 353e1051a39Sopenharmony_ci ret = 1; 354e1051a39Sopenharmony_cierr: 355e1051a39Sopenharmony_ci EVP_RAND_CTX_free(drbg); 356e1051a39Sopenharmony_ci EVP_RAND_CTX_free(test); 357e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ret); 358e1051a39Sopenharmony_ci return ret; 359e1051a39Sopenharmony_ci} 360e1051a39Sopenharmony_ci 361e1051a39Sopenharmony_ci#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC) 362e1051a39Sopenharmony_cistatic int self_test_ka(const ST_KAT_KAS *t, 363e1051a39Sopenharmony_ci OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 364e1051a39Sopenharmony_ci{ 365e1051a39Sopenharmony_ci int ret = 0; 366e1051a39Sopenharmony_ci EVP_PKEY_CTX *kactx = NULL, *dctx = NULL; 367e1051a39Sopenharmony_ci EVP_PKEY *pkey = NULL, *peerkey = NULL; 368e1051a39Sopenharmony_ci OSSL_PARAM *params = NULL; 369e1051a39Sopenharmony_ci OSSL_PARAM *params_peer = NULL; 370e1051a39Sopenharmony_ci unsigned char secret[256]; 371e1051a39Sopenharmony_ci size_t secret_len = sizeof(secret); 372e1051a39Sopenharmony_ci OSSL_PARAM_BLD *bld = NULL; 373e1051a39Sopenharmony_ci BN_CTX *bnctx = NULL; 374e1051a39Sopenharmony_ci 375e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_KAT_KA, t->desc); 376e1051a39Sopenharmony_ci 377e1051a39Sopenharmony_ci bnctx = BN_CTX_new_ex(libctx); 378e1051a39Sopenharmony_ci if (bnctx == NULL) 379e1051a39Sopenharmony_ci goto err; 380e1051a39Sopenharmony_ci 381e1051a39Sopenharmony_ci bld = OSSL_PARAM_BLD_new(); 382e1051a39Sopenharmony_ci if (bld == NULL) 383e1051a39Sopenharmony_ci goto err; 384e1051a39Sopenharmony_ci 385e1051a39Sopenharmony_ci if (!add_params(bld, t->key_group, bnctx) 386e1051a39Sopenharmony_ci || !add_params(bld, t->key_host_data, bnctx)) 387e1051a39Sopenharmony_ci goto err; 388e1051a39Sopenharmony_ci params = OSSL_PARAM_BLD_to_param(bld); 389e1051a39Sopenharmony_ci 390e1051a39Sopenharmony_ci if (!add_params(bld, t->key_group, bnctx) 391e1051a39Sopenharmony_ci || !add_params(bld, t->key_peer_data, bnctx)) 392e1051a39Sopenharmony_ci goto err; 393e1051a39Sopenharmony_ci 394e1051a39Sopenharmony_ci params_peer = OSSL_PARAM_BLD_to_param(bld); 395e1051a39Sopenharmony_ci if (params == NULL || params_peer == NULL) 396e1051a39Sopenharmony_ci goto err; 397e1051a39Sopenharmony_ci 398e1051a39Sopenharmony_ci /* Create a EVP_PKEY_CTX to load the DH keys into */ 399e1051a39Sopenharmony_ci kactx = EVP_PKEY_CTX_new_from_name(libctx, t->algorithm, ""); 400e1051a39Sopenharmony_ci if (kactx == NULL) 401e1051a39Sopenharmony_ci goto err; 402e1051a39Sopenharmony_ci if (EVP_PKEY_fromdata_init(kactx) <= 0 403e1051a39Sopenharmony_ci || EVP_PKEY_fromdata(kactx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0) 404e1051a39Sopenharmony_ci goto err; 405e1051a39Sopenharmony_ci if (EVP_PKEY_fromdata_init(kactx) <= 0 406e1051a39Sopenharmony_ci || EVP_PKEY_fromdata(kactx, &peerkey, EVP_PKEY_KEYPAIR, params_peer) <= 0) 407e1051a39Sopenharmony_ci goto err; 408e1051a39Sopenharmony_ci 409e1051a39Sopenharmony_ci /* Create a EVP_PKEY_CTX to perform key derivation */ 410e1051a39Sopenharmony_ci dctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, NULL); 411e1051a39Sopenharmony_ci if (dctx == NULL) 412e1051a39Sopenharmony_ci goto err; 413e1051a39Sopenharmony_ci 414e1051a39Sopenharmony_ci if (EVP_PKEY_derive_init(dctx) <= 0 415e1051a39Sopenharmony_ci || EVP_PKEY_derive_set_peer(dctx, peerkey) <= 0 416e1051a39Sopenharmony_ci || EVP_PKEY_derive(dctx, secret, &secret_len) <= 0) 417e1051a39Sopenharmony_ci goto err; 418e1051a39Sopenharmony_ci 419e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, secret); 420e1051a39Sopenharmony_ci 421e1051a39Sopenharmony_ci if (secret_len != t->expected_len 422e1051a39Sopenharmony_ci || memcmp(secret, t->expected, t->expected_len) != 0) 423e1051a39Sopenharmony_ci goto err; 424e1051a39Sopenharmony_ci ret = 1; 425e1051a39Sopenharmony_cierr: 426e1051a39Sopenharmony_ci BN_CTX_free(bnctx); 427e1051a39Sopenharmony_ci EVP_PKEY_free(pkey); 428e1051a39Sopenharmony_ci EVP_PKEY_free(peerkey); 429e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(kactx); 430e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(dctx); 431e1051a39Sopenharmony_ci OSSL_PARAM_free(params_peer); 432e1051a39Sopenharmony_ci OSSL_PARAM_free(params); 433e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(bld); 434e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ret); 435e1051a39Sopenharmony_ci return ret; 436e1051a39Sopenharmony_ci} 437e1051a39Sopenharmony_ci#endif /* !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC) */ 438e1051a39Sopenharmony_ci 439e1051a39Sopenharmony_cistatic int self_test_sign(const ST_KAT_SIGN *t, 440e1051a39Sopenharmony_ci OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 441e1051a39Sopenharmony_ci{ 442e1051a39Sopenharmony_ci int ret = 0; 443e1051a39Sopenharmony_ci OSSL_PARAM *params = NULL, *params_sig = NULL; 444e1051a39Sopenharmony_ci OSSL_PARAM_BLD *bld = NULL; 445e1051a39Sopenharmony_ci EVP_PKEY_CTX *sctx = NULL, *kctx = NULL; 446e1051a39Sopenharmony_ci EVP_PKEY *pkey = NULL; 447e1051a39Sopenharmony_ci unsigned char sig[256]; 448e1051a39Sopenharmony_ci BN_CTX *bnctx = NULL; 449e1051a39Sopenharmony_ci size_t siglen = sizeof(sig); 450e1051a39Sopenharmony_ci static const unsigned char dgst[] = { 451e1051a39Sopenharmony_ci 0x7f, 0x83, 0xb1, 0x65, 0x7f, 0xf1, 0xfc, 0x53, 0xb9, 0x2d, 0xc1, 0x81, 452e1051a39Sopenharmony_ci 0x48, 0xa1, 0xd6, 0x5d, 0xfc, 0x2d, 0x4b, 0x1f, 0xa3, 0xd6, 0x77, 0x28, 453e1051a39Sopenharmony_ci 0x4a, 0xdd, 0xd2, 0x00, 0x12, 0x6d, 0x90, 0x69 454e1051a39Sopenharmony_ci }; 455e1051a39Sopenharmony_ci const char *typ = OSSL_SELF_TEST_TYPE_KAT_SIGNATURE; 456e1051a39Sopenharmony_ci 457e1051a39Sopenharmony_ci if (t->sig_expected == NULL) 458e1051a39Sopenharmony_ci typ = OSSL_SELF_TEST_TYPE_PCT_SIGNATURE; 459e1051a39Sopenharmony_ci 460e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, typ, t->desc); 461e1051a39Sopenharmony_ci 462e1051a39Sopenharmony_ci bnctx = BN_CTX_new_ex(libctx); 463e1051a39Sopenharmony_ci if (bnctx == NULL) 464e1051a39Sopenharmony_ci goto err; 465e1051a39Sopenharmony_ci 466e1051a39Sopenharmony_ci bld = OSSL_PARAM_BLD_new(); 467e1051a39Sopenharmony_ci if (bld == NULL) 468e1051a39Sopenharmony_ci goto err; 469e1051a39Sopenharmony_ci 470e1051a39Sopenharmony_ci if (!add_params(bld, t->key, bnctx)) 471e1051a39Sopenharmony_ci goto err; 472e1051a39Sopenharmony_ci params = OSSL_PARAM_BLD_to_param(bld); 473e1051a39Sopenharmony_ci 474e1051a39Sopenharmony_ci /* Create a EVP_PKEY_CTX to load the DSA key into */ 475e1051a39Sopenharmony_ci kctx = EVP_PKEY_CTX_new_from_name(libctx, t->algorithm, ""); 476e1051a39Sopenharmony_ci if (kctx == NULL || params == NULL) 477e1051a39Sopenharmony_ci goto err; 478e1051a39Sopenharmony_ci if (EVP_PKEY_fromdata_init(kctx) <= 0 479e1051a39Sopenharmony_ci || EVP_PKEY_fromdata(kctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0) 480e1051a39Sopenharmony_ci goto err; 481e1051a39Sopenharmony_ci 482e1051a39Sopenharmony_ci /* Create a EVP_PKEY_CTX to use for the signing operation */ 483e1051a39Sopenharmony_ci sctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, NULL); 484e1051a39Sopenharmony_ci if (sctx == NULL 485e1051a39Sopenharmony_ci || EVP_PKEY_sign_init(sctx) <= 0) 486e1051a39Sopenharmony_ci goto err; 487e1051a39Sopenharmony_ci 488e1051a39Sopenharmony_ci /* set signature parameters */ 489e1051a39Sopenharmony_ci if (!OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_SIGNATURE_PARAM_DIGEST, 490e1051a39Sopenharmony_ci t->mdalgorithm, 491e1051a39Sopenharmony_ci strlen(t->mdalgorithm) + 1)) 492e1051a39Sopenharmony_ci goto err; 493e1051a39Sopenharmony_ci params_sig = OSSL_PARAM_BLD_to_param(bld); 494e1051a39Sopenharmony_ci if (EVP_PKEY_CTX_set_params(sctx, params_sig) <= 0) 495e1051a39Sopenharmony_ci goto err; 496e1051a39Sopenharmony_ci 497e1051a39Sopenharmony_ci if (EVP_PKEY_sign(sctx, sig, &siglen, dgst, sizeof(dgst)) <= 0 498e1051a39Sopenharmony_ci || EVP_PKEY_verify_init(sctx) <= 0 499e1051a39Sopenharmony_ci || EVP_PKEY_CTX_set_params(sctx, params_sig) <= 0) 500e1051a39Sopenharmony_ci goto err; 501e1051a39Sopenharmony_ci 502e1051a39Sopenharmony_ci /* 503e1051a39Sopenharmony_ci * Used by RSA, for other key types where the signature changes, we 504e1051a39Sopenharmony_ci * can only use the verify. 505e1051a39Sopenharmony_ci */ 506e1051a39Sopenharmony_ci if (t->sig_expected != NULL 507e1051a39Sopenharmony_ci && (siglen != t->sig_expected_len 508e1051a39Sopenharmony_ci || memcmp(sig, t->sig_expected, t->sig_expected_len) != 0)) 509e1051a39Sopenharmony_ci goto err; 510e1051a39Sopenharmony_ci 511e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, sig); 512e1051a39Sopenharmony_ci if (EVP_PKEY_verify(sctx, sig, siglen, dgst, sizeof(dgst)) <= 0) 513e1051a39Sopenharmony_ci goto err; 514e1051a39Sopenharmony_ci ret = 1; 515e1051a39Sopenharmony_cierr: 516e1051a39Sopenharmony_ci BN_CTX_free(bnctx); 517e1051a39Sopenharmony_ci EVP_PKEY_free(pkey); 518e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(kctx); 519e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(sctx); 520e1051a39Sopenharmony_ci OSSL_PARAM_free(params); 521e1051a39Sopenharmony_ci OSSL_PARAM_free(params_sig); 522e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(bld); 523e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ret); 524e1051a39Sopenharmony_ci return ret; 525e1051a39Sopenharmony_ci} 526e1051a39Sopenharmony_ci 527e1051a39Sopenharmony_ci/* 528e1051a39Sopenharmony_ci * Test an encrypt or decrypt KAT.. 529e1051a39Sopenharmony_ci * 530e1051a39Sopenharmony_ci * FIPS 140-2 IG D.9 states that separate KAT tests are needed for encrypt 531e1051a39Sopenharmony_ci * and decrypt.. 532e1051a39Sopenharmony_ci */ 533e1051a39Sopenharmony_cistatic int self_test_asym_cipher(const ST_KAT_ASYM_CIPHER *t, OSSL_SELF_TEST *st, 534e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx) 535e1051a39Sopenharmony_ci{ 536e1051a39Sopenharmony_ci int ret = 0; 537e1051a39Sopenharmony_ci OSSL_PARAM *keyparams = NULL, *initparams = NULL; 538e1051a39Sopenharmony_ci OSSL_PARAM_BLD *keybld = NULL, *initbld = NULL; 539e1051a39Sopenharmony_ci EVP_PKEY_CTX *encctx = NULL, *keyctx = NULL; 540e1051a39Sopenharmony_ci EVP_PKEY *key = NULL; 541e1051a39Sopenharmony_ci BN_CTX *bnctx = NULL; 542e1051a39Sopenharmony_ci unsigned char out[256]; 543e1051a39Sopenharmony_ci size_t outlen = sizeof(out); 544e1051a39Sopenharmony_ci 545e1051a39Sopenharmony_ci OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_KAT_ASYM_CIPHER, t->desc); 546e1051a39Sopenharmony_ci 547e1051a39Sopenharmony_ci bnctx = BN_CTX_new_ex(libctx); 548e1051a39Sopenharmony_ci if (bnctx == NULL) 549e1051a39Sopenharmony_ci goto err; 550e1051a39Sopenharmony_ci 551e1051a39Sopenharmony_ci /* Load a public or private key from data */ 552e1051a39Sopenharmony_ci keybld = OSSL_PARAM_BLD_new(); 553e1051a39Sopenharmony_ci if (keybld == NULL 554e1051a39Sopenharmony_ci || !add_params(keybld, t->key, bnctx)) 555e1051a39Sopenharmony_ci goto err; 556e1051a39Sopenharmony_ci keyparams = OSSL_PARAM_BLD_to_param(keybld); 557e1051a39Sopenharmony_ci keyctx = EVP_PKEY_CTX_new_from_name(libctx, t->algorithm, NULL); 558e1051a39Sopenharmony_ci if (keyctx == NULL || keyparams == NULL) 559e1051a39Sopenharmony_ci goto err; 560e1051a39Sopenharmony_ci if (EVP_PKEY_fromdata_init(keyctx) <= 0 561e1051a39Sopenharmony_ci || EVP_PKEY_fromdata(keyctx, &key, EVP_PKEY_KEYPAIR, keyparams) <= 0) 562e1051a39Sopenharmony_ci goto err; 563e1051a39Sopenharmony_ci 564e1051a39Sopenharmony_ci /* Create a EVP_PKEY_CTX to use for the encrypt or decrypt operation */ 565e1051a39Sopenharmony_ci encctx = EVP_PKEY_CTX_new_from_pkey(libctx, key, NULL); 566e1051a39Sopenharmony_ci if (encctx == NULL 567e1051a39Sopenharmony_ci || (t->encrypt && EVP_PKEY_encrypt_init(encctx) <= 0) 568e1051a39Sopenharmony_ci || (!t->encrypt && EVP_PKEY_decrypt_init(encctx) <= 0)) 569e1051a39Sopenharmony_ci goto err; 570e1051a39Sopenharmony_ci 571e1051a39Sopenharmony_ci /* Add any additional parameters such as padding */ 572e1051a39Sopenharmony_ci if (t->postinit != NULL) { 573e1051a39Sopenharmony_ci initbld = OSSL_PARAM_BLD_new(); 574e1051a39Sopenharmony_ci if (initbld == NULL) 575e1051a39Sopenharmony_ci goto err; 576e1051a39Sopenharmony_ci if (!add_params(initbld, t->postinit, bnctx)) 577e1051a39Sopenharmony_ci goto err; 578e1051a39Sopenharmony_ci initparams = OSSL_PARAM_BLD_to_param(initbld); 579e1051a39Sopenharmony_ci if (initparams == NULL) 580e1051a39Sopenharmony_ci goto err; 581e1051a39Sopenharmony_ci if (EVP_PKEY_CTX_set_params(encctx, initparams) <= 0) 582e1051a39Sopenharmony_ci goto err; 583e1051a39Sopenharmony_ci } 584e1051a39Sopenharmony_ci 585e1051a39Sopenharmony_ci if (t->encrypt) { 586e1051a39Sopenharmony_ci if (EVP_PKEY_encrypt(encctx, out, &outlen, 587e1051a39Sopenharmony_ci t->in, t->in_len) <= 0) 588e1051a39Sopenharmony_ci goto err; 589e1051a39Sopenharmony_ci } else { 590e1051a39Sopenharmony_ci if (EVP_PKEY_decrypt(encctx, out, &outlen, 591e1051a39Sopenharmony_ci t->in, t->in_len) <= 0) 592e1051a39Sopenharmony_ci goto err; 593e1051a39Sopenharmony_ci } 594e1051a39Sopenharmony_ci /* Check the KAT */ 595e1051a39Sopenharmony_ci OSSL_SELF_TEST_oncorrupt_byte(st, out); 596e1051a39Sopenharmony_ci if (outlen != t->expected_len 597e1051a39Sopenharmony_ci || memcmp(out, t->expected, t->expected_len) != 0) 598e1051a39Sopenharmony_ci goto err; 599e1051a39Sopenharmony_ci 600e1051a39Sopenharmony_ci ret = 1; 601e1051a39Sopenharmony_cierr: 602e1051a39Sopenharmony_ci BN_CTX_free(bnctx); 603e1051a39Sopenharmony_ci EVP_PKEY_free(key); 604e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(encctx); 605e1051a39Sopenharmony_ci EVP_PKEY_CTX_free(keyctx); 606e1051a39Sopenharmony_ci OSSL_PARAM_free(keyparams); 607e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(keybld); 608e1051a39Sopenharmony_ci OSSL_PARAM_free(initparams); 609e1051a39Sopenharmony_ci OSSL_PARAM_BLD_free(initbld); 610e1051a39Sopenharmony_ci OSSL_SELF_TEST_onend(st, ret); 611e1051a39Sopenharmony_ci return ret; 612e1051a39Sopenharmony_ci} 613e1051a39Sopenharmony_ci 614e1051a39Sopenharmony_ci/* 615e1051a39Sopenharmony_ci * Test a data driven list of KAT's for digest algorithms. 616e1051a39Sopenharmony_ci * All tests are run regardless of if they fail or not. 617e1051a39Sopenharmony_ci * Return 0 if any test fails. 618e1051a39Sopenharmony_ci */ 619e1051a39Sopenharmony_cistatic int self_test_digests(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 620e1051a39Sopenharmony_ci{ 621e1051a39Sopenharmony_ci int i, ret = 1; 622e1051a39Sopenharmony_ci 623e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_digest_tests); ++i) { 624e1051a39Sopenharmony_ci if (!self_test_digest(&st_kat_digest_tests[i], st, libctx)) 625e1051a39Sopenharmony_ci ret = 0; 626e1051a39Sopenharmony_ci } 627e1051a39Sopenharmony_ci return ret; 628e1051a39Sopenharmony_ci} 629e1051a39Sopenharmony_ci 630e1051a39Sopenharmony_cistatic int self_test_ciphers(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 631e1051a39Sopenharmony_ci{ 632e1051a39Sopenharmony_ci int i, ret = 1; 633e1051a39Sopenharmony_ci 634e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_cipher_tests); ++i) { 635e1051a39Sopenharmony_ci if (!self_test_cipher(&st_kat_cipher_tests[i], st, libctx)) 636e1051a39Sopenharmony_ci ret = 0; 637e1051a39Sopenharmony_ci } 638e1051a39Sopenharmony_ci return ret; 639e1051a39Sopenharmony_ci} 640e1051a39Sopenharmony_ci 641e1051a39Sopenharmony_cistatic int self_test_asym_ciphers(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 642e1051a39Sopenharmony_ci{ 643e1051a39Sopenharmony_ci int i, ret = 1; 644e1051a39Sopenharmony_ci 645e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_asym_cipher_tests); ++i) { 646e1051a39Sopenharmony_ci if (!self_test_asym_cipher(&st_kat_asym_cipher_tests[i], st, libctx)) 647e1051a39Sopenharmony_ci ret = 0; 648e1051a39Sopenharmony_ci } 649e1051a39Sopenharmony_ci return ret; 650e1051a39Sopenharmony_ci} 651e1051a39Sopenharmony_ci 652e1051a39Sopenharmony_cistatic int self_test_kdfs(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 653e1051a39Sopenharmony_ci{ 654e1051a39Sopenharmony_ci int i, ret = 1; 655e1051a39Sopenharmony_ci 656e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_kdf_tests); ++i) { 657e1051a39Sopenharmony_ci if (!self_test_kdf(&st_kat_kdf_tests[i], st, libctx)) 658e1051a39Sopenharmony_ci ret = 0; 659e1051a39Sopenharmony_ci } 660e1051a39Sopenharmony_ci return ret; 661e1051a39Sopenharmony_ci} 662e1051a39Sopenharmony_ci 663e1051a39Sopenharmony_cistatic int self_test_drbgs(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 664e1051a39Sopenharmony_ci{ 665e1051a39Sopenharmony_ci int i, ret = 1; 666e1051a39Sopenharmony_ci 667e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_drbg_tests); ++i) { 668e1051a39Sopenharmony_ci if (!self_test_drbg(&st_kat_drbg_tests[i], st, libctx)) 669e1051a39Sopenharmony_ci ret = 0; 670e1051a39Sopenharmony_ci } 671e1051a39Sopenharmony_ci return ret; 672e1051a39Sopenharmony_ci} 673e1051a39Sopenharmony_ci 674e1051a39Sopenharmony_cistatic int self_test_kas(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 675e1051a39Sopenharmony_ci{ 676e1051a39Sopenharmony_ci int ret = 1; 677e1051a39Sopenharmony_ci#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_EC) 678e1051a39Sopenharmony_ci int i; 679e1051a39Sopenharmony_ci 680e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_kas_tests); ++i) { 681e1051a39Sopenharmony_ci if (!self_test_ka(&st_kat_kas_tests[i], st, libctx)) 682e1051a39Sopenharmony_ci ret = 0; 683e1051a39Sopenharmony_ci } 684e1051a39Sopenharmony_ci#endif 685e1051a39Sopenharmony_ci 686e1051a39Sopenharmony_ci return ret; 687e1051a39Sopenharmony_ci} 688e1051a39Sopenharmony_ci 689e1051a39Sopenharmony_cistatic int self_test_signatures(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 690e1051a39Sopenharmony_ci{ 691e1051a39Sopenharmony_ci int i, ret = 1; 692e1051a39Sopenharmony_ci 693e1051a39Sopenharmony_ci for (i = 0; i < (int)OSSL_NELEM(st_kat_sign_tests); ++i) { 694e1051a39Sopenharmony_ci if (!self_test_sign(&st_kat_sign_tests[i], st, libctx)) 695e1051a39Sopenharmony_ci ret = 0; 696e1051a39Sopenharmony_ci } 697e1051a39Sopenharmony_ci return ret; 698e1051a39Sopenharmony_ci} 699e1051a39Sopenharmony_ci 700e1051a39Sopenharmony_ci/* 701e1051a39Sopenharmony_ci * Run the algorithm KAT's. 702e1051a39Sopenharmony_ci * Return 1 is successful, otherwise return 0. 703e1051a39Sopenharmony_ci * This runs all the tests regardless of if any fail. 704e1051a39Sopenharmony_ci */ 705e1051a39Sopenharmony_ciint SELF_TEST_kats(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx) 706e1051a39Sopenharmony_ci{ 707e1051a39Sopenharmony_ci int ret = 1; 708e1051a39Sopenharmony_ci 709e1051a39Sopenharmony_ci if (!self_test_digests(st, libctx)) 710e1051a39Sopenharmony_ci ret = 0; 711e1051a39Sopenharmony_ci if (!self_test_ciphers(st, libctx)) 712e1051a39Sopenharmony_ci ret = 0; 713e1051a39Sopenharmony_ci if (!self_test_signatures(st, libctx)) 714e1051a39Sopenharmony_ci ret = 0; 715e1051a39Sopenharmony_ci if (!self_test_kdfs(st, libctx)) 716e1051a39Sopenharmony_ci ret = 0; 717e1051a39Sopenharmony_ci if (!self_test_drbgs(st, libctx)) 718e1051a39Sopenharmony_ci ret = 0; 719e1051a39Sopenharmony_ci if (!self_test_kas(st, libctx)) 720e1051a39Sopenharmony_ci ret = 0; 721e1051a39Sopenharmony_ci if (!self_test_asym_ciphers(st, libctx)) 722e1051a39Sopenharmony_ci ret = 0; 723e1051a39Sopenharmony_ci 724e1051a39Sopenharmony_ci return ret; 725e1051a39Sopenharmony_ci} 726