/ external / libecc / src / tests / ec_self_tests_core.h
ec_self_tests_core.h
   1  /*
   2   *  Copyright (C) 2017 - This file is part of libecc project
   3   *
   4   *  Authors:
   5   *      Ryad BENADJILA <ryadbenadjila@gmail.com>
   6   *      Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr>
   7   *      Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr>
   8   *
   9   *  Contributors:
  10   *      Nicolas VIVET <nicolas.vivet@ssi.gouv.fr>
  11   *      Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr>
  12   *
  13   *  This software is licensed under a dual BSD and GPL v2 license.
  14   *  See LICENSE file at the root folder of the project.
  15   */
  16  #ifndef __EC_SELF_TESTS_CORE_H__
  17  #define __EC_SELF_TESTS_CORE_H__
  18  
  19  #include <libecc/libsig.h>
  20  
  21  /* A test is fully defined by the attributes pointed in this structure. */
  22  typedef struct {
  23  	/* Test case name */
  24  	const char *name;
  25  
  26  	/* Curve params */
  27  	const ec_str_params *ec_str_p;
  28  
  29  	/* Private key */
  30  	const u8 *priv_key;
  31  	u8 priv_key_len;
  32  
  33  	/* Function returning a fixed random value */
  34  	int (*nn_random) (nn_t out, nn_src_t q);
  35  
  36  	/* Hash function */
  37  	hash_alg_type hash_type;
  38  
  39  	/* Message */
  40  	const char *msg;
  41  	u32 msglen;
  42  
  43  	/* Expected signature and associated length */
  44  	ec_alg_type sig_type;
  45  	const u8 *exp_sig;
  46  	u8 exp_siglen;
  47  
  48  	/* Optional ancillary data */
  49  	const u8 *adata;
  50  	u16 adata_len;
  51  } ec_test_case;
  52  
  53  /* ECDH test case */
  54  typedef struct {
  55  	/* Test case name */
  56  	const char *name;
  57  
  58  	/* ECDH type */
  59  	ec_alg_type ecdh_type;
  60  
  61  	/* Curve params */
  62  	const ec_str_params *ec_str_p;
  63  
  64  	/* Our private key */
  65  	const u8 *our_priv_key;
  66  	u8 our_priv_key_len;
  67  
  68  	/* Peer public key */
  69  	const u8 *peer_pub_key;
  70  	u8 peer_pub_key_len;
  71  
  72  	/* Our expected public key */
  73  	const u8 *exp_our_pub_key;
  74  	u8 exp_our_pub_key_len;
  75  
  76  	/* Expected shared secret */
  77  	const u8 *exp_shared_secret;
  78  	u8 exp_shared_secret_len;
  79  } ecdh_test_case;
  80  
  81  /*******************************************************************
  82   ************** ECDSA tests ****************************************
  83   *******************************************************************/
  84  #if (defined(WITH_HASH_SHA3_224) || defined(WITH_HASH_SHA3_256) || \
  85       defined(WITH_HASH_SHA3_384) || defined(WITH_HASH_SHA3_512))
  86  
  87  /*
  88   * This test message is the 1600 bits message used by NIST in its
  89   * test vectors for SHA3. We reuse it for sig/verif test vectors
  90   * using SHA3.
  91   */
  92  static const u8 sha3_1600_bit_msg[] = {
  93  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
  94  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
  95  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
  96  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
  97  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
  98  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
  99  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 100  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 101  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 102  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 103  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 104  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 105  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 106  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 107  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 108  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 109  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 110  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 111  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 112  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 113  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 114  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 115  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 116  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
 117  	0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3
 118  };
 119  #endif
 120  
 121  #ifdef WITH_SIG_ECDSA
 122  #ifdef WITH_HASH_SHA3_224
 123  #ifdef WITH_CURVE_SECP224R1
 124  #define ECDSA_SHA3_224_SECP224R1_SELF_TEST
 125  
 126  /* ECDSA secp224r1 test vectors */
 127  
 128  static int ecdsa_nn_random_secp224r1_sha3_224_test_vector(nn_t out, nn_src_t q)
 129  {
 130  	int ret, cmp;
 131  
 132  	/*
 133  	 * Fixed ephemeral private key for secp224r1 signature
 134  	 * test vectors from RFC4754
 135  	 */
 136  	const u8 k_buf[] = {
 137  		0xb7, 0x63, 0x8a, 0x22, 0xe5, 0xee, 0xe7, 0x76,
 138  		0xa4, 0x25, 0x3f, 0x97, 0xe8, 0x35, 0x1a, 0x3c,
 139  		0x94, 0xb0, 0x19, 0x37, 0x66, 0x2a, 0x0e, 0xbd,
 140  		0xd6, 0xe7, 0xae, 0xe0
 141  	};
 142  
 143  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 144  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 145  
 146  	ret = (cmp >= 0) ? -1 : 0;
 147  
 148  err:
 149  	return ret;
 150  }
 151  
 152  static const u8 ecdsa_secp224r1_sha3_224_test_vectors_priv_key[] = {
 153  	0xc3, 0x1a, 0x15, 0x2d, 0x2c, 0x62, 0x40, 0x21,
 154  	0x80, 0x87, 0x55, 0xb2, 0xcb, 0xdf, 0x80, 0xd3,
 155  	0x09, 0xe3, 0x6a, 0xea, 0xc1, 0xcc, 0xd9, 0xdb,
 156  	0x82, 0xb1, 0xd7, 0xc3
 157  };
 158  
 159  static const u8 ecdsa_secp224r1_sha3_224_test_vectors_expected_sig[] = {
 160  	0x56, 0xa6, 0x93, 0xe1, 0x20, 0x0a, 0xa8, 0xe3,
 161  	0xd2, 0x78, 0x07, 0xba, 0x5c, 0xe7, 0xb8, 0xf7,
 162  	0xdf, 0x24, 0xa6, 0x65, 0x1e, 0xb8, 0x70, 0x6e,
 163  	0x65, 0x52, 0x49, 0xd4,
 164  	0x14, 0xd0, 0x4b, 0x6b, 0xb9, 0x32, 0x58, 0x7d,
 165  	0xc0, 0xc6, 0x1c, 0xa1, 0x44, 0xf8, 0x4b, 0xf4,
 166  	0x6e, 0x7a, 0xbd, 0xcf, 0xa7, 0xa7, 0xa1, 0xee,
 167  	0x56, 0x06, 0x9a, 0x37
 168  };
 169  
 170  static const ec_test_case ecdsa_secp224r1_sha3_224_test_case = {
 171  	.name = "ECDSA-SHA3_224/secp224r1",
 172  	.ec_str_p = &secp224r1_str_params,
 173  	.priv_key = ecdsa_secp224r1_sha3_224_test_vectors_priv_key,
 174  	.priv_key_len = sizeof(ecdsa_secp224r1_sha3_224_test_vectors_priv_key),
 175  	.nn_random = ecdsa_nn_random_secp224r1_sha3_224_test_vector,
 176  	.hash_type = SHA3_224,
 177  	.msg = (const char *)sha3_1600_bit_msg,
 178  	.msglen = sizeof(sha3_1600_bit_msg),
 179  	.sig_type = ECDSA,
 180  	.exp_sig = ecdsa_secp224r1_sha3_224_test_vectors_expected_sig,
 181  	.exp_siglen =
 182  		sizeof(ecdsa_secp224r1_sha3_224_test_vectors_expected_sig),
 183  	.adata = NULL,
 184  	.adata_len = 0
 185  };
 186  #endif /* WITH_CURVE_SECP224R1 */
 187  #endif /* WITH_HASH_SHA3_224 */
 188  
 189  #ifdef WITH_HASH_SHA3_256
 190  #ifdef WITH_CURVE_SECP256R1
 191  #define ECDSA_SHA3_256_SECP256R1_SELF_TEST
 192  
 193  /* ECDSA secp256r1 test vectors */
 194  
 195  static int ecdsa_nn_random_secp256r1_sha3_256_test_vector(nn_t out, nn_src_t q)
 196  {
 197  	int ret, cmp;
 198  
 199  	/*
 200  	 * Fixed ephemeral private key for secp256r1 signature
 201  	 * test vectors from RFC4754
 202  	 */
 203  	const u8 k_buf[] = {
 204  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
 205  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
 206  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
 207  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
 208  	};
 209  
 210  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 211  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 212  
 213  	ret = (cmp >= 0) ? -1 : 0;
 214  
 215  err:
 216  	return ret;
 217  }
 218  
 219  static const u8 ecdsa_secp256r1_sha3_256_test_vectors_priv_key[] = {
 220  	0xDC, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
 221  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
 222  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
 223  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
 224  };
 225  
 226  static const u8 ecdsa_secp256r1_sha3_256_test_vectors_expected_sig[] = {
 227  	0xCB, 0x28, 0xE0, 0x99, 0x9B, 0x9C, 0x77, 0x15,
 228  	0xFD, 0x0A, 0x80, 0xD8, 0xE4, 0x7A, 0x77, 0x07,
 229  	0x97, 0x16, 0xCB, 0xBF, 0x91, 0x7D, 0xD7, 0x2E,
 230  	0x97, 0x56, 0x6E, 0xA1, 0xC0, 0x66, 0x95, 0x7C,
 231  
 232  	0x1d, 0x5d, 0x46, 0x09, 0xa2, 0xf9, 0x69, 0xa1,
 233  	0x90, 0xeb, 0x6b, 0x84, 0x51, 0xdd, 0x43, 0x0d,
 234  	0x65, 0x07, 0x10, 0x4d, 0xb6, 0x46, 0x61, 0x68,
 235  	0xec, 0x7a, 0x73, 0xdb, 0x8c, 0x96, 0xe9, 0x1b
 236  };
 237  
 238  static const ec_test_case ecdsa_secp256r1_sha3_256_test_case = {
 239  	.name = "ECDSA-SHA3_256/secp256r1",
 240  	.ec_str_p = &secp256r1_str_params,
 241  	.priv_key = ecdsa_secp256r1_sha3_256_test_vectors_priv_key,
 242  	.priv_key_len = sizeof(ecdsa_secp256r1_sha3_256_test_vectors_priv_key),
 243  	.nn_random = ecdsa_nn_random_secp256r1_sha3_256_test_vector,
 244  	.hash_type = SHA3_256,
 245  	.msg = (const char *)sha3_1600_bit_msg,
 246  	.msglen = sizeof(sha3_1600_bit_msg),
 247  	.sig_type = ECDSA,
 248  	.exp_sig = ecdsa_secp256r1_sha3_256_test_vectors_expected_sig,
 249  	.exp_siglen =
 250  		sizeof(ecdsa_secp256r1_sha3_256_test_vectors_expected_sig),
 251  	.adata = NULL,
 252  	.adata_len = 0
 253  };
 254  #endif /* WITH_CURVE_SECP256R1 */
 255  #endif /* WITH_HASH_SHA3_256 */
 256  
 257  #ifdef WITH_HASH_SHA3_512
 258  #ifdef WITH_CURVE_SECP256R1
 259  #define ECDSA_SHA3_512_SECP256R1_SELF_TEST
 260  
 261  /*
 262   * ECDSA secp256r1 test vector using SHA3_512. This test vector is intended
 263   * to test truncation (right shift) step in signature and verification
 264   * code when the output size of the hash function is larger than the
 265   * bit size of q (order of the group generated by the base point).
 266   */
 267  
 268  static int ecdsa_nn_random_secp256r1_sha3_512_test_vector(nn_t out, nn_src_t q)
 269  {
 270  	int ret, cmp;
 271  	const u8 k_buf[] = {
 272  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
 273  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
 274  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
 275  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
 276  	};
 277  
 278  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 279  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 280  
 281  	ret = (cmp >= 0) ? -1 : 0;
 282  
 283  err:
 284  	return ret;
 285  }
 286  
 287  static const u8 ecdsa_secp256r1_sha3_512_test_vectors_priv_key[] = {
 288  	0xDC, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
 289  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
 290  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
 291  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
 292  };
 293  
 294  static const u8 ecdsa_secp256r1_sha3_512_test_vectors_expected_sig[] = {
 295  	0xcb, 0x28, 0xe0, 0x99, 0x9b, 0x9c, 0x77, 0x15,
 296  	0xfd, 0x0a, 0x80, 0xd8, 0xe4, 0x7a, 0x77, 0x07,
 297  	0x97, 0x16, 0xcb, 0xbf, 0x91, 0x7d, 0xd7, 0x2e,
 298  	0x97, 0x56, 0x6e, 0xa1, 0xc0, 0x66, 0x95, 0x7c,
 299  
 300  	0x88, 0x48, 0x1a, 0x4f, 0x5b, 0xd4, 0xf6, 0x8f,
 301  	0xcf, 0xe0, 0xb3, 0x15, 0xc4, 0xd4, 0x0a, 0xf9,
 302  	0xd5, 0x31, 0x76, 0x97, 0xae, 0x29, 0x45, 0x47,
 303  	0xef, 0x7c, 0x8f, 0x01, 0x41, 0x24, 0xea, 0xff
 304  };
 305  
 306  static const ec_test_case ecdsa_secp256r1_sha3_512_test_case = {
 307  	.name = "ECDSA-SHA3_512/secp256r1",
 308  	.ec_str_p = &secp256r1_str_params,
 309  	.priv_key = ecdsa_secp256r1_sha3_512_test_vectors_priv_key,
 310  	.priv_key_len = sizeof(ecdsa_secp256r1_sha3_512_test_vectors_priv_key),
 311  	.nn_random = ecdsa_nn_random_secp256r1_sha3_512_test_vector,
 312  	.hash_type = SHA3_512,
 313  	.msg = (const char *)sha3_1600_bit_msg,
 314  	.msglen = sizeof(sha3_1600_bit_msg),
 315  	.sig_type = ECDSA,
 316  	.exp_sig = ecdsa_secp256r1_sha3_512_test_vectors_expected_sig,
 317  	.exp_siglen =
 318  		sizeof(ecdsa_secp256r1_sha3_512_test_vectors_expected_sig),
 319  	.adata = NULL,
 320  	.adata_len = 0
 321  };
 322  #endif /* WITH_CURVE_SECP256R1 */
 323  #endif /* WITH_HASH_SHA3_512 */
 324  
 325  #ifdef WITH_HASH_SHA3_384
 326  #ifdef WITH_CURVE_SECP384R1
 327  #define ECDSA_SHA3_384_SECP384R1_SELF_TEST
 328  
 329  /* ECDSA secp384r1 test vectors */
 330  
 331  static int ecdsa_nn_random_secp384r1_sha3_384_test_vector(nn_t out, nn_src_t q)
 332  {
 333  	int ret, cmp;
 334  
 335  	/*
 336  	 * Fixed ephemeral private key for secp384r1 signature
 337  	 * test vectors from RFC4754
 338  	 */
 339  	const u8 k_buf[] = {
 340  		0xB4, 0xB7, 0x4E, 0x44, 0xD7, 0x1A, 0x13, 0xD5,
 341  		0x68, 0x00, 0x3D, 0x74, 0x89, 0x90, 0x8D, 0x56,
 342  		0x4C, 0x77, 0x61, 0xE2, 0x29, 0xC5, 0x8C, 0xBF,
 343  		0xA1, 0x89, 0x50, 0x09, 0x6E, 0xB7, 0x46, 0x3B,
 344  		0x85, 0x4D, 0x7F, 0xA9, 0x92, 0xF9, 0x34, 0xD9,
 345  		0x27, 0x37, 0x62, 0x85, 0xE6, 0x34, 0x14, 0xFA
 346  	};
 347  
 348  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 349  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 350  
 351  	ret = (cmp >= 0) ? -1 : 0;
 352  
 353  err:
 354  	return ret;
 355  }
 356  
 357  static const u8 ecdsa_secp384r1_sha3_384_test_vectors_priv_key[] = {
 358  	0x0B, 0xEB, 0x64, 0x66, 0x34, 0xBA, 0x87, 0x73,
 359  	0x5D, 0x77, 0xAE, 0x48, 0x09, 0xA0, 0xEB, 0xEA,
 360  	0x86, 0x55, 0x35, 0xDE, 0x4C, 0x1E, 0x1D, 0xCB,
 361  	0x69, 0x2E, 0x84, 0x70, 0x8E, 0x81, 0xA5, 0xAF,
 362  	0x62, 0xE5, 0x28, 0xC3, 0x8B, 0x2A, 0x81, 0xB3,
 363  	0x53, 0x09, 0x66, 0x8D, 0x73, 0x52, 0x4D, 0x9F
 364  };
 365  
 366  static const u8 ecdsa_secp384r1_sha3_384_test_vectors_expected_sig[] = {
 367  	0xfb, 0x01, 0x7b, 0x91, 0x4e, 0x29, 0x14, 0x94,
 368  	0x32, 0xd8, 0xba, 0xc2, 0x9a, 0x51, 0x46, 0x40,
 369  	0xb4, 0x6f, 0x53, 0xdd, 0xab, 0x2c, 0x69, 0x94,
 370  	0x80, 0x84, 0xe2, 0x93, 0x0f, 0x1c, 0x8f, 0x7e,
 371  	0x08, 0xe0, 0x7c, 0x9c, 0x63, 0xf2, 0xd2, 0x1a,
 372  	0x07, 0xdc, 0xb5, 0x6a, 0x6a, 0xf5, 0x6e, 0xb3,
 373  
 374  	0xbe, 0x9b, 0x4f, 0x2b, 0x7b, 0x02, 0xca, 0xd3,
 375  	0xd0, 0xb4, 0x7c, 0xf6, 0x20, 0xfa, 0x26, 0xae,
 376  	0x24, 0x6c, 0x95, 0x86, 0x1d, 0xbe, 0x6b, 0x5d,
 377  	0xc5, 0xb3, 0xb3, 0xfb, 0xea, 0x96, 0x4f, 0xef,
 378  	0x48, 0xb7, 0x4b, 0x07, 0x4a, 0xdd, 0x6a, 0xc8,
 379  	0x8f, 0x4f, 0x3f, 0x9d, 0xdd, 0x3a, 0xa4, 0x1c
 380  };
 381  
 382  static const ec_test_case ecdsa_secp384r1_sha3_384_test_case = {
 383  	.name = "ECDSA-SHA3_384/secp384r1",
 384  	.ec_str_p = &secp384r1_str_params,
 385  	.priv_key = ecdsa_secp384r1_sha3_384_test_vectors_priv_key,
 386  	.priv_key_len = sizeof(ecdsa_secp384r1_sha3_384_test_vectors_priv_key),
 387  	.nn_random = ecdsa_nn_random_secp384r1_sha3_384_test_vector,
 388  	.hash_type = SHA3_384,
 389  	.msg = (const char *)sha3_1600_bit_msg,
 390  	.msglen = sizeof(sha3_1600_bit_msg),
 391  	.sig_type = ECDSA,
 392  	.exp_sig = ecdsa_secp384r1_sha3_384_test_vectors_expected_sig,
 393  	.exp_siglen =
 394  		sizeof(ecdsa_secp384r1_sha3_384_test_vectors_expected_sig),
 395  	.adata = NULL,
 396  	.adata_len = 0
 397  };
 398  #endif /* WITH_CURVE_SECP384R1 */
 399  #endif /* WITH_HASH_SHA3_384 */
 400  
 401  #ifdef WITH_HASH_SHA3_512
 402  #ifdef WITH_CURVE_SECP521R1
 403  #define ECDSA_SHA3_512_SECP521R1_SELF_TEST
 404  
 405  /* ECDSA secp521r1 test vectors */
 406  
 407  static int ecdsa_nn_random_secp521r1_sha3_512_test_vector(nn_t out, nn_src_t q)
 408  {
 409  	int ret, cmp;
 410  
 411  	/*
 412  	 * Fixed ephemeral private key for secp521r1 signature
 413  	 * test vectors from RFC4754
 414  	 */
 415  	const u8 k_buf[] = {
 416  		0x00, 0xC1, 0xC2, 0xB3, 0x05, 0x41, 0x9F, 0x5A,
 417  		0x41, 0x34, 0x4D, 0x7E, 0x43, 0x59, 0x93, 0x3D,
 418  		0x73, 0x40, 0x96, 0xF5, 0x56, 0x19, 0x7A, 0x9B,
 419  		0x24, 0x43, 0x42, 0xB8, 0xB6, 0x2F, 0x46, 0xF9,
 420  		0x37, 0x37, 0x78, 0xF9, 0xDE, 0x6B, 0x64, 0x97,
 421  		0xB1, 0xEF, 0x82, 0x5F, 0xF2, 0x4F, 0x42, 0xF9,
 422  		0xB4, 0xA4, 0xBD, 0x73, 0x82, 0xCF, 0xC3, 0x37,
 423  		0x8A, 0x54, 0x0B, 0x1B, 0x7F, 0x0C, 0x1B, 0x95,
 424  		0x6C, 0x2F
 425  	};
 426  
 427  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 428  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 429  
 430  	ret = (cmp >= 0) ? -1 : 0;
 431  
 432  err:
 433  	return ret;
 434  }
 435  
 436  static const u8 ecdsa_secp521r1_sha3_512_test_vectors_priv_key[] = {
 437  	0x00, 0x65, 0xFD, 0xA3, 0x40, 0x94, 0x51, 0xDC,
 438  	0xAB, 0x0A, 0x0E, 0xAD, 0x45, 0x49, 0x51, 0x12,
 439  	0xA3, 0xD8, 0x13, 0xC1, 0x7B, 0xFD, 0x34, 0xBD,
 440  	0xF8, 0xC1, 0x20, 0x9D, 0x7D, 0xF5, 0x84, 0x91,
 441  	0x20, 0x59, 0x77, 0x79, 0x06, 0x0A, 0x7F, 0xF9,
 442  	0xD7, 0x04, 0xAD, 0xF7, 0x8B, 0x57, 0x0F, 0xFA,
 443  	0xD6, 0xF0, 0x62, 0xE9, 0x5C, 0x7E, 0x0C, 0x5D,
 444  	0x54, 0x81, 0xC5, 0xB1, 0x53, 0xB4, 0x8B, 0x37,
 445  	0x5F, 0xA1
 446  };
 447  
 448  static const u8 ecdsa_secp521r1_sha3_512_test_vectors_expected_sig[] = {
 449  	0x01, 0x54, 0xfd, 0x38, 0x36, 0xaf, 0x92, 0xd0,
 450  	0xdc, 0xa5, 0x7d, 0xd5, 0x34, 0x1d, 0x30, 0x53,
 451  	0x98, 0x85, 0x34, 0xfd, 0xe8, 0x31, 0x8f, 0xc6,
 452  	0xaa, 0xaa, 0xb6, 0x8e, 0x2e, 0x6f, 0x43, 0x39,
 453  	0xb1, 0x9f, 0x2f, 0x28, 0x1a, 0x7e, 0x0b, 0x22,
 454  	0xc2, 0x69, 0xd9, 0x3c, 0xf8, 0x79, 0x4a, 0x92,
 455  	0x78, 0x88, 0x0e, 0xd7, 0xdb, 0xb8, 0xd9, 0x36,
 456  	0x2c, 0xae, 0xac, 0xee, 0x54, 0x43, 0x20, 0x55,
 457  	0x22, 0x51,
 458  	0x00, 0x15, 0xeb, 0xfd, 0xad, 0xf3, 0xf8, 0x00,
 459  	0x11, 0x51, 0x47, 0x9e, 0xec, 0xf4, 0x19, 0x53,
 460  	0x01, 0x56, 0xc2, 0x85, 0x62, 0x69, 0xc5, 0x24,
 461  	0x4c, 0x7a, 0xbd, 0xac, 0x36, 0xab, 0x45, 0xd0,
 462  	0xdc, 0xf5, 0xa5, 0xb5, 0x33, 0xff, 0xff, 0xa2,
 463  	0xa8, 0xbe, 0xea, 0xea, 0xda, 0x04, 0xc1, 0xc5,
 464  	0xc8, 0x1e, 0x99, 0xa1, 0xd7, 0x88, 0xc9, 0x24,
 465  	0x03, 0xe1, 0x78, 0x4a, 0x82, 0xcd, 0xd5, 0xe5,
 466  	0xfb, 0x27
 467  };
 468  
 469  static const ec_test_case ecdsa_secp521r1_sha3_512_test_case = {
 470  	.name = "ECDSA-SHA3_512/secp521r1",
 471  	.ec_str_p = &secp521r1_str_params,
 472  	.priv_key = ecdsa_secp521r1_sha3_512_test_vectors_priv_key,
 473  	.priv_key_len = sizeof(ecdsa_secp521r1_sha3_512_test_vectors_priv_key),
 474  	.nn_random = ecdsa_nn_random_secp521r1_sha3_512_test_vector,
 475  	.hash_type = SHA3_512,
 476  	.msg = (const char *)sha3_1600_bit_msg,
 477  	.msglen = sizeof(sha3_1600_bit_msg),
 478  	.sig_type = ECDSA,
 479  	.exp_sig = ecdsa_secp521r1_sha3_512_test_vectors_expected_sig,
 480  	.exp_siglen =
 481  		sizeof(ecdsa_secp521r1_sha3_512_test_vectors_expected_sig),
 482  	.adata = NULL,
 483  	.adata_len = 0
 484  };
 485  #endif /* WITH_CURVE_SECP521R1 */
 486  #endif /* WITH_HASH_SHA3_512 */
 487  
 488  #ifdef WITH_HASH_SHA224
 489  #ifdef WITH_CURVE_SECP192R1
 490  #define ECDSA_SHA224_SECP192R1_SELF_TEST
 491  
 492  /* ECDSA secp192r1 w/ sha224 test vectors to test truncation steps */
 493  
 494  static int ecdsa_nn_random_secp192r1_test_vector(nn_t out, nn_src_t q)
 495  {
 496  	int ret, cmp;
 497  
 498  	const u8 k_buf[] = {
 499  		0xFA, 0x6D, 0xE2, 0x97, 0x46, 0xBB, 0xEB, 0x7F,
 500  		0x8B, 0xB1, 0xE7, 0x61, 0xF8, 0x5F, 0x7D, 0xFB,
 501  		0x29, 0x83, 0x16, 0x9D, 0x82, 0xFA, 0x2F, 0x4E
 502  	};
 503  
 504  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 505  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 506  
 507  	ret = (cmp >= 0) ? -1 : 0;
 508  
 509  err:
 510  	return ret;
 511  }
 512  
 513  static const u8 ecdsa_secp192r1_test_vectors_priv_key[] = {
 514  	0x1A, 0x8D, 0x59, 0x8F, 0xC1, 0x5B, 0xF0, 0xFD,
 515  	0x89, 0x03, 0x0B, 0x5C, 0xB1, 0x11, 0x1A, 0xEB,
 516  	0x92, 0xAE, 0x8B, 0xAF, 0x5E, 0xA4, 0x75, 0xFB
 517  };
 518  
 519  static const u8 ecdsa_secp192r1_test_vectors_expected_sig[] = {
 520  	0x88, 0x50, 0x52, 0x38, 0x0F, 0xF1, 0x47, 0xB7,
 521  	0x34, 0xC3, 0x30, 0xC4, 0x3D, 0x39, 0xB2, 0xC4,
 522  	0xA8, 0x9F, 0x29, 0xB0, 0xF7, 0x49, 0xFE, 0xAD,
 523  
 524  	0x66, 0x63, 0xF2, 0x78, 0x36, 0x98, 0x7E, 0xED,
 525  	0x45, 0x85, 0x82, 0xD1, 0xF4, 0x43, 0x29, 0x3A,
 526  	0x5E, 0xD8, 0x88, 0x49, 0xB2, 0xFC, 0x5C, 0xD9
 527  };
 528  
 529  static const ec_test_case ecdsa_secp192r1_test_case = {
 530  	.name = "ECDSA-SHA224/secp192r1",
 531  	.ec_str_p = &secp192r1_str_params,
 532  	.priv_key = ecdsa_secp192r1_test_vectors_priv_key,
 533  	.priv_key_len = sizeof(ecdsa_secp192r1_test_vectors_priv_key),
 534  	.nn_random = ecdsa_nn_random_secp192r1_test_vector,
 535  	.hash_type = SHA224,
 536  	.msg = "abc",
 537  	.msglen = 3,
 538  	.sig_type = ECDSA,
 539  	.exp_sig = ecdsa_secp192r1_test_vectors_expected_sig,
 540  	.exp_siglen = sizeof(ecdsa_secp192r1_test_vectors_expected_sig),
 541  	.adata = NULL,
 542  	.adata_len = 0
 543  };
 544  #endif /* WITH_CURVE_SECP192R1 */
 545  #endif /* WITH_HASH_SHA224 */
 546  
 547  #ifdef WITH_HASH_SHA224
 548  #ifdef WITH_CURVE_SECP224R1
 549  #define ECDSA_SHA224_SECP224R1_SELF_TEST
 550  
 551  /* ECDSA secp224r1 test vectors */
 552  
 553  static int ecdsa_nn_random_rfc4754_secp224r1_test_vector(nn_t out, nn_src_t q)
 554  {
 555  	int ret, cmp;
 556  
 557  	/*
 558  	 * Fixed ephemeral private key for secp224r1 signature
 559  	 * test vectors from RFC4754
 560  	 */
 561  	const u8 k_buf[] = {
 562  		0xb7, 0x63, 0x8a, 0x22, 0xe5, 0xee, 0xe7, 0x76,
 563  		0xa4, 0x25, 0x3f, 0x97, 0xe8, 0x35, 0x1a, 0x3c,
 564  		0x94, 0xb0, 0x19, 0x37, 0x66, 0x2a, 0x0e, 0xbd,
 565  		0xd6, 0xe7, 0xae, 0xe0
 566  	};
 567  
 568  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 569  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 570  
 571  	ret = (cmp >= 0) ? -1 : 0;
 572  
 573  err:
 574  	return ret;
 575  }
 576  
 577  static const u8 ecdsa_secp224r1_test_vectors_priv_key[] = {
 578  	0xc3, 0x1a, 0x15, 0x2d, 0x2c, 0x62, 0x40, 0x21,
 579  	0x80, 0x87, 0x55, 0xb2, 0xcb, 0xdf, 0x80, 0xd3,
 580  	0x09, 0xe3, 0x6a, 0xea, 0xc1, 0xcc, 0xd9, 0xdb,
 581  	0x82, 0xb1, 0xd7, 0xc3
 582  };
 583  
 584  static const u8 ecdsa_secp224r1_test_vectors_expected_sig[] = {
 585  	0x56, 0xa6, 0x93, 0xe1, 0x20, 0x0a, 0xa8, 0xe3,
 586  	0xd2, 0x78, 0x07, 0xba, 0x5c, 0xe7, 0xb8, 0xf7,
 587  	0xdf, 0x24, 0xa6, 0x65, 0x1e, 0xb8, 0x70, 0x6e,
 588  	0x65, 0x52, 0x49, 0xd4,
 589  	0x4e, 0x49, 0xa0, 0x37, 0x9d, 0x04, 0x4f, 0x34,
 590  	0x82, 0xe5, 0x68, 0x32, 0x45, 0x84, 0x23, 0xcf,
 591  	0x0a, 0xef, 0xef, 0xe9, 0x08, 0x1b, 0x6b, 0xc7,
 592  	0x80, 0x5e, 0x18, 0xea
 593  };
 594  
 595  static const ec_test_case ecdsa_secp224r1_test_case = {
 596  	.name = "ECDSA-SHA224/secp224r1",
 597  	.ec_str_p = &secp224r1_str_params,
 598  	.priv_key = ecdsa_secp224r1_test_vectors_priv_key,
 599  	.priv_key_len = sizeof(ecdsa_secp224r1_test_vectors_priv_key),
 600  	.nn_random = ecdsa_nn_random_rfc4754_secp224r1_test_vector,
 601  	.hash_type = SHA224,
 602  	.msg = "abc",
 603  	.msglen = 3,
 604  	.sig_type = ECDSA,
 605  	.exp_sig = ecdsa_secp224r1_test_vectors_expected_sig,
 606  	.exp_siglen = sizeof(ecdsa_secp224r1_test_vectors_expected_sig),
 607  	.adata = NULL,
 608  	.adata_len = 0
 609  };
 610  #endif /* WITH_CURVE_SECP224R1 */
 611  #endif /* WITH_HASH_SHA224 */
 612  
 613  #ifdef WITH_HASH_SHA256
 614  #ifdef WITH_CURVE_SECP256R1
 615  #define ECDSA_SHA256_SECP256R1_SELF_TEST
 616  
 617  /* ECDSA secp256r1 test vectors */
 618  
 619  static int ecdsa_nn_random_rfc4754_secp256r1_test_vector(nn_t out, nn_src_t q)
 620  {
 621  	int ret, cmp;
 622  
 623  	/*
 624  	 * Fixed ephemeral private key for secp256r1 signature
 625  	 * test vectors from RFC4754
 626  	 */
 627  	const u8 k_buf[] = {
 628  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
 629  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
 630  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
 631  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
 632  	};
 633  
 634  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 635  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 636  
 637  	ret = (cmp >= 0) ? -1 : 0;
 638  
 639  err:
 640  	return ret;
 641  }
 642  
 643  static const u8 ecdsa_secp256r1_test_vectors_priv_key[] = {
 644  	0xDC, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
 645  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
 646  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
 647  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
 648  };
 649  
 650  static const u8 ecdsa_secp256r1_test_vectors_expected_sig[] = {
 651  	0xCB, 0x28, 0xE0, 0x99, 0x9B, 0x9C, 0x77, 0x15,
 652  	0xFD, 0x0A, 0x80, 0xD8, 0xE4, 0x7A, 0x77, 0x07,
 653  	0x97, 0x16, 0xCB, 0xBF, 0x91, 0x7D, 0xD7, 0x2E,
 654  	0x97, 0x56, 0x6E, 0xA1, 0xC0, 0x66, 0x95, 0x7C,
 655  	0x86, 0xFA, 0x3B, 0xB4, 0xE2, 0x6C, 0xAD, 0x5B,
 656  	0xF9, 0x0B, 0x7F, 0x81, 0x89, 0x92, 0x56, 0xCE,
 657  	0x75, 0x94, 0xBB, 0x1E, 0xA0, 0xC8, 0x92, 0x12,
 658  	0x74, 0x8B, 0xFF, 0x3B, 0x3D, 0x5B, 0x03, 0x15
 659  };
 660  
 661  static const ec_test_case ecdsa_secp256r1_test_case = {
 662  	.name = "ECDSA-SHA256/secp256r1",
 663  	.ec_str_p = &secp256r1_str_params,
 664  	.priv_key = ecdsa_secp256r1_test_vectors_priv_key,
 665  	.priv_key_len = sizeof(ecdsa_secp256r1_test_vectors_priv_key),
 666  	.nn_random = ecdsa_nn_random_rfc4754_secp256r1_test_vector,
 667  	.hash_type = SHA256,
 668  	.msg = "abc",
 669  	.msglen = 3,
 670  	.sig_type = ECDSA,
 671  	.exp_sig = ecdsa_secp256r1_test_vectors_expected_sig,
 672  	.exp_siglen = sizeof(ecdsa_secp256r1_test_vectors_expected_sig),
 673  	.adata = NULL,
 674  	.adata_len = 0
 675  };
 676  #endif /* WITH_CURVE_SECP256R1 */
 677  #endif /* WITH_HASH_SHA256 */
 678  
 679  #ifdef WITH_HASH_SHA512
 680  #ifdef WITH_CURVE_SECP256R1
 681  #define ECDSA_SHA512_SECP256R1_SELF_TEST
 682  
 683  /*
 684   * ECDSA secp256r1 test vector using SHA512. This test vector is intended
 685   * to test truncation (right shift) step in signature and verification
 686   * code when the output size of the hash function is larger than the
 687   * bit size of q (order of the group generated by the base point).
 688   */
 689  
 690  static int ecdsa_nn_random_secp256r1_sha512_test_vector(nn_t out, nn_src_t q)
 691  {
 692  	int ret, cmp;
 693  
 694  	const u8 k_buf[] = {
 695  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
 696  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
 697  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
 698  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
 699  	};
 700  
 701  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 702  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 703  
 704  	ret = (cmp >= 0) ? -1 : 0;
 705  
 706  err:
 707  	return ret;
 708  }
 709  
 710  static const u8 ecdsa_secp256r1_sha512_test_vectors_priv_key[] = {
 711  	0xDC, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
 712  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
 713  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
 714  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
 715  };
 716  
 717  static const u8 ecdsa_secp256r1_sha512_test_vectors_expected_sig[] = {
 718  	0xcb, 0x28, 0xe0, 0x99, 0x9b, 0x9c, 0x77, 0x15,
 719  	0xfd, 0x0a, 0x80, 0xd8, 0xe4, 0x7a, 0x77, 0x07,
 720  	0x97, 0x16, 0xcb, 0xbf, 0x91, 0x7d, 0xd7, 0x2e,
 721  	0x97, 0x56, 0x6e, 0xa1, 0xc0, 0x66, 0x95, 0x7c,
 722  	0x78, 0x84, 0x35, 0x83, 0x06, 0xaf, 0xd1, 0xc8,
 723  	0xa2, 0xa5, 0xf8, 0xee, 0x73, 0xe4, 0x22, 0x6f,
 724  	0x1f, 0x6a, 0x14, 0xec, 0xaf, 0x2d, 0xe3, 0x0e,
 725  	0xde, 0x1e, 0xb4, 0xe9, 0xe2, 0xf6, 0x8d, 0x3a
 726  };
 727  
 728  static const ec_test_case ecdsa_secp256r1_sha512_test_case = {
 729  	.name = "ECDSA-SHA512/secp256r1",
 730  	.ec_str_p = &secp256r1_str_params,
 731  	.priv_key = ecdsa_secp256r1_sha512_test_vectors_priv_key,
 732  	.priv_key_len = sizeof(ecdsa_secp256r1_sha512_test_vectors_priv_key),
 733  	.nn_random = ecdsa_nn_random_secp256r1_sha512_test_vector,
 734  	.hash_type = SHA512,
 735  	.msg = "abc",
 736  	.msglen = 3,
 737  	.sig_type = ECDSA,
 738  	.exp_sig = ecdsa_secp256r1_sha512_test_vectors_expected_sig,
 739  	.exp_siglen = sizeof(ecdsa_secp256r1_sha512_test_vectors_expected_sig),
 740  	.adata = NULL,
 741  	.adata_len = 0
 742  };
 743  #endif /* WITH_CURVE_SECP256R1 */
 744  #endif /* WITH_HASH_SHA512 */
 745  
 746  #ifdef WITH_HASH_SHA384
 747  #ifdef WITH_CURVE_SECP384R1
 748  #define ECDSA_SHA384_SECP384R1_SELF_TEST
 749  
 750  /* ECDSA secp384r1 test vectors */
 751  
 752  static int ecdsa_nn_random_rfc4754_secp384r1_test_vector(nn_t out, nn_src_t q)
 753  {
 754  	int ret, cmp;
 755  
 756  	/*
 757  	 * Fixed ephemeral private key for secp384r1 signature
 758  	 * test vectors from RFC4754
 759  	 */
 760  	const u8 k_buf[] = {
 761  		0xB4, 0xB7, 0x4E, 0x44, 0xD7, 0x1A, 0x13, 0xD5,
 762  		0x68, 0x00, 0x3D, 0x74, 0x89, 0x90, 0x8D, 0x56,
 763  		0x4C, 0x77, 0x61, 0xE2, 0x29, 0xC5, 0x8C, 0xBF,
 764  		0xA1, 0x89, 0x50, 0x09, 0x6E, 0xB7, 0x46, 0x3B,
 765  		0x85, 0x4D, 0x7F, 0xA9, 0x92, 0xF9, 0x34, 0xD9,
 766  		0x27, 0x37, 0x62, 0x85, 0xE6, 0x34, 0x14, 0xFA
 767  	};
 768  
 769  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 770  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 771  
 772  	ret = (cmp >= 0) ? -1 : 0;
 773  
 774  err:
 775  	return ret;
 776  }
 777  
 778  static const u8 ecdsa_secp384r1_test_vectors_priv_key[] = {
 779  	0x0B, 0xEB, 0x64, 0x66, 0x34, 0xBA, 0x87, 0x73,
 780  	0x5D, 0x77, 0xAE, 0x48, 0x09, 0xA0, 0xEB, 0xEA,
 781  	0x86, 0x55, 0x35, 0xDE, 0x4C, 0x1E, 0x1D, 0xCB,
 782  	0x69, 0x2E, 0x84, 0x70, 0x8E, 0x81, 0xA5, 0xAF,
 783  	0x62, 0xE5, 0x28, 0xC3, 0x8B, 0x2A, 0x81, 0xB3,
 784  	0x53, 0x09, 0x66, 0x8D, 0x73, 0x52, 0x4D, 0x9F
 785  };
 786  
 787  static const u8 ecdsa_secp384r1_test_vectors_expected_sig[] = {
 788  	0xFB, 0x01, 0x7B, 0x91, 0x4E, 0x29, 0x14, 0x94,
 789  	0x32, 0xD8, 0xBA, 0xC2, 0x9A, 0x51, 0x46, 0x40,
 790  	0xB4, 0x6F, 0x53, 0xDD, 0xAB, 0x2C, 0x69, 0x94,
 791  	0x80, 0x84, 0xE2, 0x93, 0x0F, 0x1C, 0x8F, 0x7E,
 792  	0x08, 0xE0, 0x7C, 0x9C, 0x63, 0xF2, 0xD2, 0x1A,
 793  	0x07, 0xDC, 0xB5, 0x6A, 0x6A, 0xF5, 0x6E, 0xB3,
 794  	0xB2, 0x63, 0xA1, 0x30, 0x5E, 0x05, 0x7F, 0x98,
 795  	0x4D, 0x38, 0x72, 0x6A, 0x1B, 0x46, 0x87, 0x41,
 796  	0x09, 0xF4, 0x17, 0xBC, 0xA1, 0x12, 0x67, 0x4C,
 797  	0x52, 0x82, 0x62, 0xA4, 0x0A, 0x62, 0x9A, 0xF1,
 798  	0xCB, 0xB9, 0xF5, 0x16, 0xCE, 0x0F, 0xA7, 0xD2,
 799  	0xFF, 0x63, 0x08, 0x63, 0xA0, 0x0E, 0x8B, 0x9F
 800  };
 801  
 802  static const ec_test_case ecdsa_secp384r1_test_case = {
 803  	.name = "ECDSA-SHA384/secp384r1",
 804  	.ec_str_p = &secp384r1_str_params,
 805  	.priv_key = ecdsa_secp384r1_test_vectors_priv_key,
 806  	.priv_key_len = sizeof(ecdsa_secp384r1_test_vectors_priv_key),
 807  	.nn_random = ecdsa_nn_random_rfc4754_secp384r1_test_vector,
 808  	.hash_type = SHA384,
 809  	.msg = "abc",
 810  	.msglen = 3,
 811  	.sig_type = ECDSA,
 812  	.exp_sig = ecdsa_secp384r1_test_vectors_expected_sig,
 813  	.exp_siglen = sizeof(ecdsa_secp384r1_test_vectors_expected_sig),
 814  	.adata = NULL,
 815  	.adata_len = 0
 816  };
 817  #endif /* WITH_CURVE_SECP384R1 */
 818  #endif /* WITH_HASH_SHA384 */
 819  
 820  #ifdef WITH_HASH_SHA512
 821  #ifdef WITH_CURVE_SECP521R1
 822  #define ECDSA_SHA512_SECP521R1_SELF_TEST
 823  
 824  /* ECDSA secp521r1 test vectors */
 825  
 826  static int ecdsa_nn_random_secp521r1_test_vector(nn_t out, nn_src_t q)
 827  {
 828  	int ret, cmp;
 829  
 830  	/*
 831  	 * Fixed ephemeral private key for secp521r1 signature
 832  	 * test vectors from RFC4754
 833  	 */
 834  	const u8 k_buf[] = {
 835  		0x00, 0xC1, 0xC2, 0xB3, 0x05, 0x41, 0x9F, 0x5A,
 836  		0x41, 0x34, 0x4D, 0x7E, 0x43, 0x59, 0x93, 0x3D,
 837  		0x73, 0x40, 0x96, 0xF5, 0x56, 0x19, 0x7A, 0x9B,
 838  		0x24, 0x43, 0x42, 0xB8, 0xB6, 0x2F, 0x46, 0xF9,
 839  		0x37, 0x37, 0x78, 0xF9, 0xDE, 0x6B, 0x64, 0x97,
 840  		0xB1, 0xEF, 0x82, 0x5F, 0xF2, 0x4F, 0x42, 0xF9,
 841  		0xB4, 0xA4, 0xBD, 0x73, 0x82, 0xCF, 0xC3, 0x37,
 842  		0x8A, 0x54, 0x0B, 0x1B, 0x7F, 0x0C, 0x1B, 0x95,
 843  		0x6C, 0x2F
 844  	};
 845  
 846  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 847  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 848  
 849  	ret = (cmp >= 0) ? -1 : 0;
 850  
 851  err:
 852  	return ret;
 853  }
 854  
 855  static const u8 ecdsa_secp521r1_test_vectors_priv_key[] = {
 856  	0x00, 0x65, 0xFD, 0xA3, 0x40, 0x94, 0x51, 0xDC,
 857  	0xAB, 0x0A, 0x0E, 0xAD, 0x45, 0x49, 0x51, 0x12,
 858  	0xA3, 0xD8, 0x13, 0xC1, 0x7B, 0xFD, 0x34, 0xBD,
 859  	0xF8, 0xC1, 0x20, 0x9D, 0x7D, 0xF5, 0x84, 0x91,
 860  	0x20, 0x59, 0x77, 0x79, 0x06, 0x0A, 0x7F, 0xF9,
 861  	0xD7, 0x04, 0xAD, 0xF7, 0x8B, 0x57, 0x0F, 0xFA,
 862  	0xD6, 0xF0, 0x62, 0xE9, 0x5C, 0x7E, 0x0C, 0x5D,
 863  	0x54, 0x81, 0xC5, 0xB1, 0x53, 0xB4, 0x8B, 0x37,
 864  	0x5F, 0xA1
 865  };
 866  
 867  static const u8 ecdsa_secp521r1_test_vectors_expected_sig[] = {
 868  	0x01, 0x54, 0xFD, 0x38, 0x36, 0xAF, 0x92, 0xD0,
 869  	0xDC, 0xA5, 0x7D, 0xD5, 0x34, 0x1D, 0x30, 0x53,
 870  	0x98, 0x85, 0x34, 0xFD, 0xE8, 0x31, 0x8F, 0xC6,
 871  	0xAA, 0xAA, 0xB6, 0x8E, 0x2E, 0x6F, 0x43, 0x39,
 872  	0xB1, 0x9F, 0x2F, 0x28, 0x1A, 0x7E, 0x0B, 0x22,
 873  	0xC2, 0x69, 0xD9, 0x3C, 0xF8, 0x79, 0x4A, 0x92,
 874  	0x78, 0x88, 0x0E, 0xD7, 0xDB, 0xB8, 0xD9, 0x36,
 875  	0x2C, 0xAE, 0xAC, 0xEE, 0x54, 0x43, 0x20, 0x55,
 876  	0x22, 0x51, 0x01, 0x77, 0x05, 0xA7, 0x03, 0x02,
 877  	0x90, 0xD1, 0xCE, 0xB6, 0x05, 0xA9, 0xA1, 0xBB,
 878  	0x03, 0xFF, 0x9C, 0xDD, 0x52, 0x1E, 0x87, 0xA6,
 879  	0x96, 0xEC, 0x92, 0x6C, 0x8C, 0x10, 0xC8, 0x36,
 880  	0x2D, 0xF4, 0x97, 0x53, 0x67, 0x10, 0x1F, 0x67,
 881  	0xD1, 0xCF, 0x9B, 0xCC, 0xBF, 0x2F, 0x3D, 0x23,
 882  	0x95, 0x34, 0xFA, 0x50, 0x9E, 0x70, 0xAA, 0xC8,
 883  	0x51, 0xAE, 0x01, 0xAA, 0xC6, 0x8D, 0x62, 0xF8,
 884  	0x66, 0x47, 0x26, 0x60
 885  };
 886  
 887  static const ec_test_case ecdsa_secp521r1_test_case = {
 888  	.name = "ECDSA-SHA512/secp521r1",
 889  	.ec_str_p = &secp521r1_str_params,
 890  	.priv_key = ecdsa_secp521r1_test_vectors_priv_key,
 891  	.priv_key_len = sizeof(ecdsa_secp521r1_test_vectors_priv_key),
 892  	.nn_random = ecdsa_nn_random_secp521r1_test_vector,
 893  	.hash_type = SHA512,
 894  	.msg = "abc",
 895  	.msglen = 3,
 896  	.sig_type = ECDSA,
 897  	.exp_sig = ecdsa_secp521r1_test_vectors_expected_sig,
 898  	.exp_siglen = sizeof(ecdsa_secp521r1_test_vectors_expected_sig),
 899  	.adata = NULL,
 900  	.adata_len = 0
 901  };
 902  #endif /* WITH_CURVE_SECP521R1 */
 903  #endif /* WITH_HASH_SHA512 */
 904  
 905  #ifdef WITH_HASH_SHA256
 906  #ifdef WITH_CURVE_BRAINPOOLP256R1
 907  #define ECDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
 908  
 909  /* ECDSA Brainpoolp256r1 test vectors */
 910  
 911  static int ecdsa_nn_random_brainpoolp256r1_test_vector(nn_t out, nn_src_t q)
 912  {
 913  	int ret, cmp;
 914  
 915  	/*
 916  	 * Fixed ephemeral private key for brainpoolp256r1 signature
 917  	 */
 918  	const u8 k_buf[] = {
 919  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
 920  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
 921  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
 922  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
 923  	};
 924  
 925  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 926  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 927  
 928  	ret = (cmp >= 0) ? -1 : 0;
 929  
 930  err:
 931  	return ret;
 932  }
 933  
 934  static const u8 ecdsa_brainpoolp256r1_test_vectors_priv_key[] = {
 935  	0x00, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
 936  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
 937  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
 938  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
 939  };
 940  
 941  static const u8 ecdsa_brainpoolp256r1_test_vectors_expected_sig[] = {
 942  	0xa3, 0xfa, 0x53, 0x9a, 0xc2, 0xcf, 0xfb, 0xd5,
 943  	0xc5, 0xad, 0xb6, 0x64, 0x8c, 0xb3, 0xb5, 0xe3,
 944  	0x6a, 0x08, 0x7d, 0xcc, 0xd5, 0xda, 0xae, 0x8a,
 945  	0x05, 0x87, 0xac, 0x37, 0x88, 0x78, 0x79, 0xb5,
 946  	0xa7, 0xff, 0x72, 0xa9, 0xd8, 0x5c, 0x6e, 0xdd,
 947  	0x48, 0x56, 0x2e, 0x8c, 0xd8, 0xf7, 0x6d, 0xab,
 948  	0xe3, 0xdb, 0xc3, 0x96, 0x05, 0x69, 0xdf, 0x5d,
 949  	0x13, 0xf9, 0x83, 0x5c, 0xf4, 0xca, 0x72, 0x3b
 950  };
 951  
 952  static const ec_test_case ecdsa_brainpoolp256r1_test_case = {
 953  	.name = "ECDSA-SHA256/brainpoolp256r1",
 954  	.ec_str_p = &brainpoolp256r1_str_params,
 955  	.priv_key = ecdsa_brainpoolp256r1_test_vectors_priv_key,
 956  	.priv_key_len = sizeof(ecdsa_brainpoolp256r1_test_vectors_priv_key),
 957  	.nn_random = ecdsa_nn_random_brainpoolp256r1_test_vector,
 958  	.hash_type = SHA256,
 959  	.msg = "abc",
 960  	.msglen = 3,
 961  	.sig_type = ECDSA,
 962  	.exp_sig = ecdsa_brainpoolp256r1_test_vectors_expected_sig,
 963  	.exp_siglen = sizeof(ecdsa_brainpoolp256r1_test_vectors_expected_sig),
 964  	.adata = NULL,
 965  	.adata_len = 0
 966  };
 967  
 968  #endif /* WITH_CURVE_BRAINPOOLP256R1 */
 969  #endif /* WITH_HASH_SHA256 */
 970  
 971  #ifdef WITH_HASH_SHA384
 972  #ifdef WITH_CURVE_BRAINPOOLP384R1
 973  #define ECDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
 974  
 975  /* ECDSA Brainpoolp384r1 test vectors */
 976  
 977  static int ecdsa_nn_random_brainpoolp384r1_test_vector(nn_t out, nn_src_t q)
 978  {
 979  	int ret, cmp;
 980  
 981  	/*
 982  	 * Fixed ephemeral private key for brainpoolp384r1 signature
 983  	 */
 984  	const u8 k_buf[] = {
 985  		0x87, 0x77, 0x2f, 0x94, 0x81, 0x26, 0xe2, 0x38,
 986  		0x04, 0xec, 0x30, 0x71, 0x34, 0x94, 0x74, 0x84,
 987  		0x2c, 0x21, 0x08, 0x6b, 0xf2, 0x91, 0xfb, 0x33,
 988  		0x02, 0xc2, 0x54, 0x82, 0x6c, 0x14, 0xc0, 0xa8,
 989  		0x5d, 0x66, 0x03, 0x0b, 0xe9, 0x0b, 0xfe, 0x51,
 990  		0xd4, 0x53, 0x0a, 0x55, 0xfd, 0x61, 0x51, 0x21
 991  	};
 992  
 993  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
 994  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
 995  
 996  	ret = (cmp >= 0) ? -1 : 0;
 997  
 998  err:
 999  	return ret;
1000  }
1001  
1002  static const u8 ecdsa_brainpoolp384r1_test_vectors_priv_key[] = {
1003  	0x22, 0xde, 0x1b, 0x4e, 0x46, 0xdf, 0x58, 0x37,
1004  	0xe0, 0x08, 0xa2, 0x67, 0x7a, 0xc6, 0x25, 0x6a,
1005  	0xf3, 0x0e, 0xd1, 0xd9, 0x58, 0xe8, 0xa4, 0xee,
1006  	0xd5, 0x02, 0x0a, 0xef, 0xbb, 0xf7, 0x90, 0x6e,
1007  	0x35, 0x99, 0x43, 0xda, 0x81, 0xcc, 0x37, 0xdf,
1008  	0xcf, 0x03, 0x83, 0x64, 0xf3, 0x96, 0x13, 0x5a
1009  };
1010  
1011  static const u8 ecdsa_brainpoolp384r1_test_vectors_expected_sig[] = {
1012  	0x84, 0xa4, 0xe3, 0xa5, 0xdb, 0x1a, 0x93, 0x1f,
1013  	0x77, 0x3e, 0x55, 0xfb, 0xa3, 0x69, 0xc3, 0x6d,
1014  	0x21, 0x92, 0xb4, 0x7d, 0xf8, 0x5d, 0x05, 0x20,
1015  	0x80, 0x23, 0xdb, 0xaa, 0x15, 0x5f, 0xfe, 0xcc,
1016  	0xf9, 0xc0, 0x8f, 0xf1, 0xba, 0x79, 0xe0, 0x13,
1017  	0x1e, 0xb4, 0x2c, 0x13, 0xa8, 0x17, 0x99, 0xd6,
1018  
1019  	0x06, 0x9e, 0x3e, 0x95, 0x40, 0x80, 0xba, 0xef,
1020  	0xfe, 0x3b, 0x73, 0xb1, 0xb9, 0x35, 0xa5, 0x60,
1021  	0x27, 0x21, 0xa1, 0xd0, 0x0e, 0xe1, 0x12, 0xc0,
1022  	0x86, 0x0b, 0xfc, 0xea, 0x93, 0x37, 0x33, 0xca,
1023  	0x48, 0xd3, 0xae, 0xd8, 0xf7, 0x02, 0xdc, 0x86,
1024  	0x2b, 0x18, 0x2b, 0x12, 0x8c, 0x8f, 0x3a, 0x4c,
1025  };
1026  
1027  static const ec_test_case ecdsa_brainpoolp384r1_test_case = {
1028  	.name = "ECDSA-SHA384/brainpoolp384r1",
1029  	.ec_str_p = &brainpoolp384r1_str_params,
1030  	.priv_key = ecdsa_brainpoolp384r1_test_vectors_priv_key,
1031  	.priv_key_len = sizeof(ecdsa_brainpoolp384r1_test_vectors_priv_key),
1032  	.nn_random = ecdsa_nn_random_brainpoolp384r1_test_vector,
1033  	.hash_type = SHA384,
1034  	.msg = "abc",
1035  	.msglen = 3,
1036  	.sig_type = ECDSA,
1037  	.exp_sig = ecdsa_brainpoolp384r1_test_vectors_expected_sig,
1038  	.exp_siglen = sizeof(ecdsa_brainpoolp384r1_test_vectors_expected_sig),
1039  	.adata = NULL,
1040  	.adata_len = 0
1041  };
1042  
1043  #endif /* WITH_CURVE_BRAINPOOLP384R1 */
1044  #endif /* WITH_HASH_SHA384 */
1045  
1046  #ifdef WITH_HASH_SHA512
1047  #ifdef WITH_CURVE_BRAINPOOLP512R1
1048  #define ECDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
1049  
1050  /* ECDSA Brainpoolp512r1 test vectors */
1051  
1052  static int ecdsa_nn_random_brainpoolp512r1_test_vector(nn_t out, nn_src_t q)
1053  {
1054  	int ret, cmp;
1055  
1056  	/*
1057  	 * Fixed ephemeral private key for brainpoolp512r1 signature
1058  	 */
1059  	const u8 k_buf[] = {
1060  		0x00, 0xC1, 0xC2, 0xB3, 0x05, 0x41, 0x9F, 0x5A,
1061  		0x41, 0x34, 0x4D, 0x7E, 0x43, 0x59, 0x93, 0x3D,
1062  		0x73, 0x40, 0x96, 0xF5, 0x56, 0x19, 0x7A, 0x9B,
1063  		0x24, 0x43, 0x42, 0xB8, 0xB6, 0x2F, 0x46, 0xF9,
1064  		0x37, 0x37, 0x78, 0xF9, 0xDE, 0x6B, 0x64, 0x97,
1065  		0xB1, 0xEF, 0x82, 0x5F, 0xF2, 0x4F, 0x42, 0xF9,
1066  		0xB4, 0xA4, 0xBD, 0x73, 0x82, 0xCF, 0xC3, 0x37,
1067  		0x8A, 0x54, 0x0B, 0x1B, 0x7F, 0x0C, 0x1B, 0x95
1068  	};
1069  
1070  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1071  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1072  
1073  	ret = (cmp >= 0) ? -1 : 0;
1074  
1075  err:
1076  	return ret;
1077  }
1078  
1079  static const u8 ecdsa_brainpoolp512r1_test_vectors_priv_key[] = {
1080  	0x01, 0xA3, 0x40, 0x94, 0x51, 0xDC, 0xAB, 0x0A,
1081  	0x0E, 0xAD, 0x45, 0x49, 0x51, 0x12, 0xA3, 0xD8,
1082  	0x13, 0xC1, 0x7B, 0xFD, 0x34, 0xBD, 0xF8, 0xC1,
1083  	0x20, 0x9D, 0x7D, 0xF5, 0x84, 0x91, 0x20, 0x59,
1084  	0x77, 0x79, 0x06, 0x0A, 0x7F, 0xF9, 0xD7, 0x04,
1085  	0xAD, 0xF7, 0x8B, 0x57, 0x0F, 0xFA, 0xD6, 0xF0,
1086  	0x62, 0xE9, 0x5C, 0x7E, 0x0C, 0x5D, 0x54, 0x81,
1087  	0xC5, 0xB1, 0x53, 0xB4, 0x8B, 0x37, 0x5F, 0xA1
1088  };
1089  
1090  static const u8 ecdsa_brainpoolp512r1_test_vectors_expected_sig[] = {
1091  	0x34, 0x83, 0xdd, 0x62, 0x64, 0xab, 0x50, 0xc3,
1092  	0x7c, 0x01, 0x89, 0x96, 0xf2, 0x18, 0x3f, 0x31,
1093  	0x19, 0xb4, 0xd5, 0x8a, 0x71, 0xba, 0x96, 0xee,
1094  	0x4f, 0x1d, 0x69, 0x0d, 0x06, 0xff, 0x04, 0xe7,
1095  	0x62, 0xc3, 0x7c, 0x87, 0xac, 0xcb, 0x1b, 0xcb,
1096  	0xc6, 0xe1, 0x50, 0x57, 0x7f, 0xd9, 0xa5, 0xd5,
1097  	0xfc, 0x64, 0xc9, 0xaa, 0x21, 0x2f, 0x43, 0xac,
1098  	0x36, 0xeb, 0xaa, 0xb1, 0x10, 0x5b, 0xe0, 0x37,
1099  	0xa9, 0x70, 0xb3, 0xd3, 0x80, 0x1d, 0x51, 0x3d,
1100  	0x38, 0x9d, 0x9c, 0x80, 0x76, 0xd9, 0x99, 0x6f,
1101  	0xad, 0x0f, 0xc7, 0xf8, 0x67, 0x40, 0xc2, 0x28,
1102  	0x1c, 0xe3, 0xfb, 0xae, 0x71, 0x82, 0xd3, 0xe8,
1103  	0x5c, 0xb2, 0x24, 0xec, 0x88, 0xb5, 0x81, 0x2a,
1104  	0xb1, 0x15, 0x32, 0xfd, 0x01, 0x7c, 0x94, 0xed,
1105  	0xd7, 0x8c, 0xa6, 0x32, 0x1e, 0x24, 0x94, 0xa7,
1106  	0x38, 0xd0, 0xea, 0xc8, 0x34, 0x05, 0xb9, 0x9b
1107  };
1108  
1109  static const ec_test_case ecdsa_brainpoolp512r1_test_case = {
1110  	.name = "ECDSA-SHA512/brainpoolp512r1",
1111  	.ec_str_p = &brainpoolp512r1_str_params,
1112  	.priv_key = ecdsa_brainpoolp512r1_test_vectors_priv_key,
1113  	.priv_key_len = sizeof(ecdsa_brainpoolp512r1_test_vectors_priv_key),
1114  	.nn_random = ecdsa_nn_random_brainpoolp512r1_test_vector,
1115  	.hash_type = SHA512,
1116  	.msg = "abc",
1117  	.msglen = 3,
1118  	.sig_type = ECDSA,
1119  	.exp_sig = ecdsa_brainpoolp512r1_test_vectors_expected_sig,
1120  	.exp_siglen = sizeof(ecdsa_brainpoolp512r1_test_vectors_expected_sig),
1121  	.adata = NULL,
1122  	.adata_len = 0
1123  };
1124  #endif /* WITH_CURVE_BRAINPOOLP512R1 */
1125  #endif /* WITH_HASH_SHA512 */
1126  
1127  #ifdef WITH_HASH_SHA256
1128  #ifdef WITH_CURVE_FRP256V1
1129  #define ECDSA_SHA256_FRP256V1_SELF_TEST
1130  
1131  /* ECDSA frp256v1 test vectors */
1132  
1133  static int ecdsa_nn_random_frp256v1_test_vector(nn_t out, nn_src_t q)
1134  {
1135  	int ret, cmp;
1136  
1137  	/*
1138  	 * Fixed ephemeral private key for frp256v1 signature
1139  	 */
1140  	const u8 k_buf[] = {
1141  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
1142  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
1143  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
1144  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
1145  	};
1146  
1147  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1148  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1149  
1150  	ret = (cmp >= 0) ? -1 : 0;
1151  
1152  err:
1153  	return ret;
1154  }
1155  
1156  static const u8 ecdsa_frp256v1_test_vectors_priv_key[] = {
1157  	0x00, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
1158  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
1159  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
1160  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
1161  };
1162  
1163  static const u8 ecdsa_frp256v1_test_vectors_expected_sig[] = {
1164  	0x22, 0xb1, 0xd0, 0x0d, 0xc8, 0x28, 0xa5, 0xcb,
1165  	0xa2, 0x64, 0x31, 0x9f, 0x05, 0x93, 0x3a, 0xc8,
1166  	0xed, 0xe6, 0x32, 0x3d, 0x69, 0xd0, 0x2b, 0x31,
1167  	0x4e, 0x10, 0xca, 0xa5, 0xf1, 0x3b, 0x29, 0x96,
1168  	0xbd, 0xef, 0x27, 0xe6, 0x3c, 0x16, 0xee, 0x46,
1169  	0xf8, 0x14, 0x22, 0x9d, 0x3c, 0xf2, 0x3f, 0x08,
1170  	0xc7, 0x96, 0x26, 0x13, 0x55, 0xe7, 0xd4, 0x4c,
1171  	0x9d, 0xd9, 0xd6, 0xba, 0x08, 0x57, 0x1f, 0xd8
1172  };
1173  
1174  static const ec_test_case ecdsa_frp256v1_test_case = {
1175  	.name = "ECDSA-SHA256/frp256v1",
1176  	.ec_str_p = &frp256v1_str_params,
1177  	.priv_key = ecdsa_frp256v1_test_vectors_priv_key,
1178  	.priv_key_len = sizeof(ecdsa_frp256v1_test_vectors_priv_key),
1179  	.nn_random = ecdsa_nn_random_frp256v1_test_vector,
1180  	.hash_type = SHA256,
1181  	.msg = "abc",
1182  	.msglen = 3,
1183  	.sig_type = ECDSA,
1184  	.exp_sig = ecdsa_frp256v1_test_vectors_expected_sig,
1185  	.exp_siglen = sizeof(ecdsa_frp256v1_test_vectors_expected_sig),
1186  	.adata = NULL,
1187  	.adata_len = 0
1188  };
1189  #endif /* WITH_CURVE_FRP256V1 */
1190  #endif /* WITH_HASH_SHA256 */
1191  #endif /* WITH_SIG_ECDSA */
1192  
1193  /*******************************************************************
1194   ************** ECKDSA tests ***************************************
1195   *******************************************************************/
1196  
1197  #ifdef WITH_SIG_ECKCDSA
1198  #ifdef WITH_HASH_SHA224
1199  #ifdef WITH_CURVE_SECP224R1
1200  #define ECKCDSA_SHA224_SECP224R1_SELF_TEST
1201  
1202  /* ECKCDSA secp224r1 test vectors */
1203  
1204  static int eckcdsa_nn_random_iso14888_3_secp224r1_test_vector(nn_t out,
1205  							      nn_src_t q)
1206  {
1207  	int ret, cmp;
1208  
1209  	const u8 k_buf[] = {
1210  		0x76, 0xA0, 0xAF, 0xC1, 0x86, 0x46, 0xD1, 0xB6,
1211  		0x20, 0xA0, 0x79, 0xFB, 0x22, 0x38, 0x65, 0xA7,
1212  		0xBC, 0xB4, 0x47, 0xF3, 0xC0, 0x3A, 0x35, 0xD8,
1213  		0x78, 0xEA, 0x4C, 0xDA
1214  	};
1215  
1216  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1217  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1218  
1219  	ret = (cmp >= 0) ? -1 : 0;
1220  
1221  err:
1222  	return ret;
1223  }
1224  
1225  static const u8 eckcdsa_secp224r1_test_vectors_priv_key[] = {
1226  	0x56, 0x2A, 0x6F, 0x64, 0xE1, 0x62, 0xFF, 0xCB,
1227  	0x51, 0xCD, 0x47, 0x07, 0x77, 0x4A, 0xE3, 0x66,
1228  	0x81, 0xB6, 0xCE, 0xF2, 0x05, 0xFE, 0x5D, 0x43,
1229  	0x91, 0x29, 0x56, 0xA2
1230  };
1231  
1232  static const u8 eckcdsa_secp224r1_test_vectors_expected_sig[] = {
1233  	0xEE, 0xA5, 0x8C, 0x91, 0xE0, 0xCD, 0xCE, 0xB5,
1234  	0x79, 0x9B, 0x00, 0xD2, 0x41, 0x2D, 0x92, 0x8F,
1235  	0xDD, 0x23, 0x12, 0x2A, 0x1C, 0x2B, 0xDF, 0x43,
1236  	0xC2, 0xF8, 0xDA, 0xFA, 0xAE, 0xBA, 0xB5, 0x3C,
1237  	0x7A, 0x44, 0xA8, 0xB2, 0x2F, 0x35, 0xFD, 0xB9,
1238  	0xDE, 0x26, 0x5F, 0x23, 0xB8, 0x9F, 0x65, 0xA6,
1239  	0x9A, 0x8B, 0x7B, 0xD4, 0x06, 0x19, 0x11, 0xA6
1240  };
1241  
1242  static const ec_test_case eckcdsa_secp224r1_test_case = {
1243  	.name = "ECKCDSA-SHA224/secp224r1",
1244  	.ec_str_p = &secp224r1_str_params,
1245  	.priv_key = eckcdsa_secp224r1_test_vectors_priv_key,
1246  	.priv_key_len = sizeof(eckcdsa_secp224r1_test_vectors_priv_key),
1247  	.nn_random = eckcdsa_nn_random_iso14888_3_secp224r1_test_vector,
1248  	.hash_type = SHA224,
1249  	.msg = "This is a sample message for EC-KCDSA implementation validation.",
1250  	.msglen = 64,
1251  	.sig_type = ECKCDSA,
1252  	.exp_sig = eckcdsa_secp224r1_test_vectors_expected_sig,
1253  	.exp_siglen = sizeof(eckcdsa_secp224r1_test_vectors_expected_sig),
1254  	.adata = NULL,
1255  	.adata_len = 0
1256  };
1257  #endif /* WITH_CURVE_SECP224R1 */
1258  #endif /* WITH_HASH_SHA224 */
1259  
1260  #ifdef WITH_HASH_SHA256
1261  #ifdef WITH_CURVE_SECP224R1
1262  #define ECKCDSA_SHA256_SECP224R1_SELF_TEST
1263  
1264  /* ECKCDSA secp224r1 w/ SHA-256 test vectors (specific for truncation test) */
1265  
1266  static int eckcdsa_nn_random_iso14888_3_secp224r1_sha256_test_vector(nn_t out,
1267  								     nn_src_t q)
1268  {
1269  	int ret, cmp;
1270  
1271  	const u8 k_buf[] = {
1272  		0xEE, 0xC7, 0x9D, 0x8D, 0x46, 0x48, 0xDF, 0x3A,
1273  		0x83, 0x2A, 0x66, 0xE3, 0x77, 0x55, 0x37, 0xE0,
1274  		0x00, 0xCC, 0x9B, 0x95, 0x7E, 0x13, 0x19, 0xC5,
1275  		0xDB, 0x9D, 0xD4, 0xF7
1276  	};
1277  
1278  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1279  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1280  
1281  	ret = (cmp >= 0) ? -1 : 0;
1282  
1283  err:
1284  	return ret;
1285  }
1286  
1287  static const u8 eckcdsa_secp224r1_sha256_test_vectors_priv_key[] = {
1288  	0x61, 0x58, 0x58, 0x27, 0x44, 0x9D, 0xBC, 0x0E,
1289  	0xC1, 0x61, 0xB2, 0xCF, 0x85, 0x75, 0xC9, 0xDF,
1290  	0x14, 0x9F, 0x41, 0xDD, 0x02, 0x89, 0xBE, 0x4F,
1291  	0xF1, 0x10, 0x77, 0x3D
1292  };
1293  
1294  static const u8 eckcdsa_secp224r1_sha256_test_vectors_expected_sig[] = {
1295  	0x64, 0xB4, 0x9E, 0x97, 0x7E, 0x65, 0x34, 0xF8,
1296  	0x77, 0xCB, 0x68, 0xA3, 0x80, 0x6F, 0x6A, 0x98,
1297  	0x93, 0x11, 0xCE, 0xAA, 0x8A, 0x64, 0xA0, 0x55,
1298  	0x80, 0x77, 0xC0, 0x4B,
1299  
1300  	0xAF, 0xF2, 0x3D, 0x40, 0xB1, 0x77, 0x95, 0x11,
1301  	0x51, 0xBE, 0x32, 0xF6, 0x56, 0x1B, 0x1B, 0x73,
1302  	0x9E, 0x3E, 0x8F, 0x82, 0x2C, 0xC5, 0x2D, 0x4C,
1303  	0xB3, 0x90, 0x9A, 0x93
1304  };
1305  
1306  static const ec_test_case eckcdsa_secp224r1_sha256_test_case = {
1307  	.name = "ECKCDSA-SHA256/secp224r1",
1308  	.ec_str_p = &secp224r1_str_params,
1309  	.priv_key = eckcdsa_secp224r1_sha256_test_vectors_priv_key,
1310  	.priv_key_len = sizeof(eckcdsa_secp224r1_sha256_test_vectors_priv_key),
1311  	.nn_random = eckcdsa_nn_random_iso14888_3_secp224r1_sha256_test_vector,
1312  	.hash_type = SHA256,
1313  	.msg = "This is a sample message for EC-KCDSA implementation validation.",
1314  	.msglen = 64,
1315  	.sig_type = ECKCDSA,
1316  	.exp_sig = eckcdsa_secp224r1_sha256_test_vectors_expected_sig,
1317  	.exp_siglen =
1318  		sizeof(eckcdsa_secp224r1_sha256_test_vectors_expected_sig),
1319  	.adata = NULL,
1320  	.adata_len = 0
1321  };
1322  #endif /* WITH_CURVE_SECP224R1 */
1323  #endif /* WITH_HASH_SHA256 */
1324  
1325  #ifdef WITH_HASH_SHA256
1326  #ifdef WITH_CURVE_SECP256R1
1327  #define ECKCDSA_SHA256_SECP256R1_SELF_TEST
1328  
1329  /* ECKCDSA secp256r1 test vectors */
1330  
1331  static int eckcdsa_nn_random_iso14888_3_secp256r1_test_vector(nn_t out,
1332  							      nn_src_t q)
1333  {
1334  	int ret, cmp;
1335  
1336  	const u8 k_buf[] = {
1337  		0x71, 0xB8, 0x8F, 0x39, 0x89, 0x16, 0xDA, 0x9C,
1338  		0x90, 0xF5, 0x55, 0xF1, 0xB5, 0x73, 0x2B, 0x7D,
1339  		0xC6, 0x36, 0xB4, 0x9C, 0x63, 0x81, 0x50, 0xBA,
1340  		0xC1, 0x1B, 0xF0, 0x5C, 0xFE, 0x16, 0x59, 0x6A
1341  	};
1342  
1343  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1344  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1345  
1346  	ret = (cmp >= 0) ? -1 : 0;
1347  
1348  err:
1349  	return ret;
1350  }
1351  
1352  static const u8 eckcdsa_secp256r1_test_vectors_priv_key[] = {
1353  	0x90, 0x51, 0xA2, 0x75, 0xAA, 0x4D, 0x98, 0x43,
1354  	0x9E, 0xDD, 0xED, 0x13, 0xFA, 0x1C, 0x6C, 0xBB,
1355  	0xCC, 0xE7, 0x75, 0xD8, 0xCC, 0x94, 0x33, 0xDE,
1356  	0xE6, 0x9C, 0x59, 0x84, 0x8B, 0x35, 0x94, 0xDF
1357  };
1358  
1359  static const u8 eckcdsa_secp256r1_test_vectors_expected_sig[] = {
1360  	0x0e, 0xdd, 0xf6, 0x80, 0x60, 0x12, 0x66, 0xee,
1361  	0x1d, 0xa8, 0x3e, 0x55, 0xa6, 0xd9, 0x44, 0x5f,
1362  	0xc7, 0x81, 0xda, 0xeb, 0x14, 0xc7, 0x65, 0xe7,
1363  	0xe5, 0xd0, 0xcd, 0xba, 0xf1, 0xf1, 0x4a, 0x68,
1364  	0x9b, 0x33, 0x34, 0x57, 0x66, 0x1c, 0x7c, 0xf7,
1365  	0x41, 0xbd, 0xdb, 0xc0, 0x83, 0x55, 0x53, 0xdf,
1366  	0xbb, 0x37, 0xee, 0x74, 0xf5, 0x3d, 0xb6, 0x99,
1367  	0xe0, 0xa1, 0x77, 0x80, 0xc7, 0xb6, 0xf1, 0xd0
1368  };
1369  
1370  static const ec_test_case eckcdsa_secp256r1_test_case = {
1371  	.name = "ECKCDSA-SHA256/secp256r1",
1372  	.ec_str_p = &secp256r1_str_params,
1373  	.priv_key = eckcdsa_secp256r1_test_vectors_priv_key,
1374  	.priv_key_len = sizeof(eckcdsa_secp256r1_test_vectors_priv_key),
1375  	.nn_random = eckcdsa_nn_random_iso14888_3_secp256r1_test_vector,
1376  	.hash_type = SHA256,
1377  	.msg = "This is a sample message for EC-KCDSA implementation validation.",
1378  	.msglen = 64,
1379  	.sig_type = ECKCDSA,
1380  	.exp_sig = eckcdsa_secp256r1_test_vectors_expected_sig,
1381  	.exp_siglen = sizeof(eckcdsa_secp256r1_test_vectors_expected_sig),
1382  	.adata = NULL,
1383  	.adata_len = 0
1384  };
1385  #endif /* WITH_CURVE_SECP256R1 */
1386  #endif /* WITH_HASH_SHA256 */
1387  
1388  #ifdef WITH_HASH_SHA384
1389  #ifdef WITH_CURVE_SECP384R1
1390  #define ECKCDSA_SHA384_SECP384R1_SELF_TEST
1391  
1392  /* ECKCDSA secp384r1 test vectors */
1393  
1394  static int eckcdsa_nn_random_secp384r1_test_vector(nn_t out, nn_src_t q)
1395  {
1396  	int ret, cmp;
1397  
1398  	const u8 k_buf[] = {
1399  		0x08, 0x16, 0x2e, 0xf8, 0x24, 0xd2, 0xd5, 0x11,
1400  		0x4e, 0x08, 0x61, 0xf3, 0x93, 0xb4, 0x6f, 0xb6,
1401  		0x02, 0xa4, 0x95, 0xa2, 0xca, 0x17, 0x7f, 0x47,
1402  		0xda, 0x4e, 0x6f, 0x2d, 0x23, 0xa1, 0x85, 0xc5,
1403  		0xb8, 0x8f, 0x1b, 0x7e, 0x2c, 0xba, 0x8d, 0x77,
1404  		0x37, 0x16, 0x09, 0x3a, 0xf5, 0x97, 0x9a, 0x7e
1405  	};
1406  
1407  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1408  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1409  
1410  	ret = (cmp >= 0) ? -1 : 0;
1411  
1412  err:
1413  	return ret;
1414  }
1415  
1416  static const u8 eckcdsa_secp384r1_test_vectors_priv_key[] = {
1417  	0x4f, 0xdb, 0xf2, 0xe7, 0x4e, 0x56, 0x81, 0x4e,
1418  	0x4c, 0x2f, 0x40, 0x87, 0x90, 0x9c, 0xe9, 0xc4,
1419  	0x73, 0x1b, 0xff, 0x06, 0x1a, 0x78, 0x82, 0x73,
1420  	0x84, 0x1b, 0xf5, 0x68, 0xce, 0x63, 0x21, 0x3e,
1421  	0x47, 0x04, 0x04, 0xea, 0x3e, 0xb6, 0x78, 0xc5,
1422  	0x00, 0xba, 0x37, 0x92, 0xf2, 0x4a, 0x7a, 0x51
1423  };
1424  
1425  static const u8 eckcdsa_secp384r1_test_vectors_expected_sig[] = {
1426  
1427  	0xd0, 0x37, 0x26, 0x47, 0x44, 0xe3, 0x8a, 0x38,
1428  	0xca, 0xcc, 0xdc, 0x8f, 0xcb, 0x08, 0xd8, 0xcb,
1429  	0x52, 0x18, 0x7d, 0x38, 0x3c, 0xc0, 0xb6, 0x29,
1430  	0xf6, 0x27, 0x71, 0xd9, 0x3f, 0x5a, 0xfc, 0xd3,
1431  	0xc1, 0x44, 0xc1, 0x53, 0xef, 0x06, 0xd9, 0x9a,
1432  	0xc9, 0x20, 0x58, 0x81, 0xde, 0x03, 0xd1, 0x71,
1433  	0xf1, 0xff, 0xc1, 0x43, 0xb9, 0x4e, 0x44, 0xdc,
1434  	0xec, 0xd1, 0x61, 0xfd, 0xc5, 0x27, 0x0a, 0x32,
1435  	0x71, 0x3e, 0x59, 0x38, 0xfb, 0x35, 0x60, 0x0e,
1436  	0xdd, 0xd0, 0x0c, 0x63, 0x89, 0xfb, 0x33, 0xb0,
1437  	0x3e, 0x77, 0xd2, 0xf7, 0x69, 0x4a, 0x04, 0x08,
1438  	0x5a, 0xf9, 0x85, 0x31, 0xdf, 0xe6, 0xf1, 0x73
1439  };
1440  
1441  static const ec_test_case eckcdsa_secp384r1_test_case = {
1442  	.name = "ECKCDSA-SHA384/secp384r1",
1443  	.ec_str_p = &secp384r1_str_params,
1444  	.priv_key = eckcdsa_secp384r1_test_vectors_priv_key,
1445  	.priv_key_len = sizeof(eckcdsa_secp384r1_test_vectors_priv_key),
1446  	.nn_random = eckcdsa_nn_random_secp384r1_test_vector,
1447  	.hash_type = SHA384,
1448  	.msg = "This is a sample message for EC-KCDSA implementation validation.",
1449  	.msglen = 64,
1450  	.sig_type = ECKCDSA,
1451  	.exp_sig = eckcdsa_secp384r1_test_vectors_expected_sig,
1452  	.exp_siglen = sizeof(eckcdsa_secp384r1_test_vectors_expected_sig),
1453  	.adata = NULL,
1454  	.adata_len = 0
1455  };
1456  #endif /* WITH_CURVE_SECP384R1 */
1457  #endif /* WITH_HASH_SHA384 */
1458  
1459  #ifdef WITH_HASH_SHA512
1460  #ifdef WITH_CURVE_SECP256R1
1461  #define ECKCDSA_SHA512_SECP256R1_SELF_TEST
1462  
1463  /*
1464   * ECKCDSA secp256r1 test vector using SHA512. This test vector is intended
1465   * to test truncation (left shift) steps in signature and verification
1466   * code when the output size of the hash function is larger than the
1467   * bit size of q (order of the group generated by the base point).
1468   */
1469  
1470  static int eckcdsa_nn_random_secp256r1_sha512_test_vector(nn_t out, nn_src_t q)
1471  {
1472  	int ret, cmp;
1473  
1474  	const u8 k_buf[] = {
1475  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
1476  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
1477  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
1478  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
1479  	};
1480  
1481  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1482  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1483  
1484  	ret = (cmp >= 0) ? -1 : 0;
1485  
1486  err:
1487  	return ret;
1488  }
1489  
1490  static const u8 eckcdsa_secp256r1_sha512_test_vectors_priv_key[] = {
1491  	0xDC, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
1492  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
1493  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
1494  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
1495  };
1496  
1497  static const u8 eckcdsa_secp256r1_sha512_test_vectors_expected_sig[] = {
1498  	0x70, 0x02, 0x1d, 0x6d, 0x5a, 0x5e, 0x99, 0x59,
1499  	0x43, 0x18, 0xa3, 0xba, 0x8d, 0x27, 0xa5, 0x39,
1500  	0xa5, 0x73, 0x76, 0x80, 0x73, 0xc8, 0x4d, 0xa0,
1501  	0xdb, 0xcc, 0xf9, 0x24, 0x9a, 0xfe, 0x78, 0x54,
1502  
1503  	0xb6, 0x97, 0x28, 0xe1, 0x7b, 0x9e, 0x85, 0xb0,
1504  	0x30, 0x05, 0x8f, 0x28, 0x54, 0xbf, 0x34, 0xd1,
1505  	0xdd, 0x1d, 0xf6, 0x7a, 0x02, 0x64, 0x23, 0x76,
1506  	0x9e, 0xb4, 0xfd, 0x0f, 0x4c, 0x2e, 0x15, 0x6b
1507  };
1508  
1509  static const ec_test_case eckcdsa_secp256r1_sha512_test_case = {
1510  	.name = "ECKCDSA-SHA512/secp256r1",
1511  	.ec_str_p = &secp256r1_str_params,
1512  	.priv_key = eckcdsa_secp256r1_sha512_test_vectors_priv_key,
1513  	.priv_key_len = sizeof(eckcdsa_secp256r1_sha512_test_vectors_priv_key),
1514  	.nn_random = eckcdsa_nn_random_secp256r1_sha512_test_vector,
1515  	.hash_type = SHA512,
1516  	.msg = "abc",
1517  	.msglen = 3,
1518  	.sig_type = ECKCDSA,
1519  	.exp_sig = eckcdsa_secp256r1_sha512_test_vectors_expected_sig,
1520  	.exp_siglen =
1521  		sizeof(eckcdsa_secp256r1_sha512_test_vectors_expected_sig),
1522  	.adata = NULL,
1523  	.adata_len = 0
1524  };
1525  #endif /* WITH_CURVE_SECP256R1 */
1526  #endif /* WITH_HASH_SHA512 */
1527  
1528  #ifdef WITH_HASH_SHA512
1529  #ifdef WITH_CURVE_SECP521R1
1530  #define ECKCDSA_SHA512_SECP521R1_SELF_TEST
1531  
1532  /* ECKCDSA secp521r1 test vectors */
1533  
1534  static int eckcdsa_nn_random_secp521r1_test_vector(nn_t out, nn_src_t q)
1535  {
1536  	int ret, cmp;
1537  
1538  	const u8 k_buf[] = {
1539  		0x01, 0xb6, 0xfa, 0xf4, 0x5f, 0xb8, 0x6f, 0x57,
1540  		0x9c, 0x4b, 0x54, 0xae, 0xc7, 0xa7, 0xf2, 0x95,
1541  		0x6e, 0x4d, 0x93, 0x94, 0xb3, 0x62, 0x82, 0x0a,
1542  		0xa5, 0x3f, 0x1b, 0x6c, 0x07, 0x3b, 0xbe, 0xc0,
1543  		0x24, 0x33, 0x14, 0xdb, 0x11, 0xb6, 0x20, 0x21,
1544  		0x35, 0x50, 0x20, 0xe8, 0x05, 0xad, 0x8e, 0x6d,
1545  		0x0e, 0xa2, 0x7c, 0x04, 0x35, 0x9a, 0xd3, 0xf8,
1546  		0x44, 0xd6, 0x5b, 0xbb, 0x73, 0xb7, 0x91, 0xd5,
1547  		0x9a, 0x1c
1548  	};
1549  
1550  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1551  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1552  
1553  	ret = (cmp >= 0) ? -1 : 0;
1554  
1555  err:
1556  	return ret;
1557  }
1558  
1559  static const u8 eckcdsa_secp521r1_test_vectors_priv_key[] = {
1560  	0x01, 0x65, 0xe1, 0xf1, 0xf2, 0xe7, 0xae, 0x6b,
1561  	0x50, 0x2a, 0x19, 0x4e, 0xf0, 0x3a, 0xd0, 0x50,
1562  	0xe3, 0xa5, 0xae, 0x31, 0xfc, 0xb4, 0xf7, 0x0d,
1563  	0x58, 0xf5, 0xc6, 0xdf, 0x28, 0x66, 0x71, 0x7f,
1564  	0x44, 0x09, 0xe7, 0x78, 0x02, 0x4d, 0xe5, 0x2b,
1565  	0xef, 0xc9, 0x6d, 0xb9, 0xfb, 0xba, 0x21, 0x30,
1566  	0x6d, 0x12, 0x5a, 0x27, 0xcf, 0xcd, 0xce, 0x91,
1567  	0x00, 0x09, 0x79, 0x63, 0xbf, 0x0c, 0x40, 0xe6,
1568  	0x96, 0xdc
1569  };
1570  
1571  static const u8 eckcdsa_secp521r1_test_vectors_expected_sig[] = {
1572  	0x90, 0x52, 0xbb, 0xc4, 0xdf, 0xe8, 0x80, 0xfb,
1573  	0x25, 0xcb, 0xa7, 0xa7, 0x47, 0xa0, 0xd0, 0xe9,
1574  	0x0e, 0x10, 0x63, 0x5b, 0xe1, 0xc2, 0x03, 0xc0,
1575  	0x5e, 0x6d, 0x1c, 0x7d, 0x3d, 0x07, 0x1c, 0xe0,
1576  	0x5a, 0xd7, 0xd5, 0x1c, 0x38, 0xe6, 0xa5, 0x7a,
1577  	0x85, 0x58, 0x01, 0x79, 0xb0, 0x32, 0x2e, 0x66,
1578  	0xdc, 0x95, 0x7f, 0xe6, 0xd3, 0xf3, 0xa3, 0x0a,
1579  	0x05, 0x37, 0xfb, 0xf0, 0xd1, 0x24, 0xb4, 0x49,
1580  	0x01, 0x36, 0x43, 0x43, 0xdf, 0xd8, 0x52, 0x64,
1581  	0x15, 0xe0, 0x25, 0x79, 0xd5, 0xe1, 0x11, 0xee,
1582  	0x5a, 0x8e, 0x50, 0xf3, 0x41, 0x90, 0x3d, 0x5f,
1583  	0x28, 0xa0, 0x78, 0xac, 0x17, 0x82, 0xfe, 0x7d,
1584  	0xbf, 0xf7, 0xd8, 0xcc, 0x3f, 0x51, 0x17, 0x76,
1585  	0x59, 0x37, 0xd4, 0x92, 0xc3, 0x6a, 0x00, 0xb3,
1586  	0x0b, 0x70, 0xb1, 0xdb, 0xd3, 0x95, 0x34, 0x02,
1587  	0x2a, 0xa6, 0x50, 0x7a, 0xfd, 0xe6, 0x15, 0xbe,
1588  	0xec, 0xba
1589  };
1590  
1591  static const ec_test_case eckcdsa_secp521r1_test_case = {
1592  	.name = "ECKCDSA-SHA512/secp521r1",
1593  	.ec_str_p = &secp521r1_str_params,
1594  	.priv_key = eckcdsa_secp521r1_test_vectors_priv_key,
1595  	.priv_key_len = sizeof(eckcdsa_secp521r1_test_vectors_priv_key),
1596  	.nn_random = eckcdsa_nn_random_secp521r1_test_vector,
1597  	.hash_type = SHA512,
1598  	.msg = "This is a sample message for EC-KCDSA implementation validation.",
1599  	.msglen = 64,
1600  	.sig_type = ECKCDSA,
1601  	.exp_sig = eckcdsa_secp521r1_test_vectors_expected_sig,
1602  	.exp_siglen = sizeof(eckcdsa_secp521r1_test_vectors_expected_sig),
1603  	.adata = NULL,
1604  	.adata_len = 0
1605  };
1606  #endif /* WITH_CURVE_SECP521R1 */
1607  #endif /* WITH_HASH_SHA512 */
1608  
1609  #ifdef WITH_HASH_SHA256
1610  #ifdef WITH_CURVE_BRAINPOOLP256R1
1611  #define ECKCDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
1612  
1613  /* ECKCDSA brainpoolp256r1 test vectors */
1614  
1615  static int eckcdsa_nn_random_brainpoolp256r1_test_vector(nn_t out, nn_src_t q)
1616  {
1617  	int ret, cmp;
1618  
1619  	const u8 k_buf[] = {
1620  		0x09, 0x8a, 0x5b, 0x7c, 0xfa, 0x31, 0x7b, 0x79,
1621  		0x6a, 0xf4, 0x46, 0xc4, 0x0e, 0x3e, 0xb5, 0x28,
1622  		0x79, 0x03, 0x42, 0x2c, 0x56, 0x62, 0x49, 0x78,
1623  		0xd9, 0x02, 0xc5, 0x9b, 0x7a, 0x92, 0xfe, 0x9b
1624  	};
1625  
1626  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1627  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1628  
1629  	ret = (cmp >= 0) ? -1 : 0;
1630  
1631  err:
1632  	return ret;
1633  }
1634  
1635  static const u8 eckcdsa_brainpoolp256r1_test_vectors_priv_key[] = {
1636  	0xa1, 0x45, 0x67, 0x88, 0x20, 0x4e, 0x69, 0xba,
1637  	0xf3, 0x84, 0x88, 0xca, 0xe7, 0x77, 0x63, 0xca,
1638  	0xde, 0xe5, 0xd0, 0xd9, 0x1a, 0xa0, 0xe5, 0xe6,
1639  	0x0d, 0x19, 0xb0, 0x0d, 0x3a, 0x67, 0xed, 0x48
1640  };
1641  
1642  static const u8 eckcdsa_brainpoolp256r1_test_vectors_expected_sig[] = {
1643  	0xec, 0xc8, 0x2e, 0x85, 0x66, 0x90, 0x05, 0xaf,
1644  	0x07, 0x7c, 0x67, 0xde, 0xba, 0xea, 0x8e, 0xbb,
1645  	0x33, 0x26, 0x14, 0xe6, 0x61, 0xef, 0xc7, 0xff,
1646  	0xd1, 0xf4, 0x52, 0xe1, 0xc4, 0x42, 0x23, 0xcd,
1647  
1648  	0x2f, 0x53, 0xb0, 0x9d, 0xdf, 0x97, 0xa8, 0x22,
1649  	0x42, 0x55, 0x29, 0x65, 0xe1, 0xa2, 0x09, 0x27,
1650  	0x8b, 0xe1, 0x4d, 0xde, 0x16, 0xfd, 0x54, 0xbc,
1651  	0x16, 0xf1, 0xf0, 0x9d, 0x28, 0xe7, 0xfd, 0x11,
1652  };
1653  
1654  static const ec_test_case eckcdsa_brainpoolp256r1_test_case = {
1655  	.name = "ECKCDSA-SHA256/brainpoolp256r1",
1656  	.ec_str_p = &brainpoolp256r1_str_params,
1657  	.priv_key = eckcdsa_brainpoolp256r1_test_vectors_priv_key,
1658  	.priv_key_len = sizeof(eckcdsa_brainpoolp256r1_test_vectors_priv_key),
1659  	.nn_random = eckcdsa_nn_random_brainpoolp256r1_test_vector,
1660  	.hash_type = SHA256,
1661  	.msg = "brainpoolP256r1",
1662  	.msglen = 15,
1663  	.sig_type = ECKCDSA,
1664  	.exp_sig = eckcdsa_brainpoolp256r1_test_vectors_expected_sig,
1665  	.exp_siglen = sizeof(eckcdsa_brainpoolp256r1_test_vectors_expected_sig),
1666  	.adata = NULL,
1667  	.adata_len = 0
1668  };
1669  #endif /* WITH_CURVE_BRAINPOOLP256R1 */
1670  #endif /* WITH_HASH_SHA256 */
1671  
1672  #ifdef WITH_HASH_SHA384
1673  #ifdef WITH_CURVE_BRAINPOOLP384R1
1674  #define ECKCDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
1675  
1676  /* ECKCDSA brainpoolp384r1 test vectors */
1677  
1678  static int eckcdsa_nn_random_brainpoolp384r1_test_vector(nn_t out, nn_src_t q)
1679  {
1680  	int ret, cmp;
1681  
1682  	const u8 k_buf[] = {
1683  		0x07, 0x0f, 0x21, 0xec, 0xa6, 0xef, 0x53, 0xd8,
1684  		0x81, 0x75, 0x33, 0xe8, 0x9c, 0xb6, 0xb7, 0x4f,
1685  		0xb8, 0x2f, 0x4c, 0x23, 0x00, 0x80, 0x8c, 0xab,
1686  		0x19, 0x9e, 0x6f, 0xfe, 0x96, 0xe6, 0x1d, 0x29,
1687  		0x22, 0x7d, 0x76, 0x43, 0x3c, 0x34, 0x33, 0xc3,
1688  		0x4d, 0x18, 0x5a, 0x8f, 0x01, 0x21, 0x38, 0x5b
1689  	};
1690  
1691  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1692  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1693  
1694  	ret = (cmp >= 0) ? -1 : 0;
1695  
1696  err:
1697  	return ret;
1698  }
1699  
1700  static const u8 eckcdsa_brainpoolp384r1_test_vectors_priv_key[] = {
1701  	0x21, 0x24, 0x1d, 0x99, 0x52, 0xcb, 0x23, 0x67,
1702  	0x21, 0xcd, 0x02, 0xd4, 0xd5, 0xe0, 0xfd, 0xbe,
1703  	0x22, 0xd7, 0xab, 0x69, 0xaf, 0xc1, 0x22, 0x12,
1704  	0x16, 0xc6, 0x09, 0x96, 0x05, 0x14, 0xec, 0x3b,
1705  	0xe6, 0x5f, 0x52, 0x73, 0xdd, 0x06, 0x9f, 0xdf,
1706  	0x63, 0x7e, 0xd9, 0x5c, 0x6c, 0xe5, 0x4f, 0x08
1707  };
1708  
1709  static const u8 eckcdsa_brainpoolp384r1_test_vectors_expected_sig[] = {
1710  	0xe4, 0x9a, 0x76, 0x4e, 0xeb, 0x13, 0x1e, 0xa1,
1711  	0xba, 0x0c, 0xef, 0xa5, 0xd6, 0x79, 0xa1, 0xf9,
1712  	0x63, 0x5b, 0x93, 0x41, 0xa6, 0xb1, 0x3c, 0x40,
1713  	0xbb, 0xd5, 0x5c, 0x38, 0x20, 0xe5, 0x09, 0xfa,
1714  	0x15, 0x8c, 0x5a, 0x1a, 0xf1, 0xb9, 0x29, 0x26,
1715  	0x8b, 0xe1, 0x06, 0xbe, 0xb2, 0x08, 0xc4, 0xc9,
1716  
1717  	0x3b, 0xa4, 0x36, 0xa6, 0x8e, 0x1e, 0xe9, 0x25,
1718  	0x97, 0xdd, 0x12, 0x5e, 0x6e, 0xfb, 0xe5, 0x28,
1719  	0x18, 0x47, 0x41, 0x75, 0xdb, 0x2f, 0x47, 0xa5,
1720  	0xd0, 0xd0, 0x2b, 0xd7, 0xc0, 0x81, 0x43, 0xf1,
1721  	0xc3, 0xe9, 0xbf, 0x2f, 0xf1, 0x4c, 0x18, 0x46,
1722  	0xff, 0xbc, 0xdf, 0x39, 0x93, 0x88, 0x59, 0x6b
1723  };
1724  
1725  static const ec_test_case eckcdsa_brainpoolp384r1_test_case = {
1726  	.name = "ECKCDSA-SHA384/brainpoolp384r1",
1727  	.ec_str_p = &brainpoolp384r1_str_params,
1728  	.priv_key = eckcdsa_brainpoolp384r1_test_vectors_priv_key,
1729  	.priv_key_len = sizeof(eckcdsa_brainpoolp384r1_test_vectors_priv_key),
1730  	.nn_random = eckcdsa_nn_random_brainpoolp384r1_test_vector,
1731  	.hash_type = SHA384,
1732  	.msg = "brainpoolP384r1",
1733  	.msglen = 15,
1734  	.sig_type = ECKCDSA,
1735  	.exp_sig = eckcdsa_brainpoolp384r1_test_vectors_expected_sig,
1736  	.exp_siglen = sizeof(eckcdsa_brainpoolp384r1_test_vectors_expected_sig),
1737  	.adata = NULL,
1738  	.adata_len = 0
1739  };
1740  #endif /* WITH_CURVE_BRAINPOOLP384R1 */
1741  #endif /* WITH_HASH_SHA384 */
1742  
1743  #ifdef WITH_HASH_SHA512
1744  #ifdef WITH_CURVE_BRAINPOOLP512R1
1745  #define ECKCDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
1746  
1747  /* ECKCDSA brainpoolp512r1 test vectors */
1748  
1749  static int eckcdsa_nn_random_brainpoolp512r1_test_vector(nn_t out, nn_src_t q)
1750  {
1751  	int ret, cmp;
1752  
1753  	const u8 k_buf[] = {
1754  		0x46, 0x3d, 0x92, 0x92, 0x3f, 0xe3, 0x37, 0xd8,
1755  		0xe5, 0xfc, 0x5a, 0xbe, 0x76, 0xf6, 0x3d, 0x9e,
1756  		0xec, 0x9a, 0xaf, 0x57, 0x48, 0x7d, 0xef, 0xe1,
1757  		0xfa, 0xe1, 0x76, 0x5d, 0x7e, 0xf7, 0x2f, 0x5d,
1758  		0x10, 0x64, 0xe1, 0xbe, 0x65, 0x68, 0x5c, 0x08,
1759  		0x40, 0x59, 0x7e, 0x98, 0x79, 0x75, 0x1b, 0xda,
1760  		0xc8, 0x42, 0xcf, 0xbb, 0xb0, 0x8e, 0x5c, 0x42,
1761  		0x8d, 0x1c, 0xa6, 0xe7, 0x63, 0x4b, 0x37, 0xea
1762  	};
1763  
1764  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1765  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1766  
1767  	ret = (cmp >= 0) ? -1 : 0;
1768  
1769  err:
1770  	return ret;
1771  }
1772  
1773  static const u8 eckcdsa_brainpoolp512r1_test_vectors_priv_key[] = {
1774  	0xa9, 0xeb, 0x22, 0xd4, 0x1a, 0x8a, 0xa1, 0x0d,
1775  	0xdf, 0xec, 0xd3, 0x1f, 0x93, 0xc8, 0xaf, 0x9a,
1776  	0x38, 0x7f, 0xf5, 0x29, 0xb9, 0x81, 0xeb, 0x8e,
1777  	0x3a, 0x73, 0xbe, 0x90, 0x70, 0x51, 0x99, 0x50,
1778  	0xc2, 0x8d, 0x81, 0xce, 0x31, 0x84, 0x79, 0x67,
1779  	0x18, 0xbf, 0xe4, 0x39, 0x17, 0x8c, 0x38, 0xe9,
1780  	0xa8, 0x10, 0x99, 0xf7, 0xd2, 0x60, 0x7c, 0xbf,
1781  	0x53, 0xa7, 0x12, 0xc8, 0xb8, 0xb3, 0x35, 0xcb
1782  };
1783  
1784  static const u8 eckcdsa_brainpoolp512r1_test_vectors_expected_sig[] = {
1785  	0xc0, 0x0d, 0x74, 0xbe, 0x19, 0x03, 0x45, 0xe3,
1786  	0xd9, 0x73, 0x90, 0xfc, 0xcf, 0xa1, 0x27, 0x1d,
1787  	0x5e, 0x8d, 0x8f, 0xfb, 0x15, 0x31, 0x49, 0xf6,
1788  	0xa7, 0xc5, 0x69, 0xa8, 0x78, 0x63, 0x7b, 0xf5,
1789  	0xcd, 0x02, 0x78, 0xf9, 0x2b, 0xce, 0x8c, 0x64,
1790  	0x4c, 0xd3, 0xd4, 0x25, 0xc9, 0x50, 0x14, 0x34,
1791  	0xfe, 0xdb, 0x1e, 0xc8, 0xf6, 0x55, 0x60, 0x79,
1792  	0xce, 0x51, 0xf8, 0xa4, 0xcc, 0x2e, 0xa9, 0xe3,
1793  
1794  	0x45, 0xd8, 0xcf, 0x97, 0x8c, 0x15, 0x58, 0xbd,
1795  	0x11, 0xba, 0xbe, 0x41, 0x97, 0xe1, 0x06, 0x19,
1796  	0x0d, 0x60, 0x58, 0x53, 0x5e, 0xbd, 0xf4, 0x00,
1797  	0x06, 0xbd, 0xf2, 0x2b, 0x11, 0x2c, 0x87, 0x7e,
1798  	0xe4, 0x4c, 0xa2, 0xdc, 0xf9, 0x0a, 0xfe, 0x21,
1799  	0x04, 0xbd, 0xf6, 0xd8, 0xb9, 0x07, 0xaa, 0x4c,
1800  	0x75, 0xbd, 0x2e, 0x55, 0x65, 0xa3, 0xca, 0x8f,
1801  	0xae, 0xb1, 0x10, 0x7e, 0x85, 0x39, 0xe2, 0x1f
1802  };
1803  
1804  static const ec_test_case eckcdsa_brainpoolp512r1_test_case = {
1805  	.name = "ECKCDSA-SHA512/brainpoolp512r1",
1806  	.ec_str_p = &brainpoolp512r1_str_params,
1807  	.priv_key = eckcdsa_brainpoolp512r1_test_vectors_priv_key,
1808  	.priv_key_len = sizeof(eckcdsa_brainpoolp512r1_test_vectors_priv_key),
1809  	.nn_random = eckcdsa_nn_random_brainpoolp512r1_test_vector,
1810  	.hash_type = SHA512,
1811  	.msg = "brainpoolP512r1",
1812  	.msglen = 15,
1813  	.sig_type = ECKCDSA,
1814  	.exp_sig = eckcdsa_brainpoolp512r1_test_vectors_expected_sig,
1815  	.exp_siglen = sizeof(eckcdsa_brainpoolp512r1_test_vectors_expected_sig),
1816  	.adata = NULL,
1817  	.adata_len = 0
1818  };
1819  #endif /* WITH_CURVE_BRAINPOOLP512R1 */
1820  #endif /* WITH_HASH_SHA512 */
1821  
1822  #ifdef WITH_HASH_SHA256
1823  #ifdef WITH_CURVE_FRP256V1
1824  #define ECKCDSA_SHA256_FRP256V1_SELF_TEST
1825  
1826  /* ECKCDSA frp256v1 test vectors */
1827  
1828  static int eckcdsa_nn_random_frp256v1_test_vector(nn_t out, nn_src_t q)
1829  {
1830  	int ret, cmp;
1831  
1832  	const u8 k_buf[] = {
1833  		0x71, 0xB8, 0x8F, 0x39, 0x89, 0x16, 0xDA, 0x9C,
1834  		0x90, 0xF5, 0x55, 0xF1, 0xB5, 0x73, 0x2B, 0x7D,
1835  		0xC6, 0x36, 0xB4, 0x9C, 0x63, 0x81, 0x50, 0xBA,
1836  		0xC1, 0x1B, 0xF0, 0x5C, 0xFE, 0x16, 0x59, 0x6A
1837  	};
1838  
1839  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1840  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1841  
1842  	ret = (cmp >= 0) ? -1 : 0;
1843  
1844  err:
1845  	return ret;
1846  }
1847  
1848  static const u8 eckcdsa_frp256v1_test_vectors_priv_key[] = {
1849  	0x90, 0x51, 0xA2, 0x75, 0xAA, 0x4D, 0x98, 0x43,
1850  	0x9E, 0xDD, 0xED, 0x13, 0xFA, 0x1C, 0x6C, 0xBB,
1851  	0xCC, 0xE7, 0x75, 0xD8, 0xCC, 0x94, 0x33, 0xDE,
1852  	0xE6, 0x9C, 0x59, 0x84, 0x8B, 0x35, 0x94, 0xDF
1853  };
1854  
1855  static const u8 eckcdsa_frp25v1_test_vectors_expected_sig[] = {
1856  	0x37, 0x58, 0xd0, 0x27, 0x18, 0x11, 0x16, 0xe9,
1857  	0x2b, 0xaf, 0x70, 0xbf, 0x16, 0x48, 0x64, 0x34,
1858  	0x9e, 0x75, 0x60, 0x3e, 0x89, 0xa4, 0xc6, 0xc1,
1859  	0xbd, 0xb8, 0x01, 0x52, 0x2d, 0xca, 0x20, 0x31,
1860  	0x2d, 0x20, 0x6f, 0x3e, 0x70, 0x5e, 0x5e, 0xfc,
1861  	0x32, 0xd4, 0x3c, 0xb0, 0xe1, 0xf7, 0xb2, 0xc7,
1862  	0x0c, 0xc2, 0xb0, 0x26, 0x93, 0xcb, 0x69, 0xb7,
1863  	0x29, 0xb7, 0x97, 0x5c, 0x67, 0xd6, 0xa3, 0xe6
1864  };
1865  
1866  static const ec_test_case eckcdsa_frp256v1_test_case = {
1867  	.name = "ECKCDSA-SHA256/frp256v1",
1868  	.ec_str_p = &frp256v1_str_params,
1869  	.priv_key = eckcdsa_frp256v1_test_vectors_priv_key,
1870  	.priv_key_len = sizeof(eckcdsa_frp256v1_test_vectors_priv_key),
1871  	.nn_random = eckcdsa_nn_random_frp256v1_test_vector,
1872  	.hash_type = SHA256,
1873  	.msg = "abc",
1874  	.msglen = 3,
1875  	.sig_type = ECKCDSA,
1876  	.exp_sig = eckcdsa_frp25v1_test_vectors_expected_sig,
1877  	.exp_siglen = sizeof(eckcdsa_frp25v1_test_vectors_expected_sig),
1878  	.adata = NULL,
1879  	.adata_len = 0
1880  };
1881  #endif /* WITH_CURVE_FRP256V1 */
1882  #endif /* WITH_HASH_SHA256 */
1883  #endif /* WITH_SIG_ECKCDSA */
1884  
1885  /*******************************************************************
1886   ************** ECSDSA tests ***************************************
1887   *******************************************************************/
1888  
1889  #ifdef WITH_SIG_ECSDSA
1890  #ifdef WITH_HASH_SHA224
1891  #ifdef WITH_CURVE_SECP224R1
1892  #define ECSDSA_SHA224_SECP224R1_SELF_TEST
1893  
1894  /* ECSDSA secp224r1 test vectors */
1895  
1896  static int ecsdsa_nn_random_secp224r1_test_vector(nn_t out, nn_src_t q)
1897  {
1898  	int ret, cmp;
1899  
1900  	const u8 k_buf[] = {
1901  		0x89, 0x99, 0x80, 0x6e, 0x0f, 0x68, 0x10, 0x9d,
1902  		0x31, 0x56, 0x1b, 0x41, 0xbf, 0x1a, 0x56, 0x6e,
1903  		0xfb, 0x13, 0x2c, 0x3e, 0xd7, 0x1e, 0x29, 0x5e,
1904  		0x5d, 0x9b, 0x2e, 0x68
1905  	};
1906  
1907  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1908  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1909  
1910  	ret = (cmp >= 0) ? -1 : 0;
1911  
1912  err:
1913  	return ret;
1914  }
1915  
1916  static const u8 ecsdsa_secp224r1_test_vectors_priv_key[] = {
1917  	0xda, 0x71, 0x2d, 0x9b, 0x6f, 0xdb, 0xf7, 0x8f,
1918  	0x92, 0x51, 0xcc, 0x3a, 0xe4, 0xc7, 0xce, 0xd3,
1919  	0x87, 0x1a, 0x19, 0x9e, 0xf5, 0x91, 0xd1, 0x23,
1920  	0xa9, 0x36, 0x44, 0x57
1921  };
1922  
1923  static const u8 ecsdsa_secp224r1_test_vectors_expected_sig[] = {
1924  	0x41, 0x69, 0xd3, 0xec, 0x93, 0x7b, 0x15, 0xce,
1925  	0x15, 0x34, 0x53, 0x8d, 0x37, 0xe8, 0xc5, 0x7e,
1926  	0x12, 0x1f, 0xd5, 0x9f, 0x90, 0x1b, 0x5e, 0xf8,
1927  	0xd0, 0x0d, 0x62, 0x04,
1928  	0xf0, 0xfe, 0xbe, 0x28, 0x36, 0xb0, 0x87, 0xec,
1929  	0x44, 0x98, 0x94, 0x7a, 0x6c, 0x4c, 0x8a, 0xea,
1930  	0x5a, 0x5a, 0x19, 0x8a, 0xce, 0x95, 0x2f, 0x75,
1931  	0x07, 0x37, 0x23, 0x1b
1932  };
1933  
1934  static const ec_test_case ecsdsa_secp224r1_test_case = {
1935  	.name = "ECSDSA-SHA224/secp224r1",
1936  	.ec_str_p = &secp224r1_str_params,
1937  	.priv_key = ecsdsa_secp224r1_test_vectors_priv_key,
1938  	.priv_key_len = sizeof(ecsdsa_secp224r1_test_vectors_priv_key),
1939  	.nn_random = ecsdsa_nn_random_secp224r1_test_vector,
1940  	.hash_type = SHA224,
1941  	.msg = "abc",
1942  	.msglen = 3,
1943  	.sig_type = ECSDSA,
1944  	.exp_sig = ecsdsa_secp224r1_test_vectors_expected_sig,
1945  	.exp_siglen = sizeof(ecsdsa_secp224r1_test_vectors_expected_sig),
1946  	.adata = NULL,
1947  	.adata_len = 0
1948  };
1949  #endif /* WITH_CURVE_SECP224R1 */
1950  #endif /* WITH_HASH_SHA224 */
1951  
1952  #ifdef WITH_HASH_SHA256
1953  #ifdef WITH_CURVE_SECP256R1
1954  #define ECSDSA_SHA256_SECP256R1_SELF_TEST
1955  
1956  /* ECSDSA secp256r1 test vectors */
1957  
1958  static int ecsdsa_nn_random_iso14888_3_secp256r1_test_vector(nn_t out,
1959  							     nn_src_t q)
1960  {
1961  	int ret, cmp;
1962  	const u8 k_buf[] = {
1963  		0xDE, 0x7E, 0x0E, 0x5E, 0x66, 0x3F, 0x24, 0x18,
1964  		0x34, 0x14, 0xB7, 0xC7, 0x2F, 0x24, 0x54, 0x6B,
1965  		0x81, 0xE9, 0xE5, 0xF4, 0x10, 0xBE, 0xBF, 0x26,
1966  		0xF3, 0xCA, 0x5F, 0xA8, 0x2F, 0x51, 0x92, 0xC8
1967  	};
1968  
1969  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
1970  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
1971  
1972  	ret = (cmp >= 0) ? -1 : 0;
1973  
1974  err:
1975  	return ret;
1976  }
1977  
1978  static const u8 ecsdsa_secp256r1_test_vectors_priv_key[] = {
1979  	0x52, 0x02, 0xA3, 0xD8, 0xAC, 0xAF, 0x69, 0x09,
1980  	0xD1, 0x2C, 0x9A, 0x77, 0x4C, 0xD8, 0x86, 0xF9,
1981  	0xFB, 0xA6, 0x11, 0x37, 0xFF, 0xD3, 0xE8, 0xE7,
1982  	0x6A, 0xED, 0x36, 0x3F, 0xB4, 0x7A, 0xC4, 0x92
1983  };
1984  
1985  static const u8 ecsdsa_secp256r1_test_vectors_expected_sig[] = {
1986  	0x5A, 0x79, 0xA0, 0xAA, 0x9B, 0x24, 0x1E, 0x38,
1987  	0x1A, 0x59, 0x4B, 0x22, 0x05, 0x54, 0xD0, 0x96,
1988  	0xA5, 0xF0, 0x9F, 0xA6, 0x28, 0xAD, 0x9A, 0x33,
1989  	0xC3, 0xCE, 0x43, 0x93, 0xAD, 0xE1, 0xDE, 0xF7,
1990  	0x5C, 0x0E, 0xB7, 0x8B, 0x67, 0xA5, 0x13, 0xC3,
1991  	0xE5, 0x3B, 0x26, 0x19, 0xF9, 0x68, 0x55, 0xE2,
1992  	0x91, 0xD5, 0x14, 0x1C, 0x7C, 0xD0, 0x91, 0x5E,
1993  	0x1D, 0x04, 0xB3, 0x47, 0x45, 0x7C, 0x96, 0x01
1994  };
1995  
1996  static const ec_test_case ecsdsa_secp256r1_test_case = {
1997  	.name = "ECSDSA-SHA256/secp256r1",
1998  	.ec_str_p = &secp256r1_str_params,
1999  	.priv_key = ecsdsa_secp256r1_test_vectors_priv_key,
2000  	.priv_key_len = sizeof(ecsdsa_secp256r1_test_vectors_priv_key),
2001  	.nn_random = ecsdsa_nn_random_iso14888_3_secp256r1_test_vector,
2002  	.hash_type = SHA256,
2003  	.msg = "abc",
2004  	.msglen = 3,
2005  	.sig_type = ECSDSA,
2006  	.exp_sig = ecsdsa_secp256r1_test_vectors_expected_sig,
2007  	.exp_siglen = sizeof(ecsdsa_secp256r1_test_vectors_expected_sig),
2008  	.adata = NULL,
2009  	.adata_len = 0
2010  };
2011  #endif /* WITH_CURVE_SECP256R1 */
2012  #endif /* WITH_HASH_SHA256 */
2013  
2014  #ifdef WITH_HASH_SHA384
2015  #ifdef WITH_CURVE_SECP384R1
2016  #define ECSDSA_SHA384_SECP384R1_SELF_TEST
2017  
2018  /* ECSDSA secp384r1 test vectors */
2019  
2020  static int ecsdsa_nn_random_iso14888_3_secp384r1_test_vector(nn_t out,
2021  							     nn_src_t q)
2022  {
2023  	int ret, cmp;
2024  	const u8 k_buf[] = {
2025  		0x8A, 0x29, 0xE7, 0x72, 0x35, 0x7B, 0xBA, 0x6F,
2026  		0x5C, 0x9E, 0xA7, 0x65, 0xD5, 0x08, 0x2B, 0x9B,
2027  		0xC7, 0xA7, 0x4C, 0x33, 0xE9, 0xD9, 0x4D, 0x49,
2028  		0xFB, 0x2C, 0x9D, 0x3B, 0x52, 0x3A, 0x82, 0x16,
2029  		0x96, 0x82, 0xEC, 0xF1, 0x6F, 0x1D, 0x06, 0x26,
2030  		0x90, 0x42, 0xF3, 0xAF, 0x04, 0x4B, 0x4D, 0xE8
2031  	};
2032  
2033  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2034  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2035  
2036  	ret = (cmp >= 0) ? -1 : 0;
2037  
2038  err:
2039  	return ret;
2040  }
2041  
2042  static const u8 ecsdsa_secp384r1_test_vectors_priv_key[] = {
2043  	0x7E, 0x49, 0x14, 0xFE, 0x4B, 0x61, 0x70, 0x89,
2044  	0xF9, 0xFE, 0x80, 0xAD, 0x91, 0x3D, 0x55, 0x30,
2045  	0xEE, 0xC4, 0xF3, 0x0B, 0xCA, 0x1A, 0xD6, 0x6E,
2046  	0x7B, 0x5A, 0xEA, 0xCF, 0x29, 0xD2, 0xF5, 0x67,
2047  	0xD9, 0xA8, 0xF4, 0xA4, 0x55, 0x2A, 0x1A, 0x1A,
2048  	0xF3, 0xE0, 0xB6, 0xD0, 0xA4, 0x9D, 0xFC, 0xC8
2049  };
2050  
2051  static const u8 ecsdsa_secp384r1_test_vectors_expected_sig[] = {
2052  	0xF9, 0x07, 0x55, 0x3B, 0xB5, 0xC7, 0xDE, 0x02,
2053  	0x9A, 0x2A, 0x56, 0x70, 0x78, 0xDF, 0xF9, 0xB8,
2054  	0x03, 0xEC, 0x64, 0x96, 0x0D, 0x75, 0xBA, 0x73,
2055  	0xA8, 0x55, 0x90, 0xAC, 0xC0, 0xAC, 0x44, 0x79,
2056  	0xAC, 0x52, 0xE5, 0x1D, 0x56, 0x91, 0xFC, 0xB0,
2057  	0x69, 0xDC, 0x5C, 0xD2, 0x4E, 0x0B, 0xCE, 0xC7,
2058  	0x0B, 0x9D, 0x66, 0xD5, 0xDE, 0x70, 0xFA, 0xA8,
2059  	0xB3, 0x56, 0x34, 0xA3, 0x7B, 0x33, 0xC2, 0xC4,
2060  	0x60, 0xB8, 0xDC, 0x0B, 0xD4, 0xC8, 0x74, 0x5B,
2061  	0xB8, 0x4D, 0xC1, 0x5C, 0xA8, 0x57, 0x0B, 0x07,
2062  	0x92, 0x58, 0xF9, 0x77, 0xDA, 0x8B, 0x40, 0x61,
2063  	0xF3, 0xDA, 0x6E, 0xBD, 0x7C, 0x42, 0x9A, 0x89
2064  };
2065  
2066  static const ec_test_case ecsdsa_secp384r1_test_case = {
2067  	.name = "ECSDSA-SHA384/secp384r1",
2068  	.ec_str_p = &secp384r1_str_params,
2069  	.priv_key = ecsdsa_secp384r1_test_vectors_priv_key,
2070  	.priv_key_len = sizeof(ecsdsa_secp384r1_test_vectors_priv_key),
2071  	.nn_random = ecsdsa_nn_random_iso14888_3_secp384r1_test_vector,
2072  	.hash_type = SHA384,
2073  	.msg = "abc",
2074  	.msglen = 3,
2075  	.sig_type = ECSDSA,
2076  	.exp_sig = ecsdsa_secp384r1_test_vectors_expected_sig,
2077  	.exp_siglen = sizeof(ecsdsa_secp384r1_test_vectors_expected_sig),
2078  	.adata = NULL,
2079  	.adata_len = 0
2080  };
2081  #endif /* WITH_CURVE_SECP384R1 */
2082  #endif /* WITH_HASH_SHA384 */
2083  
2084  #ifdef WITH_HASH_SHA512
2085  #ifdef WITH_CURVE_SECP521R1
2086  #define ECSDSA_SHA512_SECP521R1_SELF_TEST
2087  
2088  /* ECSDSA secp521r1 test vectors */
2089  
2090  static int ecsdsa_nn_random_secp521r1_test_vector(nn_t out, nn_src_t q)
2091  {
2092  	int ret, cmp;
2093  
2094  	/*
2095  	 * Fixed ephemeral private key for secp521r1 signature
2096  	 * test vectors from RFC4754
2097  	 */
2098  	const u8 k_buf[] = {
2099  		0x01, 0xad, 0xb3, 0xfd, 0xcf, 0x67, 0x5e, 0x25,
2100  		0x3c, 0xfe, 0xac, 0x56, 0x1f, 0x21, 0x67, 0x67,
2101  		0xa4, 0xba, 0xa7, 0x90, 0xac, 0x68, 0x1c, 0x74,
2102  		0xf3, 0xdd, 0x83, 0x33, 0x5c, 0x9b, 0x37, 0x41,
2103  		0xc8, 0x88, 0x77, 0x77, 0x33, 0xf7, 0xc7, 0xea,
2104  		0x15, 0xd4, 0x5f, 0xa0, 0x7f, 0xba, 0x60, 0x39,
2105  		0x4b, 0x3e, 0x16, 0xcd, 0xce, 0x1b, 0x02, 0xef,
2106  		0xbc, 0x59, 0xba, 0xb0, 0xbd, 0x77, 0xa6, 0x50,
2107  		0x07, 0xd4
2108  	};
2109  
2110  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2111  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2112  
2113  	ret = (cmp >= 0) ? -1 : 0;
2114  
2115  err:
2116  	return ret;
2117  }
2118  
2119  static const u8 ecsdsa_secp521r1_test_vectors_priv_key[] = {
2120  	0x01, 0x82, 0x1f, 0x88, 0xbd, 0xe6, 0x75, 0x1c,
2121  	0x06, 0x29, 0xfb, 0x75, 0x3b, 0xb1, 0xc7, 0xec,
2122  	0x07, 0xbe, 0x64, 0x82, 0x88, 0x4a, 0x77, 0x4e,
2123  	0x18, 0x3e, 0x1d, 0xcf, 0x95, 0x49, 0x4f, 0x81,
2124  	0x7e, 0x71, 0x5b, 0xfe, 0x1d, 0xe3, 0x17, 0x24,
2125  	0xc2, 0x93, 0x24, 0x67, 0xb1, 0x39, 0x90, 0x02,
2126  	0x4c, 0x25, 0xc5, 0x54, 0x13, 0xbc, 0xe1, 0x24,
2127  	0xa5, 0x35, 0x83, 0xf7, 0x3a, 0x86, 0xed, 0xc4,
2128  	0x39, 0xb0
2129  };
2130  
2131  static const u8 ecsdsa_secp521r1_test_vectors_expected_sig[] = {
2132  	0xe7, 0x3a, 0xe5, 0x72, 0x50, 0x29, 0x9b, 0x19,
2133  	0x26, 0xbc, 0x79, 0x8a, 0x84, 0x6b, 0xd3, 0xbb,
2134  	0x29, 0x15, 0x9d, 0x0d, 0xcb, 0x50, 0x87, 0xbb,
2135  	0xd1, 0x72, 0xbd, 0x4a, 0x4b, 0x42, 0x3f, 0xb8,
2136  	0xf1, 0x8b, 0xc2, 0x30, 0x1c, 0xa3, 0x1b, 0x94,
2137  	0xef, 0x1a, 0xa0, 0x87, 0x71, 0x81, 0x0b, 0x37,
2138  	0xa5, 0xd5, 0x4f, 0x0c, 0xde, 0xf1, 0xb1, 0xee,
2139  	0xb0, 0x7b, 0x6c, 0xca, 0x35, 0xcf, 0xb2, 0x04,
2140  	0x00, 0xba, 0xbf, 0x93, 0x78, 0xea, 0x91, 0x23,
2141  	0x57, 0x49, 0xe1, 0x05, 0x52, 0x92, 0x2a, 0xff,
2142  	0xb3, 0x32, 0x51, 0x6f, 0x59, 0xd9, 0xe1, 0x78,
2143  	0x61, 0xfe, 0xb5, 0x43, 0x37, 0x40, 0xf3, 0xb8,
2144  	0x18, 0x8c, 0x95, 0x2e, 0xd6, 0xb3, 0xea, 0x1a,
2145  	0x37, 0x48, 0xfb, 0xa5, 0x77, 0xba, 0x69, 0xe2,
2146  	0x12, 0x6b, 0x2c, 0xc9, 0x4e, 0x4c, 0x59, 0xe7,
2147  	0x86, 0xe2, 0xfa, 0xdd, 0x5b, 0x79, 0xab, 0x15,
2148  	0x5c, 0xf6
2149  };
2150  
2151  static const ec_test_case ecsdsa_secp521r1_test_case = {
2152  	.name = "ECSDSA-SHA512/secp521r1",
2153  	.ec_str_p = &secp521r1_str_params,
2154  	.priv_key = ecsdsa_secp521r1_test_vectors_priv_key,
2155  	.priv_key_len = sizeof(ecsdsa_secp521r1_test_vectors_priv_key),
2156  	.nn_random = ecsdsa_nn_random_secp521r1_test_vector,
2157  	.hash_type = SHA512,
2158  	.msg = "abc",
2159  	.msglen = 3,
2160  	.sig_type = ECSDSA,
2161  	.exp_sig = ecsdsa_secp521r1_test_vectors_expected_sig,
2162  	.exp_siglen = sizeof(ecsdsa_secp521r1_test_vectors_expected_sig),
2163  	.adata = NULL,
2164  	.adata_len = 0
2165  };
2166  #endif /* WITH_CURVE_SECP521R1 */
2167  #endif /* WITH_HASH_SHA512 */
2168  
2169  #ifdef WITH_HASH_SHA256
2170  #ifdef WITH_CURVE_BRAINPOOLP256R1
2171  #define ECSDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
2172  
2173  /* ECSDSA Brainpoolp256r1 test vectors */
2174  
2175  static int ecsdsa_nn_random_brainpoolp256r1_test_vector(nn_t out, nn_src_t q)
2176  {
2177  	int ret, cmp;
2178  
2179  	/*
2180  	 * Fixed ephemeral private key for brainpoolp256r1 signature
2181  	 */
2182  	const u8 k_buf[] = {
2183  		0x29, 0xa5, 0xc2, 0x64, 0xba, 0x76, 0x37, 0x9d,
2184  		0x86, 0x49, 0x8a, 0x64, 0x16, 0xfc, 0x7f, 0xba,
2185  		0x9d, 0x4f, 0x62, 0x75, 0x64, 0xc6, 0x98, 0xab,
2186  		0x4d, 0x95, 0xd1, 0x90, 0x6c, 0x8c, 0x61, 0xe4
2187  	};
2188  
2189  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2190  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2191  
2192  	ret = (cmp >= 0) ? -1 : 0;
2193  
2194  err:
2195  	return ret;
2196  }
2197  
2198  static const u8 ecsdsa_brainpoolp256r1_test_vectors_priv_key[] = {
2199  	0xa9, 0x35, 0x71, 0x33, 0x4a, 0xc3, 0x2b, 0x50,
2200  	0x26, 0x8d, 0xdc, 0xa0, 0x95, 0x23, 0x89, 0x3a,
2201  	0x8f, 0x29, 0x89, 0xa9, 0x4f, 0x9f, 0x44, 0xa9,
2202  	0x1b, 0x77, 0x43, 0xf7, 0xe1, 0x45, 0xae, 0xb7
2203  };
2204  
2205  static const u8 ecsdsa_brainpoolp256r1_test_vectors_expected_sig[] = {
2206  	0x0e, 0x7a, 0xf5, 0x0b, 0xf4, 0xe0, 0x8b, 0xf8,
2207  	0x51, 0x00, 0x44, 0x24, 0xee, 0x9d, 0x65, 0x02,
2208  	0xfc, 0xd1, 0x16, 0x4e, 0xe3, 0xd9, 0x9a, 0x00,
2209  	0xa8, 0x4f, 0xd5, 0xdb, 0x81, 0x48, 0x00, 0xeb,
2210  	0x64, 0x7a, 0x24, 0xe6, 0x07, 0xb6, 0xfc, 0x09,
2211  	0xd8, 0x8b, 0x1b, 0x57, 0x2c, 0xfc, 0x4c, 0xe2,
2212  	0x9e, 0x25, 0xfa, 0xe1, 0x43, 0x1f, 0x0d, 0xfa,
2213  	0x58, 0x6b, 0xd1, 0x6d, 0xee, 0xff, 0x92, 0xb6
2214  };
2215  
2216  static const ec_test_case ecsdsa_brainpoolp256r1_test_case = {
2217  	.name = "ECSDSA-SHA256/brainpoolp256r1",
2218  	.ec_str_p = &brainpoolp256r1_str_params,
2219  	.priv_key = ecsdsa_brainpoolp256r1_test_vectors_priv_key,
2220  	.priv_key_len = sizeof(ecsdsa_brainpoolp256r1_test_vectors_priv_key),
2221  	.nn_random = ecsdsa_nn_random_brainpoolp256r1_test_vector,
2222  	.hash_type = SHA256,
2223  	.msg = "abc",
2224  	.msglen = 3,
2225  	.sig_type = ECSDSA,
2226  	.exp_sig = ecsdsa_brainpoolp256r1_test_vectors_expected_sig,
2227  	.exp_siglen = sizeof(ecsdsa_brainpoolp256r1_test_vectors_expected_sig),
2228  	.adata = NULL,
2229  	.adata_len = 0
2230  };
2231  
2232  #endif /* WITH_CURVE_BRAINPOOLP256R1 */
2233  #endif /* WITH_HASH_SHA256 */
2234  
2235  #ifdef WITH_HASH_SHA384
2236  #ifdef WITH_CURVE_BRAINPOOLP384R1
2237  #define ECSDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
2238  
2239  /* ECSDSA Brainpoolp384r1 test vectors */
2240  
2241  static int ecsdsa_nn_random_brainpoolp384r1_test_vector(nn_t out, nn_src_t q)
2242  {
2243  	int ret, cmp;
2244  
2245  	/*
2246  	 * Fixed ephemeral private key for brainpoolp384r1 signature
2247  	 */
2248  	const u8 k_buf[] = {
2249  		0x4f, 0x71, 0xb2, 0x3e, 0x7f, 0xbb, 0x47, 0xa8,
2250  		0x8d, 0xaf, 0xdb, 0xea, 0xdc, 0x78, 0x14, 0x50,
2251  		0xa9, 0x3b, 0xc8, 0x4b, 0x5b, 0xd4, 0xd5, 0x38,
2252  		0x6b, 0x1e, 0x19, 0x5f, 0x5c, 0x29, 0xe7, 0x9f,
2253  		0x9e, 0xfe, 0x66, 0x1d, 0x02, 0x7b, 0xef, 0xbb,
2254  		0xb1, 0xca, 0x1d, 0xa2, 0xfe, 0xa2, 0xab, 0x75
2255  	};
2256  
2257  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2258  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2259  
2260  	ret = (cmp >= 0) ? -1 : 0;
2261  
2262  err:
2263  	return ret;
2264  }
2265  
2266  static const u8 ecsdsa_brainpoolp384r1_test_vectors_priv_key[] = {
2267  	0x71, 0xa8, 0x85, 0x7e, 0x32, 0x14, 0x5f, 0x02,
2268  	0x90, 0x02, 0xbe, 0xdc, 0x68, 0x77, 0x78, 0x1d,
2269  	0xd9, 0x34, 0x6d, 0x5f, 0x4f, 0x7d, 0x0f, 0x96,
2270  	0xe3, 0x1d, 0x6f, 0x41, 0x42, 0x36, 0x37, 0x1d,
2271  	0x42, 0x2e, 0x97, 0xa9, 0x21, 0xc5, 0x04, 0x9c,
2272  	0xb4, 0xbf, 0x49, 0x46, 0x8a, 0x99, 0x0a, 0x16
2273  };
2274  
2275  static const u8 ecsdsa_brainpoolp384r1_test_vectors_expected_sig[] = {
2276  	0x97, 0x27, 0x3d, 0x1b, 0x4a, 0x56, 0xe5, 0x55,
2277  	0x77, 0xe0, 0x9c, 0xd4, 0xe0, 0x78, 0x2f, 0x6e,
2278  	0x8d, 0x8b, 0x2e, 0xe0, 0xde, 0xef, 0x84, 0x44,
2279  	0xd1, 0x3a, 0xc3, 0x5c, 0xe5, 0xf3, 0x5f, 0xae,
2280  	0x49, 0xc2, 0x6a, 0x31, 0x26, 0xb4, 0x44, 0x88,
2281  	0xc1, 0x4e, 0x3e, 0xcf, 0x78, 0x4c, 0xd8, 0xe5,
2282  
2283  	0x1b, 0x71, 0x79, 0x37, 0x89, 0x3a, 0x77, 0x90,
2284  	0xa8, 0x80, 0x01, 0x19, 0x87, 0xb6, 0x47, 0x1e,
2285  	0x4b, 0xb4, 0x56, 0xc9, 0x08, 0x79, 0x32, 0x29,
2286  	0x2f, 0x28, 0x35, 0x09, 0xcb, 0x39, 0x6c, 0x68,
2287  	0x13, 0x84, 0xcc, 0xb0, 0xc3, 0x97, 0x72, 0x86,
2288  	0x4c, 0xb5, 0x18, 0x5e, 0xaa, 0x59, 0xf4, 0x3d
2289  };
2290  
2291  static const ec_test_case ecsdsa_brainpoolp384r1_test_case = {
2292  	.name = "ECSDSA-SHA384/brainpoolp384r1",
2293  	.ec_str_p = &brainpoolp384r1_str_params,
2294  	.priv_key = ecsdsa_brainpoolp384r1_test_vectors_priv_key,
2295  	.priv_key_len = sizeof(ecsdsa_brainpoolp384r1_test_vectors_priv_key),
2296  	.nn_random = ecsdsa_nn_random_brainpoolp384r1_test_vector,
2297  	.hash_type = SHA384,
2298  	.msg = "abc",
2299  	.msglen = 3,
2300  	.sig_type = ECSDSA,
2301  	.exp_sig = ecsdsa_brainpoolp384r1_test_vectors_expected_sig,
2302  	.exp_siglen = sizeof(ecsdsa_brainpoolp384r1_test_vectors_expected_sig),
2303  	.adata = NULL,
2304  	.adata_len = 0
2305  };
2306  
2307  #endif /* WITH_CURVE_BRAINPOOLP384R1 */
2308  #endif /* WITH_HASH_SHA384 */
2309  
2310  #ifdef WITH_HASH_SHA512
2311  #ifdef WITH_CURVE_BRAINPOOLP512R1
2312  #define ECSDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
2313  
2314  /* ECSDSA Brainpoolp512r1 test vectors */
2315  
2316  static int ecsdsa_nn_random_brainpoolp512r1_test_vector(nn_t out, nn_src_t q)
2317  {
2318  	int ret, cmp;
2319  
2320  	/*
2321  	 * Fixed ephemeral private key for brainpoolp512r1 signature
2322  	 */
2323  	const u8 k_buf[] = {
2324  		0x65, 0xe7, 0x6d, 0xe3, 0x2e, 0x77, 0x21, 0x67,
2325  		0x3a, 0x99, 0x1d, 0x95, 0xda, 0x6f, 0x7e, 0x0a,
2326  		0x5a, 0x72, 0x72, 0xf8, 0xde, 0x4a, 0xae, 0xfe,
2327  		0xd9, 0x7b, 0x49, 0x07, 0xda, 0x0e, 0xe8, 0x4d,
2328  		0x66, 0xdd, 0x51, 0x8e, 0x6e, 0x75, 0xd3, 0x28,
2329  		0x54, 0x08, 0xaf, 0x82, 0xeb, 0xf2, 0x5a, 0x5e,
2330  		0x3c, 0x14, 0x9b, 0x6e, 0xba, 0xba, 0x2b, 0x7b,
2331  		0xdf, 0x6d, 0x26, 0x0e, 0x3a, 0xea, 0xae, 0xbc
2332  	};
2333  
2334  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2335  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2336  
2337  	ret = (cmp >= 0) ? -1 : 0;
2338  
2339  err:
2340  	return ret;
2341  }
2342  
2343  static const u8 ecsdsa_brainpoolp512r1_test_vectors_priv_key[] = {
2344  	0x20, 0xe6, 0xe2, 0x08, 0x67, 0xf7, 0x29, 0x0c,
2345  	0x04, 0xfc, 0x00, 0x7e, 0x77, 0x34, 0x9e, 0x30,
2346  	0x09, 0xaa, 0xc0, 0x3d, 0xfa, 0xf0, 0xd2, 0x56,
2347  	0x70, 0x86, 0x73, 0x86, 0xca, 0xce, 0xdb, 0xcd,
2348  	0x55, 0x3d, 0xd0, 0x1b, 0x86, 0xdd, 0x50, 0x17,
2349  	0xe1, 0xdc, 0x45, 0xa1, 0xa5, 0xae, 0xd3, 0x80,
2350  	0x72, 0xef, 0x04, 0xe7, 0x9f, 0x36, 0xc3, 0xe7,
2351  	0x84, 0xd5, 0xdf, 0x80, 0x39, 0xc2, 0x5d, 0x18
2352  };
2353  
2354  static const u8 ecsdsa_brainpoolp512r1_test_vectors_expected_sig[] = {
2355  	0x7f, 0xf5, 0x12, 0x0a, 0xaa, 0x8f, 0x7a, 0x31,
2356  	0xe9, 0xaf, 0x44, 0x4b, 0xdf, 0x97, 0x1e, 0x80,
2357  	0x0c, 0xb8, 0x3c, 0x4c, 0x45, 0x39, 0xa1, 0xa6,
2358  	0x51, 0x53, 0xc2, 0x32, 0x48, 0x62, 0x7a, 0x12,
2359  	0xf5, 0xf3, 0xb1, 0xd6, 0xdf, 0x07, 0x78, 0x14,
2360  	0xa0, 0x53, 0xcb, 0x6e, 0xef, 0x07, 0x20, 0xc3,
2361  	0x9f, 0xf2, 0x34, 0x20, 0x31, 0x21, 0x5e, 0xea,
2362  	0x55, 0xd7, 0xff, 0xd6, 0x4f, 0x18, 0xc2, 0x64,
2363  
2364  	0x45, 0xdb, 0xd2, 0xae, 0xf5, 0x0c, 0x14, 0x8b,
2365  	0xad, 0xaa, 0x2d, 0x1e, 0x04, 0x06, 0xaf, 0xb9,
2366  	0x1f, 0x17, 0x20, 0x3f, 0x29, 0x8c, 0xc6, 0x63,
2367  	0xb6, 0xf9, 0xc4, 0x56, 0x4f, 0xa7, 0x76, 0x31,
2368  	0xe5, 0x46, 0x6b, 0x86, 0x80, 0x59, 0xdf, 0x01,
2369  	0x27, 0x38, 0x0f, 0x17, 0x8c, 0x59, 0xcc, 0xad,
2370  	0x8c, 0x63, 0xe4, 0xa6, 0x48, 0x84, 0x88, 0x95,
2371  	0x0e, 0x6f, 0xa6, 0x2a, 0xbf, 0x4b, 0xff, 0x30
2372  };
2373  
2374  static const ec_test_case ecsdsa_brainpoolp512r1_test_case = {
2375  	.name = "ECSDSA-SHA512/brainpoolp512r1",
2376  	.ec_str_p = &brainpoolp512r1_str_params,
2377  	.priv_key = ecsdsa_brainpoolp512r1_test_vectors_priv_key,
2378  	.priv_key_len = sizeof(ecsdsa_brainpoolp512r1_test_vectors_priv_key),
2379  	.nn_random = ecsdsa_nn_random_brainpoolp512r1_test_vector,
2380  	.hash_type = SHA512,
2381  	.msg = "abc",
2382  	.msglen = 3,
2383  	.sig_type = ECSDSA,
2384  	.exp_sig = ecsdsa_brainpoolp512r1_test_vectors_expected_sig,
2385  	.exp_siglen = sizeof(ecsdsa_brainpoolp512r1_test_vectors_expected_sig),
2386  	.adata = NULL,
2387  	.adata_len = 0
2388  };
2389  #endif /* WITH_CURVE_BRAINPOOLP512R1 */
2390  #endif /* WITH_HASH_SHA512 */
2391  
2392  #ifdef WITH_HASH_SHA256
2393  #ifdef WITH_CURVE_FRP256V1
2394  #define ECSDSA_SHA256_FRP256V1_SELF_TEST
2395  
2396  /* ECSDSA frp256v1 test vectors */
2397  
2398  static int ecsdsa_nn_random_frp256v1_test_vector(nn_t out, nn_src_t q)
2399  {
2400  	int ret, cmp;
2401  
2402  	/*
2403  	 * Fixed ephemeral private key for frp256v1 signature
2404  	 */
2405  	const u8 k_buf[] = {
2406  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
2407  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
2408  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
2409  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
2410  	};
2411  
2412  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2413  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2414  
2415  	ret = (cmp >= 0) ? -1 : 0;
2416  
2417  err:
2418  	return ret;
2419  }
2420  
2421  static const u8 ecsdsa_frp256v1_test_vectors_priv_key[] = {
2422  	0x00, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
2423  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
2424  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
2425  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
2426  };
2427  
2428  static const u8 ecsdsa_frp256v1_test_vectors_expected_sig[] = {
2429  	0x9e, 0x57, 0x81, 0x73, 0xf9, 0x7b, 0xbe, 0xb1,
2430  	0xdc, 0xc4, 0x4f, 0xe6, 0xc1, 0x7a, 0x40, 0x9e,
2431  	0x22, 0xad, 0x13, 0xa1, 0xa9, 0x69, 0x14, 0x62,
2432  	0x0d, 0x08, 0x76, 0x0f, 0xe0, 0xd7, 0xc6, 0x75,
2433  
2434  	0x9b, 0x3a, 0xb9, 0xd5, 0xb6, 0x7f, 0xf2, 0xb9,
2435  	0xaa, 0xe8, 0xc5, 0xed, 0xf9, 0x82, 0xd4, 0xf7,
2436  	0x6d, 0x7c, 0x61, 0x36, 0x56, 0xe7, 0x73, 0xaa,
2437  	0x1a, 0xab, 0xa6, 0x30, 0x90, 0x1d, 0x56, 0xa6,
2438  };
2439  
2440  static const ec_test_case ecsdsa_frp256v1_test_case = {
2441  	.name = "ECSDSA-SHA256/frp256v1",
2442  	.ec_str_p = &frp256v1_str_params,
2443  	.priv_key = ecsdsa_frp256v1_test_vectors_priv_key,
2444  	.priv_key_len = sizeof(ecsdsa_frp256v1_test_vectors_priv_key),
2445  	.nn_random = ecsdsa_nn_random_frp256v1_test_vector,
2446  	.hash_type = SHA256,
2447  	.msg = "abc",
2448  	.msglen = 3,
2449  	.sig_type = ECSDSA,
2450  	.exp_sig = ecsdsa_frp256v1_test_vectors_expected_sig,
2451  	.exp_siglen = sizeof(ecsdsa_frp256v1_test_vectors_expected_sig),
2452  	.adata = NULL,
2453  	.adata_len = 0
2454  };
2455  #endif /* WITH_CURVE_FRP256V1 */
2456  #endif /* WITH_HASH_SHA256 */
2457  #endif /* WITH_SIG_ECSDSA */
2458  
2459  /*******************************************************************
2460   ************** ECOSDSA tests **************************************
2461   *******************************************************************/
2462  
2463  #ifdef WITH_SIG_ECOSDSA
2464  #ifdef WITH_HASH_SHA224
2465  #ifdef WITH_CURVE_SECP224R1
2466  #define ECOSDSA_SHA224_SECP224R1_SELF_TEST
2467  
2468  /* ECOSDSA secp224r1 test vectors */
2469  
2470  static int ecosdsa_nn_random_secp224r1_test_vector(nn_t out, nn_src_t q)
2471  {
2472  	int ret, cmp;
2473  
2474  	const u8 k_buf[] = {
2475  		0xc1, 0xbe, 0x08, 0xf7, 0xa6, 0xda, 0x95, 0xea,
2476  		0xda, 0xc9, 0x2b, 0x7a, 0x8d, 0xfa, 0x4b, 0x8c,
2477  		0x0b, 0x09, 0x9a, 0xf3, 0xa3, 0x0a, 0x23, 0xb5,
2478  		0xa7, 0x6a, 0xa4, 0xc5
2479  	};
2480  
2481  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2482  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2483  
2484  	ret = (cmp >= 0) ? -1 : 0;
2485  
2486  err:
2487  	return ret;
2488  }
2489  
2490  static const u8 ecosdsa_secp224r1_test_vectors_priv_key[] = {
2491  	0xfd, 0x22, 0xee, 0x55, 0x5f, 0x4a, 0xb5, 0x40,
2492  	0x1b, 0xbd, 0x53, 0x65, 0xec, 0x8a, 0xec, 0x37,
2493  	0xf3, 0xb4, 0xcb, 0xe4, 0xeb, 0xdd, 0x55, 0x40,
2494  	0xad, 0x92, 0x29, 0xf0
2495  };
2496  
2497  static const u8 ecosdsa_secp224r1_test_vectors_expected_sig[] = {
2498  	0x48, 0x33, 0x6d, 0x3d, 0x8d, 0xa5, 0x3b, 0x5d,
2499  	0xff, 0xca, 0x3e, 0x36, 0x24, 0x7b, 0xeb, 0x07,
2500  	0x0c, 0x32, 0x53, 0x21, 0xf3, 0x7e, 0xb3, 0xf7,
2501  	0xe3, 0xb1, 0xaa, 0xb3,
2502  	0x28, 0x39, 0xe8, 0x80, 0xbe, 0x1a, 0x2e, 0xd8,
2503  	0x31, 0x4f, 0x85, 0x2d, 0xf6, 0x6b, 0x1a, 0xc0,
2504  	0xb7, 0x22, 0x89, 0xa9, 0xf8, 0x70, 0xd5, 0x19,
2505  	0xbb, 0x80, 0x11, 0x16
2506  };
2507  
2508  static const ec_test_case ecosdsa_secp224r1_test_case = {
2509  	.name = "ECOSDSA-SHA224/secp224r1",
2510  	.ec_str_p = &secp224r1_str_params,
2511  	.priv_key = ecosdsa_secp224r1_test_vectors_priv_key,
2512  	.priv_key_len = sizeof(ecosdsa_secp224r1_test_vectors_priv_key),
2513  	.nn_random = ecosdsa_nn_random_secp224r1_test_vector,
2514  	.hash_type = SHA224,
2515  	.msg = "abc",
2516  	.msglen = 3,
2517  	.sig_type = ECOSDSA,
2518  	.exp_sig = ecosdsa_secp224r1_test_vectors_expected_sig,
2519  	.exp_siglen = sizeof(ecosdsa_secp224r1_test_vectors_expected_sig),
2520  	.adata = NULL,
2521  	.adata_len = 0
2522  };
2523  #endif /* WITH_CURVE_SECP224R1 */
2524  #endif /* WITH_HASH_SHA224 */
2525  
2526  #ifdef WITH_HASH_SHA256
2527  #ifdef WITH_CURVE_SECP256R1
2528  #define ECOSDSA_SHA256_SECP256R1_SELF_TEST
2529  
2530  /* ECOSDSA secp256r1 test vectors */
2531  
2532  static int ecosdsa_nn_random_iso14888_3_secp256r1_test_vector(nn_t out,
2533  							      nn_src_t q)
2534  {
2535  	int ret, cmp;
2536  	const u8 k_buf[] = {
2537  		0xDE, 0x7E, 0x0E, 0x5E, 0x66, 0x3F, 0x24, 0x18,
2538  		0x34, 0x14, 0xB7, 0xC7, 0x2F, 0x24, 0x54, 0x6B,
2539  		0x81, 0xE9, 0xE5, 0xF4, 0x10, 0xBE, 0xBF, 0x26,
2540  		0xF3, 0xCA, 0x5F, 0xA8, 0x2F, 0x51, 0x92, 0xC8
2541  	};
2542  
2543  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2544  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2545  
2546  	ret = (cmp >= 0) ? -1 : 0;
2547  
2548  err:
2549  	return ret;
2550  }
2551  
2552  static const u8 ecosdsa_secp256r1_test_vectors_priv_key[] = {
2553  	0x52, 0x02, 0xA3, 0xD8, 0xAC, 0xAF, 0x69, 0x09,
2554  	0xD1, 0x2C, 0x9A, 0x77, 0x4C, 0xD8, 0x86, 0xF9,
2555  	0xFB, 0xA6, 0x11, 0x37, 0xFF, 0xD3, 0xE8, 0xE7,
2556  	0x6A, 0xED, 0x36, 0x3F, 0xB4, 0x7A, 0xC4, 0x92
2557  };
2558  
2559  static const u8 ecosdsa_secp256r1_test_vectors_expected_sig[] = {
2560  	0xD7, 0xFB, 0x81, 0x35, 0xD8, 0xEA, 0x45, 0xE8,
2561  	0xFB, 0x3C, 0x90, 0x59, 0xF1, 0x46, 0xE2, 0x63,
2562  	0x0E, 0xF4, 0xBD, 0x51, 0xC4, 0x00, 0x6A, 0x92,
2563  	0xED, 0xB4, 0xC8, 0xB0, 0x84, 0x99, 0x63, 0xFB,
2564  	0xB4, 0x6D, 0x15, 0x25, 0x37, 0x9E, 0x02, 0xE2,
2565  	0x32, 0xD9, 0x79, 0x28, 0x26, 0x5B, 0x72, 0x54,
2566  	0xEA, 0x2E, 0xD9, 0x78, 0x13, 0x45, 0x43, 0x88,
2567  	0xC1, 0xA0, 0x8F, 0x62, 0xDC, 0xCD, 0x70, 0xB3
2568  };
2569  
2570  static const ec_test_case ecosdsa_secp256r1_test_case = {
2571  	.name = "ECOSDSA-SHA256/secp256r1",
2572  	.ec_str_p = &secp256r1_str_params,
2573  	.priv_key = ecosdsa_secp256r1_test_vectors_priv_key,
2574  	.priv_key_len = sizeof(ecosdsa_secp256r1_test_vectors_priv_key),
2575  	.nn_random = ecosdsa_nn_random_iso14888_3_secp256r1_test_vector,
2576  	.hash_type = SHA256,
2577  	.msg = "abc",
2578  	.msglen = 3,
2579  	.sig_type = ECOSDSA,
2580  	.exp_sig = ecosdsa_secp256r1_test_vectors_expected_sig,
2581  	.exp_siglen = sizeof(ecosdsa_secp256r1_test_vectors_expected_sig),
2582  	.adata = NULL,
2583  	.adata_len = 0
2584  };
2585  #endif /* WITH_CURVE_SECP256R1 */
2586  #endif /* WITH_HASH_SHA256 */
2587  
2588  #ifdef WITH_HASH_SHA384
2589  #ifdef WITH_CURVE_SECP384R1
2590  #define ECOSDSA_SHA384_SECP384R1_SELF_TEST
2591  
2592  /* ECOSDSA secp384r1 test vectors */
2593  
2594  static int ecosdsa_nn_random_iso14888_3_secp384r1_test_vector(nn_t out,
2595  							      nn_src_t q)
2596  
2597  {
2598  	int ret, cmp;
2599  	const u8 k_buf[] = {
2600  		0x8A, 0x29, 0xE7, 0x72, 0x35, 0x7B, 0xBA, 0x6F,
2601  		0x5C, 0x9E, 0xA7, 0x65, 0xD5, 0x08, 0x2B, 0x9B,
2602  		0xC7, 0xA7, 0x4C, 0x33, 0xE9, 0xD9, 0x4D, 0x49,
2603  		0xFB, 0x2C, 0x9D, 0x3B, 0x52, 0x3A, 0x82, 0x16,
2604  		0x96, 0x82, 0xEC, 0xF1, 0x6F, 0x1D, 0x06, 0x26,
2605  		0x90, 0x42, 0xF3, 0xAF, 0x04, 0x4B, 0x4D, 0xE8
2606  	};
2607  
2608  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2609  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2610  
2611  	ret = (cmp >= 0) ? -1 : 0;
2612  
2613  err:
2614  	return ret;
2615  }
2616  
2617  static const u8 ecosdsa_secp384r1_test_vectors_priv_key[] = {
2618  	0x7E, 0x49, 0x14, 0xFE, 0x4B, 0x61, 0x70, 0x89,
2619  	0xF9, 0xFE, 0x80, 0xAD, 0x91, 0x3D, 0x55, 0x30,
2620  	0xEE, 0xC4, 0xF3, 0x0B, 0xCA, 0x1A, 0xD6, 0x6E,
2621  	0x7B, 0x5A, 0xEA, 0xCF, 0x29, 0xD2, 0xF5, 0x67,
2622  	0xD9, 0xA8, 0xF4, 0xA4, 0x55, 0x2A, 0x1A, 0x1A,
2623  	0xF3, 0xE0, 0xB6, 0xD0, 0xA4, 0x9D, 0xFC, 0xC8
2624  };
2625  
2626  static const u8 ecosdsa_secp384r1_test_vectors_expected_sig[] = {
2627  	0x27, 0xD2, 0xF5, 0xB9, 0x62, 0xA3, 0xAC, 0xF6,
2628  	0x39, 0x0A, 0x47, 0x18, 0xEA, 0x54, 0x0D, 0xA7,
2629  	0x96, 0x12, 0xA6, 0x0E, 0xAA, 0x15, 0xBE, 0xBB,
2630  	0x00, 0xB9, 0xE1, 0x66, 0x57, 0x83, 0xF7, 0xC7,
2631  	0x91, 0xCC, 0xAC, 0x42, 0x2C, 0xEE, 0x81, 0x5A,
2632  	0x9C, 0x5D, 0xA3, 0x67, 0x8A, 0xC8, 0xD1, 0xF0,
2633  	0x22, 0xCC, 0x89, 0xCE, 0xB9, 0xE6, 0xBE, 0x84,
2634  	0x15, 0xCC, 0x14, 0xB3, 0x99, 0xBC, 0x66, 0xE6,
2635  	0xF3, 0xA2, 0x1E, 0x5B, 0xA3, 0x8E, 0x09, 0xA6,
2636  	0xDE, 0x8D, 0xE6, 0x70, 0xA1, 0x45, 0xC0, 0xE4,
2637  	0x74, 0xD5, 0xCC, 0x88, 0xBE, 0x88, 0x78, 0xF0,
2638  	0x12, 0x3C, 0xC6, 0x62, 0x25, 0xA1, 0xBA, 0x12
2639  };
2640  
2641  static const ec_test_case ecosdsa_secp384r1_test_case = {
2642  	.name = "ECOSDSA-SHA384/secp384r1",
2643  	.ec_str_p = &secp384r1_str_params,
2644  	.priv_key = ecosdsa_secp384r1_test_vectors_priv_key,
2645  	.priv_key_len = sizeof(ecosdsa_secp384r1_test_vectors_priv_key),
2646  	.nn_random = ecosdsa_nn_random_iso14888_3_secp384r1_test_vector,
2647  	.hash_type = SHA384,
2648  	.msg = "abc",
2649  	.msglen = 3,
2650  	.sig_type = ECOSDSA,
2651  	.exp_sig = ecosdsa_secp384r1_test_vectors_expected_sig,
2652  	.exp_siglen = sizeof(ecosdsa_secp384r1_test_vectors_expected_sig),
2653  	.adata = NULL,
2654  	.adata_len = 0
2655  };
2656  #endif /* WITH_CURVE_SECP384R1 */
2657  #endif /* WITH_HASH_SHA384 */
2658  
2659  #ifdef WITH_HASH_SHA512
2660  #ifdef WITH_CURVE_SECP521R1
2661  #define ECOSDSA_SHA512_SECP521R1_SELF_TEST
2662  
2663  /* ECOSDSA secp521r1 test vectors */
2664  
2665  static int ecosdsa_nn_random_secp521r1_test_vector(nn_t out, nn_src_t q)
2666  {
2667  	int ret, cmp;
2668  
2669  	/*
2670  	 * Fixed ephemeral private key for secp521r1 signature
2671  	 * test vectors from RFC4754
2672  	 */
2673  	const u8 k_buf[] = {
2674  		0x01, 0x73, 0x03, 0x00, 0x16, 0x30, 0x79, 0x94,
2675  		0x9b, 0xb6, 0xe3, 0x60, 0x3c, 0x96, 0xf6, 0xf0,
2676  		0x90, 0x23, 0xa6, 0xf7, 0x48, 0xc5, 0xa6, 0xfc,
2677  		0x41, 0xec, 0x39, 0xf5, 0x24, 0x04, 0x59, 0x59,
2678  		0xa8, 0xfe, 0x4c, 0xc1, 0x9b, 0x01, 0x47, 0x5a,
2679  		0xac, 0xc5, 0xf3, 0x92, 0xab, 0x50, 0x60, 0x1f,
2680  		0x39, 0x8b, 0xc3, 0xb8, 0x01, 0x4a, 0x63, 0x91,
2681  		0x1b, 0xce, 0x30, 0xe7, 0xcc, 0x0f, 0x3d, 0x82,
2682  		0x3b, 0x05
2683  	};
2684  
2685  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2686  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2687  
2688  	ret = (cmp >= 0) ? -1 : 0;
2689  
2690  err:
2691  	return ret;
2692  }
2693  
2694  static const u8 ecosdsa_secp521r1_test_vectors_priv_key[] = {
2695  	0x01, 0x08, 0xb9, 0x4c, 0x21, 0x92, 0x06, 0xb8,
2696  	0xd8, 0x92, 0x16, 0x90, 0xa5, 0x15, 0x76, 0xae,
2697  	0x70, 0x3d, 0x46, 0x4b, 0x71, 0xbd, 0xf5, 0x68,
2698  	0xf9, 0xf6, 0x70, 0x92, 0x95, 0x67, 0x85, 0x80,
2699  	0x55, 0xb9, 0x16, 0xdb, 0xce, 0x5d, 0xb5, 0x6a,
2700  	0x25, 0xb7, 0x91, 0x33, 0x25, 0xf5, 0x14, 0xf7,
2701  	0x2a, 0x22, 0xbe, 0x4e, 0xfb, 0x4d, 0xb7, 0x9e,
2702  	0x2f, 0x01, 0xb5, 0x71, 0xa9, 0x3f, 0x21, 0x79,
2703  	0x82, 0xc5
2704  };
2705  
2706  static const u8 ecosdsa_secp521r1_test_vectors_expected_sig[] = {
2707  	0xbd, 0x54, 0xe8, 0xd7, 0x27, 0x1c, 0xcc, 0x1e,
2708  	0x0a, 0xdd, 0xc3, 0x33, 0x8a, 0x99, 0xeb, 0x94,
2709  	0x5e, 0x65, 0x40, 0x18, 0x05, 0x6f, 0xaf, 0x7e,
2710  	0xc7, 0x6c, 0x0a, 0xa6, 0xb4, 0xd2, 0x62, 0x89,
2711  	0x00, 0xe0, 0x5c, 0x05, 0x24, 0x95, 0xa0, 0x91,
2712  	0x7d, 0x80, 0x85, 0x14, 0xd9, 0x1e, 0x41, 0x42,
2713  	0xc5, 0xae, 0x53, 0x06, 0x24, 0x31, 0xe2, 0x31,
2714  	0x05, 0x8d, 0xb5, 0x19, 0x2e, 0x35, 0x90, 0xe3,
2715  
2716  	0x00, 0x52, 0x7b, 0xab, 0x84, 0xc9, 0xaf, 0x15,
2717  	0xcf, 0xa7, 0xd9, 0x25, 0x29, 0xdc, 0x15, 0xd2,
2718  	0x17, 0x45, 0xee, 0x04, 0x88, 0x91, 0xf5, 0xe0,
2719  	0x6a, 0x06, 0x65, 0xe5, 0xcb, 0x16, 0x2e, 0x62,
2720  	0x2a, 0x0a, 0x62, 0xc3, 0x12, 0x23, 0xcc, 0x21,
2721  	0x6d, 0x8f, 0xfe, 0xc3, 0x3a, 0xcd, 0xdd, 0xe5,
2722  	0x0d, 0x58, 0xef, 0xe3, 0x87, 0x89, 0x3a, 0x5c,
2723  	0xbc, 0xe2, 0xea, 0x07, 0x6e, 0x3b, 0x7c, 0xe7,
2724  	0x95, 0x00,
2725  };
2726  
2727  static const ec_test_case ecosdsa_secp521r1_test_case = {
2728  	.name = "ECOSDSA-SHA512/secp521r1",
2729  	.ec_str_p = &secp521r1_str_params,
2730  	.priv_key = ecosdsa_secp521r1_test_vectors_priv_key,
2731  	.priv_key_len = sizeof(ecosdsa_secp521r1_test_vectors_priv_key),
2732  	.nn_random = ecosdsa_nn_random_secp521r1_test_vector,
2733  	.hash_type = SHA512,
2734  	.msg = "abc",
2735  	.msglen = 3,
2736  	.sig_type = ECOSDSA,
2737  	.exp_sig = ecosdsa_secp521r1_test_vectors_expected_sig,
2738  	.exp_siglen = sizeof(ecosdsa_secp521r1_test_vectors_expected_sig),
2739  	.adata = NULL,
2740  	.adata_len = 0
2741  };
2742  #endif /* WITH_CURVE_SECP521R1 */
2743  #endif /* WITH_HASH_SHA512 */
2744  
2745  #ifdef WITH_HASH_SHA256
2746  #ifdef WITH_CURVE_BRAINPOOLP256R1
2747  #define ECOSDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
2748  
2749  /* ECOSDSA Brainpoolp256r1 test vectors */
2750  
2751  static int ecosdsa_nn_random_brainpoolp256r1_test_vector(nn_t out, nn_src_t q)
2752  {
2753  	int ret, cmp;
2754  
2755  	/*
2756  	 * Fixed ephemeral private key for brainpoolp256r1 signature
2757  	 */
2758  	const u8 k_buf[] = {
2759  		0x3f, 0x80, 0xde, 0x27, 0x3e, 0xef, 0xc9, 0x53,
2760  		0xc9, 0x25, 0xab, 0x53, 0xdd, 0xba, 0xd4, 0xb3,
2761  		0x23, 0x98, 0xb7, 0xcc, 0x39, 0xb1, 0xda, 0xe4,
2762  		0xbe, 0x68, 0x37, 0xd4, 0xd9, 0x9e, 0xa0, 0x49
2763  	};
2764  
2765  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2766  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2767  
2768  	ret = (cmp >= 0) ? -1 : 0;
2769  
2770  err:
2771  	return ret;
2772  }
2773  
2774  static const u8 ecosdsa_brainpoolp256r1_test_vectors_priv_key[] = {
2775  	0xa8, 0x44, 0x22, 0x5a, 0xf8, 0xae, 0xb6, 0xa7,
2776  	0x66, 0x10, 0x93, 0xe5, 0x44, 0xd8, 0x47, 0xa0,
2777  	0x63, 0x82, 0x08, 0xcf, 0xc6, 0x4f, 0x6e, 0xa8,
2778  	0x1c, 0xbb, 0x0d, 0xbb, 0xcf, 0x16, 0x4d, 0xa2
2779  };
2780  
2781  static const u8 ecosdsa_brainpoolp256r1_test_vectors_expected_sig[] = {
2782  	0xc1, 0x5a, 0x0e, 0xd2, 0x9c, 0x39, 0x3b, 0x04,
2783  	0x14, 0xaa, 0x40, 0xe5, 0x1c, 0xe6, 0x45, 0x28,
2784  	0x19, 0xa9, 0x7f, 0x66, 0x1b, 0x4f, 0x11, 0x50,
2785  	0x13, 0x8f, 0xc4, 0xe6, 0x96, 0x47, 0xe1, 0xa4,
2786  
2787  	0x1c, 0x26, 0x9e, 0x5e, 0xd2, 0x9d, 0x38, 0x1a,
2788  	0xc4, 0xa0, 0xed, 0x86, 0xe4, 0x73, 0x68, 0x46,
2789  	0xa4, 0x34, 0x72, 0x6a, 0xb5, 0x36, 0x0d, 0x3a,
2790  	0x7e, 0x2b, 0x1c, 0x44, 0x0a, 0x69, 0xfe, 0xde
2791  };
2792  
2793  static const ec_test_case ecosdsa_brainpoolp256r1_test_case = {
2794  	.name = "ECOSDSA-SHA256/brainpoolp256r1",
2795  	.ec_str_p = &brainpoolp256r1_str_params,
2796  	.priv_key = ecosdsa_brainpoolp256r1_test_vectors_priv_key,
2797  	.priv_key_len = sizeof(ecosdsa_brainpoolp256r1_test_vectors_priv_key),
2798  	.nn_random = ecosdsa_nn_random_brainpoolp256r1_test_vector,
2799  	.hash_type = SHA256,
2800  	.msg = "abc",
2801  	.msglen = 3,
2802  	.sig_type = ECOSDSA,
2803  	.exp_sig = ecosdsa_brainpoolp256r1_test_vectors_expected_sig,
2804  	.exp_siglen = sizeof(ecosdsa_brainpoolp256r1_test_vectors_expected_sig),
2805  	.adata = NULL,
2806  	.adata_len = 0
2807  };
2808  
2809  #endif /* WITH_CURVE_BRAINPOOLP256R1 */
2810  #endif /* WITH_HASH_SHA256 */
2811  
2812  #ifdef WITH_HASH_SHA384
2813  #ifdef WITH_CURVE_BRAINPOOLP384R1
2814  #define ECOSDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
2815  
2816  /* ECOSDSA Brainpoolp384r1 test vectors */
2817  
2818  static int ecosdsa_nn_random_brainpoolp384r1_test_vector(nn_t out, nn_src_t q)
2819  {
2820  	int ret, cmp;
2821  
2822  	/*
2823  	 * Fixed ephemeral private key for brainpoolp384r1 signature
2824  	 */
2825  	const u8 k_buf[] = {
2826  		0x4c, 0x0f, 0xa0, 0xfb, 0xd2, 0xec, 0x92, 0x0f,
2827  		0x70, 0x32, 0xb2, 0xd5, 0xa4, 0xb0, 0xe5, 0xb0,
2828  		0x88, 0xc1, 0x70, 0x6a, 0xe1, 0x4a, 0xc7, 0x49,
2829  		0xc3, 0x14, 0x8a, 0x09, 0x9d, 0x3f, 0x0e, 0xde,
2830  		0xe6, 0xf9, 0x73, 0x36, 0x76, 0x3b, 0xa7, 0x53,
2831  		0x4c, 0xf5, 0x29, 0xa3, 0xd6, 0xe4, 0x60, 0x3e
2832  	};
2833  
2834  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2835  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2836  
2837  	ret = (cmp >= 0) ? -1 : 0;
2838  
2839  err:
2840  	return ret;
2841  }
2842  
2843  static const u8 ecosdsa_brainpoolp384r1_test_vectors_priv_key[] = {
2844  	0x84, 0x27, 0xc5, 0xc6, 0xb1, 0x95, 0x1a, 0x87,
2845  	0x4a, 0x00, 0x02, 0xfc, 0xeb, 0x8b, 0x8f, 0x46,
2846  	0x53, 0x2a, 0x82, 0xff, 0xac, 0x72, 0x78, 0x70,
2847  	0x6a, 0x04, 0xe6, 0x25, 0x6b, 0x0f, 0xbd, 0x6e,
2848  	0x10, 0xab, 0x74, 0x9d, 0xee, 0x3e, 0x02, 0x7d,
2849  	0xc5, 0x2e, 0x3c, 0x55, 0x25, 0xc0, 0x1e, 0x7d
2850  };
2851  
2852  static const u8 ecosdsa_brainpoolp384r1_test_vectors_expected_sig[] = {
2853  	0xf8, 0x8e, 0x7c, 0x39, 0xcf, 0x98, 0xa5, 0x7d,
2854  	0xb1, 0x6f, 0x3b, 0xea, 0x31, 0x61, 0xd5, 0x8a,
2855  	0x9d, 0x90, 0xfe, 0x4b, 0xa8, 0xc0, 0x71, 0x65,
2856  	0x93, 0x63, 0x34, 0x99, 0x0b, 0x06, 0xaf, 0x5e,
2857  	0x86, 0xb1, 0x10, 0x53, 0x39, 0xfd, 0xf1, 0x52,
2858  	0xda, 0x28, 0x9f, 0x6b, 0x4c, 0xd4, 0x20, 0x43,
2859  
2860  	0x69, 0x4e, 0x23, 0x7e, 0xc4, 0x5a, 0x83, 0x22,
2861  	0x61, 0x53, 0xfd, 0x08, 0xc7, 0x5e, 0xdc, 0x69,
2862  	0xc0, 0x22, 0x3f, 0x59, 0x8b, 0xf1, 0x9e, 0x8d,
2863  	0x07, 0xb0, 0xb2, 0x38, 0x8a, 0xe2, 0xb7, 0x79,
2864  	0x46, 0xda, 0xa2, 0x39, 0x4d, 0x7a, 0xce, 0x38,
2865  	0x2a, 0xc6, 0xbe, 0xda, 0x21, 0x67, 0x81, 0xbf
2866  };
2867  
2868  static const ec_test_case ecosdsa_brainpoolp384r1_test_case = {
2869  	.name = "ECOSDSA-SHA384/brainpoolp384r1",
2870  	.ec_str_p = &brainpoolp384r1_str_params,
2871  	.priv_key = ecosdsa_brainpoolp384r1_test_vectors_priv_key,
2872  	.priv_key_len = sizeof(ecosdsa_brainpoolp384r1_test_vectors_priv_key),
2873  	.nn_random = ecosdsa_nn_random_brainpoolp384r1_test_vector,
2874  	.hash_type = SHA384,
2875  	.msg = "abc",
2876  	.msglen = 3,
2877  	.sig_type = ECOSDSA,
2878  	.exp_sig = ecosdsa_brainpoolp384r1_test_vectors_expected_sig,
2879  	.exp_siglen = sizeof(ecosdsa_brainpoolp384r1_test_vectors_expected_sig),
2880  	.adata = NULL,
2881  	.adata_len = 0
2882  };
2883  
2884  #endif /* WITH_CURVE_BRAINPOOLP384R1 */
2885  #endif /* WITH_HASH_SHA384 */
2886  
2887  #ifdef WITH_HASH_SHA512
2888  #ifdef WITH_CURVE_BRAINPOOLP512R1
2889  #define ECOSDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
2890  
2891  /* ECOSDSA Brainpoolp512r1 test vectors */
2892  
2893  static int ecosdsa_nn_random_brainpoolp512r1_test_vector(nn_t out, nn_src_t q)
2894  {
2895  	int ret, cmp;
2896  
2897  	/*
2898  	 * Fixed ephemeral private key for brainpoolp512r1 signature
2899  	 */
2900  	const u8 k_buf[] = {
2901  		0x70, 0x82, 0xf3, 0x1a, 0xb1, 0x06, 0x2d, 0x5b,
2902  		0xb8, 0x16, 0x87, 0xd5, 0x65, 0x34, 0x74, 0xc3,
2903  		0x53, 0x23, 0x0a, 0xc0, 0x09, 0xde, 0xd1, 0x44,
2904  		0xad, 0x47, 0x86, 0xda, 0x89, 0xbf, 0x33, 0x0e,
2905  		0x34, 0xd2, 0x12, 0x40, 0x44, 0xa5, 0x8b, 0x08,
2906  		0x5a, 0x7e, 0x70, 0xbc, 0xfd, 0xed, 0x72, 0x03,
2907  		0x07, 0x66, 0xc5, 0x41, 0x49, 0x1a, 0xda, 0x73,
2908  		0x34, 0x3e, 0x7d, 0xf9, 0x0f, 0x0a, 0x4e, 0x38
2909  	};
2910  
2911  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2912  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2913  
2914  	ret = (cmp >= 0) ? -1 : 0;
2915  
2916  err:
2917  	return ret;
2918  }
2919  
2920  static const u8 ecosdsa_brainpoolp512r1_test_vectors_priv_key[] = {
2921  	0x9d, 0xf5, 0xaa, 0xf5, 0xdb, 0xc9, 0x8d, 0x6b,
2922  	0x55, 0xf2, 0xa0, 0x8c, 0xd7, 0xea, 0x7f, 0x7b,
2923  	0x19, 0xdb, 0xc7, 0x8c, 0x28, 0x0d, 0x76, 0xd5,
2924  	0xd1, 0xd2, 0x71, 0xf1, 0x73, 0xc3, 0xca, 0x1e,
2925  	0xf8, 0xfa, 0x96, 0x87, 0x10, 0xd6, 0x14, 0x06,
2926  	0xff, 0xce, 0x74, 0x89, 0x34, 0x27, 0x19, 0x57,
2927  	0x5d, 0x8a, 0x9e, 0x3f, 0x0a, 0xcc, 0xf4, 0x53,
2928  	0xfa, 0x51, 0x5a, 0x8d, 0xcd, 0x3f, 0x5a, 0xf6
2929  };
2930  
2931  static const u8 ecosdsa_brainpoolp512r1_test_vectors_expected_sig[] = {
2932  	0xb2, 0x08, 0xeb, 0xa4, 0xf6, 0x87, 0x2b, 0xd6,
2933  	0xcd, 0xef, 0xad, 0x6e, 0x72, 0x50, 0xb0, 0xb1,
2934  	0x43, 0xb1, 0x4d, 0xfd, 0xf6, 0x10, 0xe8, 0xb5,
2935  	0x95, 0x60, 0xec, 0xe6, 0xf7, 0x03, 0x56, 0xf6,
2936  	0xac, 0xc0, 0x69, 0x57, 0xb5, 0x31, 0x30, 0x60,
2937  	0x0f, 0x58, 0x3f, 0x6a, 0x8d, 0xf8, 0x1d, 0x4b,
2938  	0xb0, 0xe3, 0x05, 0xe8, 0xdb, 0x5a, 0xee, 0x7f,
2939  	0x15, 0xdb, 0xa8, 0xac, 0xbc, 0x3e, 0xba, 0x5d,
2940  
2941  	0x79, 0xc7, 0xad, 0xc8, 0x4a, 0x09, 0xd2, 0x84,
2942  	0x30, 0x9b, 0x09, 0xdc, 0xe3, 0x79, 0x69, 0x33,
2943  	0x4b, 0xb5, 0x3e, 0x57, 0x4c, 0x57, 0x1f, 0xf7,
2944  	0x41, 0x48, 0xeb, 0x27, 0xf9, 0xcc, 0xb9, 0x9c,
2945  	0x23, 0xd7, 0xed, 0xd2, 0x7e, 0x46, 0xb6, 0xd9,
2946  	0x1e, 0x59, 0xc3, 0xb5, 0x62, 0x66, 0x6a, 0x88,
2947  	0xab, 0x3c, 0x66, 0x48, 0x96, 0x57, 0xbb, 0xd4,
2948  	0xd7, 0x4c, 0xac, 0x91, 0x59, 0xfc, 0xb2, 0x08
2949  };
2950  
2951  static const ec_test_case ecosdsa_brainpoolp512r1_test_case = {
2952  	.name = "ECOSDSA-SHA512/brainpoolp512r1",
2953  	.ec_str_p = &brainpoolp512r1_str_params,
2954  	.priv_key = ecosdsa_brainpoolp512r1_test_vectors_priv_key,
2955  	.priv_key_len = sizeof(ecosdsa_brainpoolp512r1_test_vectors_priv_key),
2956  	.nn_random = ecosdsa_nn_random_brainpoolp512r1_test_vector,
2957  	.hash_type = SHA512,
2958  	.msg = "abc",
2959  	.msglen = 3,
2960  	.sig_type = ECOSDSA,
2961  	.exp_sig = ecosdsa_brainpoolp512r1_test_vectors_expected_sig,
2962  	.exp_siglen = sizeof(ecosdsa_brainpoolp512r1_test_vectors_expected_sig),
2963  	.adata = NULL,
2964  	.adata_len = 0
2965  };
2966  #endif /* WITH_CURVE_BRAINPOOLP512R1 */
2967  #endif /* WITH_HASH_SHA512 */
2968  
2969  #ifdef WITH_HASH_SHA256
2970  #ifdef WITH_CURVE_FRP256V1
2971  #define ECOSDSA_SHA256_FRP256V1_SELF_TEST
2972  
2973  /* ECOSDSA frp256v1 test vectors */
2974  
2975  static int ecosdsa_nn_random_frp256v1_test_vector(nn_t out, nn_src_t q)
2976  {
2977  	int ret, cmp;
2978  
2979  	/*
2980  	 * Fixed ephemeral private key for frp256v1 signature
2981  	 */
2982  	const u8 k_buf[] = {
2983  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
2984  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
2985  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
2986  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
2987  	};
2988  
2989  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
2990  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
2991  
2992  	ret = (cmp >= 0) ? -1 : 0;
2993  
2994  err:
2995  	return ret;
2996  }
2997  
2998  static const u8 ecosdsa_frp256v1_test_vectors_priv_key[] = {
2999  	0x00, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
3000  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
3001  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
3002  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
3003  };
3004  
3005  static const u8 ecosdsa_frp256v1_test_vectors_expected_sig[] = {
3006  	0xae, 0xc2, 0x3f, 0x82, 0x0f, 0x4c, 0x50, 0x80,
3007  	0xf4, 0xcd, 0x15, 0xd1, 0xd4, 0x7d, 0x68, 0x51,
3008  	0x5e, 0x98, 0xb2, 0x85, 0xe2, 0x6f, 0x6a, 0x08,
3009  	0x61, 0x46, 0x4b, 0x7e, 0x2b, 0xe0, 0xa4, 0x61,
3010  
3011  	0xd7, 0xa4, 0x22, 0x5f, 0x29, 0x79, 0x8c, 0x78,
3012  	0x97, 0x2f, 0x1b, 0xce, 0x6b, 0x35, 0x97, 0x7d,
3013  	0x85, 0x9b, 0x7e, 0x22, 0x9b, 0xde, 0xa4, 0x19,
3014  	0xc9, 0xbe, 0x26, 0x35, 0x9e, 0x54, 0xea, 0x14
3015  };
3016  
3017  static const ec_test_case ecosdsa_frp256v1_test_case = {
3018  	.name = "ECOSDSA-SHA256/frp256v1",
3019  	.ec_str_p = &frp256v1_str_params,
3020  	.priv_key = ecosdsa_frp256v1_test_vectors_priv_key,
3021  	.priv_key_len = sizeof(ecosdsa_frp256v1_test_vectors_priv_key),
3022  	.nn_random = ecosdsa_nn_random_frp256v1_test_vector,
3023  	.hash_type = SHA256,
3024  	.msg = "abc",
3025  	.msglen = 3,
3026  	.sig_type = ECOSDSA,
3027  	.exp_sig = ecosdsa_frp256v1_test_vectors_expected_sig,
3028  	.exp_siglen = sizeof(ecosdsa_frp256v1_test_vectors_expected_sig),
3029  	.adata = NULL,
3030  	.adata_len = 0
3031  };
3032  #endif /* WITH_CURVE_FRP256V1 */
3033  #endif /* WITH_HASH_SHA256 */
3034  #endif /* WITH_SIG_ECOSDSA */
3035  
3036  /*******************************************************************
3037   ************** ECFSDSA tests **************************************
3038   *******************************************************************/
3039  
3040  #ifdef WITH_SIG_ECFSDSA
3041  #ifdef WITH_HASH_SHA224
3042  #ifdef WITH_CURVE_SECP224R1
3043  #define ECFSDSA_SHA224_SECP224R1_SELF_TEST
3044  
3045  /* ECFSDSA secp224r1 test vectors */
3046  
3047  static int ecfsdsa_nn_random_secp224r1_test_vector(nn_t out, nn_src_t q)
3048  {
3049  	int ret, cmp;
3050  
3051  	const u8 k_buf[] = {
3052  		0x42, 0xcf, 0xfe, 0x41, 0xf5, 0x01, 0xb4, 0x99,
3053  		0x45, 0xe3, 0xd1, 0x03, 0xe9, 0x00, 0x48, 0xb9,
3054  		0x6f, 0x47, 0xee, 0xb3, 0xb7, 0x37, 0xdc, 0x6a,
3055  		0x79, 0xc7, 0xa4, 0x2e
3056  	};
3057  
3058  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3059  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3060  
3061  	ret = (cmp >= 0) ? -1 : 0;
3062  
3063  err:
3064  	return ret;
3065  }
3066  
3067  static const u8 ecfsdsa_secp224r1_test_vectors_priv_key[] = {
3068  	0xda, 0xd8, 0x0f, 0xfb, 0x64, 0x35, 0x6b, 0xd5,
3069  	0x3b, 0x66, 0x3b, 0x6e, 0x20, 0xa8, 0x08, 0x94,
3070  	0xb7, 0x93, 0x9a, 0xde, 0x21, 0xc7, 0x1e, 0xb8,
3071  	0x09, 0xf7, 0xb5, 0x39
3072  };
3073  
3074  static const u8 ecfsdsa_secp224r1_test_vectors_expected_sig[] = {
3075  	0x55, 0x49, 0x93, 0x3b, 0xb2, 0x5d, 0x21, 0xc6,
3076  	0x10, 0x84, 0xc1, 0xa4, 0x92, 0xed, 0x95, 0x30,
3077  	0x0b, 0x50, 0x78, 0xd9, 0xa9, 0x5c, 0xac, 0x43,
3078  	0xfd, 0xeb, 0x94, 0x9f, 0x32, 0xc2, 0xa1, 0xb1,
3079  	0x67, 0x56, 0x3a, 0x6b, 0xe9, 0xdd, 0x77, 0x4e,
3080  	0xa6, 0x5a, 0x29, 0xb1, 0x9f, 0xf3, 0xd8, 0x3b,
3081  	0xdc, 0xa4, 0xf0, 0x3b, 0x7b, 0xc5, 0x27, 0x67,
3082  
3083  	0xb4, 0xe9, 0xf2, 0x03, 0x1a, 0x98, 0xbe, 0x55,
3084  	0xf1, 0xa9, 0xb3, 0x8b, 0x23, 0x31, 0x98, 0x6c,
3085  	0x3a, 0xfd, 0x97, 0x2a, 0xed, 0xcd, 0x80, 0x5a,
3086  	0x3c, 0x6e, 0x3a, 0x8c
3087  };
3088  
3089  static const ec_test_case ecfsdsa_secp224r1_test_case = {
3090  	.name = "ECFSDSA-SHA224/secp224r1",
3091  	.ec_str_p = &secp224r1_str_params,
3092  	.priv_key = ecfsdsa_secp224r1_test_vectors_priv_key,
3093  	.priv_key_len = sizeof(ecfsdsa_secp224r1_test_vectors_priv_key),
3094  	.nn_random = ecfsdsa_nn_random_secp224r1_test_vector,
3095  	.hash_type = SHA224,
3096  	.msg = "abc",
3097  	.msglen = 3,
3098  	.sig_type = ECFSDSA,
3099  	.exp_sig = ecfsdsa_secp224r1_test_vectors_expected_sig,
3100  	.exp_siglen = sizeof(ecfsdsa_secp224r1_test_vectors_expected_sig),
3101  	.adata = NULL,
3102  	.adata_len = 0
3103  };
3104  #endif /* WITH_CURVE_SECP224R1 */
3105  #endif /* WITH_HASH_SHA224 */
3106  
3107  #ifdef WITH_HASH_SHA256
3108  #ifdef WITH_CURVE_SECP256R1
3109  #define ECFSDSA_SHA256_SECP256R1_SELF_TEST
3110  
3111  /* ECFSDSA secp256r1 test vectors */
3112  
3113  static int ecfsdsa_nn_random_iso14888_3_secp256r1_test_vector(nn_t out,
3114  							      nn_src_t q)
3115  {
3116  	int ret, cmp;
3117  	const u8 k_buf[] = {
3118  		0x89, 0x4D, 0xEA, 0xB4, 0x4D, 0x88, 0x45, 0x0F,
3119  		0xE8, 0xDA, 0xC6, 0x63, 0xF0, 0xE5, 0x86, 0x50,
3120  		0x31, 0xE8, 0x75, 0xBA, 0x22, 0x4C, 0x06, 0x01,
3121  		0x3C, 0x53, 0xD0, 0xE3, 0x01, 0x09, 0xC2, 0x07
3122  	};
3123  
3124  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3125  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3126  
3127  	ret = (cmp >= 0) ? -1 : 0;
3128  
3129  err:
3130  	return ret;
3131  }
3132  
3133  static const u8 ecfsdsa_secp256r1_test_vectors_priv_key[] = {
3134  	0xAC, 0xCA, 0x7F, 0x0D, 0xD3, 0xAC, 0x53, 0x5F,
3135  	0x48, 0x9B, 0x34, 0x0F, 0x6B, 0xD7, 0xF5, 0x03,
3136  	0x61, 0xB0, 0xEE, 0x09, 0x5A, 0xE6, 0xA2, 0x28,
3137  	0x9A, 0x6A, 0xB3, 0x29, 0x23, 0x81, 0x23, 0xE5
3138  };
3139  
3140  static const u8 ecfsdsa_secp256r1_test_vectors_expected_sig[] = {
3141  	0xAF, 0x31, 0x2F, 0xBD, 0x77, 0x92, 0x12, 0x5C,
3142  	0x5C, 0xDF, 0xBA, 0x69, 0xE6, 0xD3, 0x69, 0x90,
3143  	0x0A, 0xCE, 0x9A, 0x70, 0xBA, 0x65, 0x3F, 0xFF,
3144  	0xBD, 0x91, 0x40, 0xE0, 0x00, 0x79, 0xFA, 0xE8,
3145  	0xB7, 0xCE, 0xC5, 0x70, 0x16, 0xA0, 0xB9, 0x7A,
3146  	0xA0, 0x69, 0xD5, 0x4E, 0x0D, 0xA9, 0x5E, 0x45,
3147  	0xFB, 0x50, 0xB6, 0x77, 0x1F, 0xB6, 0x9F, 0x53,
3148  	0xFE, 0xF0, 0x0F, 0xC8, 0xB0, 0x0E, 0x1F, 0xEC,
3149  	0x25, 0x84, 0x70, 0x40, 0x23, 0x04, 0xBC, 0x2D,
3150  	0xB4, 0x4F, 0x3B, 0x2A, 0x20, 0xC0, 0x8F, 0xF2,
3151  	0xA6, 0x4F, 0x56, 0x6B, 0xAA, 0x2E, 0xB7, 0xBF,
3152  	0x37, 0xE1, 0x61, 0x9B, 0x6A, 0xE0, 0x98, 0x44
3153  };
3154  
3155  static const ec_test_case ecfsdsa_secp256r1_test_case = {
3156  	.name = "ECFSDSA-SHA256/secp256r1",
3157  	.ec_str_p = &secp256r1_str_params,
3158  	.priv_key = ecfsdsa_secp256r1_test_vectors_priv_key,
3159  	.priv_key_len = sizeof(ecfsdsa_secp256r1_test_vectors_priv_key),
3160  	.nn_random = ecfsdsa_nn_random_iso14888_3_secp256r1_test_vector,
3161  	.hash_type = SHA256,
3162  	.msg = "abc",
3163  	.msglen = 3,
3164  	.sig_type = ECFSDSA,
3165  	.exp_sig = ecfsdsa_secp256r1_test_vectors_expected_sig,
3166  	.exp_siglen = sizeof(ecfsdsa_secp256r1_test_vectors_expected_sig),
3167  	.adata = NULL,
3168  	.adata_len = 0
3169  };
3170  #endif /* WITH_CURVE_SECP256R1 */
3171  #endif /* WITH_HASH_SHA256 */
3172  
3173  #ifdef WITH_HASH_SHA384
3174  #ifdef WITH_CURVE_SECP384R1
3175  #define ECFSDSA_SHA384_SECP384R1_SELF_TEST
3176  
3177  /* ECFSDSA secp384r1 test vectors */
3178  
3179  static int ecfsdsa_nn_random_iso14888_3_secp384r1_test_vector(nn_t out,
3180  							      nn_src_t q)
3181  {
3182  	int ret, cmp;
3183  	const u8 k_buf[] = {
3184  		0x51, 0xC5, 0xB8, 0xB2, 0xE5, 0x9C, 0xF7, 0x8F,
3185  		0x54, 0xE7, 0x7C, 0xDB, 0x0B, 0x2E, 0x26, 0x69,
3186  		0xB6, 0x6B, 0x32, 0x84, 0x8B, 0x7B, 0x53, 0x78,
3187  		0x01, 0x48, 0x3D, 0xE2, 0x39, 0x42, 0x27, 0x45,
3188  		0x6F, 0x49, 0x30, 0xC8, 0x53, 0xFB, 0xFF, 0x6C,
3189  		0x58, 0xFA, 0x6E, 0x1C, 0xC5, 0xD9, 0x74, 0x66
3190  	};
3191  
3192  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3193  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3194  
3195  	ret = (cmp >= 0) ? -1 : 0;
3196  
3197  err:
3198  	return ret;
3199  }
3200  
3201  static const u8 ecfsdsa_secp384r1_test_vectors_priv_key[] = {
3202  	0x95, 0xA4, 0xD2, 0x57, 0xA7, 0x29, 0x8C, 0x66,
3203  	0x10, 0xA3, 0x75, 0x58, 0x78, 0x50, 0x36, 0xDE,
3204  	0x6F, 0x9F, 0xB9, 0x97, 0x73, 0x5C, 0x07, 0x6B,
3205  	0x8C, 0x8A, 0x18, 0xB2, 0xAA, 0xAC, 0x31, 0x42,
3206  	0x50, 0x7A, 0x25, 0x60, 0x3D, 0x7C, 0x95, 0xF9,
3207  	0xE5, 0xF0, 0x30, 0x7E, 0xC5, 0xA5, 0x6D, 0x7E
3208  };
3209  
3210  static const u8 ecfsdsa_secp384r1_test_vectors_expected_sig[] = {
3211  	0x29, 0xB7, 0x85, 0xAB, 0x7F, 0xAC, 0x1F, 0x80,
3212  	0xF6, 0x4C, 0xE2, 0xF2, 0xD8, 0x8A, 0xBA, 0x8F,
3213  	0xE6, 0x10, 0x3B, 0x25, 0x65, 0xFE, 0xB5, 0xAE,
3214  	0x82, 0xFB, 0x6C, 0xF5, 0x8F, 0x8C, 0xE1, 0xE7,
3215  	0x3F, 0x7A, 0x8D, 0x68, 0x3B, 0xEA, 0xBD, 0x24,
3216  	0xB7, 0xEA, 0x78, 0xF6, 0x01, 0x3C, 0x9F, 0x70,
3217  	0xDE, 0x94, 0xFA, 0xD1, 0x72, 0x81, 0xF4, 0xA6,
3218  	0x0A, 0xA2, 0x54, 0x23, 0xE9, 0xD8, 0x71, 0x22,
3219  	0x96, 0x54, 0x02, 0x19, 0x52, 0x39, 0xB8, 0x39,
3220  	0xFC, 0xD4, 0x4C, 0xDF, 0x54, 0x5B, 0xF7, 0x4E,
3221  	0x13, 0x00, 0xC9, 0xF5, 0x7F, 0xFC, 0x83, 0x0D,
3222  	0xEF, 0xD9, 0x7B, 0x66, 0xD5, 0x7E, 0x9D, 0x07,
3223  
3224  	0xD1, 0x85, 0x80, 0x62, 0xC5, 0x50, 0x4E, 0x21,
3225  	0x78, 0x52, 0x39, 0x26, 0x42, 0x3F, 0xDD, 0x83,
3226  	0x99, 0xA8, 0xBA, 0x2B, 0x85, 0xBF, 0x45, 0x85,
3227  	0x3F, 0x8E, 0x04, 0xBF, 0x20, 0x44, 0x15, 0x16,
3228  	0xE7, 0x1A, 0x78, 0xB0, 0x9C, 0x7A, 0x7E, 0xE6,
3229  	0x20, 0xB7, 0xF5, 0x37, 0xE6, 0xC1, 0xDE, 0xEE
3230  };
3231  
3232  static const ec_test_case ecfsdsa_secp384r1_test_case = {
3233  	.name = "ECFSDSA-SHA384/secp384r1",
3234  	.ec_str_p = &secp384r1_str_params,
3235  	.priv_key = ecfsdsa_secp384r1_test_vectors_priv_key,
3236  	.priv_key_len = sizeof(ecfsdsa_secp384r1_test_vectors_priv_key),
3237  	.nn_random = ecfsdsa_nn_random_iso14888_3_secp384r1_test_vector,
3238  	.hash_type = SHA384,
3239  	.msg = "abc",
3240  	.msglen = 3,
3241  	.sig_type = ECFSDSA,
3242  	.exp_sig = ecfsdsa_secp384r1_test_vectors_expected_sig,
3243  	.exp_siglen = sizeof(ecfsdsa_secp384r1_test_vectors_expected_sig),
3244  	.adata = NULL,
3245  	.adata_len = 0
3246  };
3247  #endif /* WITH_CURVE_SECP384R1 */
3248  #endif /* WITH_HASH_SHA384 */
3249  
3250  #ifdef WITH_HASH_SHA512
3251  #ifdef WITH_CURVE_SECP521R1
3252  #define ECFSDSA_SHA512_SECP521R1_SELF_TEST
3253  
3254  /* ECFSDSA secp521r1 test vectors */
3255  
3256  static int ecfsdsa_nn_random_secp521r1_test_vector(nn_t out, nn_src_t q)
3257  {
3258  	int ret, cmp;
3259  
3260  	/*
3261  	 * Fixed ephemeral private key for secp521r1 signature
3262  	 * test vectors from RFC4754
3263  	 */
3264  	const u8 k_buf[] = {
3265  		0x01, 0xbc, 0x24, 0x62, 0x6a, 0xd6, 0x10, 0x3c,
3266  		0x72, 0xdc, 0x63, 0xb6, 0x8c, 0xe4, 0xcd, 0xb2,
3267  		0xf0, 0x63, 0x39, 0x9c, 0x69, 0x69, 0x84, 0xc6,
3268  		0x2f, 0x8c, 0x58, 0x5f, 0x12, 0x7d, 0x47, 0x71,
3269  		0x6e, 0x0e, 0x9d, 0xd7, 0x2b, 0x27, 0x28, 0xfb,
3270  		0xab, 0xed, 0xe4, 0x12, 0x0b, 0xcf, 0x83, 0x5a,
3271  		0x9a, 0x32, 0xf1, 0x3e, 0x65, 0x1d, 0x18, 0x2a,
3272  		0x69, 0x13, 0xfd, 0xeb, 0x9d, 0x79, 0xf5, 0xb0,
3273  		0xbf, 0xe5
3274  	};
3275  
3276  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3277  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3278  
3279  	ret = (cmp >= 0) ? -1 : 0;
3280  
3281  err:
3282  	return ret;
3283  }
3284  
3285  static const u8 ecfsdsa_secp521r1_test_vectors_priv_key[] = {
3286  	0x00, 0x9c, 0x0d, 0x38, 0xdb, 0x40, 0x76, 0x55,
3287  	0x37, 0x79, 0xd9, 0x4a, 0x8f, 0x4f, 0x74, 0x2d,
3288  	0x32, 0xd0, 0xf9, 0xf2, 0x9b, 0xea, 0x27, 0x60,
3289  	0x47, 0x03, 0xcb, 0xe7, 0x34, 0x9e, 0x5f, 0x14,
3290  	0x52, 0x5b, 0xfe, 0x57, 0x41, 0x50, 0x31, 0x52,
3291  	0x0b, 0x19, 0xf7, 0x68, 0x70, 0x1a, 0x57, 0x0b,
3292  	0x62, 0xa6, 0x4e, 0xc1, 0xc0, 0xd0, 0xe7, 0xa0,
3293  	0x84, 0x94, 0x37, 0xfc, 0xf6, 0x7b, 0x56, 0x12,
3294  	0x53, 0xc3
3295  };
3296  
3297  static const u8 ecfsdsa_secp521r1_test_vectors_expected_sig[] = {
3298  	0x00, 0x43, 0xf7, 0x90, 0x80, 0xe4, 0xff, 0x8c,
3299  	0x91, 0x44, 0x93, 0xad, 0xbb, 0x35, 0x3d, 0x78,
3300  	0xbb, 0x15, 0x5d, 0x95, 0xde, 0x51, 0x9b, 0x78,
3301  	0xe2, 0xa1, 0xfa, 0x34, 0x70, 0x0b, 0x45, 0x04,
3302  	0x6a, 0xd2, 0xea, 0x99, 0xa7, 0x0c, 0xf8, 0x37,
3303  	0x7a, 0xcf, 0x72, 0x89, 0x4b, 0xa3, 0xa5, 0x8c,
3304  	0x5d, 0x50, 0xcb, 0x01, 0x3e, 0x3a, 0x3e, 0x19,
3305  	0xc8, 0xcb, 0xf2, 0xca, 0xcf, 0x1e, 0x28, 0x47,
3306  	0xcb, 0x92, 0x01, 0x70, 0x49, 0x0a, 0x35, 0xde,
3307  	0xfd, 0x32, 0xc6, 0xd6, 0x08, 0x2a, 0xc5, 0x24,
3308  	0x70, 0x51, 0x3f, 0x03, 0x93, 0x92, 0x71, 0xfb,
3309  	0x8b, 0xa8, 0xbe, 0x1a, 0xe1, 0xc2, 0x64, 0xf9,
3310  	0x86, 0x78, 0x5b, 0xb8, 0xd0, 0xa1, 0xcc, 0xd0,
3311  	0xc8, 0xf6, 0x93, 0xb7, 0xff, 0x92, 0xe3, 0x72,
3312  	0x20, 0xe5, 0x1c, 0x15, 0x80, 0xb7, 0x4d, 0xda,
3313  	0x1c, 0x90, 0x79, 0x5b, 0x52, 0x5b, 0x23, 0x5b,
3314  	0x1e, 0x0e, 0xc8, 0xb7,
3315  
3316  	0x01, 0x0f, 0x45, 0xec, 0x7c, 0x8b, 0xe0, 0x8f,
3317  	0x42, 0xb4, 0x4f, 0xe1, 0x7c, 0xde, 0x1e, 0xe4,
3318  	0x9f, 0xa7, 0x47, 0xcb, 0x4a, 0x23, 0x42, 0xb7,
3319  	0x72, 0x26, 0x9b, 0xc5, 0x96, 0x16, 0x8f, 0x82,
3320  	0xa4, 0xc3, 0x44, 0x71, 0x1c, 0xdb, 0xf7, 0x20,
3321  	0x3f, 0x45, 0x19, 0x93, 0x00, 0xb7, 0xc5, 0xc6,
3322  	0xb1, 0xb6, 0xa1, 0x67, 0x9e, 0xe9, 0xba, 0x88,
3323  	0xe6, 0x30, 0x13, 0x13, 0x85, 0xaf, 0x2d, 0x5d,
3324  	0x82, 0xce
3325  };
3326  
3327  static const ec_test_case ecfsdsa_secp521r1_test_case = {
3328  	.name = "ECFSDSA-SHA512/secp521r1",
3329  	.ec_str_p = &secp521r1_str_params,
3330  	.priv_key = ecfsdsa_secp521r1_test_vectors_priv_key,
3331  	.priv_key_len = sizeof(ecfsdsa_secp521r1_test_vectors_priv_key),
3332  	.nn_random = ecfsdsa_nn_random_secp521r1_test_vector,
3333  	.hash_type = SHA512,
3334  	.msg = "abc",
3335  	.msglen = 3,
3336  	.sig_type = ECFSDSA,
3337  	.exp_sig = ecfsdsa_secp521r1_test_vectors_expected_sig,
3338  	.exp_siglen = sizeof(ecfsdsa_secp521r1_test_vectors_expected_sig),
3339  	.adata = NULL,
3340  	.adata_len = 0
3341  };
3342  #endif /* WITH_CURVE_SECP521R1 */
3343  #endif /* WITH_HASH_SHA512 */
3344  
3345  #ifdef WITH_HASH_SHA256
3346  #ifdef WITH_CURVE_BRAINPOOLP256R1
3347  #define ECFSDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
3348  
3349  /* ECFSDSA Brainpoolp256r1 test vectors */
3350  
3351  static int ecfsdsa_nn_random_brainpoolp256r1_test_vector(nn_t out, nn_src_t q)
3352  {
3353  	int ret, cmp;
3354  
3355  	/*
3356  	 * Fixed ephemeral private key for brainpoolp256r1 signature
3357  	 */
3358  	const u8 k_buf[] = {
3359  		0x94, 0x06, 0x79, 0x01, 0x57, 0xb2, 0x15, 0x15,
3360  		0x35, 0x11, 0x37, 0xbc, 0xe0, 0x42, 0x8f, 0xc3,
3361  		0xde, 0x3a, 0xe9, 0x86, 0xa2, 0xf3, 0xab, 0xac,
3362  		0xaf, 0x0e, 0xa5, 0xcb, 0x24, 0x49, 0x19, 0x37
3363  	};
3364  
3365  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3366  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3367  
3368  	ret = (cmp >= 0) ? -1 : 0;
3369  
3370  err:
3371  	return ret;
3372  }
3373  
3374  static const u8 ecfsdsa_brainpoolp256r1_test_vectors_priv_key[] = {
3375  	0x17, 0x86, 0x00, 0xbb, 0xf4, 0xf6, 0xe8, 0x92,
3376  	0xbe, 0x80, 0x67, 0xc5, 0xd4, 0xdb, 0xd3, 0x90,
3377  	0x67, 0x6c, 0xb8, 0x57, 0xc1, 0x68, 0x31, 0x0b,
3378  	0x87, 0x3a, 0xdc, 0xe4, 0x74, 0xd3, 0xcf, 0x2d
3379  };
3380  
3381  static const u8 ecfsdsa_brainpoolp256r1_test_vectors_expected_sig[] = {
3382  	0xa7, 0xf1, 0xc8, 0xcb, 0x02, 0x9f, 0x01, 0xda,
3383  	0xb8, 0xf5, 0x68, 0x74, 0x57, 0x2c, 0xf0, 0xdb,
3384  	0x75, 0x2f, 0x95, 0x8b, 0xb5, 0x23, 0x53, 0xd9,
3385  	0x2d, 0x87, 0xec, 0x9f, 0x59, 0x53, 0x12, 0x3e,
3386  	0x5e, 0x2a, 0x30, 0x64, 0x9b, 0xb8, 0xa2, 0x5f,
3387  	0x8f, 0xcb, 0xe1, 0xd9, 0x7f, 0xb4, 0x98, 0x7d,
3388  	0x2d, 0xad, 0xd8, 0x1b, 0x05, 0xdd, 0x8b, 0x94,
3389  	0xbe, 0x1a, 0xc5, 0xc9, 0x14, 0x05, 0x09, 0x52,
3390  
3391  	0x2d, 0xf7, 0x9a, 0x80, 0xaa, 0xa9, 0x57, 0x82,
3392  	0xff, 0x96, 0x44, 0x62, 0xce, 0xd9, 0x68, 0xf5,
3393  	0x11, 0xc6, 0xb5, 0x1a, 0x8e, 0xb9, 0x44, 0xd1,
3394  	0xf9, 0xe7, 0xbc, 0xb3, 0xd0, 0xd8, 0x98, 0xc4
3395  };
3396  
3397  static const ec_test_case ecfsdsa_brainpoolp256r1_test_case = {
3398  	.name = "ECFSDSA-SHA256/brainpoolp256r1",
3399  	.ec_str_p = &brainpoolp256r1_str_params,
3400  	.priv_key = ecfsdsa_brainpoolp256r1_test_vectors_priv_key,
3401  	.priv_key_len = sizeof(ecfsdsa_brainpoolp256r1_test_vectors_priv_key),
3402  	.nn_random = ecfsdsa_nn_random_brainpoolp256r1_test_vector,
3403  	.hash_type = SHA256,
3404  	.msg = "abc",
3405  	.msglen = 3,
3406  	.sig_type = ECFSDSA,
3407  	.exp_sig = ecfsdsa_brainpoolp256r1_test_vectors_expected_sig,
3408  	.exp_siglen = sizeof(ecfsdsa_brainpoolp256r1_test_vectors_expected_sig),
3409  	.adata = NULL,
3410  	.adata_len = 0
3411  };
3412  
3413  #endif /* WITH_CURVE_BRAINPOOLP256R1 */
3414  #endif /* WITH_HASH_SHA256 */
3415  
3416  #ifdef WITH_HASH_SHA384
3417  #ifdef WITH_CURVE_BRAINPOOLP384R1
3418  #define ECFSDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
3419  
3420  /* ECFSDSA Brainpoolp384r1 test vectors */
3421  
3422  static int ecfsdsa_nn_random_brainpoolp384r1_test_vector(nn_t out, nn_src_t q)
3423  {
3424  	int ret, cmp;
3425  
3426  	/*
3427  	 * Fixed ephemeral private key for brainpoolp384r1 signature
3428  	 */
3429  	const u8 k_buf[] = {
3430  		0x20, 0x89, 0x69, 0xde, 0xcd, 0xd0, 0x61, 0xd9,
3431  		0xee, 0x13, 0xae, 0xdc, 0xbe, 0xd0, 0xd3, 0x3c,
3432  		0x6e, 0xe7, 0xf7, 0x57, 0xd7, 0xfd, 0xe4, 0xb2,
3433  		0x1e, 0xbc, 0xbd, 0xd5, 0x21, 0x57, 0x86, 0xf5,
3434  		0x28, 0x3e, 0x65, 0x81, 0x46, 0x92, 0xbd, 0xc0,
3435  		0x38, 0x82, 0x52, 0xce, 0x58, 0x3d, 0xf5, 0x77
3436  	};
3437  
3438  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3439  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3440  
3441  	ret = (cmp >= 0) ? -1 : 0;
3442  
3443  err:
3444  	return ret;
3445  }
3446  
3447  static const u8 ecfsdsa_brainpoolp384r1_test_vectors_priv_key[] = {
3448  	0x1c, 0x5b, 0xdb, 0xfa, 0xf3, 0x7e, 0x68, 0x87,
3449  	0xd3, 0xf9, 0x10, 0xa6, 0x45, 0x14, 0x4c, 0x95,
3450  	0xe6, 0xcc, 0x48, 0xe7, 0x8c, 0xfa, 0x6b, 0x05,
3451  	0xac, 0xf5, 0x0a, 0xcd, 0x51, 0x38, 0xba, 0xba,
3452  	0xcd, 0x26, 0x01, 0x50, 0x8a, 0x86, 0x48, 0xd3,
3453  	0x87, 0x82, 0x37, 0xb1, 0xca, 0xf1, 0xd8, 0xcf
3454  };
3455  
3456  static const u8 ecfsdsa_brainpoolp384r1_test_vectors_expected_sig[] = {
3457  	0x7e, 0xa5, 0xf5, 0x97, 0x64, 0x8a, 0x55, 0x0c,
3458  	0x5a, 0xb1, 0xaa, 0x74, 0xd4, 0x40, 0x42, 0xdb,
3459  	0xf8, 0xaf, 0xf2, 0x71, 0xad, 0x14, 0xaf, 0xc3,
3460  	0x89, 0x0c, 0xe4, 0x62, 0x2d, 0x91, 0xdb, 0x94,
3461  	0x87, 0xa0, 0xbf, 0x3a, 0xf0, 0x55, 0xf1, 0xf6,
3462  	0xaa, 0x60, 0x8c, 0x83, 0x62, 0xe2, 0x7f, 0xf5,
3463  	0x49, 0xc4, 0xe6, 0xa7, 0x6c, 0xbc, 0x03, 0xac,
3464  	0xb0, 0x7d, 0x6b, 0x75, 0x25, 0xe5, 0x5e, 0xfd,
3465  	0x97, 0xdd, 0x5c, 0xec, 0x09, 0x55, 0x0b, 0x58,
3466  	0x47, 0x0a, 0x9b, 0x7e, 0x07, 0xe9, 0x5d, 0x4b,
3467  	0x86, 0xf6, 0xfa, 0xe3, 0xe8, 0xb7, 0x66, 0xa9,
3468  	0xca, 0x40, 0xe7, 0x4a, 0xc4, 0x44, 0x79, 0xe7,
3469  
3470  	0x3d, 0x33, 0x34, 0xaf, 0x71, 0x29, 0x4c, 0x1c,
3471  	0xef, 0x28, 0x2f, 0xdb, 0xbf, 0xf2, 0x4e, 0x7f,
3472  	0xde, 0xf0, 0xb9, 0xe2, 0x4c, 0xaa, 0xdf, 0x56,
3473  	0x52, 0xcc, 0x1e, 0xb5, 0x33, 0x6e, 0x29, 0x8e,
3474  	0x29, 0x8f, 0x2c, 0x5b, 0x0f, 0x2f, 0x1f, 0x8c,
3475  	0xb8, 0xd8, 0x2a, 0x8f, 0x12, 0x5b, 0x08, 0xc9
3476  };
3477  
3478  static const ec_test_case ecfsdsa_brainpoolp384r1_test_case = {
3479  	.name = "ECFSDSA-SHA384/brainpoolp384r1",
3480  	.ec_str_p = &brainpoolp384r1_str_params,
3481  	.priv_key = ecfsdsa_brainpoolp384r1_test_vectors_priv_key,
3482  	.priv_key_len = sizeof(ecfsdsa_brainpoolp384r1_test_vectors_priv_key),
3483  	.nn_random = ecfsdsa_nn_random_brainpoolp384r1_test_vector,
3484  	.hash_type = SHA384,
3485  	.msg = "abc",
3486  	.msglen = 3,
3487  	.sig_type = ECFSDSA,
3488  	.exp_sig = ecfsdsa_brainpoolp384r1_test_vectors_expected_sig,
3489  	.exp_siglen = sizeof(ecfsdsa_brainpoolp384r1_test_vectors_expected_sig),
3490  	.adata = NULL,
3491  	.adata_len = 0
3492  };
3493  
3494  #endif /* WITH_CURVE_BRAINPOOLP384R1 */
3495  #endif /* WITH_HASH_SHA384 */
3496  
3497  #ifdef WITH_HASH_SHA512
3498  #ifdef WITH_CURVE_BRAINPOOLP512R1
3499  #define ECFSDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
3500  
3501  /* ECFSDSA Brainpoolp512r1 test vectors */
3502  
3503  static int ecfsdsa_nn_random_brainpoolp512r1_test_vector(nn_t out, nn_src_t q)
3504  {
3505  	int ret, cmp;
3506  
3507  	/*
3508  	 * Fixed ephemeral private key for brainpoolp512r1 signature
3509  	 */
3510  	const u8 k_buf[] = {
3511  		0x5f, 0x84, 0x57, 0xa0, 0xbc, 0xd3, 0x49, 0xd9,
3512  		0x7d, 0x0a, 0xc7, 0x95, 0x49, 0x49, 0x43, 0x03,
3513  		0x06, 0x37, 0x2b, 0x63, 0xfc, 0x73, 0x14, 0xaa,
3514  		0xe0, 0x23, 0x4d, 0x96, 0x66, 0x53, 0x46, 0xea,
3515  		0xa7, 0x8a, 0x60, 0x05, 0xa6, 0x0f, 0xc4, 0x16,
3516  		0x11, 0x4c, 0xbc, 0x02, 0x67, 0x6d, 0x49, 0xe6,
3517  		0xea, 0x92, 0x21, 0xcd, 0xe7, 0xd7, 0x2a, 0x45,
3518  		0xf7, 0xc2, 0xf5, 0x07, 0xfe, 0x39, 0x65, 0x52
3519  	};
3520  
3521  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3522  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3523  
3524  	ret = (cmp >= 0) ? -1 : 0;
3525  
3526  err:
3527  	return ret;
3528  }
3529  
3530  static const u8 ecfsdsa_brainpoolp512r1_test_vectors_priv_key[] = {
3531  	0xaa, 0x85, 0x90, 0x2b, 0xdc, 0x3a, 0x89, 0xb9,
3532  	0xa2, 0xa6, 0x12, 0x80, 0xb2, 0xd5, 0xd4, 0xea,
3533  	0xb0, 0xdd, 0x69, 0xb6, 0x45, 0xd0, 0x2b, 0xfd,
3534  	0xb1, 0xa6, 0xa9, 0x36, 0x39, 0xff, 0x27, 0x1e,
3535  	0xf3, 0x52, 0x9f, 0xbc, 0xca, 0x45, 0xe5, 0x7b,
3536  	0x46, 0x3a, 0x3c, 0xe3, 0x88, 0x90, 0x44, 0xeb,
3537  	0x2f, 0x6d, 0x09, 0x80, 0x47, 0x50, 0xe7, 0xf9,
3538  	0x43, 0x10, 0x80, 0xe0, 0xb0, 0x5c, 0x2b, 0xab
3539  };
3540  
3541  static const u8 ecfsdsa_brainpoolp512r1_test_vectors_expected_sig[] = {
3542  	0x3e, 0xe9, 0x03, 0x40, 0x75, 0x7a, 0x19, 0xae,
3543  	0x24, 0x2f, 0xf9, 0x89, 0x77, 0xb8, 0x23, 0x54,
3544  	0xf3, 0x7e, 0x68, 0xda, 0x32, 0xcc, 0x80, 0xf7,
3545  	0x83, 0x5f, 0x1f, 0xd6, 0xf9, 0x64, 0x62, 0x64,
3546  	0x0f, 0xc2, 0xbb, 0x6e, 0x83, 0x3e, 0x2e, 0xd6,
3547  	0x29, 0x37, 0x1f, 0x43, 0xd3, 0x83, 0xa9, 0x9b,
3548  	0x62, 0x25, 0x68, 0x7f, 0xd5, 0xf9, 0x9b, 0x07,
3549  	0xfb, 0x4b, 0x95, 0x30, 0x5f, 0x25, 0xa5, 0x4d,
3550  	0x58, 0x5a, 0xf5, 0x95, 0xd6, 0x07, 0x92, 0xa4,
3551  	0xdf, 0x01, 0xf0, 0x42, 0x2f, 0x39, 0x94, 0x9c,
3552  	0xf9, 0x8b, 0xe4, 0x0e, 0x9f, 0xb3, 0x8b, 0x40,
3553  	0xc4, 0xaa, 0x2d, 0x49, 0x36, 0xf7, 0x0f, 0x71,
3554  	0x7e, 0x30, 0x3e, 0xe7, 0xba, 0x0f, 0x44, 0x28,
3555  	0xa4, 0xfd, 0x18, 0x9d, 0x88, 0xe8, 0x5c, 0x5e,
3556  	0x69, 0xf8, 0x7b, 0xb7, 0x44, 0x44, 0x0a, 0x41,
3557  	0xfd, 0x79, 0x37, 0x14, 0x54, 0x49, 0x6b, 0xc1,
3558  
3559  	0x29, 0x0a, 0x96, 0x8b, 0x0d, 0x46, 0xbe, 0x9c,
3560  	0x5e, 0x3e, 0x1c, 0x1e, 0xa3, 0x09, 0xb3, 0x03,
3561  	0x10, 0x81, 0x6b, 0x08, 0x01, 0xab, 0x8f, 0x20,
3562  	0x0e, 0xf7, 0x7c, 0x86, 0xfb, 0xf4, 0xfc, 0xc3,
3563  	0xeb, 0x43, 0x8f, 0xf9, 0xd7, 0x6e, 0xc0, 0x62,
3564  	0x2e, 0xbc, 0x37, 0xa4, 0xbe, 0x14, 0x12, 0x26,
3565  	0xc2, 0xa4, 0x40, 0xd6, 0x90, 0x8c, 0xe4, 0x73,
3566  	0x0c, 0x5c, 0xf3, 0xbb, 0x7b, 0xf7, 0x6c, 0x7f
3567  };
3568  
3569  static const ec_test_case ecfsdsa_brainpoolp512r1_test_case = {
3570  	.name = "ECFSDSA-SHA512/brainpoolp512r1",
3571  	.ec_str_p = &brainpoolp512r1_str_params,
3572  	.priv_key = ecfsdsa_brainpoolp512r1_test_vectors_priv_key,
3573  	.priv_key_len = sizeof(ecfsdsa_brainpoolp512r1_test_vectors_priv_key),
3574  	.nn_random = ecfsdsa_nn_random_brainpoolp512r1_test_vector,
3575  	.hash_type = SHA512,
3576  	.msg = "abc",
3577  	.msglen = 3,
3578  	.sig_type = ECFSDSA,
3579  	.exp_sig = ecfsdsa_brainpoolp512r1_test_vectors_expected_sig,
3580  	.exp_siglen = sizeof(ecfsdsa_brainpoolp512r1_test_vectors_expected_sig),
3581  	.adata = NULL,
3582  	.adata_len = 0
3583  };
3584  #endif /* WITH_CURVE_BRAINPOOLP512R1 */
3585  #endif /* WITH_HASH_SHA512 */
3586  
3587  #ifdef WITH_HASH_SHA256
3588  #ifdef WITH_CURVE_FRP256V1
3589  #define ECFSDSA_SHA256_FRP256V1_SELF_TEST
3590  
3591  /* ECFSDSA frp256v1 test vectors */
3592  
3593  static int ecfsdsa_nn_random_frp256v1_test_vector(nn_t out, nn_src_t q)
3594  {
3595  	int ret, cmp;
3596  
3597  	/*
3598  	 * Fixed ephemeral private key for frp256v1 signature
3599  	 */
3600  	const u8 k_buf[] = {
3601  		0x9E, 0x56, 0xF5, 0x09, 0x19, 0x67, 0x84, 0xD9,
3602  		0x63, 0xD1, 0xC0, 0xA4, 0x01, 0x51, 0x0E, 0xE7,
3603  		0xAD, 0xA3, 0xDC, 0xC5, 0xDE, 0xE0, 0x4B, 0x15,
3604  		0x4B, 0xF6, 0x1A, 0xF1, 0xD5, 0xA6, 0xDE, 0xCE
3605  	};
3606  
3607  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3608  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3609  
3610  	ret = (cmp >= 0) ? -1 : 0;
3611  
3612  err:
3613  	return ret;
3614  }
3615  
3616  static const u8 ecfsdsa_frp256v1_test_vectors_priv_key[] = {
3617  	0x00, 0x51, 0xD3, 0x86, 0x6A, 0x15, 0xBA, 0xCD,
3618  	0xE3, 0x3D, 0x96, 0xF9, 0x92, 0xFC, 0xA9, 0x9D,
3619  	0xA7, 0xE6, 0xEF, 0x09, 0x34, 0xE7, 0x09, 0x75,
3620  	0x59, 0xC2, 0x7F, 0x16, 0x14, 0xC8, 0x8A, 0x7F
3621  };
3622  
3623  static const u8 ecfsdsa_frp256v1_test_vectors_expected_sig[] = {
3624  	0x22, 0xb1, 0xd0, 0x0d, 0xc8, 0x28, 0xa5, 0xcb,
3625  	0xa2, 0x64, 0x31, 0x9f, 0x05, 0x93, 0x3a, 0xc8,
3626  	0xed, 0xe6, 0x32, 0x3d, 0x69, 0xd0, 0x2b, 0x31,
3627  	0x4e, 0x10, 0xca, 0xa5, 0xf1, 0x3b, 0x29, 0x96,
3628  	0x52, 0xe2, 0xef, 0x4e, 0x46, 0x9f, 0x08, 0x63,
3629  	0xfb, 0x3c, 0xf4, 0xc5, 0x18, 0xb0, 0x5f, 0xc4,
3630  	0xbb, 0x1d, 0xaf, 0xb7, 0xd2, 0xc4, 0x30, 0x7e,
3631  	0xda, 0x41, 0xef, 0xac, 0x88, 0x8f, 0x0c, 0x7d,
3632  
3633  	0x9b, 0x3a, 0xb9, 0xd5, 0xb6, 0x7f, 0xf2, 0xb9,
3634  	0xaa, 0xe8, 0xc5, 0xed, 0xf9, 0x82, 0xd4, 0xf7,
3635  	0x6d, 0x7c, 0x61, 0x36, 0x56, 0xe7, 0x73, 0xaa,
3636  	0x1a, 0xab, 0xa6, 0x30, 0x90, 0x1d, 0x56, 0xa6
3637  };
3638  
3639  static const ec_test_case ecfsdsa_frp256v1_test_case = {
3640  	.name = "ECFSDSA-SHA256/frp256v1",
3641  	.ec_str_p = &frp256v1_str_params,
3642  	.priv_key = ecfsdsa_frp256v1_test_vectors_priv_key,
3643  	.priv_key_len = sizeof(ecfsdsa_frp256v1_test_vectors_priv_key),
3644  	.nn_random = ecfsdsa_nn_random_frp256v1_test_vector,
3645  	.hash_type = SHA256,
3646  	.msg = "abc",
3647  	.msglen = 3,
3648  	.sig_type = ECFSDSA,
3649  	.exp_sig = ecfsdsa_frp256v1_test_vectors_expected_sig,
3650  	.exp_siglen = sizeof(ecfsdsa_frp256v1_test_vectors_expected_sig),
3651  	.adata = NULL,
3652  	.adata_len = 0
3653  };
3654  #endif /* WITH_CURVE_FRP256V1 */
3655  #endif /* WITH_HASH_SHA256 */
3656  #endif /* WITH_SIG_ECFSDSA */
3657  
3658  /*******************************************************************
3659   ************** ECGDSA tests **************************************
3660   *******************************************************************/
3661  #ifdef WITH_SIG_ECGDSA
3662  #ifdef WITH_HASH_SHA256
3663  #ifdef WITH_CURVE_BRAINPOOLP192R1
3664  #define ECGDSA_SHA256_BRAINPOOLP192R1_SELF_TEST
3665  
3666  /* ECGDSA brainpoolp192r1 test vectors */
3667  
3668  static int ecgdsa_nn_random_iso14888_3_brainpoolp192r1_test_vector(nn_t out,
3669  								   nn_src_t q)
3670  {
3671  	int ret, cmp;
3672  	const u8 k_buf[] = {
3673  		0x5A, 0x96, 0x62, 0x60, 0x96, 0x28, 0x8C, 0xC4,
3674  		0x69, 0xF1, 0x70, 0x4E, 0xC0, 0x5F, 0x44, 0xD1,
3675  		0xEC, 0x18, 0xBD, 0x32, 0xCE, 0xB0, 0x2D, 0x5B,
3676  	};
3677  
3678  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3679  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3680  
3681  	ret = (cmp >= 0) ? -1 : 0;
3682  
3683  err:
3684  	return ret;
3685  }
3686  
3687  static const u8 ecgdsa_brainpoolp192r1_test_vectors_priv_key[] = {
3688  	0x40, 0xF9, 0x5B, 0x49, 0xA3, 0xB1, 0xBF, 0x55,
3689  	0x31, 0x1A, 0x56, 0xDF, 0xD3, 0xB5, 0x06, 0x1E,
3690  	0xE1, 0xDF, 0x64, 0x39, 0x84, 0xD4, 0x1E, 0x35,
3691  };
3692  
3693  static const u8 ecgdsa_brainpoolp192r1_test_vectors_expected_sig[] = {
3694  	0xA0, 0x0B, 0x0A, 0xA2, 0x5D, 0xB6, 0xAB, 0x5C,
3695  	0x21, 0xB8, 0x63, 0x00, 0xD9, 0xBC, 0x99, 0xF5,
3696  	0x6E, 0x9D, 0xD1, 0xB7, 0xF1, 0xDC, 0x47, 0x74,
3697  	0x63, 0x46, 0x35, 0xEF, 0x81, 0x32, 0x47, 0xD7,
3698  	0x20, 0x24, 0x5C, 0x94, 0x09, 0xFB, 0x20, 0xA2,
3699  	0x67, 0xC5, 0x60, 0xC8, 0x8E, 0xB2, 0xB0, 0x7B,
3700  };
3701  
3702  static const ec_test_case ecgdsa_brainpoolp192r1_test_case = {
3703  	.name = "ECGDSA-SHA256/brainpoolp192r1",
3704  	.ec_str_p = &brainpoolp192r1_str_params,
3705  	.priv_key = ecgdsa_brainpoolp192r1_test_vectors_priv_key,
3706  	.priv_key_len = sizeof(ecgdsa_brainpoolp192r1_test_vectors_priv_key),
3707  	.nn_random = ecgdsa_nn_random_iso14888_3_brainpoolp192r1_test_vector,
3708  	.hash_type = SHA256,
3709  	.msg = "brainpoolP192r1",
3710  	.msglen = 15,
3711  	.sig_type = ECGDSA,
3712  	.exp_sig = ecgdsa_brainpoolp192r1_test_vectors_expected_sig,
3713  	.exp_siglen = sizeof(ecgdsa_brainpoolp192r1_test_vectors_expected_sig),
3714  	.adata = NULL,
3715  	.adata_len = 0
3716  };
3717  #endif /* WITH_CURVE_BRAINPOOLP192R1 */
3718  #endif /* WITH_HASH_SHA256 */
3719  
3720  #ifdef WITH_HASH_SHA224
3721  #ifdef WITH_CURVE_BRAINPOOLP224R1
3722  #define ECGDSA_SHA224_BRAINPOOLP224R1_SELF_TEST
3723  
3724  /* ECGDSA brainpoolp224r1 test vectors */
3725  
3726  static int ecgdsa_nn_random_iso14888_3_brainpoolp224r1_test_vector(nn_t out,
3727  								   nn_src_t q)
3728  {
3729  	int ret, cmp;
3730  	const u8 k_buf[] = {
3731  		0x5B, 0x60, 0x4F, 0x2C, 0x35, 0xED, 0x04, 0x01,
3732  		0xFC, 0xA3, 0x1E, 0x88, 0x0C, 0xB5, 0x5C, 0x2A,
3733  		0x74, 0x56, 0xE7, 0x1A, 0x5C, 0xBA, 0xA8, 0xDF,
3734  		0x2F, 0xC0, 0x3C, 0xA9
3735  	};
3736  
3737  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3738  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3739  
3740  	ret = (cmp >= 0) ? -1 : 0;
3741  
3742  err:
3743  	return ret;
3744  }
3745  
3746  static const u8 ecgdsa_brainpoolp224r1_test_vectors_priv_key[] = {
3747  	0x7E, 0x75, 0xBC, 0x2C, 0xD5, 0x73, 0xB3, 0x8A,
3748  	0xED, 0x09, 0x77, 0xAD, 0x61, 0x17, 0x63, 0xDD,
3749  	0x57, 0xFB, 0x29, 0xB2, 0x20, 0x88, 0x33, 0x44,
3750  	0xB8, 0x1D, 0xF0, 0x37
3751  };
3752  
3753  static const u8 ecgdsa_brainpoolp224r1_test_vectors_expected_sig[] = {
3754  	0x60, 0xFB, 0xB2, 0xB1, 0x5F, 0x05, 0x5C, 0xD1,
3755  	0xD4, 0x82, 0xED, 0x6D, 0xC5, 0x06, 0x9C, 0x8F,
3756  	0x62, 0x4A, 0x34, 0x05, 0xB6, 0x7D, 0x11, 0xB3,
3757  	0xB6, 0x5E, 0x02, 0x34, 0x5A, 0x05, 0x0F, 0x05,
3758  	0xAF, 0x0B, 0x10, 0x6B, 0xA3, 0xF1, 0x46, 0x96,
3759  	0xE6, 0x16, 0x2C, 0xA4, 0x6F, 0xBA, 0xBD, 0x2C,
3760  	0x14, 0x44, 0x19, 0xDB, 0xB5, 0xBF, 0xBD, 0xC0
3761  };
3762  
3763  static const ec_test_case ecgdsa_brainpoolp224r1_test_case = {
3764  	.name = "ECGDSA-SHA224/brainpoolp224r1",
3765  	.ec_str_p = &brainpoolp224r1_str_params,
3766  	.priv_key = ecgdsa_brainpoolp224r1_test_vectors_priv_key,
3767  	.priv_key_len = sizeof(ecgdsa_brainpoolp224r1_test_vectors_priv_key),
3768  	.nn_random = ecgdsa_nn_random_iso14888_3_brainpoolp224r1_test_vector,
3769  	.hash_type = SHA224,
3770  	.msg = "brainpoolP224r1",
3771  	.msglen = 15,
3772  	.sig_type = ECGDSA,
3773  	.exp_sig = ecgdsa_brainpoolp224r1_test_vectors_expected_sig,
3774  	.exp_siglen = sizeof(ecgdsa_brainpoolp224r1_test_vectors_expected_sig),
3775  	.adata = NULL,
3776  	.adata_len = 0
3777  };
3778  #endif /* WITH_CURVE_BRAINPOOLP224R1 */
3779  #endif /* WITH_HASH_SHA224 */
3780  
3781  #ifdef WITH_HASH_SHA256
3782  #ifdef WITH_CURVE_BRAINPOOLP256R1
3783  #define ECGDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
3784  
3785  /* ECGDSA brainpoolp256r1 test vectors */
3786  
3787  static int ecgdsa_nn_random_iso14888_3_brainpoolp256r1_test_vector(nn_t out,
3788  								   nn_src_t q)
3789  {
3790  	int ret, cmp;
3791  	const u8 k_buf[] = {
3792  		0x0E, 0x64, 0x21, 0x27, 0x2D, 0xDA, 0xB9, 0xC2,
3793  		0x07, 0xB1, 0x19, 0xBD, 0xD1, 0x0C, 0x03, 0x86,
3794  		0x10, 0x05, 0x75, 0x2E, 0xEA, 0xBB, 0x3A, 0xC9,
3795  		0x75, 0x13, 0x04, 0x1A, 0xDE, 0x62, 0x86, 0xD9
3796  	};
3797  
3798  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3799  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3800  
3801  	ret = (cmp >= 0) ? -1 : 0;
3802  
3803  err:
3804  	return ret;
3805  }
3806  
3807  static const u8 ecgdsa_brainpoolp256r1_test_vectors_priv_key[] = {
3808  	0x52, 0xB9, 0x29, 0xB4, 0x02, 0x97, 0x43, 0x7B,
3809  	0x98, 0x97, 0x3A, 0x2C, 0x43, 0x7E, 0x8F, 0x03,
3810  	0xA2, 0x31, 0xEB, 0x61, 0xE0, 0xCD, 0x38, 0xFD,
3811  	0xAD, 0x80, 0x2F, 0x00, 0xD5, 0x5A, 0x13, 0xA3
3812  };
3813  
3814  static const u8 ecgdsa_brainpoolp256r1_test_vectors_expected_sig[] = {
3815  	0x82, 0x93, 0x49, 0xe3, 0xb6, 0xe1, 0xf3, 0xe5,
3816  	0x15, 0xeb, 0x95, 0x81, 0xbe, 0x0f, 0x95, 0x8d,
3817  	0xcc, 0xaa, 0xa6, 0xb6, 0x8d, 0x83, 0xba, 0x77,
3818  	0x01, 0xdd, 0x7a, 0x08, 0x67, 0xe4, 0x4e, 0xa7,
3819  	0x3d, 0xc2, 0xf1, 0x03, 0x29, 0x6a, 0x79, 0x3e,
3820  	0x50, 0xdc, 0x22, 0x66, 0x65, 0x74, 0x70, 0xa4,
3821  	0x0d, 0x2c, 0x9e, 0xa1, 0xca, 0x79, 0x7d, 0xea,
3822  	0x61, 0x00, 0x42, 0xb7, 0x73, 0x0b, 0xbd, 0xce
3823  };
3824  
3825  static const ec_test_case ecgdsa_brainpoolp256r1_test_case = {
3826  	.name = "ECGDSA-SHA256/brainpoolp256r1",
3827  	.ec_str_p = &brainpoolp256r1_str_params,
3828  	.priv_key = ecgdsa_brainpoolp256r1_test_vectors_priv_key,
3829  	.priv_key_len = sizeof(ecgdsa_brainpoolp256r1_test_vectors_priv_key),
3830  	.nn_random = ecgdsa_nn_random_iso14888_3_brainpoolp256r1_test_vector,
3831  	.hash_type = SHA256,
3832  	.msg = "brainpoolP256r1",
3833  	.msglen = 15,
3834  	.sig_type = ECGDSA,
3835  	.exp_sig = ecgdsa_brainpoolp256r1_test_vectors_expected_sig,
3836  	.exp_siglen = sizeof(ecgdsa_brainpoolp256r1_test_vectors_expected_sig),
3837  	.adata = NULL,
3838  	.adata_len = 0
3839  };
3840  #endif /* WITH_CURVE_BRAINPOOLP256R1 */
3841  #endif /* WITH_HASH_SHA256 */
3842  
3843  #ifdef WITH_HASH_SHA384
3844  #ifdef WITH_CURVE_BRAINPOOLP384R1
3845  #define ECGDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
3846  
3847  /* ECGDSA brainpoolp384r1 test vectors */
3848  
3849  static int ecgdsa_nn_random_brainpoolp384r1_test_vector(nn_t out, nn_src_t q)
3850  {
3851  	int ret, cmp;
3852  
3853  	const u8 k_buf[] = {
3854  		0x39, 0x1c, 0x0c, 0xff, 0xe3, 0xaa, 0x7e, 0x95,
3855  		0x47, 0xd2, 0x3e, 0xe9, 0x70, 0x36, 0x12, 0x55,
3856  		0x15, 0xce, 0x74, 0xd6, 0xfe, 0x55, 0x44, 0x07,
3857  		0x17, 0x79, 0x64, 0xfd, 0xee, 0xce, 0x9d, 0x88,
3858  		0xb3, 0xeb, 0xdc, 0xed, 0x5e, 0xe6, 0x34, 0xf3,
3859  		0x0c, 0x3a, 0x74, 0xaa, 0xad, 0x54, 0x57, 0x0a
3860  	};
3861  
3862  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3863  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
3864  
3865  	ret = (cmp >= 0) ? -1 : 0;
3866  
3867  err:
3868  	return ret;
3869  }
3870  
3871  static const u8 ecgdsa_brainpoolp384r1_test_vectors_priv_key[] = {
3872  	0x70, 0x74, 0x93, 0xc8, 0x39, 0x9a, 0x07, 0x95,
3873  	0xd1, 0xa3, 0xd2, 0x36, 0xae, 0x60, 0xa5, 0x46,
3874  	0x86, 0xec, 0xc5, 0x7c, 0x1e, 0xc5, 0x51, 0xef,
3875  	0x3f, 0x63, 0x19, 0x3a, 0x09, 0xd9, 0xb5, 0x9c,
3876  	0xae, 0x50, 0x04, 0xee, 0x2d, 0x4d, 0x48, 0x71,
3877  	0xf8, 0x5a, 0xcb, 0x1a, 0x60, 0x36, 0xbb, 0x68
3878  };
3879  
3880  static const u8 ecgdsa_brainpoolp384r1_test_vectors_expected_sig[] = {
3881  	0x3b, 0x34, 0xbe, 0xb7, 0xa6, 0x9e, 0x07, 0x6d,
3882  	0xd9, 0x6f, 0x2d, 0x71, 0x2a, 0xfe, 0xe2, 0xf2,
3883  	0x72, 0xa4, 0xd7, 0xad, 0xdf, 0x29, 0x1c, 0xa7,
3884  	0x99, 0xed, 0x62, 0x49, 0xa9, 0xbb, 0x4e, 0xcd,
3885  	0xcb, 0xe4, 0x44, 0x88, 0x31, 0xc5, 0x49, 0xb7,
3886  	0x8f, 0xc7, 0x2b, 0xa5, 0x5a, 0x34, 0x66, 0xa6,
3887  
3888  	0x79, 0xa0, 0x47, 0x25, 0x3d, 0xad, 0x09, 0x80,
3889  	0xe1, 0x3f, 0x99, 0xf3, 0x20, 0x4a, 0xd9, 0x7b,
3890  	0xfe, 0x2c, 0xa2, 0x09, 0xdd, 0x33, 0xbe, 0xd5,
3891  	0x7f, 0xe0, 0xb5, 0x1d, 0x52, 0x1d, 0x2e, 0x61,
3892  	0xb2, 0x78, 0x81, 0x40, 0x90, 0x57, 0x02, 0xe5,
3893  	0x1a, 0xdf, 0x44, 0x84, 0x9f, 0x0c, 0x4b, 0xce
3894  };
3895  
3896  static const ec_test_case ecgdsa_brainpoolp384r1_test_case = {
3897  	.name = "ECGDSA-SHA384/brainpoolp384r1",
3898  	.ec_str_p = &brainpoolp384r1_str_params,
3899  	.priv_key = ecgdsa_brainpoolp384r1_test_vectors_priv_key,
3900  	.priv_key_len = sizeof(ecgdsa_brainpoolp384r1_test_vectors_priv_key),
3901  	.nn_random = ecgdsa_nn_random_brainpoolp384r1_test_vector,
3902  	.hash_type = SHA384,
3903  	.msg = "brainpoolP384r1",
3904  	.msglen = 15,
3905  	.sig_type = ECGDSA,
3906  	.exp_sig = ecgdsa_brainpoolp384r1_test_vectors_expected_sig,
3907  	.exp_siglen = sizeof(ecgdsa_brainpoolp384r1_test_vectors_expected_sig),
3908  	.adata = NULL,
3909  	.adata_len = 0
3910  };
3911  #endif /* WITH_CURVE_BRAINPOOLP384R1 */
3912  #endif /* WITH_HASH_SHA384 */
3913  #endif /* WITH_SIG_ECGDSA */
3914  
3915  /*******************************************************************
3916   ************** ECRDSA tests ***************************************
3917   *******************************************************************/
3918  /*
3919   * NOTE: ISO/IEC 14888-3 standard seems to diverge from the existing implementations
3920   * of ECRDSA when treating the message hash, and from the examples of certificates provided
3921   * in RFC 7091 and draft-deremin-rfc4491-bis. While in ISO/IEC 14888-3 it is explicitely asked
3922   * to proceed with the hash of the message as big endian, the RFCs derived from the Russian
3923   * standard expect the hash value to be treated as little endian when importing it as an integer
3924   * (this discrepancy is exhibited and confirmed by test vectors present in ISO/IEC 14888-3, and
3925   * by X.509 certificates present in the RFCs). This seems (to be confirmed) to be a discrepancy of
3926   * ISO/IEC 14888-3 algorithm description that must be fixed there.
3927   *
3928   * In order to be conservative, libecc uses the Russian standard behavior as expected to be in line with
3929   * other implemetations, but keeps the ISO/IEC 14888-3 behavior if forced/asked by the user using
3930   * the USE_ISO14888_3_ECRDSA toggle. This allows to keep backward compatibility with previous versions of the
3931   * library if needed.
3932   *
3933   */
3934  
3935  #ifdef WITH_SIG_ECRDSA
3936  
3937  #ifndef USE_ISO14888_3_ECRDSA
3938  
3939  /*
3940   * All the follwing test vectors are extracted from draft-deremin-rfc4491-bis RFC draft
3941   * (https://datatracker.ietf.org/doc/html/draft-deremin-rfc4491-bis) where certificates signed with
3942   * GOST R 34.10-2012 using GOST R 34.11-2012 (256 and 512 bits) are provided. We can use them
3943   * as test vectors with the message being the TBS (To Be Signed) blob of the certificate.
3944   */
3945  
3946  #ifdef WITH_HASH_STREEBOG256
3947  #ifdef WITH_CURVE_GOST256
3948  #define ECRDSA_STREEBOG256_GOST256_SELF_TEST
3949  
3950  static int ecrdsa_nn_random_rfc4491_bis_1_GOST_256bits_curve_test_vector(nn_t out, nn_src_t q){
3951  	int ret, cmp;
3952  	const u8 k_buf[] = {
3953  		0x77, 0x10, 0x5c, 0x9b, 0x20, 0xbc, 0xd3, 0x12, 0x28, 0x23, 0xc8, 0xcf,
3954  		0x6f, 0xcc, 0x7b, 0x95, 0x6d, 0xe3, 0x38, 0x14, 0xe9, 0x5b, 0x7f, 0xe6,
3955  		0x4f, 0xed, 0x92, 0x45, 0x94, 0xdc, 0xea, 0xb3,
3956  	};
3957          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
3958          ret = nn_cmp(out, q, &cmp); EG(ret, err);
3959  
3960          ret = (cmp >= 0) ? -1 : 0;
3961  
3962  err:
3963          return ret;
3964  }
3965  static const u8 ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_priv_key[] = {
3966  	0x7a, 0x92, 0x9a, 0xde, 0x78, 0x9b, 0xb9, 0xbe, 0x10, 0xed,
3967  	0x35, 0x9d, 0xd3, 0x9a, 0x72, 0xc1, 0x1b, 0x60, 0x96, 0x1f,
3968  	0x49, 0x39, 0x7e, 0xee, 0x1d, 0x19, 0xce, 0x98, 0x91, 0xec,
3969  	0x3b, 0x28,
3970  };
3971  static const u8 ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_expected_sig[] = {
3972  	0x41, 0xaa, 0x28, 0xd2, 0xf1, 0xab, 0x14, 0x82, 0x80, 0xcd,
3973  	0x9e, 0xd5, 0x6f, 0xed, 0xa4, 0x19, 0x74, 0x05, 0x35, 0x54,
3974  	0xa4, 0x27, 0x67, 0xb8, 0x3a, 0xd0, 0x43, 0xfd, 0x39, 0xdc,
3975  	0x04, 0x93,
3976  	0x4d, 0x53, 0xf0, 0x12, 0xfe, 0x08, 0x17, 0x76, 0x50, 0x7d,
3977  	0x4d, 0x9b, 0xb8, 0x1f, 0x00, 0xef, 0xdb, 0x4e, 0xef, 0xd4,
3978  	0xab, 0x83, 0xba, 0xc4, 0xba, 0xcf, 0x73, 0x51, 0x73, 0xcf,
3979  	0xa8, 0x1c,
3980  };
3981  static const unsigned char ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_message[] = {
3982  	0x30, 0x81, 0xdb, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x0a, 0x30,
3983  	0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x30,
3984  	0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x07,
3985  	0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x30, 0x20, 0x17, 0x0d, 0x30,
3986  	0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,
3987  	0x18, 0x0f, 0x32, 0x30, 0x35, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30,
3988  	0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06,
3989  	0x03, 0x55, 0x04, 0x03, 0x13, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c,
3990  	0x65, 0x30, 0x66, 0x30, 0x1f, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01,
3991  	0x01, 0x01, 0x01, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02,
3992  	0x23, 0x00, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02,
3993  	0x03, 0x43, 0x00, 0x04, 0x40, 0x0b, 0xd8, 0x6f, 0xe5, 0xd8, 0xdb, 0x89,
3994  	0x66, 0x8f, 0x78, 0x9b, 0x4e, 0x1d, 0xba, 0x85, 0x85, 0xc5, 0x50, 0x8b,
3995  	0x45, 0xec, 0x5b, 0x59, 0xd8, 0x90, 0x6d, 0xdb, 0x70, 0xe2, 0x49, 0x2b,
3996  	0x7f, 0xda, 0x77, 0xff, 0x87, 0x1a, 0x10, 0xfb, 0xdf, 0x27, 0x66, 0xd2,
3997  	0x93, 0xc5, 0xd1, 0x64, 0xaf, 0xbb, 0x3c, 0x7b, 0x97, 0x3a, 0x41, 0xc8,
3998  	0x85, 0xd1, 0x1d, 0x70, 0xd6, 0x89, 0xb4, 0xf1, 0x26, 0xa3, 0x13, 0x30,
3999  	0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
4000  	0x05, 0x30, 0x03, 0x01, 0x01, 0xff,
4001  };
4002  static const ec_test_case ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_case = {
4003  	.name="ECRDSA-STREEBOG256/GOST-256-curve (RFC4491)",
4004  	.ec_str_p = &GOST_256bits_curve_str_params,
4005  	.priv_key = ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_priv_key,
4006  	.priv_key_len = sizeof(ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_priv_key),
4007  	.nn_random = ecrdsa_nn_random_rfc4491_bis_1_GOST_256bits_curve_test_vector,
4008  	.hash_type = STREEBOG256,
4009  	.msg = (const char*)ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_message,
4010  	.msglen = sizeof(ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_message),
4011  	.sig_type = ECRDSA,
4012  	.exp_sig = ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_expected_sig,
4013  	.exp_siglen = sizeof(ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_vector_expected_sig),
4014  	.adata = NULL,
4015  	.adata_len = 0
4016  };
4017  
4018  #endif /* WITH_CURVE_GOST256 */
4019  #endif /* WITH_HASH_STREEBOG256 */
4020  
4021  #ifdef WITH_HASH_STREEBOG256
4022  #ifdef WITH_CURVE_GOST_R3410_2012_256_PARAMSETA
4023  #define ECRDSA_STREEBOG256_GOST256_PARAMSETA_SELF_TEST
4024  
4025  static int ecrdsa_nn_random_rfc4491_bis_2_GOST_256bits_curve_test_vector(nn_t out, nn_src_t q){
4026  	int ret, cmp;
4027  	const u8 k_buf[] = {
4028  		0x27, 0x10, 0x5c, 0x9b, 0x20, 0xbc, 0xd3, 0x12, 0x28, 0x23,
4029  		0xc8, 0xcf, 0x6f, 0xcc, 0x7b, 0x95, 0x6d, 0xe3, 0x38, 0x14,
4030  		0xe9, 0x5b, 0x7f, 0xe6, 0x4f, 0xed, 0x92, 0x45, 0x94, 0xdc,
4031  		0xea, 0xb3,
4032  	};
4033          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4034          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4035  
4036          ret = (cmp >= 0) ? -1 : 0;
4037  
4038  err:
4039          return ret;
4040  }
4041  static const u8 ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_priv_key[] = {
4042  	0x3a, 0x92, 0x9a, 0xde, 0x78, 0x9b, 0xb9, 0xbe, 0x10,
4043  	0xed, 0x35, 0x9d, 0xd3, 0x9a, 0x72, 0xc1, 0x0b, 0x87,
4044  	0xc8, 0x3f, 0x80, 0xbe, 0x18, 0xb8, 0x5c, 0x04, 0x1f,
4045  	0x43, 0x25, 0xb6, 0x2e, 0xc1,
4046  };
4047  static const u8 ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_expected_sig[] = {
4048  	0x1d, 0x0e, 0x1d, 0xa5, 0xbe, 0x34, 0x7c, 0x6f, 0x1b,
4049  	0x52, 0x56, 0xc7, 0xae, 0xac, 0x20, 0x0a, 0xd6, 0x4a,
4050  	0xc7, 0x7a, 0x6f, 0x5b, 0x3a, 0x0e, 0x09, 0x73, 0x18,
4051  	0xe7, 0xae, 0x6e, 0xe7, 0x69,
4052  	0x14, 0x0b, 0x4d, 0xa9, 0x12, 0x4b, 0x09, 0xcb, 0x0d,
4053  	0x5c, 0xe9, 0x28, 0xee, 0x87, 0x42, 0x73, 0xa3, 0x10,
4054  	0x12, 0x94, 0x92, 0xec, 0x0e, 0x29, 0x36, 0x9e, 0x3b,
4055  	0x79, 0x12, 0x48, 0x57, 0x8c,
4056  };
4057  static const unsigned char ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_message[] = {
4058  	0x30, 0x81, 0xd3, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x0a, 0x30,
4059  	0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02, 0x30,
4060  	0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x07,
4061  	0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x30, 0x20, 0x17, 0x0d, 0x30,
4062  	0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a,
4063  	0x18, 0x0f, 0x32, 0x30, 0x35, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30, 0x30,
4064  	0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06,
4065  	0x03, 0x55, 0x04, 0x03, 0x13, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c,
4066  	0x65, 0x30, 0x5e, 0x30, 0x17, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01,
4067  	0x01, 0x01, 0x01, 0x30, 0x0b, 0x06, 0x09, 0x2a, 0x85, 0x03, 0x07, 0x01,
4068  	0x02, 0x01, 0x01, 0x01, 0x03, 0x43, 0x00, 0x04, 0x40, 0x74, 0x27, 0x95,
4069  	0xd4, 0xbe, 0xe8, 0x84, 0xdd, 0xf2, 0x85, 0x0f, 0xec, 0x03, 0xea, 0x3f,
4070  	0xaf, 0x18, 0x44, 0xe0, 0x1d, 0x9d, 0xa6, 0x0b, 0x64, 0x50, 0x93, 0xa5,
4071  	0x5e, 0x26, 0xdf, 0xc3, 0x99, 0x78, 0xf5, 0x96, 0xcf, 0x4d, 0x4d, 0x0c,
4072  	0x6c, 0xf1, 0xd1, 0x89, 0x43, 0xd9, 0x44, 0x93, 0xd1, 0x6b, 0x9e, 0xc0,
4073  	0xa1, 0x6d, 0x51, 0x2d, 0x2e, 0x12, 0x7c, 0xc4, 0x69, 0x1a, 0x63, 0x18,
4074  	0xe2, 0xa3, 0x13, 0x30, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,
4075  	0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff,
4076  };
4077  static const ec_test_case ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_case = {
4078  	.name="ECRDSA-STREEBOG256/GOST-256-curve-paramsetA (RFC4491)",
4079  	.ec_str_p = &gost_R3410_2012_256_paramSetA_str_params,
4080  	.priv_key = ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_priv_key,
4081  	.priv_key_len = sizeof(ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_priv_key),
4082  	.nn_random = ecrdsa_nn_random_rfc4491_bis_2_GOST_256bits_curve_test_vector,
4083  	.hash_type = STREEBOG256,
4084  	.msg = (const char*)ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_message,
4085  	.msglen = sizeof(ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_message),
4086  	.sig_type = ECRDSA,
4087  	.exp_sig = ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_expected_sig,
4088  	.exp_siglen = sizeof(ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_vector_expected_sig),
4089  	.adata = NULL,
4090  	.adata_len = 0
4091  };
4092  
4093  #endif /* WITH_CURVE_GOST_R3410_2012_256_PARAMSETA */
4094  #endif /* WITH_HASH_STREEBOG256 */
4095  
4096  #ifdef WITH_HASH_STREEBOG512
4097  #ifdef WITH_CURVE_GOST512
4098  #define ECRDSA_STREEBOG512_GOST512_SELF_TEST
4099  
4100  static int ecrdsa_nn_random_rfc4491_bis_1_GOST_512bits_curve_test_vector(nn_t out, nn_src_t q){
4101  	int ret, cmp;
4102  	const u8 k_buf[] = {
4103  		0x03, 0x59, 0xe7, 0xf4, 0xb1, 0x41, 0x0f, 0xea, 0xcc,
4104  		0x57, 0x04, 0x56, 0xc6, 0x80, 0x14, 0x96, 0x94, 0x63,
4105  		0x12, 0x12, 0x0b, 0x39, 0xd0, 0x19, 0xd4, 0x55, 0x98,
4106  		0x6e, 0x36, 0x4f, 0x36, 0x58, 0x86, 0x74, 0x8e, 0xd7,
4107  		0xa4, 0x4b, 0x3e, 0x79, 0x44, 0x34, 0x00, 0x60, 0x11,
4108  		0x84, 0x22, 0x86, 0x21, 0x22, 0x73, 0xa6, 0xd1, 0x4c,
4109  		0xf7, 0x0e, 0xa3, 0xaf, 0x71, 0xbb, 0x1a, 0xe6, 0x79,
4110  		0xf1,
4111  	};
4112          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4113          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4114  
4115          ret = (cmp >= 0) ? -1 : 0;
4116  
4117  err:
4118          return ret;
4119  }
4120  static const u8 ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_priv_key[] = {
4121  	0x0B, 0xA6, 0x04, 0x8A, 0xAD, 0xAE, 0x24, 0x1B, 0xA4,
4122  	0x09, 0x36, 0xD4, 0x77, 0x56, 0xD7, 0xC9, 0x30, 0x91,
4123  	0xA0, 0xE8, 0x51, 0x46, 0x69, 0x70, 0x0E, 0xE7, 0x50,
4124  	0x8E, 0x50, 0x8B, 0x10, 0x20, 0x72, 0xE8, 0x12, 0x3B,
4125  	0x22, 0x00, 0xA0, 0x56, 0x33, 0x22, 0xDA, 0xD2, 0x82,
4126  	0x7E, 0x27, 0x14, 0xA2, 0x63, 0x6B, 0x7B, 0xFD, 0x18,
4127  	0xAA, 0xDF, 0xC6, 0x29, 0x67, 0x82, 0x1F, 0xA1, 0x8D,
4128  	0xD4,
4129  };
4130  static const u8 ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_expected_sig[] = {
4131  	0x2f, 0x86, 0xfa, 0x60, 0xa0, 0x81, 0x09, 0x1a, 0x23,
4132  	0xdd, 0x79, 0x5e, 0x1e, 0x3c, 0x68, 0x9e, 0xe5, 0x12,
4133  	0xa3, 0xc8, 0x2e, 0xe0, 0xdc, 0xc2, 0x64, 0x3c, 0x78,
4134  	0xee, 0xa8, 0xfc, 0xac, 0xd3, 0x54, 0x92, 0x55, 0x84,
4135  	0x86, 0xb2, 0x0f, 0x1c, 0x9e, 0xc1, 0x97, 0xc9, 0x06,
4136  	0x99, 0x85, 0x02, 0x60, 0xc9, 0x3b, 0xcb, 0xcd, 0x9c,
4137  	0x5c, 0x33, 0x17, 0xe1, 0x93, 0x44, 0xe1, 0x73, 0xae,
4138  	0x36,
4139  	0x41, 0x57, 0x03, 0xd8, 0x92, 0xf1, 0xa5, 0xf3, 0xf6,
4140  	0x8c, 0x43, 0x53, 0x18, 0x9a, 0x7e, 0xe2, 0x07, 0xb8,
4141  	0x0b, 0x56, 0x31, 0xef, 0x9d, 0x49, 0x52, 0x9a, 0x4d,
4142  	0x6b, 0x54, 0x2c, 0x2c, 0xfa, 0x15, 0xaa, 0x2e, 0xac,
4143  	0xf1, 0x1f, 0x47, 0x0f, 0xde, 0x7d, 0x95, 0x48, 0x56,
4144  	0x90, 0x3c, 0x35, 0xfd, 0x8f, 0x95, 0x5e, 0xf3, 0x00,
4145  	0xd9, 0x5c, 0x77, 0x53, 0x4a, 0x72, 0x4a, 0x0e, 0xee,
4146  	0x70,
4147  };
4148  static const unsigned char ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_message[] = {
4149  	0x30, 0x82, 0x01, 0x16, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x0b,
4150  	0x30, 0x0a, 0x06, 0x08, 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x03,
4151  	0x30, 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
4152  	0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x30, 0x20, 0x17, 0x0d,
4153  	0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
4154  	0x5a, 0x18, 0x0f, 0x32, 0x30, 0x35, 0x30, 0x31, 0x32, 0x33, 0x31, 0x30,
4155  	0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x12, 0x31, 0x10, 0x30, 0x0e,
4156  	0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70,
4157  	0x6c, 0x65, 0x30, 0x81, 0xa0, 0x30, 0x17, 0x06, 0x08, 0x2a, 0x85, 0x03,
4158  	0x07, 0x01, 0x01, 0x01, 0x02, 0x30, 0x0b, 0x06, 0x09, 0x2a, 0x85, 0x03,
4159  	0x07, 0x01, 0x02, 0x01, 0x02, 0x00, 0x03, 0x81, 0x84, 0x00, 0x04, 0x81,
4160  	0x80, 0xe1, 0xef, 0x30, 0xd5, 0x2c, 0x61, 0x33, 0xdd, 0xd9, 0x9d, 0x1d,
4161  	0x5c, 0x41, 0x45, 0x5c, 0xf7, 0xdf, 0x4d, 0x8b, 0x4c, 0x92, 0x5b, 0xbc,
4162  	0x69, 0xaf, 0x14, 0x33, 0xd1, 0x56, 0x58, 0x51, 0x5a, 0xdd, 0x21, 0x46,
4163  	0x85, 0x0c, 0x32, 0x5c, 0x5b, 0x81, 0xc1, 0x33, 0xbe, 0x65, 0x5a, 0xa8,
4164  	0xc4, 0xd4, 0x40, 0xe7, 0xb9, 0x8a, 0x8d, 0x59, 0x48, 0x7b, 0x0c, 0x76,
4165  	0x96, 0xbc, 0xc5, 0x5d, 0x11, 0xec, 0xbe, 0x77, 0x36, 0xa9, 0xec, 0x35,
4166  	0x7f, 0xf2, 0xfd, 0x39, 0x93, 0x1f, 0x4e, 0x11, 0x4c, 0xb8, 0xcd, 0xa3,
4167  	0x59, 0x27, 0x0a, 0xc7, 0xf0, 0xe7, 0xff, 0x43, 0xd9, 0x41, 0x94, 0x19,
4168  	0xea, 0x61, 0xfd, 0x2a, 0xb7, 0x7f, 0x5d, 0x9f, 0x63, 0x52, 0x3d, 0x3b,
4169  	0x50, 0xa0, 0x4f, 0x63, 0xe2, 0xa0, 0xcf, 0x51, 0xb7, 0xc1, 0x3a, 0xdc,
4170  	0x21, 0x56, 0x0f, 0x0b, 0xd4, 0x0c, 0xc9, 0xc7, 0x37, 0xa3, 0x13, 0x30,
4171  	0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
4172  	0x05, 0x30, 0x03, 0x01, 0x01, 0xff
4173  };
4174  static const ec_test_case ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_case = {
4175  	.name="ECRDSA-STREEBOG512/GOST-512-curve (RFC4491)",
4176  	.ec_str_p = &GOST_512bits_curve_str_params,
4177  	.priv_key = ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_priv_key,
4178  	.priv_key_len = sizeof(ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_priv_key),
4179  	.nn_random = ecrdsa_nn_random_rfc4491_bis_1_GOST_512bits_curve_test_vector,
4180  	.hash_type = STREEBOG512,
4181  	.msg = (const char*)ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_message,
4182  	.msglen = sizeof(ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_message),
4183  	.sig_type = ECRDSA,
4184  	.exp_sig = ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_expected_sig,
4185  	.exp_siglen = sizeof(ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_vector_expected_sig),
4186  	.adata = NULL,
4187  	.adata_len = 0
4188  };
4189  
4190  #endif /* WITH_CURVE_GOST512 */
4191  #endif /* WITH_HASH_STREEBOG512 */
4192  
4193  
4194  #else /* !defined(USE_ISO14888_3_ECRDSA) */
4195  /*
4196   * Unlike other signature algorithms (defined in ISO 14888-3:2015) for
4197   * which tests vectors are based on secp* or brainpoolp* curves, EC-RDSA
4198   * tests vectors are based on custom curves. As a side note, the 256
4199   * curve (not the random signature param and key) appear in RFC 5832 and
4200   * RFC 7091, but discrepancies exist in the algorithm with the ISO/IEC 14888-3
4201   * description and test vectors (see above).
4202   */
4203  
4204  #ifdef WITH_HASH_SHA256
4205  #ifdef WITH_CURVE_GOST256
4206  #define ECRDSA_SHA256_GOST256_SELF_TEST
4207  
4208  /* First, ECRDSA test vector on a 256-bit GOST curve */
4209  
4210  static int ecrdsa_nn_random_iso14888_3_GOST_256bits_curve_test_vector(nn_t out,
4211  								      nn_src_t q)
4212  {
4213  	int ret, cmp;
4214  	const u8 k_buf[] = {
4215  		0x77, 0x10, 0x5C, 0x9B, 0x20, 0xBC, 0xD3, 0x12,
4216  		0x28, 0x23, 0xC8, 0xCF, 0x6F, 0xCC, 0x7B, 0x95,
4217  		0x6D, 0xE3, 0x38, 0x14, 0xE9, 0x5B, 0x7F, 0xE6,
4218  		0x4F, 0xED, 0x92, 0x45, 0x94, 0xDC, 0xEA, 0xB3
4219  	};
4220  
4221  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4222  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
4223  
4224  	ret = (cmp >= 0) ? -1 : 0;
4225  
4226  err:
4227  	return ret;
4228  }
4229  
4230  static const u8 ecrdsa_GOST_256bits_curve_test_vectors_priv_key[] = {
4231  	0x7A, 0x92, 0x9A, 0xDE, 0x78, 0x9B, 0xB9, 0xBE,
4232  	0x10, 0xED, 0x35, 0x9D, 0xD3, 0x9A, 0x72, 0xC1,
4233  	0x1B, 0x60, 0x96, 0x1F, 0x49, 0x39, 0x7E, 0xEE,
4234  	0x1D, 0x19, 0xCE, 0x98, 0x91, 0xEC, 0x3B, 0x28
4235  };
4236  
4237  static const u8 ecrdsa_GOST_256bits_curve_test_vectors_expected_sig[] = {
4238  	0x41, 0xAA, 0x28, 0xD2, 0xF1, 0xAB, 0x14, 0x82,
4239  	0x80, 0xCD, 0x9E, 0xD5, 0x6F, 0xED, 0xA4, 0x19,
4240  	0x74, 0x05, 0x35, 0x54, 0xA4, 0x27, 0x67, 0xB8,
4241  	0x3A, 0xD0, 0x43, 0xFD, 0x39, 0xDC, 0x04, 0x93,
4242  	0x0A, 0x7B, 0xA4, 0x72, 0x2D, 0xA5, 0x69, 0x3F,
4243  	0x22, 0x9D, 0x17, 0x5F, 0xAB, 0x6A, 0xFB, 0x85,
4244  	0x7E, 0xC2, 0x27, 0x3B, 0x9F, 0x88, 0xDA, 0x58,
4245  	0x92, 0xCE, 0xD3, 0x11, 0x7F, 0xCF, 0x1E, 0x36
4246  };
4247  
4248  static const ec_test_case ecrdsa_GOST_256bits_curve_test_case = {
4249  	.name = "ECRDSA-SHA256/GOST-256-curve",
4250  	.ec_str_p = &GOST_256bits_curve_str_params,
4251  	.priv_key = ecrdsa_GOST_256bits_curve_test_vectors_priv_key,
4252  	.priv_key_len =
4253  		sizeof(ecrdsa_GOST_256bits_curve_test_vectors_priv_key),
4254  	.nn_random =
4255  		ecrdsa_nn_random_iso14888_3_GOST_256bits_curve_test_vector,
4256  	.hash_type = SHA256,
4257  	.msg = "abc",
4258  	.msglen = 3,
4259  	.sig_type = ECRDSA,
4260  	.exp_sig = ecrdsa_GOST_256bits_curve_test_vectors_expected_sig,
4261  	.exp_siglen =
4262  		sizeof(ecrdsa_GOST_256bits_curve_test_vectors_expected_sig),
4263  	.adata = NULL,
4264  	.adata_len = 0
4265  };
4266  #endif /* WITH_CURVE_GOST256 */
4267  #endif /* WITH_HASH_SHA256 */
4268  
4269  /* NOTE: the test vectors present in the GOST 34.10-2012 standard and in the
4270   * associated RFC7091 do not provide messages as input, they instead provide the
4271   * value of the raw result of the hash function reduced modulo q. This is kinf of
4272   * useless here as we want to test the full GOST stack (i.e. hash digest plus curves),
4273   * hence we use the PyGOST Python library to generate some test vectors.
4274   */
4275  #ifdef WITH_HASH_STREEBOG256
4276  #ifdef WITH_CURVE_GOST256
4277  #define ECRDSA_STREEBOG256_GOST256_SELF_TEST
4278  static int ecrdsa_nn_random_pygostlib_1_GOST_256bits_curve_test_vector(nn_t out, nn_src_t q){
4279  	int ret, cmp;
4280  	const u8 k_buf[] = {
4281  		0x4c, 0xe0, 0xe1, 0x2a, 0x2a, 0x35, 0x82, 0xa2, 0x1b, 0xe0,
4282  		0xe7, 0x3f, 0xaf, 0xf2, 0xe2, 0xdb, 0x0c, 0xc2, 0x04, 0x80,
4283  		0x33, 0x86, 0x36, 0xa2, 0x75, 0xcd, 0x12, 0xee, 0x0e, 0x3b,
4284  		0x7a, 0xa7,
4285  	};
4286          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4287          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4288  
4289          ret = (cmp >= 0) ? -1 : 0;
4290  
4291  err:
4292          return ret;
4293  }
4294  static const u8 ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_priv_key[] = {
4295  	0x34, 0xce, 0x5e, 0x59, 0xef, 0x00, 0x78, 0x53, 0x06,
4296  	0xe8, 0x4a, 0xfd, 0x53, 0x47, 0xab, 0xe5, 0x68, 0x92,
4297  	0x4e, 0xfe, 0x26, 0x32, 0x11, 0x1d, 0x05, 0x6a, 0xf9,
4298  	0x1c, 0x4d, 0x7d, 0x59, 0x9a,
4299  };
4300  static const u8 ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_expected_sig[] = {
4301  	0x43, 0x3f, 0x32, 0xf8, 0xcb, 0xdb, 0x53, 0x3d, 0x1e,
4302  	0x8f, 0x5f, 0x5b, 0xfa, 0xc8, 0x67, 0x90, 0x5d, 0x01,
4303  	0x22, 0xa7, 0x40, 0x5d, 0x06, 0xa2, 0x06, 0xac, 0x6a,
4304  	0xfb, 0x42, 0xf9, 0x9c, 0x66, 0x4a, 0xa8, 0xea, 0x8f,
4305  	0x5c, 0xbc, 0x88, 0xf3, 0x3b, 0x66, 0x9f, 0x0d, 0xa6,
4306  	0x21, 0xa9, 0xe2, 0x1c, 0xba, 0xcc, 0xca, 0x91, 0x97,
4307  	0xe6, 0xdf, 0xcb, 0x14, 0x9a, 0x99, 0x26, 0xf2, 0xd7,
4308  	0xd2,
4309  };
4310  static const char ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_message[] = {
4311  	0x61, 0x62, 0x63,
4312  };
4313  static const ec_test_case ecrdsa_pygostlib_1_GOST_256bits_curve_test_case = {
4314  	.name="ECRDSA-STREEBOG256/GOST-256-curve 1",
4315  	.ec_str_p = &GOST_256bits_curve_str_params,
4316  	.priv_key = ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_priv_key,
4317  	.priv_key_len = sizeof(ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_priv_key),
4318  	.nn_random = ecrdsa_nn_random_pygostlib_1_GOST_256bits_curve_test_vector,
4319  	.hash_type = STREEBOG256,
4320  	.msg = ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_message,
4321  	.msglen = sizeof(ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_message),
4322  	.sig_type = ECRDSA,
4323  	.exp_sig = ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_expected_sig,
4324  	.exp_siglen = sizeof(ecrdsa_pygostlib_1_GOST_256bits_curve_test_vector_expected_sig),
4325  	.adata = NULL,
4326  	.adata_len = 0
4327  };
4328  
4329  static int ecrdsa_nn_random_pygostlib_2_GOST_256bits_curve_test_vector(nn_t out, nn_src_t q){
4330  	int ret, cmp;
4331  	const u8 k_buf[] = {
4332  		0x1b, 0x91, 0xc9, 0xc8, 0xf3, 0x3d, 0x16, 0x2f, 0xe0,
4333  		0x97, 0xf2, 0x8e, 0x1d, 0x8a, 0x52, 0xab, 0x8f, 0x31,
4334  		0x91, 0x55, 0x08, 0xf7, 0x1c, 0x80, 0x65, 0xac, 0x50,
4335  		0x61, 0xff, 0x20, 0x07, 0x07,
4336  	};
4337          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4338          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4339  
4340          ret = (cmp >= 0) ? -1 : 0;
4341  
4342  err:
4343          return ret;
4344  }
4345  static const u8 ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_priv_key[] = {
4346  	0x36, 0xf5, 0x26, 0x39, 0x79, 0x87, 0x88, 0x83, 0x06,
4347  	0x56, 0x86, 0xd8, 0x7e, 0x04, 0xf0, 0x68, 0xbb, 0xf5,
4348  	0x54, 0x18, 0xbf, 0xbf, 0x02, 0x1f, 0xa3, 0x0e, 0x9c,
4349  	0xfb, 0xa7, 0x8d, 0x63, 0xef,
4350  };
4351  static const u8 ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_expected_sig[] = {
4352  	0x24, 0x28, 0x81, 0x56, 0xe2, 0xaa, 0xb4, 0xd7, 0xbd,
4353  	0x33, 0x2c, 0x50, 0x39, 0xe0, 0x84, 0x8a, 0x85, 0x2a,
4354  	0xfd, 0xab, 0x36, 0x35, 0xea, 0x1e, 0xdd, 0xd0, 0x28,
4355  	0xf3, 0x34, 0x5d, 0x68, 0xcf, 0x24, 0xaf, 0x4b, 0xe3,
4356  	0x86, 0xc6, 0x95, 0x9c, 0xfb, 0xd5, 0x0e, 0x2e, 0x11,
4357  	0x17, 0x65, 0x09, 0x18, 0xea, 0xe9, 0x3c, 0x60, 0x67,
4358  	0x3f, 0xe2, 0xa2, 0xe9, 0xde, 0x33, 0xe7, 0xff, 0x79,
4359  	0x0c,
4360  };
4361  static const char ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_message[] = {
4362  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4363  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4364  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4365  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4366  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4367  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4368  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4369  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4370  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4371  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4372  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4373  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4374  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4375  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4376  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4377  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4378  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4379  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4380  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4381  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4382  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4383  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4384  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4385  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4386  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4387  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4388  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4389  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4390  	0x61, 0x62, 0x63, 0x64,
4391  };
4392  static const ec_test_case ecrdsa_pygostlib_2_GOST_256bits_curve_test_case = {
4393  	.name="ECRDSA-STREEBOG256/GOST-256-curve 2",
4394  	.ec_str_p = &GOST_256bits_curve_str_params,
4395  	.priv_key = ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_priv_key,
4396  	.priv_key_len = sizeof(ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_priv_key),
4397  	.nn_random = ecrdsa_nn_random_pygostlib_2_GOST_256bits_curve_test_vector,
4398  	.hash_type = STREEBOG256,
4399  	.msg = ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_message,
4400  	.msglen = sizeof(ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_message),
4401  	.sig_type = ECRDSA,
4402  	.exp_sig = ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_expected_sig,
4403  	.exp_siglen = sizeof(ecrdsa_pygostlib_2_GOST_256bits_curve_test_vector_expected_sig),
4404  	.adata = NULL,
4405  	.adata_len = 0
4406  };
4407  
4408  #endif /* WITH_CURVE_GOST256 */
4409  #endif /* WITH_HASH_STREEBOG256 */
4410  
4411  #ifdef WITH_HASH_SHA512
4412  #ifdef WITH_CURVE_GOST512
4413  #define ECRDSA_SHA512_GOST512_SELF_TEST
4414  
4415  /* Then, ECRDSA test vector on a GOST 512-bit curve */
4416  
4417  static int ecrdsa_nn_random_iso14888_3_GOST_512bits_curve_test_vector(nn_t out,
4418  								nn_src_t q)
4419  {
4420  	int ret, cmp;
4421  	/*
4422  	 * Current version of ISO 14888-3:2015 has a bad k value in its
4423  	 * test vectors. The value of k is higher than q!!!! Instead of
4424  	 * reducing the wrong value each time, let's change that false
4425  	 * value for a correct one (i.e. the reduced one mod q).
4426  	 *
4427  
4428  	 const u8 k_buf[] = {
4429  	 0xC5, 0x73, 0xF6, 0xB3, 0x01, 0xD9, 0x9C, 0x24,
4430  	 0xC4, 0x22, 0xA4, 0x27, 0x1E, 0x9E, 0xC9, 0x3B,
4431  	 0xAE, 0xAA, 0x6E, 0xEF, 0x0D, 0xE8, 0x24, 0x77,
4432  	 0xD8, 0xB7, 0x39, 0x1F, 0x9F, 0x67, 0x90, 0xD9,
4433  	 0xDD, 0xE5, 0x14, 0x6F, 0x02, 0xEC, 0xA5, 0x67,
4434  	 0x2C, 0x38, 0xFC, 0x80, 0x9C, 0xF4, 0xCA, 0x88,
4435  	 0x93, 0x7C, 0x4B, 0x3A, 0x39, 0x36, 0xAD, 0xF9,
4436  	 0x90, 0x8F, 0x79, 0x6C, 0x86, 0xC0, 0x5C, 0x43
4437  	 };
4438  
4439  	 */
4440  
4441  	const u8 k_buf[] = {
4442  		0x3b, 0x10, 0x9d, 0x0f, 0x05, 0xd9, 0x54, 0x96,
4443  		0x1a, 0x08, 0x57, 0x30, 0x48, 0x3e, 0xec, 0x3a,
4444  		0x8a, 0x54, 0x45, 0x89, 0x0e, 0x76, 0x06, 0x6e,
4445  		0x2e, 0xe0, 0x41, 0x0c, 0x33, 0xc1, 0xee, 0x1e,
4446  		0x8d, 0x86, 0xb9, 0x71, 0x6c, 0xb1, 0x2f, 0xd8,
4447  		0xf9, 0x18, 0x43, 0xc2, 0xc3, 0x6c, 0x82, 0xa4,
4448  		0xe2, 0x9f, 0xff, 0x5e, 0xbc, 0xef, 0x22, 0xcd,
4449  		0xe4, 0x06, 0x23, 0x89, 0x76, 0xf2, 0x8e, 0x85
4450  	};
4451  
4452  	ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4453  	ret = nn_cmp(out, q, &cmp); EG(ret, err);
4454  
4455  	ret = (cmp >= 0) ? -1 : 0;
4456  
4457  err:
4458  	return ret;
4459  }
4460  
4461  static const u8 ecrdsa_GOST_512bits_curve_test_vectors_priv_key[] = {
4462  	0x0B, 0xA6, 0x04, 0x8A, 0xAD, 0xAE, 0x24, 0x1B,
4463  	0xA4, 0x09, 0x36, 0xD4, 0x77, 0x56, 0xD7, 0xC9,
4464  	0x30, 0x91, 0xA0, 0xE8, 0x51, 0x46, 0x69, 0x70,
4465  	0x0E, 0xE7, 0x50, 0x8E, 0x50, 0x8B, 0x10, 0x20,
4466  	0x72, 0xE8, 0x12, 0x3B, 0x22, 0x00, 0xA0, 0x56,
4467  	0x33, 0x22, 0xDA, 0xD2, 0x82, 0x7E, 0x27, 0x14,
4468  	0xA2, 0x63, 0x6B, 0x7B, 0xFD, 0x18, 0xAA, 0xDF,
4469  	0xC6, 0x29, 0x67, 0x82, 0x1F, 0xA1, 0x8D, 0xD4
4470  };
4471  
4472  static const u8 ecrdsa_GOST_512bits_curve_test_vectors_expected_sig[] = {
4473  	0x13, 0xc5, 0x65, 0x57, 0xe3, 0x00, 0x89, 0x8b,
4474  	0xf6, 0xc9, 0x1a, 0x08, 0xaf, 0x0c, 0xaf, 0x80,
4475  	0x10, 0x46, 0xa2, 0xdc, 0x58, 0xcf, 0x7e, 0x84,
4476  	0xa1, 0x5d, 0xa3, 0xb6, 0x89, 0xc0, 0xeb, 0x29,
4477  	0x73, 0xf5, 0xbe, 0x70, 0x27, 0xdb, 0xdd, 0x77,
4478  	0xbc, 0xe5, 0xd3, 0x37, 0x6a, 0xd5, 0x79, 0x3c,
4479  	0x21, 0x31, 0x57, 0x85, 0xaa, 0x6d, 0x25, 0x36,
4480  	0xa2, 0x0c, 0x91, 0x58, 0x14, 0xf2, 0xad, 0xdc,
4481  	0x32, 0xC0, 0xB1, 0x5B, 0xE3, 0x67, 0x58, 0x3B,
4482  	0xB3, 0xFA, 0xEF, 0xF1, 0x49, 0xAF, 0x87, 0xD1,
4483  	0x18, 0xBF, 0x18, 0xE1, 0x34, 0x87, 0xE0, 0xC6,
4484  	0xAB, 0x75, 0x80, 0xB8, 0x62, 0xEC, 0x10, 0x4A,
4485  	0x41, 0xEC, 0x9A, 0x5F, 0xB1, 0x7B, 0x0E, 0x0E,
4486  	0xDB, 0xCF, 0xFD, 0x92, 0x0D, 0x6F, 0x62, 0x7E,
4487  	0x70, 0x4A, 0x82, 0xCC, 0x53, 0x41, 0x27, 0xF6,
4488  	0x44, 0xFD, 0xC9, 0x58, 0x98, 0x4D, 0xDC, 0xA0
4489  };
4490  
4491  static const ec_test_case ecrdsa_GOST_512bits_curve_test_case = {
4492  	.name = "ECRDSA-SHA512/GOST-512-curve",
4493  	.ec_str_p = &GOST_512bits_curve_str_params,
4494  	.priv_key = ecrdsa_GOST_512bits_curve_test_vectors_priv_key,
4495  	.priv_key_len =
4496  		sizeof(ecrdsa_GOST_512bits_curve_test_vectors_priv_key),
4497  	.nn_random =
4498  		ecrdsa_nn_random_iso14888_3_GOST_512bits_curve_test_vector,
4499  	.hash_type = SHA512,
4500  	.msg = "abc",
4501  	.msglen = 3,
4502  	.sig_type = ECRDSA,
4503  	.exp_sig = ecrdsa_GOST_512bits_curve_test_vectors_expected_sig,
4504  	.exp_siglen =
4505  		sizeof(ecrdsa_GOST_512bits_curve_test_vectors_expected_sig),
4506  	.adata = NULL,
4507  	.adata_len = 0
4508  };
4509  #endif /* WITH_CURVE_GOST512 */
4510  #endif /* WITH_HASH_SHA512 */
4511  
4512  #ifdef WITH_HASH_STREEBOG512
4513  #ifdef WITH_CURVE_GOST512
4514  #define ECRDSA_STREEBOG512_GOST512_SELF_TEST
4515  
4516  static int ecrdsa_nn_random_pygostlib_1_GOST_512bits_curve_test_vector(nn_t out, nn_src_t q){
4517  	int ret, cmp;
4518  	const u8 k_buf[] = {
4519  		0x03, 0xc3, 0xcb, 0xa3, 0x26, 0xc7, 0xdd, 0x44,	0x8e,
4520  		0x98, 0xa1, 0x03, 0x37, 0x71, 0x4e, 0xf7, 0xa7, 0x9c,
4521  		0xc1, 0x06, 0x30, 0x34, 0xb6, 0xcf, 0x63, 0x0c, 0x1d,
4522  		0xe7, 0x7d, 0x80, 0xe0, 0x95, 0xc5, 0x7c, 0x5b, 0xa3,
4523  		0x78, 0x01, 0x99, 0xde, 0x1f, 0x7c, 0xb0, 0x5b, 0x5b,
4524  		0x08, 0x41, 0xd2, 0xcd, 0x88, 0x60, 0x8e, 0x75, 0xa8,
4525  		0x8f, 0xe4, 0x9f, 0xee, 0xe8, 0xfd, 0xc2, 0x9f, 0x8b,
4526  		0xa6,
4527  	};
4528          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4529          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4530  
4531          ret = (cmp >= 0) ? -1 : 0;
4532  
4533  err:
4534          return ret;
4535  }
4536  static const u8 ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_priv_key[] = {
4537  	0x0c, 0x18, 0x44, 0xa6, 0x1c, 0xbb, 0x08, 0xb7, 0xa1,
4538  	0x86, 0x32, 0x1e, 0xf5, 0x53, 0x97, 0x7d, 0xef, 0x40,
4539  	0x87, 0x7e, 0xd8, 0x98, 0xfb, 0xf6, 0xfd, 0x3e, 0xab,
4540  	0xe4, 0xcf, 0xcf, 0xd3, 0x04, 0x21, 0xe5, 0xbf, 0xcb,
4541  	0x73, 0xce, 0xd7, 0x35, 0x98, 0xa5, 0x4f, 0x9d, 0x9e,
4542  	0x4b, 0x55, 0x83, 0xd6, 0x04, 0x65, 0x3c, 0xb3, 0x0a,
4543  	0xbb, 0xe0, 0x56, 0x96, 0x3f, 0x08, 0xaf, 0x9a, 0x5b, 0x4f,
4544  };
4545  static const u8 ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_expected_sig[] = {
4546  	0x0e, 0xf7, 0xf8, 0xcb, 0x41, 0x86, 0xce, 0xb5, 0x86,
4547  	0x43, 0x53, 0x15, 0xec, 0x67, 0x48, 0xfe, 0x20, 0x58,
4548  	0x35, 0x57, 0x51, 0xd3, 0xfe, 0x25, 0xe2, 0x42, 0xad,
4549  	0x96, 0x58, 0xae, 0x55, 0x11, 0xef, 0xb3, 0x3f, 0x93,
4550  	0x2d, 0x71, 0x0c, 0xea, 0xc9, 0xd7, 0x4e, 0x34, 0x98,
4551  	0xde, 0x85, 0xc9, 0xf1, 0x31, 0x52, 0xfe, 0xf4, 0x65,
4552  	0xa6, 0x57, 0x05, 0x78, 0x4d, 0x6d, 0x45, 0x40, 0x09,
4553  	0x4b, 0x1f, 0x2f, 0xc0, 0x2b, 0x79, 0xc5, 0x85, 0x1a,
4554  	0xc1, 0xc1, 0x4b, 0xaa, 0x63, 0x58, 0xab, 0x07, 0x6e,
4555  	0x0b, 0xc7, 0xfd, 0x28, 0x98, 0xe9, 0x88, 0x90, 0x6c,
4556  	0xd7, 0x14, 0x02, 0x30, 0x14, 0x8c, 0xa7, 0xe7, 0x24,
4557  	0x9a, 0x64, 0x83, 0x63, 0x9c, 0x4f, 0x18, 0xf5, 0x84,
4558  	0x7e, 0xce, 0x03, 0xad, 0x3f, 0x9f, 0x26, 0x2f, 0xcb,
4559  	0xaa, 0x3c, 0x55, 0xf7, 0xee, 0xd2, 0x91, 0xb3, 0xe7,
4560  	0xeb, 0x4b,
4561  };
4562  static const char ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_message[] = {
4563  	0x61, 0x62, 0x63,
4564  };
4565  static const ec_test_case ecrdsa_pygostlib_1_GOST_512bits_curve_test_case = {
4566  	.name="ECRDSA-STREEBOG512/GOST-512-curve 1",
4567  	.ec_str_p = &GOST_512bits_curve_str_params,
4568  	.priv_key = ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_priv_key,
4569  	.priv_key_len = sizeof(ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_priv_key),
4570  	.nn_random = ecrdsa_nn_random_pygostlib_1_GOST_512bits_curve_test_vector,
4571  	.hash_type = STREEBOG512,
4572  	.msg = ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_message,
4573  	.msglen = sizeof(ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_message),
4574  	.sig_type = ECRDSA,
4575  	.exp_sig = ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_expected_sig,
4576  	.exp_siglen = sizeof(ecrdsa_pygostlib_1_GOST_512bits_curve_test_vector_expected_sig),
4577  	.adata = NULL,
4578  	.adata_len = 0
4579  };
4580  
4581  static int ecrdsa_nn_random_pygostlib_2_GOST_512bits_curve_test_vector(nn_t out, nn_src_t q){
4582  	int ret, cmp;
4583  	const u8 k_buf[] = {
4584  		0x15, 0x56, 0x79, 0x4e, 0xed, 0x00, 0x7c, 0xdc, 0xc0,
4585  		0xc1, 0x3f, 0xb3, 0x6b, 0xa3, 0xa3, 0x00, 0xdd, 0x16,
4586  		0xce, 0x6d, 0x83, 0xf6, 0x49, 0xab, 0x8d, 0x7a, 0x06,
4587  		0x38, 0x34, 0xf0, 0x8b, 0xaf, 0xbc, 0x4e, 0x2a, 0x30,
4588  		0x25, 0xee, 0xa2, 0x59, 0x5a, 0xc6, 0x79, 0x57, 0x84,
4589  		0xc9, 0x15, 0x65, 0xed, 0xcb, 0x33, 0x42, 0x8a, 0x7a,
4590  		0xd0, 0xe7, 0x87, 0xfe, 0x3c, 0x16, 0xd1, 0xb5, 0x50,
4591  		0x8a,
4592  	};
4593          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4594          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4595  
4596          ret = (cmp >= 0) ? -1 : 0;
4597  
4598  err:
4599          return ret;
4600  }
4601  static const u8 ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_priv_key[] = {
4602  	0x32, 0xb5, 0xda, 0xed, 0x49, 0x2e, 0x13, 0xc5, 0x8a, 0xb5, 0xa1, 0x41,
4603  	0x9e, 0x01, 0x2f, 0x0c, 0x69, 0xc1, 0x4e, 0xf0, 0xcf, 0x84, 0xce, 0x81,
4604  	0x4f, 0x76, 0x3b, 0x6f, 0xac, 0xd5, 0x7c, 0xd9, 0x42, 0xfe, 0x47, 0xe5,
4605  	0x13, 0x38, 0xbd, 0xdd, 0xd5, 0x91, 0xe0, 0x38, 0xa6, 0x77, 0x17, 0x89,
4606  	0x85, 0x9c, 0x55, 0x54, 0xa3, 0xd0, 0x94, 0x6d, 0x20, 0xb4, 0xd3, 0xfd,
4607  	0x5c, 0xad, 0x17, 0xbc,
4608  };
4609  static const u8 ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_expected_sig[] = {
4610  	0x06, 0xfa, 0x71, 0xf0, 0xf9, 0x5b, 0xab, 0x4f, 0x08, 0x5b, 0x81, 0x44,
4611  	0x32, 0x3a, 0x79, 0xa3, 0x9f, 0xb6, 0x72, 0x7c, 0x5b, 0x14, 0x48, 0xcb,
4612  	0x2b, 0x42, 0xc9, 0x75, 0xb8, 0x35, 0x63, 0xf0, 0x6f, 0x81, 0x02, 0x78,
4613  	0xd3, 0x2d, 0x7b, 0x04, 0x91, 0x11, 0xb0, 0x69, 0xa0, 0xba, 0x62, 0x47,
4614  	0x3c, 0x72, 0x29, 0xef, 0x1b, 0xc2, 0x5c, 0xe5, 0x94, 0x4a, 0xf4, 0xbb,
4615  	0x64, 0xf8, 0x68, 0xb9, 0x2e, 0x29, 0xa4, 0x50, 0xd2, 0x38, 0xae, 0xc2,
4616  	0x8f, 0x6c, 0x3f, 0xcf, 0x2b, 0x13, 0x5b, 0xf9, 0x73, 0x6a, 0xf8, 0xac,
4617  	0x13, 0xff, 0xff, 0x60, 0x19, 0xbd, 0x89, 0xae, 0x4e, 0x29, 0xb8, 0x07,
4618  	0xea, 0xa9, 0xe3, 0xf1, 0x78, 0xa2, 0x4f, 0x07, 0x3d, 0xd8, 0x6b, 0x9f,
4619  	0x2e, 0xb7, 0x2d, 0x96, 0xd2, 0xea, 0xae, 0x68, 0x38, 0xdb, 0x0d, 0x42,
4620  	0xa7, 0x73, 0xf5, 0x5b, 0xbd, 0x3c, 0xe8, 0x84,
4621  };
4622  static const char ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_message[] = {
4623  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4624  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4625  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4626  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4627  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4628  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4629  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4630  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4631  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4632  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4633  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4634  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4635  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4636  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4637  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4638  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4639  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4640  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4641  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4642  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4643  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4644  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4645  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4646  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4647  	0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61,
4648  	0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62,
4649  	0x63, 0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63,
4650  	0x64, 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
4651  	0x61, 0x62, 0x63, 0x64,
4652  };
4653  static const ec_test_case ecrdsa_pygostlib_2_GOST_512bits_curve_test_case = {
4654  	.name="ECRDSA-STREEBOG512/GOST-512-curve 2",
4655  	.ec_str_p = &GOST_512bits_curve_str_params,
4656  	.priv_key = ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_priv_key,
4657  	.priv_key_len = sizeof(ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_priv_key),
4658  	.nn_random = ecrdsa_nn_random_pygostlib_2_GOST_512bits_curve_test_vector,
4659  	.hash_type = STREEBOG512,
4660  	.msg = ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_message,
4661  	.msglen = sizeof(ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_message),
4662  	.sig_type = ECRDSA,
4663  	.exp_sig = ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_expected_sig,
4664  	.exp_siglen = sizeof(ecrdsa_pygostlib_2_GOST_512bits_curve_test_vector_expected_sig),
4665  	.adata = NULL,
4666  	.adata_len = 0
4667  };
4668  
4669  #endif /* WITH_CURVE_GOST512 */
4670  #endif /* WITH_HASH_STREEBOG512 */
4671  
4672  #endif /* defined(USE_ISO14888_3_ECRDSA) */
4673  
4674  #endif /* WITH_SIG_ECRDSA */
4675  
4676  /*******************************************************************
4677   ************** SM2 tests ******************************************
4678   *******************************************************************/
4679  
4680  /*
4681   * Unlike other signature algorithms (defined in ISO 14888-3:2015) for
4682   * which tests vectors are based on secp* or brainpoolp* curves, SM2
4683   * tests vectors are based on custom curves.
4684   */
4685  
4686  #ifdef WITH_SIG_SM2
4687  #ifdef WITH_HASH_SM3
4688  
4689  #ifdef WITH_CURVE_SM2P256TEST
4690  #define SM2_SM3_CURVE_SM2P256TEST
4691  
4692  /* First, SM2 test vector on a 256-bit SM2 TEST curve */
4693  
4694  static int sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vector(nn_t out,
4695  								      nn_src_t
4696  								      q)
4697  {
4698  	int ret, cmp;
4699  	const u8 k_buf[] = {
4700  		0x6C, 0xB2, 0x8D, 0x99, 0x38, 0x5C, 0x17, 0x5C,
4701  		0x94, 0xF9, 0x4E, 0x93, 0x48, 0x17, 0x66, 0x3F,
4702  		0xC1, 0x76, 0xD9, 0x25, 0xDD, 0x72, 0xB7, 0x27,
4703  		0x26, 0x0D, 0xBA, 0xAE, 0x1F, 0xB2, 0xF9, 0x6F
4704  	};
4705          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4706          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4707  
4708          ret = (cmp >= 0) ? -1 : 0;
4709  
4710  err:
4711          return ret;
4712  }
4713  
4714  static const u8 sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_priv_key[] = {
4715  	0x12, 0x8B, 0x2F, 0xA8, 0xBD, 0x43, 0x3C, 0x6C,
4716  	0x06, 0x8C, 0x8D, 0x80, 0x3D, 0xFF, 0x79, 0x79,
4717  	0x2A, 0x51, 0x9A, 0x55, 0x17, 0x1B, 0x1B, 0x65,
4718  	0x0C, 0x23, 0x66, 0x1D, 0x15, 0x89, 0x72, 0x63
4719  };
4720  
4721  static const u8 sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_expected_sig[] = {
4722  	0x40, 0xF1, 0xEC, 0x59, 0xF7, 0x93, 0xD9, 0xF4,
4723  	0x9E, 0x09, 0xDC, 0xEF, 0x49, 0x13, 0x0D, 0x41,
4724  	0x94, 0xF7, 0x9F, 0xB1, 0xEE, 0xD2, 0xCA, 0xA5,
4725  	0x5B, 0xAC, 0xDB, 0x49, 0xC4, 0xE7, 0x55, 0xD1,
4726  	0x6F, 0xC6, 0xDA, 0xC3, 0x2C, 0x5D, 0x5C, 0xF1,
4727  	0x0C, 0x77, 0xDF, 0xB2, 0x0F, 0x7C, 0x2E, 0xB6,
4728  	0x67, 0xA4, 0x57, 0x87, 0x2F, 0xB0, 0x9E, 0xC5,
4729  	0x63, 0x27, 0xA6, 0x7E, 0xC7, 0xDE, 0xEB, 0xE7
4730  };
4731  
4732  static const char sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_msg[] = "message digest";
4733  
4734  static const char sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_adata[] = "ALICE123@YAHOO.COM";
4735  
4736  static const ec_test_case sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_case = {
4737  	.name = "SM2-SM3/SM2P256TEST",
4738  	.ec_str_p = &sm2p256test_str_params,
4739  	.priv_key = sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_priv_key,
4740  	.priv_key_len = sizeof(sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_priv_key),
4741  	.nn_random = sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vector,
4742  	.hash_type = SM3,
4743  	.msg = sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_msg,
4744  	.msglen = 14,
4745  	.sig_type = SM2,
4746  	.exp_sig = sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_expected_sig,
4747  	.exp_siglen = sizeof(sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_expected_sig),
4748  	.adata = (const u8*)sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_vectors_adata,
4749  	.adata_len = 18,
4750  };
4751  #endif /* WITH_CURVE_SM2P256TEST */
4752  
4753  #ifdef WITH_CURVE_SM2P256V1
4754  #define SM2_SM3_CURVE_SM2P256V1
4755  
4756  /* SM2 test vector on a 256-bit SM2 standardized curve */
4757  
4758  static int sm2_nn_random_sm2p256v1_test_vector(nn_t out, nn_src_t q)
4759  {
4760  	int ret, cmp;
4761  	const u8 k_buf[] = {
4762  		0x59, 0x27, 0x6E, 0x27, 0xD5, 0x06, 0x86, 0x1A, 0x16,
4763  		0x68, 0x0F, 0x3A, 0xD9, 0xC0, 0x2D, 0xCC, 0xEF, 0x3C,
4764  		0xC1, 0xFA, 0x3C, 0xDB, 0xE4, 0xCE, 0x6D, 0x54, 0xB8,
4765  		0x0D, 0xEA, 0xC1, 0xBC, 0x21,
4766  	};
4767          ret = nn_init_from_buf(out, k_buf, sizeof(k_buf)); EG(ret, err);
4768          ret = nn_cmp(out, q, &cmp); EG(ret, err);
4769  
4770          ret = (cmp >= 0) ? -1 : 0;
4771  
4772  err:
4773          return ret;
4774  }
4775  
4776  static const u8 sm2_nn_random_sm2p256v1_test_vectors_priv_key[] = {
4777  	0x39, 0x45, 0x20, 0x8F, 0x7B, 0x21, 0x44, 0xB1, 0x3F, 0x36, 0xE3,
4778  	0x8A, 0xC6, 0xD3, 0x9F, 0x95, 0x88, 0x93, 0x93, 0x69, 0x28, 0x60,
4779  	0xB5, 0x1A, 0x42, 0xFB, 0x81, 0xEF, 0x4D, 0xF7, 0xC5, 0xB8,
4780  };
4781  
4782  static const u8 sm2_nn_random_sm2p256v1_test_vectors_expected_sig[] = {
4783  	0xF5, 0xA0, 0x3B, 0x06, 0x48, 0xD2, 0xC4, 0x63, 0x0E, 0xEA, 0xC5,
4784  	0x13, 0xE1, 0xBB, 0x81, 0xA1, 0x59, 0x44, 0xDA, 0x38, 0x27, 0xD5,
4785  	0xB7, 0x41, 0x43, 0xAC, 0x7E, 0xAC, 0xEE, 0xE7, 0x20, 0xB3, 0xB1,
4786  	0xB6, 0xAA, 0x29, 0xDF, 0x21, 0x2F, 0xD8, 0x76, 0x31, 0x82, 0xBC,
4787  	0x0D, 0x42, 0x1C, 0xA1, 0xBB, 0x90, 0x38, 0xFD, 0x1F, 0x7F, 0x42,
4788  	0xD4, 0x84, 0x0B, 0x69, 0xC4, 0x85, 0xBB, 0xC1, 0xAA,
4789  };
4790  
4791  static const u8 sm2_nn_random_sm2p256v1_test_vectors_adata[] = {
4792  	0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33,
4793  	0x34, 0x35, 0x36, 0x37, 0x38,
4794  };
4795  
4796  static const u8 tmp_msg_sm2_sm2p256v1[] = {
4797  	0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74,
4798  };
4799  static const ec_test_case sm2_nn_random_sm2p256v1_test_case = {
4800  	.name = "SM2-SM3/SM2P256V1",
4801  	.ec_str_p = &sm2p256v1_str_params,
4802  	.priv_key = sm2_nn_random_sm2p256v1_test_vectors_priv_key,
4803  	.priv_key_len = sizeof(sm2_nn_random_sm2p256v1_test_vectors_priv_key),
4804  	.nn_random = sm2_nn_random_sm2p256v1_test_vector,
4805  	.hash_type = SM3,
4806  	.msg = (const char *)tmp_msg_sm2_sm2p256v1,
4807  	.msglen = sizeof(tmp_msg_sm2_sm2p256v1),
4808  	.sig_type = SM2,
4809  	.exp_sig = sm2_nn_random_sm2p256v1_test_vectors_expected_sig,
4810  	.exp_siglen = sizeof(sm2_nn_random_sm2p256v1_test_vectors_expected_sig),
4811  	.adata = sm2_nn_random_sm2p256v1_test_vectors_adata,
4812  	.adata_len = sizeof(sm2_nn_random_sm2p256v1_test_vectors_adata),
4813  };
4814  #endif /* WITH_CURVE_SM2P256TEST */
4815  
4816  
4817  #endif /* WITH_HASH_SM3 */
4818  #endif /* WITH_SIG_SM2 */
4819  
4820  
4821  /*******************************************************************
4822   ************** EdDSA tests ****************************************
4823   *******************************************************************/
4824  #ifdef WITH_SIG_EDDSA25519
4825  #ifdef WITH_HASH_SHA512
4826  #ifdef WITH_CURVE_WEI25519
4827  #define EDDSA25519_SHA512_WEI25519_SELF_TEST
4828  
4829  #include "ed25519_test_vectors.h"
4830  
4831  #define EDDSA25519PH_SHA512_WEI25519_SELF_TEST
4832  
4833  #include "ed25519ph_test_vectors.h"
4834  
4835  #define EDDSA25519CTX_SHA512_WEI25519_SELF_TEST
4836  
4837  #include "ed25519ctx_test_vectors.h"
4838  
4839  #endif /* WITH_CURVE_WEI25519 */
4840  #endif /* WITH_HASH_SHA512 */
4841  #endif /* WITH_SIG_EDDSA */
4842  
4843  #ifdef WITH_SIG_EDDSA448
4844  #ifdef WITH_HASH_SHAKE256
4845  #ifdef WITH_CURVE_WEI448
4846  #define EDDSA448_SHAKE256_WEI448_SELF_TEST
4847  
4848  #include "ed448_test_vectors.h"
4849  
4850  #define EDDSA448PH_SHAKE256_WEI448_SELF_TEST
4851  
4852  #include "ed448ph_test_vectors.h"
4853  
4854  #endif /* WITH_CURVE_WEI448 */
4855  #endif /* WITH_HASH_SHAKE256 */
4856  #endif /* WITH_SIG_EDDSA */
4857  
4858  /*********** Deterministic ECDSA tests taken from RFC6979 **************/
4859  #ifdef WITH_SIG_DECDSA
4860  
4861  #include "decdsa_test_vectors.h"
4862  
4863  #endif /* WITH_SIG_DECDSA */
4864  
4865  #if defined(WITH_SIG_BIGN) && defined(WITH_CURVE_BIGN256V1)
4866  
4867  /* NOTE: tests taken from STB 34.101.45-2013 */
4868  #include "bign_test_vectors.h"
4869  
4870  #endif
4871  
4872  #if defined(WITH_SIG_DBIGN) && defined(WITH_CURVE_BIGN256V1)
4873  
4874  /* NOTE: tests taken from STB 34.101.45-2013 */
4875  #include "dbign_test_vectors.h"
4876  
4877  #endif
4878  
4879  #if defined(WITH_SIG_BIP0340) && defined(WITH_HASH_SHA256) && defined(WITH_CURVE_SECP256K1)
4880  
4881  /* NOTE: tests taken from:
4882   * https://github.com/bitcoin/bips/blob/master/bip-0340/test-vectors.csv
4883   */
4884  #include "bip0340_test_vectors.h"
4885  
4886  #endif
4887  
4888  /* ADD curve test vectors header here */
4889  /* XXX: Do not remove the comment above, as it is
4890   * used by external tools as a placeholder to add or
4891   * remove automatically generated code.
4892   */
4893  
4894  /* Dummy empty test case to avoid empty array
4895   * when no test case is defined
4896   */
4897  static const ec_test_case dummy_test_case = {
4898  	.name = "Dummy SIGN",
4899  	.ec_str_p = NULL,
4900  	.priv_key = NULL,
4901  	.priv_key_len = 0,
4902  	.nn_random = NULL,
4903  	.hash_type = UNKNOWN_HASH_ALG,
4904  	.msg = NULL,
4905  	.msglen = 0,
4906  	.sig_type = UNKNOWN_ALG,
4907  	.exp_sig = NULL,
4908  	.exp_siglen = 0,
4909  	.adata = NULL,
4910  	.adata_len = 0
4911  };
4912  
4913  /* List of all test cases */
4914  
4915  static const ec_test_case *ec_fixed_vector_tests[] = {
4916  	/* ECDSA */
4917  #ifdef ECDSA_SHA224_SECP224R1_SELF_TEST
4918  	&ecdsa_secp224r1_test_case,
4919  #endif
4920  #ifdef ECDSA_SHA256_SECP256R1_SELF_TEST
4921  	&ecdsa_secp256r1_test_case,
4922  #endif
4923  #ifdef ECDSA_SHA512_SECP256R1_SELF_TEST
4924  	&ecdsa_secp256r1_sha512_test_case,
4925  #endif
4926  #ifdef ECDSA_SHA384_SECP384R1_SELF_TEST
4927  	&ecdsa_secp384r1_test_case,
4928  #endif
4929  #ifdef ECDSA_SHA512_SECP521R1_SELF_TEST
4930  	&ecdsa_secp521r1_test_case,
4931  #endif
4932  #ifdef ECDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
4933  	&ecdsa_brainpoolp256r1_test_case,
4934  #endif
4935  #ifdef ECDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
4936  	&ecdsa_brainpoolp384r1_test_case,
4937  #endif
4938  #ifdef ECDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
4939  	&ecdsa_brainpoolp512r1_test_case,
4940  #endif
4941  #ifdef ECDSA_SHA256_FRP256V1_SELF_TEST
4942  	&ecdsa_frp256v1_test_case,
4943  #endif
4944  #ifdef ECDSA_SHA3_224_SECP224R1_SELF_TEST
4945  	&ecdsa_secp224r1_sha3_224_test_case,
4946  #endif
4947  #ifdef ECDSA_SHA3_256_SECP256R1_SELF_TEST
4948  	&ecdsa_secp256r1_sha3_256_test_case,
4949  #endif
4950  #ifdef ECDSA_SHA3_512_SECP256R1_SELF_TEST
4951  	&ecdsa_secp256r1_sha3_512_test_case,
4952  #endif
4953  #ifdef ECDSA_SHA3_384_SECP384R1_SELF_TEST
4954  	&ecdsa_secp384r1_sha3_384_test_case,
4955  #endif
4956  #ifdef ECDSA_SHA3_512_SECP521R1_SELF_TEST
4957  	&ecdsa_secp521r1_sha3_512_test_case,
4958  #endif
4959  #ifdef ECDSA_SHA224_SECP192R1_SELF_TEST
4960  	&ecdsa_secp192r1_test_case,
4961  #endif
4962  	/* ECKCDSA */
4963  #ifdef ECKCDSA_SHA224_SECP224R1_SELF_TEST
4964  	&eckcdsa_secp224r1_test_case,
4965  #endif
4966  #ifdef ECKCDSA_SHA256_SECP224R1_SELF_TEST
4967  	&eckcdsa_secp224r1_sha256_test_case,
4968  #endif
4969  #ifdef ECKCDSA_SHA256_SECP256R1_SELF_TEST
4970  	&eckcdsa_secp256r1_test_case,
4971  #endif
4972  #ifdef ECKCDSA_SHA384_SECP384R1_SELF_TEST
4973  	&eckcdsa_secp384r1_test_case,
4974  #endif
4975  #ifdef ECKCDSA_SHA512_SECP256R1_SELF_TEST
4976  	&eckcdsa_secp256r1_sha512_test_case,
4977  #endif
4978  #ifdef ECKCDSA_SHA512_SECP521R1_SELF_TEST
4979  	&eckcdsa_secp521r1_test_case,
4980  #endif
4981  #ifdef ECKCDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
4982  	&eckcdsa_brainpoolp256r1_test_case,
4983  #endif
4984  #ifdef ECKCDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
4985  	&eckcdsa_brainpoolp384r1_test_case,
4986  #endif
4987  #ifdef ECKCDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
4988  	&eckcdsa_brainpoolp512r1_test_case,
4989  #endif
4990  #ifdef ECKCDSA_SHA256_FRP256V1_SELF_TEST
4991  	&eckcdsa_frp256v1_test_case,
4992  #endif
4993  	/* ECSDSA */
4994  #ifdef ECSDSA_SHA224_SECP224R1_SELF_TEST
4995  	&ecsdsa_secp224r1_test_case,
4996  #endif
4997  #ifdef ECSDSA_SHA256_SECP256R1_SELF_TEST
4998  	&ecsdsa_secp256r1_test_case,
4999  #endif
5000  #ifdef ECSDSA_SHA384_SECP384R1_SELF_TEST
5001  	&ecsdsa_secp384r1_test_case,
5002  #endif
5003  #ifdef ECSDSA_SHA512_SECP521R1_SELF_TEST
5004  	&ecsdsa_secp521r1_test_case,
5005  #endif
5006  #ifdef ECSDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
5007  	&ecsdsa_brainpoolp256r1_test_case,
5008  #endif
5009  #ifdef ECSDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
5010  	&ecsdsa_brainpoolp384r1_test_case,
5011  #endif
5012  #ifdef ECSDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
5013  	&ecsdsa_brainpoolp512r1_test_case,
5014  #endif
5015  #ifdef ECSDSA_SHA256_FRP256V1_SELF_TEST
5016  	&ecsdsa_frp256v1_test_case,
5017  #endif
5018  	/* ECOSDSA */
5019  #ifdef ECOSDSA_SHA224_SECP224R1_SELF_TEST
5020  	&ecosdsa_secp224r1_test_case,
5021  #endif
5022  #ifdef ECOSDSA_SHA256_SECP256R1_SELF_TEST
5023  	&ecosdsa_secp256r1_test_case,
5024  #endif
5025  #ifdef ECOSDSA_SHA384_SECP384R1_SELF_TEST
5026  	&ecosdsa_secp384r1_test_case,
5027  #endif
5028  #ifdef ECOSDSA_SHA512_SECP521R1_SELF_TEST
5029  	&ecosdsa_secp521r1_test_case,
5030  #endif
5031  #ifdef ECOSDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
5032  	&ecosdsa_brainpoolp256r1_test_case,
5033  #endif
5034  #ifdef ECOSDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
5035  	&ecosdsa_brainpoolp384r1_test_case,
5036  #endif
5037  #ifdef ECOSDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
5038  	&ecosdsa_brainpoolp512r1_test_case,
5039  #endif
5040  #ifdef ECOSDSA_SHA256_FRP256V1_SELF_TEST
5041  	&ecosdsa_frp256v1_test_case,
5042  #endif
5043  	/* ECFSDSA */
5044  #ifdef ECFSDSA_SHA224_SECP224R1_SELF_TEST
5045  	&ecfsdsa_secp224r1_test_case,
5046  #endif
5047  #ifdef ECFSDSA_SHA256_SECP256R1_SELF_TEST
5048  	&ecfsdsa_secp256r1_test_case,
5049  #endif
5050  #ifdef ECFSDSA_SHA384_SECP384R1_SELF_TEST
5051  	&ecfsdsa_secp384r1_test_case,
5052  #endif
5053  #ifdef ECFSDSA_SHA512_SECP521R1_SELF_TEST
5054  	&ecfsdsa_secp521r1_test_case,
5055  #endif
5056  #ifdef ECFSDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
5057  	&ecfsdsa_brainpoolp256r1_test_case,
5058  #endif
5059  #ifdef ECFSDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
5060  	&ecfsdsa_brainpoolp384r1_test_case,
5061  #endif
5062  #ifdef ECFSDSA_SHA512_BRAINPOOLP512R1_SELF_TEST
5063  	&ecfsdsa_brainpoolp512r1_test_case,
5064  #endif
5065  #ifdef ECFSDSA_SHA256_FRP256V1_SELF_TEST
5066  	&ecfsdsa_frp256v1_test_case,
5067  #endif
5068  	/* ECGDSA */
5069  #ifdef ECGDSA_SHA256_BRAINPOOLP192R1_SELF_TEST
5070  	&ecgdsa_brainpoolp192r1_test_case,
5071  #endif
5072  #ifdef ECGDSA_SHA224_BRAINPOOLP224R1_SELF_TEST
5073  	&ecgdsa_brainpoolp224r1_test_case,
5074  #endif
5075  #ifdef ECGDSA_SHA256_BRAINPOOLP256R1_SELF_TEST
5076  	&ecgdsa_brainpoolp256r1_test_case,
5077  #endif
5078  #ifdef ECGDSA_SHA384_BRAINPOOLP384R1_SELF_TEST
5079  	&ecgdsa_brainpoolp384r1_test_case,
5080  #endif
5081  	/* ECRDSA */
5082  #ifndef USE_ISO14888_3_ECRDSA
5083  #ifdef ECRDSA_STREEBOG256_GOST256_SELF_TEST
5084  	&ecrdsa_rfc4491_bis_1_GOST_256bits_curve_test_case,
5085  #endif
5086  #ifdef ECRDSA_STREEBOG256_GOST256_PARAMSETA_SELF_TEST
5087  	&ecrdsa_rfc4491_bis_2_GOST_256bits_curve_test_case,
5088  #endif
5089  #ifdef ECRDSA_STREEBOG512_GOST512_SELF_TEST
5090  	&ecrdsa_rfc4491_bis_1_GOST_512bits_curve_test_case,
5091  #endif
5092  /**/
5093  #else /* defined(USE_ISO14888_3_ECRDSA) */
5094  #ifdef ECRDSA_SHA256_GOST256_SELF_TEST
5095  	&ecrdsa_GOST_256bits_curve_test_case,
5096  #endif
5097  #ifdef ECRDSA_SHA512_GOST512_SELF_TEST
5098  	&ecrdsa_GOST_512bits_curve_test_case,
5099  #endif
5100  #ifdef ECRDSA_STREEBOG256_GOST256_SELF_TEST
5101  	&ecrdsa_pygostlib_1_GOST_256bits_curve_test_case,
5102  	&ecrdsa_pygostlib_2_GOST_256bits_curve_test_case,
5103  #endif
5104  #ifdef ECRDSA_STREEBOG512_GOST512_SELF_TEST
5105  	&ecrdsa_pygostlib_1_GOST_512bits_curve_test_case,
5106  	&ecrdsa_pygostlib_2_GOST_512bits_curve_test_case,
5107  #endif
5108  #endif /* defined(USE_ISO14888_3_ECRDSA) */
5109  #ifdef SM2_SM3_CURVE_SM2P256TEST
5110  	&sm2_nn_random_iso14888_3_SM2_256bits_test_curve_test_case,
5111  #endif
5112  #ifdef SM2_SM3_CURVE_SM2P256V1
5113  	&sm2_nn_random_sm2p256v1_test_case,
5114  #endif
5115  	/* EdDSA Ed25519 */
5116  #ifdef EDDSA25519_SHA512_WEI25519_SELF_TEST
5117  	EDDSA25519_SHA512_WEI25519_ALL_TESTS()
5118  #endif
5119  	/* EdDSA Ed25519ph */
5120  #ifdef EDDSA25519PH_SHA512_WEI25519_SELF_TEST
5121  	EDDSA25519PH_SHA512_WEI25519_ALL_TESTS()
5122  #endif
5123  	/* EdDSA Ed25519ctx */
5124  #ifdef EDDSA25519CTX_SHA512_WEI25519_SELF_TEST
5125  	EDDSA25519CTX_SHA512_WEI25519_ALL_TESTS()
5126  #endif
5127  	/* EdDSA Ed448 */
5128  #ifdef EDDSA448_SHAKE256_WEI448_SELF_TEST
5129  	EDDSA448_SHAKE256_WEI448_ALL_TESTS()
5130  #endif
5131  	/* EdDSA Ed448PH */
5132  #ifdef EDDSA448PH_SHAKE256_WEI448_SELF_TEST
5133  	EDDSA448PH_SHAKE256_WEI448_ALL_TESTS()
5134  #endif
5135  #ifdef DECDSA_SHA224_SECP192R1_SELF_TEST_0
5136  	&decdsa_rfc6979_SECP192R1_SHA224_0_test_case,
5137  #endif /* DECDSA_SHA224_SECP192R1_SELF_TEST_0 */
5138  #ifdef DECDSA_SHA256_SECP192R1_SELF_TEST_0
5139  	&decdsa_rfc6979_SECP192R1_SHA256_0_test_case,
5140  #endif /* DECDSA_SHA256_SECP192R1_SELF_TEST_0 */
5141  #ifdef DECDSA_SHA384_SECP192R1_SELF_TEST_0
5142  	&decdsa_rfc6979_SECP192R1_SHA384_0_test_case,
5143  #endif /* DECDSA_SHA384_SECP192R1_SELF_TEST_0 */
5144  #ifdef DECDSA_SHA512_SECP192R1_SELF_TEST_0
5145  	&decdsa_rfc6979_SECP192R1_SHA512_0_test_case,
5146  #endif /* DECDSA_SHA512_SECP192R1_SELF_TEST_0 */
5147  #ifdef DECDSA_SHA224_SECP192R1_SELF_TEST_1
5148  	&decdsa_rfc6979_SECP192R1_SHA224_1_test_case,
5149  #endif /* DECDSA_SHA224_SECP192R1_SELF_TEST_1 */
5150  #ifdef DECDSA_SHA256_SECP192R1_SELF_TEST_1
5151  	&decdsa_rfc6979_SECP192R1_SHA256_1_test_case,
5152  #endif /* DECDSA_SHA256_SECP192R1_SELF_TEST_1 */
5153  #ifdef DECDSA_SHA384_SECP192R1_SELF_TEST_1
5154  	&decdsa_rfc6979_SECP192R1_SHA384_1_test_case,
5155  #endif /* DECDSA_SHA384_SECP192R1_SELF_TEST_1 */
5156  #ifdef DECDSA_SHA512_SECP192R1_SELF_TEST_1
5157  	&decdsa_rfc6979_SECP192R1_SHA512_1_test_case,
5158  #endif /* DECDSA_SHA512_SECP192R1_SELF_TEST_1 */
5159  #ifdef DECDSA_SHA224_SECP256R1_SELF_TEST_0
5160  	&decdsa_rfc6979_SECP256R1_SHA224_0_test_case,
5161  #endif /* DECDSA_SHA224_SECP256R1_SELF_TEST_0 */
5162  #ifdef DECDSA_SHA256_SECP256R1_SELF_TEST_0
5163  	&decdsa_rfc6979_SECP256R1_SHA256_0_test_case,
5164  #endif /* DECDSA_SHA256_SECP256R1_SELF_TEST_0 */
5165  #ifdef DECDSA_SHA384_SECP256R1_SELF_TEST_0
5166  	&decdsa_rfc6979_SECP256R1_SHA384_0_test_case,
5167  #endif /* DECDSA_SHA384_SECP256R1_SELF_TEST_0 */
5168  #ifdef DECDSA_SHA512_SECP256R1_SELF_TEST_0
5169  	&decdsa_rfc6979_SECP256R1_SHA512_0_test_case,
5170  #endif /* DECDSA_SHA512_SECP256R1_SELF_TEST_0 */
5171  #ifdef DECDSA_SHA224_SECP256R1_SELF_TEST_1
5172  	&decdsa_rfc6979_SECP256R1_SHA224_1_test_case,
5173  #endif /* DECDSA_SHA224_SECP256R1_SELF_TEST_1 */
5174  #ifdef DECDSA_SHA256_SECP256R1_SELF_TEST_1
5175  	&decdsa_rfc6979_SECP256R1_SHA256_1_test_case,
5176  #endif /* DECDSA_SHA256_SECP256R1_SELF_TEST_1 */
5177  #ifdef DECDSA_SHA384_SECP256R1_SELF_TEST_1
5178  	&decdsa_rfc6979_SECP256R1_SHA384_1_test_case,
5179  #endif /* DECDSA_SHA384_SECP256R1_SELF_TEST_1 */
5180  #ifdef DECDSA_SHA512_SECP256R1_SELF_TEST_1
5181  	&decdsa_rfc6979_SECP256R1_SHA512_1_test_case,
5182  #endif /* DECDSA_SHA512_SECP256R1_SELF_TEST_1 */
5183  #ifdef DECDSA_SHA224_SECP384R1_SELF_TEST_0
5184  	&decdsa_rfc6979_SECP384R1_SHA224_0_test_case,
5185  #endif /* DECDSA_SHA224_SECP384R1_SELF_TEST_0 */
5186  #ifdef DECDSA_SHA256_SECP384R1_SELF_TEST_0
5187  	&decdsa_rfc6979_SECP384R1_SHA256_0_test_case,
5188  #endif /* DECDSA_SHA256_SECP384R1_SELF_TEST_0 */
5189  #ifdef DECDSA_SHA384_SECP384R1_SELF_TEST_0
5190  	&decdsa_rfc6979_SECP384R1_SHA384_0_test_case,
5191  #endif /* DECDSA_SHA384_SECP384R1_SELF_TEST_0 */
5192  #ifdef DECDSA_SHA512_SECP384R1_SELF_TEST_0
5193  	&decdsa_rfc6979_SECP384R1_SHA512_0_test_case,
5194  #endif /* DECDSA_SHA512_SECP384R1_SELF_TEST_0 */
5195  #ifdef DECDSA_SHA224_SECP384R1_SELF_TEST_1
5196  	&decdsa_rfc6979_SECP384R1_SHA224_1_test_case,
5197  #endif /* DECDSA_SHA224_SECP384R1_SELF_TEST_1 */
5198  #ifdef DECDSA_SHA256_SECP384R1_SELF_TEST_1
5199  	&decdsa_rfc6979_SECP384R1_SHA256_1_test_case,
5200  #endif /* DECDSA_SHA256_SECP384R1_SELF_TEST_1 */
5201  #ifdef DECDSA_SHA384_SECP384R1_SELF_TEST_1
5202  	&decdsa_rfc6979_SECP384R1_SHA384_1_test_case,
5203  #endif /* DECDSA_SHA384_SECP384R1_SELF_TEST_1 */
5204  #ifdef DECDSA_SHA512_SECP384R1_SELF_TEST_1
5205  	&decdsa_rfc6979_SECP384R1_SHA512_1_test_case,
5206  #endif /* DECDSA_SHA512_SECP384R1_SELF_TEST_1 */
5207  #ifdef DECDSA_SHA224_SECP521R1_SELF_TEST_0
5208  	&decdsa_rfc6979_SECP521R1_SHA224_0_test_case,
5209  #endif /* DECDSA_SHA224_SECP521R1_SELF_TEST_0 */
5210  #ifdef DECDSA_SHA256_SECP521R1_SELF_TEST_0
5211  	&decdsa_rfc6979_SECP521R1_SHA256_0_test_case,
5212  #endif /* DECDSA_SHA256_SECP521R1_SELF_TEST_0 */
5213  #ifdef DECDSA_SHA384_SECP521R1_SELF_TEST_0
5214  	&decdsa_rfc6979_SECP521R1_SHA384_0_test_case,
5215  #endif /* DECDSA_SHA384_SECP521R1_SELF_TEST_0 */
5216  #ifdef DECDSA_SHA512_SECP521R1_SELF_TEST_0
5217  	&decdsa_rfc6979_SECP521R1_SHA512_0_test_case,
5218  #endif /* DECDSA_SHA512_SECP521R1_SELF_TEST_0 */
5219  #ifdef DECDSA_SHA224_SECP521R1_SELF_TEST_1
5220  	&decdsa_rfc6979_SECP521R1_SHA224_1_test_case,
5221  #endif /* DECDSA_SHA224_SECP521R1_SELF_TEST_1 */
5222  #ifdef DECDSA_SHA256_SECP521R1_SELF_TEST_1
5223  	&decdsa_rfc6979_SECP521R1_SHA256_1_test_case,
5224  #endif /* DECDSA_SHA256_SECP521R1_SELF_TEST_1 */
5225  #ifdef DECDSA_SHA384_SECP521R1_SELF_TEST_1
5226  	&decdsa_rfc6979_SECP521R1_SHA384_1_test_case,
5227  #endif /* DECDSA_SHA384_SECP521R1_SELF_TEST_1 */
5228  #ifdef DECDSA_SHA512_SECP521R1_SELF_TEST_1
5229  	&decdsa_rfc6979_SECP521R1_SHA512_1_test_case,
5230  #endif /* DECDSA_SHA512_SECP521R1_SELF_TEST_1 */
5231  #if defined(WITH_SIG_BIGN) && defined(WITH_CURVE_BIGN256V1)
5232  	BIGN_ALL_TESTS()
5233  #endif
5234  #if defined(WITH_SIG_DBIGN) && defined(WITH_CURVE_BIGN256V1)
5235  	DBIGN_ALL_TESTS()
5236  #endif
5237  #if defined(WITH_SIG_BIP0340) && defined(WITH_HASH_SHA256) && defined(WITH_CURVE_SECP256K1)
5238  	BIP0340_ALL_TESTS()
5239  #endif
5240  
5241  	/* Dummy empty test case to avoid empty array
5242  	 * when no test case is defined */
5243  	&dummy_test_case,
5244  
5245  /* ADD curve test case here */
5246  /* XXX: Do not remove the comment above, as it is
5247   * used by external tools as a placeholder to add or
5248   * remove automatically generated code.
5249   */
5250  };
5251  
5252  #define EC_FIXED_VECTOR_NUM_TESTS \
5253  	(sizeof(ec_fixed_vector_tests) / sizeof(ec_fixed_vector_tests[0]))
5254  
5255  
5256  /* Dummy empty test case to avoid empty array
5257   * when no test case is defined
5258   */
5259  static const ecdh_test_case ecdh_dummy_test_case = {
5260  	.name = "Dummy ECDH",
5261  	.ecdh_type = UNKNOWN_ALG,
5262  	.ec_str_p = NULL,
5263  	.our_priv_key = NULL,
5264  	.our_priv_key_len = 0,
5265  	.peer_pub_key = NULL,
5266  	.peer_pub_key_len = 0,
5267  	.exp_our_pub_key = NULL,
5268  	.exp_our_pub_key_len = 0,
5269  	.exp_shared_secret = NULL,
5270  	.exp_shared_secret_len = 0,
5271  };
5272  
5273  /*******************************************************************
5274   ************** ECCCDH tests ***************************************
5275   *******************************************************************/
5276  #ifdef WITH_ECCCDH
5277  /* NOTE: these tests are taken from the NIST CAVS 14.1 test suite
5278   * on curves P-192 P-224 P-256 P-384 P-521
5279   */
5280  #include "ecccdh_test_vectors.h"
5281  #endif /* WITH_ECCCDH */
5282  
5283  #ifdef WITH_X25519
5284  /* NOTE: tests taken from RFC7748 and https://tools.ietf.org/id/draft-ietf-ipsecme-safecurves-03.xml */
5285  #include "x25519_test_vectors.h"
5286  #endif /* WITH_X25519 */
5287  
5288  #ifdef WITH_X448
5289  /* NOTE: tests taken from RFC7748 */
5290  #include "x448_test_vectors.h"
5291  #endif /* WITH_X448 */
5292  
5293  #if defined(WITH_ECCCDH) || defined(WITH_X25519) || defined(WITH_X448)
5294  static const ecdh_test_case *ecdh_fixed_vector_tests[] = {
5295  #ifdef ECCCDH_SECP192R1_SELF_TEST_0
5296  	&ecccdh_SECP192R1_0_test_case,
5297  #endif /* ECCCDH_SECP192R1_SELF_TEST_0 */
5298  #ifdef ECCCDH_SECP192R1_SELF_TEST_1
5299  	&ecccdh_SECP192R1_1_test_case,
5300  #endif /* ECCCDH_SECP192R1_SELF_TEST_1 */
5301  #ifdef ECCCDH_SECP192R1_SELF_TEST_2
5302  	&ecccdh_SECP192R1_2_test_case,
5303  #endif /* ECCCDH_SECP192R1_SELF_TEST_2 */
5304  #ifdef ECCCDH_SECP192R1_SELF_TEST_3
5305  	&ecccdh_SECP192R1_3_test_case,
5306  #endif /* ECCCDH_SECP192R1_SELF_TEST_3 */
5307  #ifdef ECCCDH_SECP192R1_SELF_TEST_4
5308  	&ecccdh_SECP192R1_4_test_case,
5309  #endif /* ECCCDH_SECP192R1_SELF_TEST_4 */
5310  #ifdef ECCCDH_SECP192R1_SELF_TEST_5
5311  	&ecccdh_SECP192R1_5_test_case,
5312  #endif /* ECCCDH_SECP192R1_SELF_TEST_5 */
5313  #ifdef ECCCDH_SECP192R1_SELF_TEST_6
5314  	&ecccdh_SECP192R1_6_test_case,
5315  #endif /* ECCCDH_SECP192R1_SELF_TEST_6 */
5316  #ifdef ECCCDH_SECP192R1_SELF_TEST_7
5317  	&ecccdh_SECP192R1_7_test_case,
5318  #endif /* ECCCDH_SECP192R1_SELF_TEST_7 */
5319  #ifdef ECCCDH_SECP192R1_SELF_TEST_8
5320  	&ecccdh_SECP192R1_8_test_case,
5321  #endif /* ECCCDH_SECP192R1_SELF_TEST_8 */
5322  #ifdef ECCCDH_SECP192R1_SELF_TEST_9
5323  	&ecccdh_SECP192R1_9_test_case,
5324  #endif /* ECCCDH_SECP192R1_SELF_TEST_9 */
5325  #ifdef ECCCDH_SECP192R1_SELF_TEST_10
5326  	&ecccdh_SECP192R1_10_test_case,
5327  #endif /* ECCCDH_SECP192R1_SELF_TEST_10 */
5328  #ifdef ECCCDH_SECP192R1_SELF_TEST_11
5329  	&ecccdh_SECP192R1_11_test_case,
5330  #endif /* ECCCDH_SECP192R1_SELF_TEST_11 */
5331  #ifdef ECCCDH_SECP192R1_SELF_TEST_12
5332  	&ecccdh_SECP192R1_12_test_case,
5333  #endif /* ECCCDH_SECP192R1_SELF_TEST_12 */
5334  #ifdef ECCCDH_SECP192R1_SELF_TEST_13
5335  	&ecccdh_SECP192R1_13_test_case,
5336  #endif /* ECCCDH_SECP192R1_SELF_TEST_13 */
5337  #ifdef ECCCDH_SECP192R1_SELF_TEST_14
5338  	&ecccdh_SECP192R1_14_test_case,
5339  #endif /* ECCCDH_SECP192R1_SELF_TEST_14 */
5340  #ifdef ECCCDH_SECP192R1_SELF_TEST_15
5341  	&ecccdh_SECP192R1_15_test_case,
5342  #endif /* ECCCDH_SECP192R1_SELF_TEST_15 */
5343  #ifdef ECCCDH_SECP192R1_SELF_TEST_16
5344  	&ecccdh_SECP192R1_16_test_case,
5345  #endif /* ECCCDH_SECP192R1_SELF_TEST_16 */
5346  #ifdef ECCCDH_SECP192R1_SELF_TEST_17
5347  	&ecccdh_SECP192R1_17_test_case,
5348  #endif /* ECCCDH_SECP192R1_SELF_TEST_17 */
5349  #ifdef ECCCDH_SECP192R1_SELF_TEST_18
5350  	&ecccdh_SECP192R1_18_test_case,
5351  #endif /* ECCCDH_SECP192R1_SELF_TEST_18 */
5352  #ifdef ECCCDH_SECP192R1_SELF_TEST_19
5353  	&ecccdh_SECP192R1_19_test_case,
5354  #endif /* ECCCDH_SECP192R1_SELF_TEST_19 */
5355  #ifdef ECCCDH_SECP192R1_SELF_TEST_20
5356  	&ecccdh_SECP192R1_20_test_case,
5357  #endif /* ECCCDH_SECP192R1_SELF_TEST_20 */
5358  #ifdef ECCCDH_SECP192R1_SELF_TEST_21
5359  	&ecccdh_SECP192R1_21_test_case,
5360  #endif /* ECCCDH_SECP192R1_SELF_TEST_21 */
5361  #ifdef ECCCDH_SECP192R1_SELF_TEST_22
5362  	&ecccdh_SECP192R1_22_test_case,
5363  #endif /* ECCCDH_SECP192R1_SELF_TEST_22 */
5364  #ifdef ECCCDH_SECP192R1_SELF_TEST_23
5365  	&ecccdh_SECP192R1_23_test_case,
5366  #endif /* ECCCDH_SECP192R1_SELF_TEST_23 */
5367  #ifdef ECCCDH_SECP192R1_SELF_TEST_24
5368  	&ecccdh_SECP192R1_24_test_case,
5369  #endif /* ECCCDH_SECP192R1_SELF_TEST_24 */
5370  #ifdef ECCCDH_SECP224R1_SELF_TEST_0
5371  	&ecccdh_SECP224R1_0_test_case,
5372  #endif /* ECCCDH_SECP224R1_SELF_TEST_0 */
5373  #ifdef ECCCDH_SECP224R1_SELF_TEST_1
5374  	&ecccdh_SECP224R1_1_test_case,
5375  #endif /* ECCCDH_SECP224R1_SELF_TEST_1 */
5376  #ifdef ECCCDH_SECP224R1_SELF_TEST_2
5377  	&ecccdh_SECP224R1_2_test_case,
5378  #endif /* ECCCDH_SECP224R1_SELF_TEST_2 */
5379  #ifdef ECCCDH_SECP224R1_SELF_TEST_3
5380  	&ecccdh_SECP224R1_3_test_case,
5381  #endif /* ECCCDH_SECP224R1_SELF_TEST_3 */
5382  #ifdef ECCCDH_SECP224R1_SELF_TEST_4
5383  	&ecccdh_SECP224R1_4_test_case,
5384  #endif /* ECCCDH_SECP224R1_SELF_TEST_4 */
5385  #ifdef ECCCDH_SECP224R1_SELF_TEST_5
5386  	&ecccdh_SECP224R1_5_test_case,
5387  #endif /* ECCCDH_SECP224R1_SELF_TEST_5 */
5388  #ifdef ECCCDH_SECP224R1_SELF_TEST_6
5389  	&ecccdh_SECP224R1_6_test_case,
5390  #endif /* ECCCDH_SECP224R1_SELF_TEST_6 */
5391  #ifdef ECCCDH_SECP224R1_SELF_TEST_7
5392  	&ecccdh_SECP224R1_7_test_case,
5393  #endif /* ECCCDH_SECP224R1_SELF_TEST_7 */
5394  #ifdef ECCCDH_SECP224R1_SELF_TEST_8
5395  	&ecccdh_SECP224R1_8_test_case,
5396  #endif /* ECCCDH_SECP224R1_SELF_TEST_8 */
5397  #ifdef ECCCDH_SECP224R1_SELF_TEST_9
5398  	&ecccdh_SECP224R1_9_test_case,
5399  #endif /* ECCCDH_SECP224R1_SELF_TEST_9 */
5400  #ifdef ECCCDH_SECP224R1_SELF_TEST_10
5401  	&ecccdh_SECP224R1_10_test_case,
5402  #endif /* ECCCDH_SECP224R1_SELF_TEST_10 */
5403  #ifdef ECCCDH_SECP224R1_SELF_TEST_11
5404  	&ecccdh_SECP224R1_11_test_case,
5405  #endif /* ECCCDH_SECP224R1_SELF_TEST_11 */
5406  #ifdef ECCCDH_SECP224R1_SELF_TEST_12
5407  	&ecccdh_SECP224R1_12_test_case,
5408  #endif /* ECCCDH_SECP224R1_SELF_TEST_12 */
5409  #ifdef ECCCDH_SECP224R1_SELF_TEST_13
5410  	&ecccdh_SECP224R1_13_test_case,
5411  #endif /* ECCCDH_SECP224R1_SELF_TEST_13 */
5412  #ifdef ECCCDH_SECP224R1_SELF_TEST_14
5413  	&ecccdh_SECP224R1_14_test_case,
5414  #endif /* ECCCDH_SECP224R1_SELF_TEST_14 */
5415  #ifdef ECCCDH_SECP224R1_SELF_TEST_15
5416  	&ecccdh_SECP224R1_15_test_case,
5417  #endif /* ECCCDH_SECP224R1_SELF_TEST_15 */
5418  #ifdef ECCCDH_SECP224R1_SELF_TEST_16
5419  	&ecccdh_SECP224R1_16_test_case,
5420  #endif /* ECCCDH_SECP224R1_SELF_TEST_16 */
5421  #ifdef ECCCDH_SECP224R1_SELF_TEST_17
5422  	&ecccdh_SECP224R1_17_test_case,
5423  #endif /* ECCCDH_SECP224R1_SELF_TEST_17 */
5424  #ifdef ECCCDH_SECP224R1_SELF_TEST_18
5425  	&ecccdh_SECP224R1_18_test_case,
5426  #endif /* ECCCDH_SECP224R1_SELF_TEST_18 */
5427  #ifdef ECCCDH_SECP224R1_SELF_TEST_19
5428  	&ecccdh_SECP224R1_19_test_case,
5429  #endif /* ECCCDH_SECP224R1_SELF_TEST_19 */
5430  #ifdef ECCCDH_SECP224R1_SELF_TEST_20
5431  	&ecccdh_SECP224R1_20_test_case,
5432  #endif /* ECCCDH_SECP224R1_SELF_TEST_20 */
5433  #ifdef ECCCDH_SECP224R1_SELF_TEST_21
5434  	&ecccdh_SECP224R1_21_test_case,
5435  #endif /* ECCCDH_SECP224R1_SELF_TEST_21 */
5436  #ifdef ECCCDH_SECP224R1_SELF_TEST_22
5437  	&ecccdh_SECP224R1_22_test_case,
5438  #endif /* ECCCDH_SECP224R1_SELF_TEST_22 */
5439  #ifdef ECCCDH_SECP224R1_SELF_TEST_23
5440  	&ecccdh_SECP224R1_23_test_case,
5441  #endif /* ECCCDH_SECP224R1_SELF_TEST_23 */
5442  #ifdef ECCCDH_SECP224R1_SELF_TEST_24
5443  	&ecccdh_SECP224R1_24_test_case,
5444  #endif /* ECCCDH_SECP224R1_SELF_TEST_24 */
5445  #ifdef ECCCDH_SECP256R1_SELF_TEST_0
5446  	&ecccdh_SECP256R1_0_test_case,
5447  #endif /* ECCCDH_SECP256R1_SELF_TEST_0 */
5448  #ifdef ECCCDH_SECP256R1_SELF_TEST_1
5449  	&ecccdh_SECP256R1_1_test_case,
5450  #endif /* ECCCDH_SECP256R1_SELF_TEST_1 */
5451  #ifdef ECCCDH_SECP256R1_SELF_TEST_2
5452  	&ecccdh_SECP256R1_2_test_case,
5453  #endif /* ECCCDH_SECP256R1_SELF_TEST_2 */
5454  #ifdef ECCCDH_SECP256R1_SELF_TEST_3
5455  	&ecccdh_SECP256R1_3_test_case,
5456  #endif /* ECCCDH_SECP256R1_SELF_TEST_3 */
5457  #ifdef ECCCDH_SECP256R1_SELF_TEST_4
5458  	&ecccdh_SECP256R1_4_test_case,
5459  #endif /* ECCCDH_SECP256R1_SELF_TEST_4 */
5460  #ifdef ECCCDH_SECP256R1_SELF_TEST_5
5461  	&ecccdh_SECP256R1_5_test_case,
5462  #endif /* ECCCDH_SECP256R1_SELF_TEST_5 */
5463  #ifdef ECCCDH_SECP256R1_SELF_TEST_6
5464  	&ecccdh_SECP256R1_6_test_case,
5465  #endif /* ECCCDH_SECP256R1_SELF_TEST_6 */
5466  #ifdef ECCCDH_SECP256R1_SELF_TEST_7
5467  	&ecccdh_SECP256R1_7_test_case,
5468  #endif /* ECCCDH_SECP256R1_SELF_TEST_7 */
5469  #ifdef ECCCDH_SECP256R1_SELF_TEST_8
5470  	&ecccdh_SECP256R1_8_test_case,
5471  #endif /* ECCCDH_SECP256R1_SELF_TEST_8 */
5472  #ifdef ECCCDH_SECP256R1_SELF_TEST_9
5473  	&ecccdh_SECP256R1_9_test_case,
5474  #endif /* ECCCDH_SECP256R1_SELF_TEST_9 */
5475  #ifdef ECCCDH_SECP256R1_SELF_TEST_10
5476  	&ecccdh_SECP256R1_10_test_case,
5477  #endif /* ECCCDH_SECP256R1_SELF_TEST_10 */
5478  #ifdef ECCCDH_SECP256R1_SELF_TEST_11
5479  	&ecccdh_SECP256R1_11_test_case,
5480  #endif /* ECCCDH_SECP256R1_SELF_TEST_11 */
5481  #ifdef ECCCDH_SECP256R1_SELF_TEST_12
5482  	&ecccdh_SECP256R1_12_test_case,
5483  #endif /* ECCCDH_SECP256R1_SELF_TEST_12 */
5484  #ifdef ECCCDH_SECP256R1_SELF_TEST_13
5485  	&ecccdh_SECP256R1_13_test_case,
5486  #endif /* ECCCDH_SECP256R1_SELF_TEST_13 */
5487  #ifdef ECCCDH_SECP256R1_SELF_TEST_14
5488  	&ecccdh_SECP256R1_14_test_case,
5489  #endif /* ECCCDH_SECP256R1_SELF_TEST_14 */
5490  #ifdef ECCCDH_SECP256R1_SELF_TEST_15
5491  	&ecccdh_SECP256R1_15_test_case,
5492  #endif /* ECCCDH_SECP256R1_SELF_TEST_15 */
5493  #ifdef ECCCDH_SECP256R1_SELF_TEST_16
5494  	&ecccdh_SECP256R1_16_test_case,
5495  #endif /* ECCCDH_SECP256R1_SELF_TEST_16 */
5496  #ifdef ECCCDH_SECP256R1_SELF_TEST_17
5497  	&ecccdh_SECP256R1_17_test_case,
5498  #endif /* ECCCDH_SECP256R1_SELF_TEST_17 */
5499  #ifdef ECCCDH_SECP256R1_SELF_TEST_18
5500  	&ecccdh_SECP256R1_18_test_case,
5501  #endif /* ECCCDH_SECP256R1_SELF_TEST_18 */
5502  #ifdef ECCCDH_SECP256R1_SELF_TEST_19
5503  	&ecccdh_SECP256R1_19_test_case,
5504  #endif /* ECCCDH_SECP256R1_SELF_TEST_19 */
5505  #ifdef ECCCDH_SECP256R1_SELF_TEST_20
5506  	&ecccdh_SECP256R1_20_test_case,
5507  #endif /* ECCCDH_SECP256R1_SELF_TEST_20 */
5508  #ifdef ECCCDH_SECP256R1_SELF_TEST_21
5509  	&ecccdh_SECP256R1_21_test_case,
5510  #endif /* ECCCDH_SECP256R1_SELF_TEST_21 */
5511  #ifdef ECCCDH_SECP256R1_SELF_TEST_22
5512  	&ecccdh_SECP256R1_22_test_case,
5513  #endif /* ECCCDH_SECP256R1_SELF_TEST_22 */
5514  #ifdef ECCCDH_SECP256R1_SELF_TEST_23
5515  	&ecccdh_SECP256R1_23_test_case,
5516  #endif /* ECCCDH_SECP256R1_SELF_TEST_23 */
5517  #ifdef ECCCDH_SECP256R1_SELF_TEST_24
5518  	&ecccdh_SECP256R1_24_test_case,
5519  #endif /* ECCCDH_SECP256R1_SELF_TEST_24 */
5520  #ifdef ECCCDH_SECP384R1_SELF_TEST_0
5521  	&ecccdh_SECP384R1_0_test_case,
5522  #endif /* ECCCDH_SECP384R1_SELF_TEST_0 */
5523  #ifdef ECCCDH_SECP384R1_SELF_TEST_1
5524  	&ecccdh_SECP384R1_1_test_case,
5525  #endif /* ECCCDH_SECP384R1_SELF_TEST_1 */
5526  #ifdef ECCCDH_SECP384R1_SELF_TEST_2
5527  	&ecccdh_SECP384R1_2_test_case,
5528  #endif /* ECCCDH_SECP384R1_SELF_TEST_2 */
5529  #ifdef ECCCDH_SECP384R1_SELF_TEST_3
5530  	&ecccdh_SECP384R1_3_test_case,
5531  #endif /* ECCCDH_SECP384R1_SELF_TEST_3 */
5532  #ifdef ECCCDH_SECP384R1_SELF_TEST_4
5533  	&ecccdh_SECP384R1_4_test_case,
5534  #endif /* ECCCDH_SECP384R1_SELF_TEST_4 */
5535  #ifdef ECCCDH_SECP384R1_SELF_TEST_5
5536  	&ecccdh_SECP384R1_5_test_case,
5537  #endif /* ECCCDH_SECP384R1_SELF_TEST_5 */
5538  #ifdef ECCCDH_SECP384R1_SELF_TEST_6
5539  	&ecccdh_SECP384R1_6_test_case,
5540  #endif /* ECCCDH_SECP384R1_SELF_TEST_6 */
5541  #ifdef ECCCDH_SECP384R1_SELF_TEST_7
5542  	&ecccdh_SECP384R1_7_test_case,
5543  #endif /* ECCCDH_SECP384R1_SELF_TEST_7 */
5544  #ifdef ECCCDH_SECP384R1_SELF_TEST_8
5545  	&ecccdh_SECP384R1_8_test_case,
5546  #endif /* ECCCDH_SECP384R1_SELF_TEST_8 */
5547  #ifdef ECCCDH_SECP384R1_SELF_TEST_9
5548  	&ecccdh_SECP384R1_9_test_case,
5549  #endif /* ECCCDH_SECP384R1_SELF_TEST_9 */
5550  #ifdef ECCCDH_SECP384R1_SELF_TEST_10
5551  	&ecccdh_SECP384R1_10_test_case,
5552  #endif /* ECCCDH_SECP384R1_SELF_TEST_10 */
5553  #ifdef ECCCDH_SECP384R1_SELF_TEST_11
5554  	&ecccdh_SECP384R1_11_test_case,
5555  #endif /* ECCCDH_SECP384R1_SELF_TEST_11 */
5556  #ifdef ECCCDH_SECP384R1_SELF_TEST_12
5557  	&ecccdh_SECP384R1_12_test_case,
5558  #endif /* ECCCDH_SECP384R1_SELF_TEST_12 */
5559  #ifdef ECCCDH_SECP384R1_SELF_TEST_13
5560  	&ecccdh_SECP384R1_13_test_case,
5561  #endif /* ECCCDH_SECP384R1_SELF_TEST_13 */
5562  #ifdef ECCCDH_SECP384R1_SELF_TEST_14
5563  	&ecccdh_SECP384R1_14_test_case,
5564  #endif /* ECCCDH_SECP384R1_SELF_TEST_14 */
5565  #ifdef ECCCDH_SECP384R1_SELF_TEST_15
5566  	&ecccdh_SECP384R1_15_test_case,
5567  #endif /* ECCCDH_SECP384R1_SELF_TEST_15 */
5568  #ifdef ECCCDH_SECP384R1_SELF_TEST_16
5569  	&ecccdh_SECP384R1_16_test_case,
5570  #endif /* ECCCDH_SECP384R1_SELF_TEST_16 */
5571  #ifdef ECCCDH_SECP384R1_SELF_TEST_17
5572  	&ecccdh_SECP384R1_17_test_case,
5573  #endif /* ECCCDH_SECP384R1_SELF_TEST_17 */
5574  #ifdef ECCCDH_SECP384R1_SELF_TEST_18
5575  	&ecccdh_SECP384R1_18_test_case,
5576  #endif /* ECCCDH_SECP384R1_SELF_TEST_18 */
5577  #ifdef ECCCDH_SECP384R1_SELF_TEST_19
5578  	&ecccdh_SECP384R1_19_test_case,
5579  #endif /* ECCCDH_SECP384R1_SELF_TEST_19 */
5580  #ifdef ECCCDH_SECP384R1_SELF_TEST_20
5581  	&ecccdh_SECP384R1_20_test_case,
5582  #endif /* ECCCDH_SECP384R1_SELF_TEST_20 */
5583  #ifdef ECCCDH_SECP384R1_SELF_TEST_21
5584  	&ecccdh_SECP384R1_21_test_case,
5585  #endif /* ECCCDH_SECP384R1_SELF_TEST_21 */
5586  #ifdef ECCCDH_SECP384R1_SELF_TEST_22
5587  	&ecccdh_SECP384R1_22_test_case,
5588  #endif /* ECCCDH_SECP384R1_SELF_TEST_22 */
5589  #ifdef ECCCDH_SECP384R1_SELF_TEST_23
5590  	&ecccdh_SECP384R1_23_test_case,
5591  #endif /* ECCCDH_SECP384R1_SELF_TEST_23 */
5592  #ifdef ECCCDH_SECP384R1_SELF_TEST_24
5593  	&ecccdh_SECP384R1_24_test_case,
5594  #endif /* ECCCDH_SECP384R1_SELF_TEST_24 */
5595  #ifdef ECCCDH_SECP521R1_SELF_TEST_0
5596  	&ecccdh_SECP521R1_0_test_case,
5597  #endif /* ECCCDH_SECP521R1_SELF_TEST_0 */
5598  #ifdef ECCCDH_SECP521R1_SELF_TEST_1
5599  	&ecccdh_SECP521R1_1_test_case,
5600  #endif /* ECCCDH_SECP521R1_SELF_TEST_1 */
5601  #ifdef ECCCDH_SECP521R1_SELF_TEST_2
5602  	&ecccdh_SECP521R1_2_test_case,
5603  #endif /* ECCCDH_SECP521R1_SELF_TEST_2 */
5604  #ifdef ECCCDH_SECP521R1_SELF_TEST_3
5605  	&ecccdh_SECP521R1_3_test_case,
5606  #endif /* ECCCDH_SECP521R1_SELF_TEST_3 */
5607  #ifdef ECCCDH_SECP521R1_SELF_TEST_4
5608  	&ecccdh_SECP521R1_4_test_case,
5609  #endif /* ECCCDH_SECP521R1_SELF_TEST_4 */
5610  #ifdef ECCCDH_SECP521R1_SELF_TEST_5
5611  	&ecccdh_SECP521R1_5_test_case,
5612  #endif /* ECCCDH_SECP521R1_SELF_TEST_5 */
5613  #ifdef ECCCDH_SECP521R1_SELF_TEST_6
5614  	&ecccdh_SECP521R1_6_test_case,
5615  #endif /* ECCCDH_SECP521R1_SELF_TEST_6 */
5616  #ifdef ECCCDH_SECP521R1_SELF_TEST_7
5617  	&ecccdh_SECP521R1_7_test_case,
5618  #endif /* ECCCDH_SECP521R1_SELF_TEST_7 */
5619  #ifdef ECCCDH_SECP521R1_SELF_TEST_8
5620  	&ecccdh_SECP521R1_8_test_case,
5621  #endif /* ECCCDH_SECP521R1_SELF_TEST_8 */
5622  #ifdef ECCCDH_SECP521R1_SELF_TEST_9
5623  	&ecccdh_SECP521R1_9_test_case,
5624  #endif /* ECCCDH_SECP521R1_SELF_TEST_9 */
5625  #ifdef ECCCDH_SECP521R1_SELF_TEST_10
5626  	&ecccdh_SECP521R1_10_test_case,
5627  #endif /* ECCCDH_SECP521R1_SELF_TEST_10 */
5628  #ifdef ECCCDH_SECP521R1_SELF_TEST_11
5629  	&ecccdh_SECP521R1_11_test_case,
5630  #endif /* ECCCDH_SECP521R1_SELF_TEST_11 */
5631  #ifdef ECCCDH_SECP521R1_SELF_TEST_12
5632  	&ecccdh_SECP521R1_12_test_case,
5633  #endif /* ECCCDH_SECP521R1_SELF_TEST_12 */
5634  #ifdef ECCCDH_SECP521R1_SELF_TEST_13
5635  	&ecccdh_SECP521R1_13_test_case,
5636  #endif /* ECCCDH_SECP521R1_SELF_TEST_13 */
5637  #ifdef ECCCDH_SECP521R1_SELF_TEST_14
5638  	&ecccdh_SECP521R1_14_test_case,
5639  #endif /* ECCCDH_SECP521R1_SELF_TEST_14 */
5640  #ifdef ECCCDH_SECP521R1_SELF_TEST_15
5641  	&ecccdh_SECP521R1_15_test_case,
5642  #endif /* ECCCDH_SECP521R1_SELF_TEST_15 */
5643  #ifdef ECCCDH_SECP521R1_SELF_TEST_16
5644  	&ecccdh_SECP521R1_16_test_case,
5645  #endif /* ECCCDH_SECP521R1_SELF_TEST_16 */
5646  #ifdef ECCCDH_SECP521R1_SELF_TEST_17
5647  	&ecccdh_SECP521R1_17_test_case,
5648  #endif /* ECCCDH_SECP521R1_SELF_TEST_17 */
5649  #ifdef ECCCDH_SECP521R1_SELF_TEST_18
5650  	&ecccdh_SECP521R1_18_test_case,
5651  #endif /* ECCCDH_SECP521R1_SELF_TEST_18 */
5652  #ifdef ECCCDH_SECP521R1_SELF_TEST_19
5653  	&ecccdh_SECP521R1_19_test_case,
5654  #endif /* ECCCDH_SECP521R1_SELF_TEST_19 */
5655  #ifdef ECCCDH_SECP521R1_SELF_TEST_20
5656  	&ecccdh_SECP521R1_20_test_case,
5657  #endif /* ECCCDH_SECP521R1_SELF_TEST_20 */
5658  #ifdef ECCCDH_SECP521R1_SELF_TEST_21
5659  	&ecccdh_SECP521R1_21_test_case,
5660  #endif /* ECCCDH_SECP521R1_SELF_TEST_21 */
5661  #ifdef ECCCDH_SECP521R1_SELF_TEST_22
5662  	&ecccdh_SECP521R1_22_test_case,
5663  #endif /* ECCCDH_SECP521R1_SELF_TEST_22 */
5664  #ifdef ECCCDH_SECP521R1_SELF_TEST_23
5665  	&ecccdh_SECP521R1_23_test_case,
5666  #endif /* ECCCDH_SECP521R1_SELF_TEST_23 */
5667  #ifdef ECCCDH_SECP521R1_SELF_TEST_24
5668  	&ecccdh_SECP521R1_24_test_case,
5669  #endif /* ECCCDH_SECP521R1_SELF_TEST_24 */
5670  #if defined(WITH_X25519) && defined(WITH_CURVE_WEI25519)
5671  	&x25519_WEI25519_0_test_case,
5672  	&x25519_WEI25519_1_test_case,
5673  	&x25519_WEI25519_2_test_case,
5674  	&x25519_WEI25519_3_test_case,
5675  #endif
5676  #if defined(WITH_X448) && defined(WITH_CURVE_WEI448)
5677  	&x448_WEI448_0_test_case,
5678  	&x448_WEI448_1_test_case,
5679  #endif
5680  
5681  	/* Dummy empty test case to avoid empty array
5682  	 * when no test case is defined */
5683  	&ecdh_dummy_test_case,
5684  };
5685  #endif /* !(defined(WITH_ECCCDH) || defined(WITH_X25519) || defined(WITH_X448)) */
5686  
5687  #define ECDH_FIXED_VECTOR_NUM_TESTS \
5688          (sizeof(ecdh_fixed_vector_tests) / sizeof(ecdh_fixed_vector_tests[0]))
5689  
5690  /*
5691   * A fixed test can fail in various ways. The way we report the failure
5692   * to the caller is by returning a non-zero value, in which we encode
5693   * some informations on the failure: curve, sig alg, hash alg, operation
5694   * (key import, signature, sig comparison, verification). Those 4 pieces
5695   * of information are each encoded on 8 bits in that order on the 28 LSB
5696   * of the return value. The function below produces a meaningful negative
5697   * return value in that specific format.
5698   */
5699  typedef enum {
5700  	TEST_KEY_IMPORT_ERROR = 1,
5701  	TEST_SIG_ERROR = 2,
5702  	TEST_SIG_COMP_ERROR = 3,
5703  	TEST_VERIF_ERROR = 4,
5704  	TEST_ECDH_ERROR = 5,
5705  	TEST_ECDH_COMP_ERROR = 6,
5706  } test_err_kind;
5707  
5708  static int encode_error_value(const ec_test_case *c, test_err_kind failed_test, u32 *err_val)
5709  {
5710  	ec_curve_type ctype;
5711  	ec_alg_type stype = c->sig_type;
5712  	hash_alg_type htype = c->hash_type;
5713  	test_err_kind etype = failed_test;
5714  	int ret;
5715  
5716  	MUST_HAVE((c != NULL) && (err_val != NULL), ret, err);
5717  
5718  	ret = ec_get_curve_type_by_name(c->ec_str_p->name->buf,
5719  					c->ec_str_p->name->buflen, &ctype); EG(ret, err);
5720  
5721  	*err_val = (((u32)ctype << 24) |
5722  		    ((u32)stype << 16) |
5723  		    ((u32)htype <<  8) |
5724  		    ((u32)etype));
5725  	ret = 0;
5726  
5727  err:
5728  	return ret;
5729  }
5730  
5731  static inline int ecdh_encode_error_value(const ecdh_test_case *c, test_err_kind failed_test, u32 *err_val)
5732  {
5733  	ec_curve_type ctype;
5734  	ec_alg_type stype = c->ecdh_type;
5735  	test_err_kind etype = failed_test;
5736  	int ret;
5737  
5738  	MUST_HAVE((c != NULL) && (err_val != NULL), ret, err);
5739  
5740  	ret = ec_get_curve_type_by_name(c->ec_str_p->name->buf,
5741  					c->ec_str_p->name->buflen, &ctype); EG(ret, err);
5742  
5743  	*err_val = (((u32)ctype << 24) |
5744  		    ((u32)stype << 16) |
5745  		    ((u32)0 <<  8) |
5746  		    ((u32)etype));
5747  	ret = 0;
5748  
5749  err:
5750  	return ret;
5751  }
5752  
5753  int perform_known_test_vectors_test(const char *sig, const char *hash, const char *curve);
5754  int perform_random_sig_verif_test(const char *sig, const char *hash, const char *curve);
5755  int perform_performance_test(const char *sig, const char *hash, const char *curve);
5756  
5757  #endif /* __EC_SELF_TESTS_CORE_H__ */