endecode_test.c 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316
  1. /*
  2. * Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <string.h>
  10. #include <openssl/core_dispatch.h>
  11. #include <openssl/evp.h>
  12. #include <openssl/pem.h>
  13. #include <openssl/rsa.h>
  14. #include <openssl/x509.h>
  15. #include <openssl/core_names.h>
  16. #include <openssl/params.h>
  17. #include <openssl/param_build.h>
  18. #include <openssl/encoder.h>
  19. #include <openssl/decoder.h>
  20. #include "internal/cryptlib.h" /* ossl_assert */
  21. #include "crypto/pem.h" /* For PVK and "blob" PEM headers */
  22. #include "testutil.h"
  23. #ifndef OPENSSL_NO_EC
  24. static BN_CTX *bnctx = NULL;
  25. static OSSL_PARAM_BLD *bld_prime_nc = NULL;
  26. static OSSL_PARAM_BLD *bld_prime = NULL;
  27. static OSSL_PARAM *ec_explicit_prime_params_nc = NULL;
  28. static OSSL_PARAM *ec_explicit_prime_params_explicit = NULL;
  29. # ifndef OPENSSL_NO_EC2M
  30. static OSSL_PARAM_BLD *bld_tri_nc = NULL;
  31. static OSSL_PARAM_BLD *bld_tri = NULL;
  32. static OSSL_PARAM *ec_explicit_tri_params_nc = NULL;
  33. static OSSL_PARAM *ec_explicit_tri_params_explicit = NULL;
  34. # endif
  35. #endif
  36. static EVP_PKEY *make_template(const char *type, OSSL_PARAM *genparams)
  37. {
  38. EVP_PKEY *pkey = NULL;
  39. EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(NULL, type, NULL);
  40. /*
  41. * No real need to check the errors other than for the cascade
  42. * effect. |pkey| will simply remain NULL if something goes wrong.
  43. */
  44. (void)(ctx != NULL
  45. && EVP_PKEY_paramgen_init(ctx) > 0
  46. && (genparams == NULL
  47. || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
  48. && EVP_PKEY_gen(ctx, &pkey) > 0);
  49. EVP_PKEY_CTX_free(ctx);
  50. return pkey;
  51. }
  52. static EVP_PKEY *make_key(const char *type, EVP_PKEY *template,
  53. OSSL_PARAM *genparams)
  54. {
  55. EVP_PKEY *pkey = NULL;
  56. EVP_PKEY_CTX *ctx =
  57. template != NULL
  58. ? EVP_PKEY_CTX_new(template, NULL)
  59. : EVP_PKEY_CTX_new_from_name(NULL, type, NULL);
  60. /*
  61. * No real need to check the errors other than for the cascade
  62. * effect. |pkey| will simply remain NULL if something goes wrong.
  63. */
  64. (void)(ctx != NULL
  65. && EVP_PKEY_keygen_init(ctx) > 0
  66. && (genparams == NULL
  67. || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
  68. && EVP_PKEY_keygen(ctx, &pkey) > 0);
  69. EVP_PKEY_CTX_free(ctx);
  70. return pkey;
  71. }
  72. /* Main test driver */
  73. /*
  74. * TODO(3.0) For better error output, changed the callbacks to take __FILE__
  75. * and __LINE__ as first two arguments, and have them use the lower case
  76. * functions, such as test_strn_eq(), rather than the uppercase macros
  77. * (TEST_strn2_eq(), for example).
  78. */
  79. typedef int (encoder)(void **encoded, long *encoded_len,
  80. void *object, int selection,
  81. const char *output_type, const char *output_structure,
  82. const char *pass, const char *pcipher);
  83. typedef int (decoder)(void **object, void *encoded, long encoded_len,
  84. const char *keytype, const char *input_type,
  85. int selection, const char *pass);
  86. typedef int (tester)(const void *data1, size_t data1_len,
  87. const void *data2, size_t data2_len);
  88. typedef int (checker)(const char *type, const void *data, size_t data_len);
  89. typedef void (dumper)(const char *label, const void *data, size_t data_len);
  90. #define FLAG_DECODE_WITH_TYPE 0x0001
  91. static int test_encode_decode(const char *type, EVP_PKEY *pkey,
  92. int selection, const char *output_type,
  93. const char *output_structure,
  94. const char *pass, const char *pcipher,
  95. encoder *encode_cb, decoder *decode_cb,
  96. tester *test_cb, checker *check_cb,
  97. dumper *dump_cb, int flags)
  98. {
  99. void *encoded = NULL;
  100. long encoded_len = 0;
  101. EVP_PKEY *pkey2 = NULL;
  102. void *encoded2 = NULL;
  103. long encoded2_len = 0;
  104. int ok = 0;
  105. /*
  106. * Encode |pkey|, decode the result into |pkey2|, and finish off by
  107. * encoding |pkey2| as well. That last encoding is for checking and
  108. * dumping purposes.
  109. */
  110. if (!TEST_true(encode_cb(&encoded, &encoded_len, pkey, selection,
  111. output_type, output_structure, pass, pcipher))
  112. || !TEST_true(check_cb(type, encoded, encoded_len))
  113. || !TEST_true(decode_cb((void **)&pkey2, encoded, encoded_len,
  114. (flags & FLAG_DECODE_WITH_TYPE ? type : NULL),
  115. output_type, selection, pass))
  116. || !TEST_true(encode_cb(&encoded2, &encoded2_len, pkey2, selection,
  117. output_type, output_structure, pass, pcipher)))
  118. goto end;
  119. if (selection == OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) {
  120. if (!TEST_int_eq(EVP_PKEY_parameters_eq(pkey, pkey2), 1))
  121. goto end;
  122. } else {
  123. if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
  124. goto end;
  125. }
  126. /*
  127. * Double check the encoding, but only for unprotected keys,
  128. * as protected keys have a random component, which makes the output
  129. * differ.
  130. */
  131. if ((pass == NULL && pcipher == NULL)
  132. && !test_cb(encoded, encoded_len, encoded2, encoded2_len))
  133. goto end;
  134. ok = 1;
  135. end:
  136. if (!ok) {
  137. if (encoded != NULL && encoded_len != 0)
  138. dump_cb("|pkey| encoded", encoded, encoded_len);
  139. if (encoded2 != NULL && encoded2_len != 0)
  140. dump_cb("|pkey2| encoded", encoded2, encoded2_len);
  141. }
  142. OPENSSL_free(encoded);
  143. OPENSSL_free(encoded2);
  144. EVP_PKEY_free(pkey2);
  145. return ok;
  146. }
  147. /* Encoding and decoding methods */
  148. static int encode_EVP_PKEY_prov(void **encoded, long *encoded_len,
  149. void *object, int selection,
  150. const char *output_type,
  151. const char *output_structure,
  152. const char *pass, const char *pcipher)
  153. {
  154. EVP_PKEY *pkey = object;
  155. OSSL_ENCODER_CTX *ectx = NULL;
  156. BIO *mem_ser = NULL;
  157. BUF_MEM *mem_buf = NULL;
  158. const unsigned char *upass = (const unsigned char *)pass;
  159. int ok = 0;
  160. if (!TEST_ptr(ectx = OSSL_ENCODER_CTX_new_by_EVP_PKEY(pkey, selection,
  161. output_type,
  162. output_structure,
  163. NULL, NULL))
  164. || !TEST_int_gt(OSSL_ENCODER_CTX_get_num_encoders(ectx), 0)
  165. || (pass != NULL
  166. && !TEST_true(OSSL_ENCODER_CTX_set_passphrase(ectx, upass,
  167. strlen(pass))))
  168. || (pcipher != NULL
  169. && !TEST_true(OSSL_ENCODER_CTX_set_cipher(ectx, pcipher, NULL)))
  170. || !TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
  171. || !TEST_true(OSSL_ENCODER_to_bio(ectx, mem_ser))
  172. || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
  173. || !TEST_ptr(*encoded = mem_buf->data)
  174. || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
  175. goto end;
  176. /* Detach the encoded output */
  177. mem_buf->data = NULL;
  178. mem_buf->length = 0;
  179. ok = 1;
  180. end:
  181. BIO_free(mem_ser);
  182. OSSL_ENCODER_CTX_free(ectx);
  183. return ok;
  184. }
  185. static int decode_EVP_PKEY_prov(void **object, void *encoded, long encoded_len,
  186. const char *keytype, const char *input_type,
  187. int selection, const char *pass)
  188. {
  189. EVP_PKEY *pkey = NULL, *testpkey = NULL;
  190. OSSL_DECODER_CTX *dctx = NULL;
  191. BIO *encoded_bio = NULL;
  192. const unsigned char *upass = (const unsigned char *)pass;
  193. int ok = 0;
  194. int i;
  195. const char *badtype;
  196. if (strcmp(input_type, "DER") == 0)
  197. badtype = "PEM";
  198. else
  199. badtype = "DER";
  200. if (!TEST_ptr(encoded_bio = BIO_new_mem_buf(encoded, encoded_len)))
  201. goto end;
  202. /*
  203. * We attempt the decode 3 times. The first time we provide the expected
  204. * starting input type. The second time we provide NULL for the starting
  205. * type. The third time we provide a bad starting input type.
  206. * The bad starting input type should fail. The other two should succeed
  207. * and produce the same result.
  208. */
  209. for (i = 0; i < 3; i++) {
  210. const char *testtype = (i == 0) ? input_type
  211. : ((i == 1) ? NULL : badtype);
  212. if (!TEST_ptr(dctx = OSSL_DECODER_CTX_new_by_EVP_PKEY(&testpkey,
  213. testtype,
  214. NULL,
  215. keytype,
  216. selection,
  217. NULL, NULL))
  218. || (pass != NULL
  219. && !OSSL_DECODER_CTX_set_passphrase(dctx, upass, strlen(pass)))
  220. || !TEST_int_gt(BIO_reset(encoded_bio), 0)
  221. /* We expect to fail when using a bad input type */
  222. || !TEST_int_eq(OSSL_DECODER_from_bio(dctx, encoded_bio),
  223. (i == 2) ? 0 : 1))
  224. goto end;
  225. OSSL_DECODER_CTX_free(dctx);
  226. dctx = NULL;
  227. if (i == 0) {
  228. pkey = testpkey;
  229. testpkey = NULL;
  230. } else if (i == 1) {
  231. if (selection == OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) {
  232. if (!TEST_int_eq(EVP_PKEY_parameters_eq(pkey, testpkey), 1))
  233. goto end;
  234. } else {
  235. if (!TEST_int_eq(EVP_PKEY_eq(pkey, testpkey), 1))
  236. goto end;
  237. }
  238. }
  239. }
  240. ok = 1;
  241. *object = pkey;
  242. pkey = NULL;
  243. end:
  244. EVP_PKEY_free(pkey);
  245. EVP_PKEY_free(testpkey);
  246. BIO_free(encoded_bio);
  247. OSSL_DECODER_CTX_free(dctx);
  248. return ok;
  249. }
  250. static int encode_EVP_PKEY_legacy_PEM(void **encoded, long *encoded_len,
  251. void *object, ossl_unused int selection,
  252. ossl_unused const char *output_type,
  253. ossl_unused const char *output_structure,
  254. const char *pass, const char *pcipher)
  255. {
  256. EVP_PKEY *pkey = object;
  257. EVP_CIPHER *cipher = NULL;
  258. BIO *mem_ser = NULL;
  259. BUF_MEM *mem_buf = NULL;
  260. const unsigned char *upass = (const unsigned char *)pass;
  261. size_t passlen = 0;
  262. int ok = 0;
  263. if (pcipher != NULL && pass != NULL) {
  264. passlen = strlen(pass);
  265. if (!TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, pcipher, NULL)))
  266. goto end;
  267. }
  268. if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
  269. || !TEST_true(PEM_write_bio_PrivateKey_traditional(mem_ser, pkey,
  270. cipher,
  271. upass, passlen,
  272. NULL, NULL))
  273. || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
  274. || !TEST_ptr(*encoded = mem_buf->data)
  275. || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
  276. goto end;
  277. /* Detach the encoded output */
  278. mem_buf->data = NULL;
  279. mem_buf->length = 0;
  280. ok = 1;
  281. end:
  282. BIO_free(mem_ser);
  283. EVP_CIPHER_free(cipher);
  284. return ok;
  285. }
  286. #ifndef OPENSSL_NO_DSA
  287. static int encode_EVP_PKEY_MSBLOB(void **encoded, long *encoded_len,
  288. void *object, int selection,
  289. ossl_unused const char *output_type,
  290. ossl_unused const char *output_structure,
  291. ossl_unused const char *pass,
  292. ossl_unused const char *pcipher)
  293. {
  294. EVP_PKEY *pkey = object;
  295. BIO *mem_ser = NULL;
  296. BUF_MEM *mem_buf = NULL;
  297. int ok = 0;
  298. if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem())))
  299. goto end;
  300. if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
  301. if (!TEST_int_ge(i2b_PrivateKey_bio(mem_ser, pkey), 0))
  302. goto end;
  303. } else {
  304. if (!TEST_int_ge(i2b_PublicKey_bio(mem_ser, pkey), 0))
  305. goto end;
  306. }
  307. if (!TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
  308. || !TEST_ptr(*encoded = mem_buf->data)
  309. || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
  310. goto end;
  311. /* Detach the encoded output */
  312. mem_buf->data = NULL;
  313. mem_buf->length = 0;
  314. ok = 1;
  315. end:
  316. BIO_free(mem_ser);
  317. return ok;
  318. }
  319. # ifndef OPENSSL_NO_RC4
  320. static pem_password_cb pass_pw;
  321. static int pass_pw(char *buf, int size, int rwflag, void *userdata)
  322. {
  323. OPENSSL_strlcpy(buf, userdata, size);
  324. return strlen(userdata);
  325. }
  326. static int encode_EVP_PKEY_PVK(void **encoded, long *encoded_len,
  327. void *object, int selection,
  328. ossl_unused const char *output_type,
  329. ossl_unused const char *output_structure,
  330. const char *pass,
  331. ossl_unused const char *pcipher)
  332. {
  333. EVP_PKEY *pkey = object;
  334. BIO *mem_ser = NULL;
  335. BUF_MEM *mem_buf = NULL;
  336. int enc = (pass != NULL);
  337. int ok = 0;
  338. if (!TEST_true(ossl_assert((selection
  339. & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0))
  340. || !TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
  341. || !TEST_int_ge(i2b_PVK_bio(mem_ser, pkey, enc,
  342. pass_pw, (void *)pass), 0)
  343. || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
  344. || !TEST_ptr(*encoded = mem_buf->data)
  345. || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
  346. goto end;
  347. /* Detach the encoded output */
  348. mem_buf->data = NULL;
  349. mem_buf->length = 0;
  350. ok = 1;
  351. end:
  352. BIO_free(mem_ser);
  353. return ok;
  354. }
  355. # endif
  356. #endif
  357. static int test_text(const void *data1, size_t data1_len,
  358. const void *data2, size_t data2_len)
  359. {
  360. return TEST_strn2_eq(data1, data1_len, data2, data2_len);
  361. }
  362. static int test_mem(const void *data1, size_t data1_len,
  363. const void *data2, size_t data2_len)
  364. {
  365. return TEST_mem_eq(data1, data1_len, data2, data2_len);
  366. }
  367. /* Test cases and their dumpers / checkers */
  368. static void collect_name(const char *name, void *arg)
  369. {
  370. char **namelist = arg;
  371. char *new_namelist;
  372. size_t space;
  373. space = strlen(name);
  374. if (*namelist != NULL)
  375. space += strlen(*namelist) + 2 /* for comma and space */;
  376. space++; /* for terminating null byte */
  377. new_namelist = OPENSSL_realloc(*namelist, space);
  378. if (new_namelist == NULL)
  379. return;
  380. if (*namelist != NULL) {
  381. strcat(new_namelist, ", ");
  382. strcat(new_namelist, name);
  383. } else {
  384. strcpy(new_namelist, name);
  385. }
  386. *namelist = new_namelist;
  387. }
  388. static void dump_der(const char *label, const void *data, size_t data_len)
  389. {
  390. test_output_memory(label, data, data_len);
  391. }
  392. static void dump_pem(const char *label, const void *data, size_t data_len)
  393. {
  394. test_output_string(label, data, data_len - 1);
  395. }
  396. static int check_unprotected_PKCS8_DER(const char *type,
  397. const void *data, size_t data_len)
  398. {
  399. const unsigned char *datap = data;
  400. PKCS8_PRIV_KEY_INFO *p8inf =
  401. d2i_PKCS8_PRIV_KEY_INFO(NULL, &datap, data_len);
  402. int ok = 0;
  403. if (TEST_ptr(p8inf)) {
  404. EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf);
  405. char *namelist = NULL;
  406. if (TEST_ptr(pkey)) {
  407. if (!(ok = TEST_true(EVP_PKEY_is_a(pkey, type)))) {
  408. EVP_PKEY_typenames_do_all(pkey, collect_name, &namelist);
  409. if (namelist != NULL)
  410. TEST_note("%s isn't any of %s", type, namelist);
  411. OPENSSL_free(namelist);
  412. }
  413. EVP_PKEY_free(pkey);
  414. }
  415. }
  416. PKCS8_PRIV_KEY_INFO_free(p8inf);
  417. return ok;
  418. }
  419. static int test_unprotected_via_DER(const char *type, EVP_PKEY *key)
  420. {
  421. return test_encode_decode(type, key,
  422. OSSL_KEYMGMT_SELECT_KEYPAIR
  423. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  424. "DER", "pkcs8", NULL, NULL,
  425. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  426. test_mem, check_unprotected_PKCS8_DER,
  427. dump_der, 0);
  428. }
  429. static int check_unprotected_PKCS8_PEM(const char *type,
  430. const void *data, size_t data_len)
  431. {
  432. static const char expected_pem_header[] =
  433. "-----BEGIN " PEM_STRING_PKCS8INF "-----";
  434. return TEST_strn_eq(data, expected_pem_header,
  435. sizeof(expected_pem_header) - 1);
  436. }
  437. static int test_unprotected_via_PEM(const char *type, EVP_PKEY *key)
  438. {
  439. return test_encode_decode(type, key, OSSL_KEYMGMT_SELECT_KEYPAIR
  440. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  441. "PEM", "pkcs8", NULL, NULL,
  442. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  443. test_text, check_unprotected_PKCS8_PEM,
  444. dump_pem, 0);
  445. }
  446. static int check_params_DER(const char *type, const void *data, size_t data_len)
  447. {
  448. const unsigned char *datap = data;
  449. int ok = 0;
  450. int itype = NID_undef;
  451. EVP_PKEY *pkey = NULL;
  452. if (strcmp(type, "DH") == 0)
  453. itype = EVP_PKEY_DH;
  454. else if (strcmp(type, "X9.42 DH") == 0)
  455. itype = EVP_PKEY_DHX;
  456. else if (strcmp(type, "DSA") == 0)
  457. itype = EVP_PKEY_DSA;
  458. else if (strcmp(type, "EC") == 0)
  459. itype = EVP_PKEY_EC;
  460. if (itype != NID_undef) {
  461. pkey = d2i_KeyParams(itype, NULL, &datap, data_len);
  462. ok = (pkey != NULL);
  463. EVP_PKEY_free(pkey);
  464. }
  465. return ok;
  466. }
  467. static int check_params_PEM(const char *type,
  468. const void *data, size_t data_len)
  469. {
  470. static char expected_pem_header[80];
  471. return
  472. TEST_int_gt(BIO_snprintf(expected_pem_header,
  473. sizeof(expected_pem_header),
  474. "-----BEGIN %s PARAMETERS-----", type), 0)
  475. && TEST_strn_eq(data, expected_pem_header, strlen(expected_pem_header));
  476. }
  477. static int test_params_via_DER(const char *type, EVP_PKEY *key)
  478. {
  479. return test_encode_decode(type, key, OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  480. "DER", "type-specific", NULL, NULL,
  481. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  482. test_mem, check_params_DER,
  483. dump_der, FLAG_DECODE_WITH_TYPE);
  484. }
  485. static int test_params_via_PEM(const char *type, EVP_PKEY *key)
  486. {
  487. return test_encode_decode(type, key, OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  488. "PEM", "type-specific", NULL, NULL,
  489. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  490. test_text, check_params_PEM,
  491. dump_pem, 0);
  492. }
  493. static int check_unprotected_legacy_PEM(const char *type,
  494. const void *data, size_t data_len)
  495. {
  496. static char expected_pem_header[80];
  497. return
  498. TEST_int_gt(BIO_snprintf(expected_pem_header,
  499. sizeof(expected_pem_header),
  500. "-----BEGIN %s PRIVATE KEY-----", type), 0)
  501. && TEST_strn_eq(data, expected_pem_header, strlen(expected_pem_header));
  502. }
  503. static int test_unprotected_via_legacy_PEM(const char *type, EVP_PKEY *key)
  504. {
  505. return test_encode_decode(type, key,
  506. OSSL_KEYMGMT_SELECT_KEYPAIR
  507. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  508. "PEM", "type-specific", NULL, NULL,
  509. encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
  510. test_text, check_unprotected_legacy_PEM,
  511. dump_pem, 0);
  512. }
  513. #ifndef OPENSSL_NO_DSA
  514. static int check_MSBLOB(const char *type, const void *data, size_t data_len)
  515. {
  516. const unsigned char *datap = data;
  517. EVP_PKEY *pkey = b2i_PrivateKey(&datap, data_len);
  518. int ok = TEST_ptr(pkey);
  519. EVP_PKEY_free(pkey);
  520. return ok;
  521. }
  522. static int test_unprotected_via_MSBLOB(const char *type, EVP_PKEY *key)
  523. {
  524. return test_encode_decode(type, key,
  525. OSSL_KEYMGMT_SELECT_KEYPAIR
  526. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  527. "MSBLOB", NULL, NULL, NULL,
  528. encode_EVP_PKEY_MSBLOB, decode_EVP_PKEY_prov,
  529. test_mem, check_MSBLOB,
  530. dump_der, 0);
  531. }
  532. # ifndef OPENSSL_NO_RC4
  533. static int check_PVK(const char *type, const void *data, size_t data_len)
  534. {
  535. const unsigned char *in = data;
  536. unsigned int saltlen = 0, keylen = 0;
  537. int ok = ossl_do_PVK_header(&in, data_len, 0, &saltlen, &keylen);
  538. return ok;
  539. }
  540. static int test_unprotected_via_PVK(const char *type, EVP_PKEY *key)
  541. {
  542. return test_encode_decode(type, key,
  543. OSSL_KEYMGMT_SELECT_KEYPAIR
  544. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  545. "PVK", NULL, NULL, NULL,
  546. encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
  547. test_mem, check_PVK,
  548. dump_der, 0);
  549. }
  550. # endif
  551. #endif
  552. static const char *pass_cipher = "AES-256-CBC";
  553. static const char *pass = "the holy handgrenade of antioch";
  554. static int check_protected_PKCS8_DER(const char *type,
  555. const void *data, size_t data_len)
  556. {
  557. const unsigned char *datap = data;
  558. X509_SIG *p8 = d2i_X509_SIG(NULL, &datap, data_len);
  559. int ok = TEST_ptr(p8);
  560. X509_SIG_free(p8);
  561. return ok;
  562. }
  563. static int test_protected_via_DER(const char *type, EVP_PKEY *key)
  564. {
  565. return test_encode_decode(type, key,
  566. OSSL_KEYMGMT_SELECT_KEYPAIR
  567. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  568. "DER", "pkcs8", pass, pass_cipher,
  569. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  570. test_mem, check_protected_PKCS8_DER,
  571. dump_der, 0);
  572. }
  573. static int check_protected_PKCS8_PEM(const char *type,
  574. const void *data, size_t data_len)
  575. {
  576. static const char expected_pem_header[] =
  577. "-----BEGIN " PEM_STRING_PKCS8 "-----";
  578. return TEST_strn_eq(data, expected_pem_header,
  579. sizeof(expected_pem_header) - 1);
  580. }
  581. static int test_protected_via_PEM(const char *type, EVP_PKEY *key)
  582. {
  583. return test_encode_decode(type, key,
  584. OSSL_KEYMGMT_SELECT_KEYPAIR
  585. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  586. "PEM", "pkcs8", pass, pass_cipher,
  587. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  588. test_text, check_protected_PKCS8_PEM,
  589. dump_pem, 0);
  590. }
  591. static int check_protected_legacy_PEM(const char *type,
  592. const void *data, size_t data_len)
  593. {
  594. static char expected_pem_header[80];
  595. return
  596. TEST_int_gt(BIO_snprintf(expected_pem_header,
  597. sizeof(expected_pem_header),
  598. "-----BEGIN %s PRIVATE KEY-----", type), 0)
  599. && TEST_strn_eq(data, expected_pem_header, strlen(expected_pem_header))
  600. && TEST_ptr(strstr(data, "\nDEK-Info: "));
  601. }
  602. static int test_protected_via_legacy_PEM(const char *type, EVP_PKEY *key)
  603. {
  604. return test_encode_decode(type, key,
  605. OSSL_KEYMGMT_SELECT_KEYPAIR
  606. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  607. "PEM", "type-specific", pass, pass_cipher,
  608. encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
  609. test_text, check_protected_legacy_PEM,
  610. dump_pem, 0);
  611. }
  612. #if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4)
  613. static int test_protected_via_PVK(const char *type, EVP_PKEY *key)
  614. {
  615. return test_encode_decode(type, key,
  616. OSSL_KEYMGMT_SELECT_KEYPAIR
  617. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  618. "PVK", NULL, pass, NULL,
  619. encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
  620. test_mem, check_PVK, dump_der, 0);
  621. }
  622. #endif
  623. static int check_public_DER(const char *type, const void *data, size_t data_len)
  624. {
  625. const unsigned char *datap = data;
  626. EVP_PKEY *pkey = d2i_PUBKEY(NULL, &datap, data_len);
  627. int ok = (TEST_ptr(pkey) && TEST_true(EVP_PKEY_is_a(pkey, type)));
  628. EVP_PKEY_free(pkey);
  629. return ok;
  630. }
  631. static int test_public_via_DER(const char *type, EVP_PKEY *key)
  632. {
  633. return test_encode_decode(type, key,
  634. OSSL_KEYMGMT_SELECT_PUBLIC_KEY
  635. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  636. "DER", "SubjectPublicKeyInfo", NULL, NULL,
  637. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  638. test_mem, check_public_DER, dump_der, 0);
  639. }
  640. static int check_public_PEM(const char *type, const void *data, size_t data_len)
  641. {
  642. static const char expected_pem_header[] =
  643. "-----BEGIN " PEM_STRING_PUBLIC "-----";
  644. return
  645. TEST_strn_eq(data, expected_pem_header,
  646. sizeof(expected_pem_header) - 1);
  647. }
  648. static int test_public_via_PEM(const char *type, EVP_PKEY *key)
  649. {
  650. return test_encode_decode(type, key,
  651. OSSL_KEYMGMT_SELECT_PUBLIC_KEY
  652. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  653. "PEM", "SubjectPublicKeyInfo", NULL, NULL,
  654. encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
  655. test_text, check_public_PEM, dump_pem, 0);
  656. }
  657. #ifndef OPENSSL_NO_DSA
  658. static int check_public_MSBLOB(const char *type,
  659. const void *data, size_t data_len)
  660. {
  661. const unsigned char *datap = data;
  662. EVP_PKEY *pkey = b2i_PublicKey(&datap, data_len);
  663. int ok = TEST_ptr(pkey);
  664. EVP_PKEY_free(pkey);
  665. return ok;
  666. }
  667. static int test_public_via_MSBLOB(const char *type, EVP_PKEY *key)
  668. {
  669. return test_encode_decode(type, key, OSSL_KEYMGMT_SELECT_PUBLIC_KEY
  670. | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS,
  671. "MSBLOB", NULL, NULL, NULL,
  672. encode_EVP_PKEY_MSBLOB, decode_EVP_PKEY_prov,
  673. test_mem, check_public_MSBLOB, dump_der, 0);
  674. }
  675. #endif
  676. #define KEYS(KEYTYPE) \
  677. static EVP_PKEY *key_##KEYTYPE = NULL
  678. #define MAKE_KEYS(KEYTYPE, KEYTYPEstr, params) \
  679. ok = ok \
  680. && TEST_ptr(key_##KEYTYPE = make_key(KEYTYPEstr, NULL, params))
  681. #define FREE_KEYS(KEYTYPE) \
  682. EVP_PKEY_free(key_##KEYTYPE); \
  683. #define DOMAIN_KEYS(KEYTYPE) \
  684. static EVP_PKEY *template_##KEYTYPE = NULL; \
  685. static EVP_PKEY *key_##KEYTYPE = NULL
  686. #define MAKE_DOMAIN_KEYS(KEYTYPE, KEYTYPEstr, params) \
  687. ok = ok \
  688. && TEST_ptr(template_##KEYTYPE = \
  689. make_template(KEYTYPEstr, params)) \
  690. && TEST_ptr(key_##KEYTYPE = \
  691. make_key(KEYTYPEstr, template_##KEYTYPE, NULL))
  692. #define FREE_DOMAIN_KEYS(KEYTYPE) \
  693. EVP_PKEY_free(template_##KEYTYPE); \
  694. EVP_PKEY_free(key_##KEYTYPE)
  695. #define IMPLEMENT_TEST_SUITE(KEYTYPE, KEYTYPEstr) \
  696. static int test_unprotected_##KEYTYPE##_via_DER(void) \
  697. { \
  698. return test_unprotected_via_DER(KEYTYPEstr, key_##KEYTYPE); \
  699. } \
  700. static int test_unprotected_##KEYTYPE##_via_PEM(void) \
  701. { \
  702. return test_unprotected_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
  703. } \
  704. static int test_protected_##KEYTYPE##_via_DER(void) \
  705. { \
  706. return test_protected_via_DER(KEYTYPEstr, key_##KEYTYPE); \
  707. } \
  708. static int test_protected_##KEYTYPE##_via_PEM(void) \
  709. { \
  710. return test_protected_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
  711. } \
  712. static int test_public_##KEYTYPE##_via_DER(void) \
  713. { \
  714. return test_public_via_DER(KEYTYPEstr, key_##KEYTYPE); \
  715. } \
  716. static int test_public_##KEYTYPE##_via_PEM(void) \
  717. { \
  718. return test_public_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
  719. }
  720. #define ADD_TEST_SUITE(KEYTYPE) \
  721. ADD_TEST(test_unprotected_##KEYTYPE##_via_DER); \
  722. ADD_TEST(test_unprotected_##KEYTYPE##_via_PEM); \
  723. ADD_TEST(test_protected_##KEYTYPE##_via_DER); \
  724. ADD_TEST(test_protected_##KEYTYPE##_via_PEM); \
  725. ADD_TEST(test_public_##KEYTYPE##_via_DER); \
  726. ADD_TEST(test_public_##KEYTYPE##_via_PEM)
  727. #define IMPLEMENT_TEST_SUITE_PARAMS(KEYTYPE, KEYTYPEstr) \
  728. static int test_params_##KEYTYPE##_via_DER(void) \
  729. { \
  730. return test_params_via_DER(KEYTYPEstr, key_##KEYTYPE); \
  731. } \
  732. static int test_params_##KEYTYPE##_via_PEM(void) \
  733. { \
  734. return test_params_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
  735. }
  736. #define ADD_TEST_SUITE_PARAMS(KEYTYPE) \
  737. ADD_TEST(test_params_##KEYTYPE##_via_DER); \
  738. ADD_TEST(test_params_##KEYTYPE##_via_PEM)
  739. #define IMPLEMENT_TEST_SUITE_LEGACY(KEYTYPE, KEYTYPEstr) \
  740. static int test_unprotected_##KEYTYPE##_via_legacy_PEM(void) \
  741. { \
  742. return \
  743. test_unprotected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE); \
  744. } \
  745. static int test_protected_##KEYTYPE##_via_legacy_PEM(void) \
  746. { \
  747. return \
  748. test_protected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE); \
  749. }
  750. #define ADD_TEST_SUITE_LEGACY(KEYTYPE) \
  751. ADD_TEST(test_unprotected_##KEYTYPE##_via_legacy_PEM); \
  752. ADD_TEST(test_protected_##KEYTYPE##_via_legacy_PEM)
  753. #ifndef OPENSSL_NO_DSA
  754. # define IMPLEMENT_TEST_SUITE_MSBLOB(KEYTYPE, KEYTYPEstr) \
  755. static int test_unprotected_##KEYTYPE##_via_MSBLOB(void) \
  756. { \
  757. return test_unprotected_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE); \
  758. } \
  759. static int test_public_##KEYTYPE##_via_MSBLOB(void) \
  760. { \
  761. return test_public_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE); \
  762. }
  763. # define ADD_TEST_SUITE_MSBLOB(KEYTYPE) \
  764. ADD_TEST(test_unprotected_##KEYTYPE##_via_MSBLOB); \
  765. ADD_TEST(test_public_##KEYTYPE##_via_MSBLOB)
  766. # ifndef OPENSSL_NO_RC4
  767. # define IMPLEMENT_TEST_SUITE_PVK(KEYTYPE, KEYTYPEstr) \
  768. static int test_unprotected_##KEYTYPE##_via_PVK(void) \
  769. { \
  770. return test_unprotected_via_PVK(KEYTYPEstr, key_##KEYTYPE); \
  771. } \
  772. static int test_protected_##KEYTYPE##_via_PVK(void) \
  773. { \
  774. return test_protected_via_PVK(KEYTYPEstr, key_##KEYTYPE); \
  775. }
  776. # define ADD_TEST_SUITE_PVK(KEYTYPE) \
  777. ADD_TEST(test_unprotected_##KEYTYPE##_via_PVK); \
  778. ADD_TEST(test_protected_##KEYTYPE##_via_PVK)
  779. # endif
  780. #endif
  781. #ifndef OPENSSL_NO_DH
  782. DOMAIN_KEYS(DH);
  783. IMPLEMENT_TEST_SUITE(DH, "DH")
  784. IMPLEMENT_TEST_SUITE_PARAMS(DH, "DH")
  785. DOMAIN_KEYS(DHX);
  786. IMPLEMENT_TEST_SUITE(DHX, "X9.42 DH")
  787. IMPLEMENT_TEST_SUITE_PARAMS(DHX, "X9.42 DH")
  788. /*
  789. * DH has no support for PEM_write_bio_PrivateKey_traditional(),
  790. * so no legacy tests.
  791. */
  792. #endif
  793. #ifndef OPENSSL_NO_DSA
  794. DOMAIN_KEYS(DSA);
  795. IMPLEMENT_TEST_SUITE(DSA, "DSA")
  796. IMPLEMENT_TEST_SUITE_PARAMS(DSA, "DSA")
  797. IMPLEMENT_TEST_SUITE_LEGACY(DSA, "DSA")
  798. IMPLEMENT_TEST_SUITE_MSBLOB(DSA, "DSA")
  799. # ifndef OPENSSL_NO_RC4
  800. IMPLEMENT_TEST_SUITE_PVK(DSA, "DSA")
  801. # endif
  802. #endif
  803. #ifndef OPENSSL_NO_EC
  804. DOMAIN_KEYS(EC);
  805. IMPLEMENT_TEST_SUITE(EC, "EC")
  806. IMPLEMENT_TEST_SUITE_PARAMS(EC, "EC")
  807. IMPLEMENT_TEST_SUITE_LEGACY(EC, "EC")
  808. DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
  809. IMPLEMENT_TEST_SUITE(ECExplicitPrimeNamedCurve, "EC")
  810. IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve, "EC")
  811. DOMAIN_KEYS(ECExplicitPrime2G);
  812. IMPLEMENT_TEST_SUITE(ECExplicitPrime2G, "EC")
  813. IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrime2G, "EC")
  814. # ifndef OPENSSL_NO_EC2M
  815. DOMAIN_KEYS(ECExplicitTriNamedCurve);
  816. IMPLEMENT_TEST_SUITE(ECExplicitTriNamedCurve, "EC")
  817. IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve, "EC")
  818. DOMAIN_KEYS(ECExplicitTri2G);
  819. IMPLEMENT_TEST_SUITE(ECExplicitTri2G, "EC")
  820. IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTri2G, "EC")
  821. # endif
  822. KEYS(ED25519);
  823. IMPLEMENT_TEST_SUITE(ED25519, "ED25519")
  824. KEYS(ED448);
  825. IMPLEMENT_TEST_SUITE(ED448, "ED448")
  826. KEYS(X25519);
  827. IMPLEMENT_TEST_SUITE(X25519, "X25519")
  828. KEYS(X448);
  829. IMPLEMENT_TEST_SUITE(X448, "X448")
  830. /*
  831. * ED25519, ED448, X25519 and X448 have no support for
  832. * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
  833. */
  834. #endif
  835. KEYS(RSA);
  836. IMPLEMENT_TEST_SUITE(RSA, "RSA")
  837. IMPLEMENT_TEST_SUITE_LEGACY(RSA, "RSA")
  838. KEYS(RSA_PSS);
  839. IMPLEMENT_TEST_SUITE(RSA_PSS, "RSA-PSS")
  840. /*
  841. * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
  842. * so no legacy tests.
  843. */
  844. #ifndef OPENSSL_NO_DSA
  845. IMPLEMENT_TEST_SUITE_MSBLOB(RSA, "RSA")
  846. # ifndef OPENSSL_NO_RC4
  847. IMPLEMENT_TEST_SUITE_PVK(RSA, "RSA")
  848. # endif
  849. #endif
  850. #ifndef OPENSSL_NO_EC
  851. /* Explicit parameters that match a named curve */
  852. static int do_create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld,
  853. const unsigned char *gen,
  854. size_t gen_len)
  855. {
  856. BIGNUM *a, *b, *prime, *order;
  857. /* Curve prime256v1 */
  858. static const unsigned char prime_data[] = {
  859. 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  860. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  861. 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
  862. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  863. 0xff
  864. };
  865. static const unsigned char a_data[] = {
  866. 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  867. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  868. 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
  869. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  870. 0xfc
  871. };
  872. static const unsigned char b_data[] = {
  873. 0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7,
  874. 0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc,
  875. 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
  876. 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b
  877. };
  878. static const unsigned char seed[] = {
  879. 0xc4, 0x9d, 0x36, 0x08, 0x86, 0xe7, 0x04, 0x93,
  880. 0x6a, 0x66, 0x78, 0xe1, 0x13, 0x9d, 0x26, 0xb7,
  881. 0x81, 0x9f, 0x7e, 0x90
  882. };
  883. static const unsigned char order_data[] = {
  884. 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
  885. 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  886. 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e,
  887. 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51
  888. };
  889. return TEST_ptr(a = BN_CTX_get(bnctx))
  890. && TEST_ptr(b = BN_CTX_get(bnctx))
  891. && TEST_ptr(prime = BN_CTX_get(bnctx))
  892. && TEST_ptr(order = BN_CTX_get(bnctx))
  893. && TEST_ptr(BN_bin2bn(prime_data, sizeof(prime_data), prime))
  894. && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
  895. && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
  896. && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
  897. && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
  898. OSSL_PKEY_PARAM_EC_FIELD_TYPE, SN_X9_62_prime_field,
  899. 0))
  900. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, prime))
  901. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
  902. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
  903. && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
  904. OSSL_PKEY_PARAM_EC_ORDER, order))
  905. && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
  906. OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
  907. && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
  908. OSSL_PKEY_PARAM_EC_SEED, seed, sizeof(seed)))
  909. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
  910. BN_value_one()));
  911. }
  912. static int create_ec_explicit_prime_params_namedcurve(OSSL_PARAM_BLD *bld)
  913. {
  914. static const unsigned char prime256v1_gen[] = {
  915. 0x04,
  916. 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47,
  917. 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2,
  918. 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0,
  919. 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96,
  920. 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b,
  921. 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16,
  922. 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
  923. 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5
  924. };
  925. return do_create_ec_explicit_prime_params(bld, prime256v1_gen,
  926. sizeof(prime256v1_gen));
  927. }
  928. static int create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld)
  929. {
  930. /* 2G */
  931. static const unsigned char prime256v1_gen2[] = {
  932. 0x04,
  933. 0xe4, 0x97, 0x08, 0xbe, 0x7d, 0xfa, 0xa2, 0x9a,
  934. 0xa3, 0x12, 0x6f, 0xe4, 0xe7, 0xd0, 0x25, 0xe3,
  935. 0x4a, 0xc1, 0x03, 0x15, 0x8c, 0xd9, 0x33, 0xc6,
  936. 0x97, 0x42, 0xf5, 0xdc, 0x97, 0xb9, 0xd7, 0x31,
  937. 0xe9, 0x7d, 0x74, 0x3d, 0x67, 0x6a, 0x3b, 0x21,
  938. 0x08, 0x9c, 0x31, 0x73, 0xf8, 0xc1, 0x27, 0xc9,
  939. 0xd2, 0xa0, 0xa0, 0x83, 0x66, 0xe0, 0xc9, 0xda,
  940. 0xa8, 0xc6, 0x56, 0x2b, 0x94, 0xb1, 0xae, 0x55
  941. };
  942. return do_create_ec_explicit_prime_params(bld, prime256v1_gen2,
  943. sizeof(prime256v1_gen2));
  944. }
  945. # ifndef OPENSSL_NO_EC2M
  946. static int do_create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld,
  947. const unsigned char *gen,
  948. size_t gen_len)
  949. {
  950. BIGNUM *a, *b, *poly, *order, *cofactor;
  951. /* sect233k1 characteristic-two-field tpBasis */
  952. static const unsigned char poly_data[] = {
  953. 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  954. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
  955. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  956. };
  957. static const unsigned char a_data[] = {
  958. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  959. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  960. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  961. };
  962. static const unsigned char b_data[] = {
  963. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  964. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  965. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
  966. };
  967. static const unsigned char order_data[] = {
  968. 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  969. 0x00, 0x00, 0x00, 0x06, 0x9D, 0x5B, 0xB9, 0x15, 0xBC, 0xD4, 0x6E, 0xFB,
  970. 0x1A, 0xD5, 0xF1, 0x73, 0xAB, 0xDF
  971. };
  972. static const unsigned char cofactor_data[]= {
  973. 0x4
  974. };
  975. return TEST_ptr(a = BN_CTX_get(bnctx))
  976. && TEST_ptr(b = BN_CTX_get(bnctx))
  977. && TEST_ptr(poly = BN_CTX_get(bnctx))
  978. && TEST_ptr(order = BN_CTX_get(bnctx))
  979. && TEST_ptr(cofactor = BN_CTX_get(bnctx))
  980. && TEST_ptr(BN_bin2bn(poly_data, sizeof(poly_data), poly))
  981. && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
  982. && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
  983. && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
  984. && TEST_ptr(BN_bin2bn(cofactor_data, sizeof(cofactor_data), cofactor))
  985. && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
  986. OSSL_PKEY_PARAM_EC_FIELD_TYPE,
  987. SN_X9_62_characteristic_two_field, 0))
  988. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, poly))
  989. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
  990. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
  991. && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
  992. OSSL_PKEY_PARAM_EC_ORDER, order))
  993. && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
  994. OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
  995. && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
  996. cofactor));
  997. }
  998. static int create_ec_explicit_trinomial_params_namedcurve(OSSL_PARAM_BLD *bld)
  999. {
  1000. static const unsigned char gen[] = {
  1001. 0x04,
  1002. 0x01, 0x72, 0x32, 0xBA, 0x85, 0x3A, 0x7E, 0x73, 0x1A, 0xF1, 0x29, 0xF2,
  1003. 0x2F, 0xF4, 0x14, 0x95, 0x63, 0xA4, 0x19, 0xC2, 0x6B, 0xF5, 0x0A, 0x4C,
  1004. 0x9D, 0x6E, 0xEF, 0xAD, 0x61, 0x26,
  1005. 0x01, 0xDB, 0x53, 0x7D, 0xEC, 0xE8, 0x19, 0xB7, 0xF7, 0x0F, 0x55, 0x5A,
  1006. 0x67, 0xC4, 0x27, 0xA8, 0xCD, 0x9B, 0xF1, 0x8A, 0xEB, 0x9B, 0x56, 0xE0,
  1007. 0xC1, 0x10, 0x56, 0xFA, 0xE6, 0xA3
  1008. };
  1009. return do_create_ec_explicit_trinomial_params(bld, gen, sizeof(gen));
  1010. }
  1011. static int create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld)
  1012. {
  1013. static const unsigned char gen2[] = {
  1014. 0x04,
  1015. 0x00, 0xd7, 0xba, 0xd0, 0x26, 0x6c, 0x31, 0x6a, 0x78, 0x76, 0x01, 0xd1,
  1016. 0x32, 0x4b, 0x8f, 0x30, 0x29, 0x2d, 0x78, 0x30, 0xca, 0x43, 0xaa, 0xf0,
  1017. 0xa2, 0x5a, 0xd4, 0x0f, 0xb3, 0xf4,
  1018. 0x00, 0x85, 0x4b, 0x1b, 0x8d, 0x50, 0x10, 0xa5, 0x1c, 0x80, 0xf7, 0x86,
  1019. 0x40, 0x62, 0x4c, 0x87, 0xd1, 0x26, 0x7a, 0x9c, 0x5c, 0xe9, 0x82, 0x29,
  1020. 0xd1, 0x67, 0x70, 0x41, 0xea, 0xcb
  1021. };
  1022. return do_create_ec_explicit_trinomial_params(bld, gen2, sizeof(gen2));
  1023. }
  1024. # endif /* OPENSSL_NO_EC2M */
  1025. #endif /* OPENSSL_NO_EC */
  1026. int setup_tests(void)
  1027. {
  1028. int ok = 1;
  1029. #ifndef OPENSSL_NO_DSA
  1030. static size_t qbits = 160; /* PVK only tolerates 160 Q bits */
  1031. static size_t pbits = 1024; /* With 160 Q bits, we MUST use 1024 P bits */
  1032. OSSL_PARAM DSA_params[] = {
  1033. OSSL_PARAM_size_t("pbits", &pbits),
  1034. OSSL_PARAM_size_t("qbits", &qbits),
  1035. OSSL_PARAM_END
  1036. };
  1037. #endif
  1038. #ifndef OPENSSL_NO_EC
  1039. static char groupname[] = "prime256v1";
  1040. OSSL_PARAM EC_params[] = {
  1041. OSSL_PARAM_utf8_string("group", groupname, sizeof(groupname) - 1),
  1042. OSSL_PARAM_END
  1043. };
  1044. #endif
  1045. /* 7 is the default magic number */
  1046. static unsigned int rsapss_min_saltlen = 7;
  1047. OSSL_PARAM RSA_PSS_params[] = {
  1048. OSSL_PARAM_uint("saltlen", &rsapss_min_saltlen),
  1049. OSSL_PARAM_END
  1050. };
  1051. #ifndef OPENSSL_NO_EC
  1052. if (!TEST_ptr(bnctx = BN_CTX_new_ex(NULL))
  1053. || !TEST_ptr(bld_prime_nc = OSSL_PARAM_BLD_new())
  1054. || !TEST_ptr(bld_prime = OSSL_PARAM_BLD_new())
  1055. || !create_ec_explicit_prime_params_namedcurve(bld_prime_nc)
  1056. || !create_ec_explicit_prime_params(bld_prime)
  1057. || !TEST_ptr(ec_explicit_prime_params_nc = OSSL_PARAM_BLD_to_param(bld_prime_nc))
  1058. || !TEST_ptr(ec_explicit_prime_params_explicit = OSSL_PARAM_BLD_to_param(bld_prime))
  1059. # ifndef OPENSSL_NO_EC2M
  1060. || !TEST_ptr(bld_tri_nc = OSSL_PARAM_BLD_new())
  1061. || !TEST_ptr(bld_tri = OSSL_PARAM_BLD_new())
  1062. || !create_ec_explicit_trinomial_params_namedcurve(bld_tri_nc)
  1063. || !create_ec_explicit_trinomial_params(bld_tri)
  1064. || !TEST_ptr(ec_explicit_tri_params_nc = OSSL_PARAM_BLD_to_param(bld_tri_nc))
  1065. || !TEST_ptr(ec_explicit_tri_params_explicit = OSSL_PARAM_BLD_to_param(bld_tri))
  1066. # endif
  1067. )
  1068. return 0;
  1069. #endif
  1070. TEST_info("Generating keys...");
  1071. #ifndef OPENSSL_NO_DH
  1072. MAKE_DOMAIN_KEYS(DH, "DH", NULL);
  1073. MAKE_DOMAIN_KEYS(DHX, "X9.42 DH", NULL);
  1074. #endif
  1075. #ifndef OPENSSL_NO_DSA
  1076. MAKE_DOMAIN_KEYS(DSA, "DSA", DSA_params);
  1077. #endif
  1078. #ifndef OPENSSL_NO_EC
  1079. MAKE_DOMAIN_KEYS(EC, "EC", EC_params);
  1080. MAKE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve, "EC", ec_explicit_prime_params_nc);
  1081. MAKE_DOMAIN_KEYS(ECExplicitPrime2G, "EC", ec_explicit_prime_params_explicit);
  1082. # ifndef OPENSSL_NO_EC2M
  1083. MAKE_DOMAIN_KEYS(ECExplicitTriNamedCurve, "EC", ec_explicit_tri_params_nc);
  1084. MAKE_DOMAIN_KEYS(ECExplicitTri2G, "EC", ec_explicit_tri_params_explicit);
  1085. # endif
  1086. MAKE_KEYS(ED25519, "ED25519", NULL);
  1087. MAKE_KEYS(ED448, "ED448", NULL);
  1088. MAKE_KEYS(X25519, "X25519", NULL);
  1089. MAKE_KEYS(X448, "X448", NULL);
  1090. #endif
  1091. MAKE_KEYS(RSA, "RSA", NULL);
  1092. MAKE_KEYS(RSA_PSS, "RSA-PSS", RSA_PSS_params);
  1093. TEST_info("Generating key... done");
  1094. if (ok) {
  1095. #ifndef OPENSSL_NO_DH
  1096. ADD_TEST_SUITE(DH);
  1097. ADD_TEST_SUITE_PARAMS(DH);
  1098. ADD_TEST_SUITE(DHX);
  1099. ADD_TEST_SUITE_PARAMS(DHX);
  1100. /*
  1101. * DH has no support for PEM_write_bio_PrivateKey_traditional(),
  1102. * so no legacy tests.
  1103. */
  1104. #endif
  1105. #ifndef OPENSSL_NO_DSA
  1106. ADD_TEST_SUITE(DSA);
  1107. ADD_TEST_SUITE_PARAMS(DSA);
  1108. ADD_TEST_SUITE_LEGACY(DSA);
  1109. ADD_TEST_SUITE_MSBLOB(DSA);
  1110. # ifndef OPENSSL_NO_RC4
  1111. ADD_TEST_SUITE_PVK(DSA);
  1112. # endif
  1113. #endif
  1114. #ifndef OPENSSL_NO_EC
  1115. ADD_TEST_SUITE(EC);
  1116. ADD_TEST_SUITE_PARAMS(EC);
  1117. ADD_TEST_SUITE_LEGACY(EC);
  1118. ADD_TEST_SUITE(ECExplicitPrimeNamedCurve);
  1119. ADD_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve);
  1120. ADD_TEST_SUITE(ECExplicitPrime2G);
  1121. ADD_TEST_SUITE_LEGACY(ECExplicitPrime2G);
  1122. # ifndef OPENSSL_NO_EC2M
  1123. ADD_TEST_SUITE(ECExplicitTriNamedCurve);
  1124. ADD_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve);
  1125. ADD_TEST_SUITE(ECExplicitTri2G);
  1126. ADD_TEST_SUITE_LEGACY(ECExplicitTri2G);
  1127. # endif
  1128. ADD_TEST_SUITE(ED25519);
  1129. ADD_TEST_SUITE(ED448);
  1130. ADD_TEST_SUITE(X25519);
  1131. ADD_TEST_SUITE(X448);
  1132. /*
  1133. * ED25519, ED448, X25519 and X448 have no support for
  1134. * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
  1135. */
  1136. #endif
  1137. ADD_TEST_SUITE(RSA);
  1138. ADD_TEST_SUITE_LEGACY(RSA);
  1139. ADD_TEST_SUITE(RSA_PSS);
  1140. /*
  1141. * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
  1142. * so no legacy tests.
  1143. */
  1144. #ifndef OPENSSL_NO_DSA
  1145. ADD_TEST_SUITE_MSBLOB(RSA);
  1146. # ifndef OPENSSL_NO_RC4
  1147. ADD_TEST_SUITE_PVK(RSA);
  1148. # endif
  1149. #endif
  1150. }
  1151. return 1;
  1152. }
  1153. void cleanup_tests(void)
  1154. {
  1155. #ifndef OPENSSL_NO_EC
  1156. OSSL_PARAM_BLD_free_params(ec_explicit_prime_params_nc);
  1157. OSSL_PARAM_BLD_free_params(ec_explicit_prime_params_explicit);
  1158. OSSL_PARAM_BLD_free(bld_prime_nc);
  1159. OSSL_PARAM_BLD_free(bld_prime);
  1160. # ifndef OPENSSL_NO_EC2M
  1161. OSSL_PARAM_BLD_free_params(ec_explicit_tri_params_nc);
  1162. OSSL_PARAM_BLD_free_params(ec_explicit_tri_params_explicit);
  1163. OSSL_PARAM_BLD_free(bld_tri_nc);
  1164. OSSL_PARAM_BLD_free(bld_tri);
  1165. # endif
  1166. BN_CTX_free(bnctx);
  1167. #endif /* OPENSSL_NO_EC */
  1168. #ifndef OPENSSL_NO_DH
  1169. FREE_DOMAIN_KEYS(DH);
  1170. FREE_DOMAIN_KEYS(DHX);
  1171. #endif
  1172. #ifndef OPENSSL_NO_DSA
  1173. FREE_DOMAIN_KEYS(DSA);
  1174. #endif
  1175. #ifndef OPENSSL_NO_EC
  1176. FREE_DOMAIN_KEYS(EC);
  1177. FREE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
  1178. FREE_DOMAIN_KEYS(ECExplicitPrime2G);
  1179. # ifndef OPENSSL_NO_EC2M
  1180. FREE_DOMAIN_KEYS(ECExplicitTriNamedCurve);
  1181. FREE_DOMAIN_KEYS(ECExplicitTri2G);
  1182. # endif
  1183. FREE_KEYS(ED25519);
  1184. FREE_KEYS(ED448);
  1185. FREE_KEYS(X25519);
  1186. FREE_KEYS(X448);
  1187. #endif
  1188. FREE_KEYS(RSA);
  1189. FREE_KEYS(RSA_PSS);
  1190. }