blob: 6140e16e2618c0751ce49eeb9a110a39b4e895a7 [file] [log] [blame]
Rich Salz440e5d82016-05-17 14:20:24 -04001/*
Richard Levitte4333b892021-01-28 13:54:57 +01002 * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
Matt Caswell71ea6b42015-02-09 09:45:35 +00003 *
Richard Levitte909f1a22018-12-06 13:05:25 +01004 * Licensed under the Apache License 2.0 (the "License"). You may not use
Rich Salz440e5d82016-05-17 14:20:24 -04005 * 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
Matt Caswell71ea6b42015-02-09 09:45:35 +00008 */
9
Pauli41bbba52020-02-13 11:00:57 +100010/* We need to use some deprecated APIs */
11#define OPENSSL_SUPPRESS_DEPRECATED
12
Matt Caswell71ea6b42015-02-09 09:45:35 +000013#include <stdio.h>
14#include <stdlib.h>
Matt Caswellbb5f2812018-06-01 15:06:52 +010015#include <string.h>
Matt Caswell71ea6b42015-02-09 09:45:35 +000016#include <openssl/bio.h>
Shane Lontis7bb82f92019-09-15 19:55:10 +100017#include <openssl/conf.h>
Matt Caswell71ea6b42015-02-09 09:45:35 +000018#include <openssl/crypto.h>
19#include <openssl/err.h>
20#include <openssl/evp.h>
Matt Caswell71ea6b42015-02-09 09:45:35 +000021#include <openssl/x509.h>
Paul Yang48037172018-09-04 17:21:10 +080022#include <openssl/pem.h>
Matt Caswell10d5b412018-10-26 12:45:27 +010023#include <openssl/kdf.h>
Matt Caswell847d0f82019-03-18 14:36:41 +000024#include <openssl/provider.h>
Matt Caswell9c452222019-09-04 12:46:02 +010025#include <openssl/core_names.h>
Richard Levittef54a4102019-12-02 11:26:15 +010026#include <openssl/params.h>
Richard Levitted7e498a2020-10-04 16:34:31 +020027#include <openssl/param_build.h>
Matt Caswell9c452222019-09-04 12:46:02 +010028#include <openssl/dsa.h>
Matt Caswelle295de12019-12-09 12:03:02 +000029#include <openssl/dh.h>
Matt Caswelle5bc0ce2020-08-12 14:41:12 +010030#include <openssl/aes.h>
Richard Levitted7e498a2020-10-04 16:34:31 +020031#include <openssl/decoder.h>
Daniel Beveniuse947a062020-10-09 06:07:43 +020032#include <openssl/rsa.h>
Rich Salzadcd8e32017-04-18 16:33:15 -040033#include "testutil.h"
Rich Salz176db6d2017-08-22 08:35:43 -040034#include "internal/nelem.h"
Richard Levitte00bc1ad2020-02-02 12:55:05 +010035#include "internal/sizes.h"
Dr. Matthias St. Pierre25f21382019-09-28 00:45:33 +020036#include "crypto/evp.h"
Richard Levittef0c62c52020-09-11 08:36:54 +020037#include "../e_os.h" /* strcasecmp */
Matt Caswell71ea6b42015-02-09 09:45:35 +000038
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +030039static OSSL_LIB_CTX *testctx = NULL;
Jon Spillett062490d2021-03-09 20:42:57 +100040static char *testpropq = NULL;
41
42static OSSL_PROVIDER *nullprov = NULL;
43static OSSL_PROVIDER *deflprov = NULL;
44static OSSL_PROVIDER *lgcyprov = NULL;
Matt Caswell86dc26b2020-04-27 17:17:05 +010045
Matt Caswell71ea6b42015-02-09 09:45:35 +000046/*
47 * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
48 * should never use this key anywhere but in an example.
49 */
50static const unsigned char kExampleRSAKeyDER[] = {
51 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8,
52 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59,
53 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37,
54 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71,
55 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a,
56 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4,
57 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec,
58 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76,
59 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8,
60 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7,
61 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c,
62 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01,
63 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7,
64 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85,
65 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee,
66 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85,
67 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a,
68 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15,
69 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83,
70 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b,
71 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73,
72 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99,
73 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02,
74 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41,
75 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59,
76 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9,
77 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef,
78 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87,
79 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf,
80 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5,
81 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5,
82 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62,
83 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64,
84 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8,
85 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba,
86 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe,
87 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7,
88 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe,
89 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb,
90 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34,
91 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27,
92 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0,
93 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba,
94 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06,
95 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c,
96 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e,
97 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf,
98 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a,
99 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17,
100 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1,
101 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
102};
103
Paul Yang2aee35d2017-09-04 22:02:59 +0800104/*
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100105* kExampleDSAKeyDER is a DSA private key in ASN.1, DER format. Of course, you
106 * should never use this key anywhere but in an example.
107 */
Matt Caswellf650ab42019-11-07 09:24:18 +0000108#ifndef OPENSSL_NO_DSA
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100109static const unsigned char kExampleDSAKeyDER[] = {
110 0x30, 0x82, 0x01, 0xba, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9a,
111 0x05, 0x6d, 0x33, 0xcd, 0x5d, 0x78, 0xa1, 0xbb, 0xcb, 0x7d, 0x5b, 0x8d,
112 0xb4, 0xcc, 0xbf, 0x03, 0x99, 0x64, 0xde, 0x38, 0x78, 0x06, 0x15, 0x2f,
113 0x86, 0x26, 0x77, 0xf3, 0xb1, 0x85, 0x00, 0xed, 0xfc, 0x28, 0x3a, 0x42,
114 0x4d, 0xab, 0xab, 0xdf, 0xbc, 0x9c, 0x16, 0xd0, 0x22, 0x50, 0xd1, 0x38,
115 0xdd, 0x3f, 0x64, 0x05, 0x9e, 0x68, 0x7a, 0x1e, 0xf1, 0x56, 0xbf, 0x1e,
116 0x2c, 0xc5, 0x97, 0x2a, 0xfe, 0x7a, 0x22, 0xdc, 0x6c, 0x68, 0xb8, 0x2e,
117 0x06, 0xdb, 0x41, 0xca, 0x98, 0xd8, 0x54, 0xc7, 0x64, 0x48, 0x24, 0x04,
118 0x20, 0xbc, 0x59, 0xe3, 0x6b, 0xea, 0x7e, 0xfc, 0x7e, 0xc5, 0x4e, 0xd4,
119 0xd8, 0x3a, 0xed, 0xcd, 0x5d, 0x99, 0xb8, 0x5c, 0xa2, 0x8b, 0xbb, 0x0b,
120 0xac, 0xe6, 0x8e, 0x25, 0x56, 0x22, 0x3a, 0x2d, 0x3a, 0x56, 0x41, 0x14,
121 0x1f, 0x1c, 0x8f, 0x53, 0x46, 0x13, 0x85, 0x02, 0x15, 0x00, 0x98, 0x7e,
122 0x92, 0x81, 0x88, 0xc7, 0x3f, 0x70, 0x49, 0x54, 0xf6, 0x76, 0xb4, 0xa3,
123 0x9e, 0x1d, 0x45, 0x98, 0x32, 0x7f, 0x02, 0x81, 0x80, 0x69, 0x4d, 0xef,
124 0x55, 0xff, 0x4d, 0x59, 0x2c, 0x01, 0xfa, 0x6a, 0x38, 0xe0, 0x70, 0x9f,
125 0x9e, 0x66, 0x8e, 0x3e, 0x8c, 0x52, 0x22, 0x9d, 0x15, 0x7e, 0x3c, 0xef,
126 0x4c, 0x7a, 0x61, 0x26, 0xe0, 0x2b, 0x81, 0x3f, 0xeb, 0xaf, 0x35, 0x38,
127 0x8d, 0xfe, 0xed, 0x46, 0xff, 0x5f, 0x03, 0x9b, 0x81, 0x92, 0xe7, 0x6f,
128 0x76, 0x4f, 0x1d, 0xd9, 0xbb, 0x89, 0xc9, 0x3e, 0xd9, 0x0b, 0xf9, 0xf4,
129 0x78, 0x11, 0x59, 0xc0, 0x1d, 0xcd, 0x0e, 0xa1, 0x6f, 0x15, 0xf1, 0x4d,
130 0xc1, 0xc9, 0x22, 0xed, 0x8d, 0xad, 0x67, 0xc5, 0x4b, 0x95, 0x93, 0x86,
131 0xa6, 0xaf, 0x8a, 0xee, 0x06, 0x89, 0x2f, 0x37, 0x7e, 0x64, 0xaa, 0xf6,
132 0xe7, 0xb1, 0x5a, 0x0a, 0x93, 0x95, 0x5d, 0x3e, 0x53, 0x9a, 0xde, 0x8a,
133 0xc2, 0x95, 0x45, 0x81, 0xbe, 0x5c, 0x2f, 0xc2, 0xb2, 0x92, 0x58, 0x19,
134 0x72, 0x80, 0xe9, 0x79, 0xa1, 0x02, 0x81, 0x80, 0x07, 0xd7, 0x62, 0xff,
135 0xdf, 0x1a, 0x3f, 0xed, 0x32, 0xd4, 0xd4, 0x88, 0x7b, 0x2c, 0x63, 0x7f,
136 0x97, 0xdc, 0x44, 0xd4, 0x84, 0xa2, 0xdd, 0x17, 0x16, 0x85, 0x13, 0xe0,
137 0xac, 0x51, 0x8d, 0x29, 0x1b, 0x75, 0x9a, 0xe4, 0xe3, 0x8a, 0x92, 0x69,
138 0x09, 0x03, 0xc5, 0x68, 0xae, 0x5e, 0x94, 0xfe, 0xc9, 0x92, 0x6c, 0x07,
139 0xb4, 0x1e, 0x64, 0x62, 0x87, 0xc6, 0xa4, 0xfd, 0x0d, 0x5f, 0xe5, 0xf9,
140 0x1b, 0x4f, 0x85, 0x5f, 0xae, 0xf3, 0x11, 0xe5, 0x18, 0xd4, 0x4d, 0x79,
141 0x9f, 0xc4, 0x79, 0x26, 0x04, 0x27, 0xf0, 0x0b, 0xee, 0x2b, 0x86, 0x9f,
142 0x86, 0x61, 0xe6, 0x51, 0xce, 0x04, 0x9b, 0x5d, 0x6b, 0x34, 0x43, 0x8c,
143 0x85, 0x3c, 0xf1, 0x51, 0x9b, 0x08, 0x23, 0x1b, 0xf5, 0x7e, 0x33, 0x12,
144 0xea, 0xab, 0x1f, 0xb7, 0x2d, 0xe2, 0x5f, 0xe6, 0x97, 0x99, 0xb5, 0x45,
145 0x16, 0x5b, 0xc3, 0x41, 0x02, 0x14, 0x61, 0xbf, 0x51, 0x60, 0xcf, 0xc8,
146 0xf1, 0x8c, 0x82, 0x97, 0xf2, 0xf4, 0x19, 0xba, 0x2b, 0xf3, 0x16, 0xbe,
147 0x40, 0x48
148};
Matt Caswellf650ab42019-11-07 09:24:18 +0000149#endif
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100150
151/*
Paul Yang2aee35d2017-09-04 22:02:59 +0800152 * kExampleBadRSAKeyDER is an RSA private key in ASN.1, DER format. The private
153 * components are not correct.
154 */
155static const unsigned char kExampleBadRSAKeyDER[] = {
156 0x30, 0x82, 0x04, 0x27, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
157 0xa6, 0x1a, 0x1e, 0x6e, 0x7b, 0xee, 0xc6, 0x89, 0x66, 0xe7, 0x93, 0xef,
158 0x54, 0x12, 0x68, 0xea, 0xbf, 0x86, 0x2f, 0xdd, 0xd2, 0x79, 0xb8, 0xa9,
159 0x6e, 0x03, 0xc2, 0xa3, 0xb9, 0xa3, 0xe1, 0x4b, 0x2a, 0xb3, 0xf8, 0xb4,
160 0xcd, 0xea, 0xbe, 0x24, 0xa6, 0x57, 0x5b, 0x83, 0x1f, 0x0f, 0xf2, 0xd3,
161 0xb7, 0xac, 0x7e, 0xd6, 0x8e, 0x6e, 0x1e, 0xbf, 0xb8, 0x73, 0x8c, 0x05,
162 0x56, 0xe6, 0x35, 0x1f, 0xe9, 0x04, 0x0b, 0x09, 0x86, 0x7d, 0xf1, 0x26,
163 0x08, 0x99, 0xad, 0x7b, 0xc8, 0x4d, 0x94, 0xb0, 0x0b, 0x8b, 0x38, 0xa0,
164 0x5c, 0x62, 0xa0, 0xab, 0xd3, 0x8f, 0xd4, 0x09, 0x60, 0x72, 0x1e, 0x33,
165 0x50, 0x80, 0x6e, 0x22, 0xa6, 0x77, 0x57, 0x6b, 0x9a, 0x33, 0x21, 0x66,
166 0x87, 0x6e, 0x21, 0x7b, 0xc7, 0x24, 0x0e, 0xd8, 0x13, 0xdf, 0x83, 0xde,
167 0xcd, 0x40, 0x58, 0x1d, 0x84, 0x86, 0xeb, 0xb8, 0x12, 0x4e, 0xd2, 0xfa,
168 0x80, 0x1f, 0xe4, 0xe7, 0x96, 0x29, 0xb8, 0xcc, 0xce, 0x66, 0x6d, 0x53,
169 0xca, 0xb9, 0x5a, 0xd7, 0xf6, 0x84, 0x6c, 0x2d, 0x9a, 0x1a, 0x14, 0x1c,
170 0x4e, 0x93, 0x39, 0xba, 0x74, 0xed, 0xed, 0x87, 0x87, 0x5e, 0x48, 0x75,
171 0x36, 0xf0, 0xbc, 0x34, 0xfb, 0x29, 0xf9, 0x9f, 0x96, 0x5b, 0x0b, 0xa7,
172 0x54, 0x30, 0x51, 0x29, 0x18, 0x5b, 0x7d, 0xac, 0x0f, 0xd6, 0x5f, 0x7c,
173 0xf8, 0x98, 0x8c, 0xd8, 0x86, 0x62, 0xb3, 0xdc, 0xff, 0x0f, 0xff, 0x7a,
174 0xaf, 0x5c, 0x4c, 0x61, 0x49, 0x2e, 0xc8, 0x95, 0x86, 0xc4, 0x0e, 0x87,
175 0xfc, 0x1d, 0xcf, 0x8b, 0x7c, 0x61, 0xf6, 0xd8, 0xd0, 0x69, 0xf6, 0xcd,
176 0x8a, 0x8c, 0xf6, 0x62, 0xa2, 0x56, 0xa9, 0xe3, 0xd1, 0xcf, 0x4d, 0xa0,
177 0xf6, 0x2d, 0x20, 0x0a, 0x04, 0xb7, 0xa2, 0xf7, 0xb5, 0x99, 0x47, 0x18,
178 0x56, 0x85, 0x87, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
179 0x01, 0x00, 0x99, 0x41, 0x38, 0x1a, 0xd0, 0x96, 0x7a, 0xf0, 0x83, 0xd5,
180 0xdf, 0x94, 0xce, 0x89, 0x3d, 0xec, 0x7a, 0x52, 0x21, 0x10, 0x16, 0x06,
181 0xe0, 0xee, 0xd2, 0xe6, 0xfd, 0x4b, 0x7b, 0x19, 0x4d, 0xe1, 0xc0, 0xc0,
182 0xd5, 0x14, 0x5d, 0x79, 0xdd, 0x7e, 0x8b, 0x4b, 0xc6, 0xcf, 0xb0, 0x75,
183 0x52, 0xa3, 0x2d, 0xb1, 0x26, 0x46, 0x68, 0x9c, 0x0a, 0x1a, 0xf2, 0xe1,
184 0x09, 0xac, 0x53, 0x85, 0x8c, 0x36, 0xa9, 0x14, 0x65, 0xea, 0xa0, 0x00,
185 0xcb, 0xe3, 0x3f, 0xc4, 0x2b, 0x61, 0x2e, 0x6b, 0x06, 0x69, 0x77, 0xfd,
186 0x38, 0x7e, 0x1d, 0x3f, 0x92, 0xe7, 0x77, 0x08, 0x19, 0xa7, 0x9d, 0x29,
187 0x2d, 0xdc, 0x42, 0xc6, 0x7c, 0xd7, 0xd3, 0xa8, 0x01, 0x2c, 0xf2, 0xd5,
188 0x82, 0x57, 0xcb, 0x55, 0x3d, 0xe7, 0xaa, 0xd2, 0x06, 0x30, 0x30, 0x05,
189 0xe6, 0xf2, 0x47, 0x86, 0xba, 0xc6, 0x61, 0x64, 0xeb, 0x4f, 0x2a, 0x5e,
190 0x07, 0x29, 0xe0, 0x96, 0xb2, 0x43, 0xff, 0x5f, 0x1a, 0x54, 0x16, 0xcf,
191 0xb5, 0x56, 0x5c, 0xa0, 0x9b, 0x0c, 0xfd, 0xb3, 0xd2, 0xe3, 0x79, 0x1d,
192 0x21, 0xe2, 0xd6, 0x13, 0xc4, 0x74, 0xa6, 0xf5, 0x8e, 0x8e, 0x81, 0xbb,
193 0xb4, 0xad, 0x8a, 0xf0, 0x93, 0x0a, 0xd8, 0x0a, 0x42, 0x36, 0xbc, 0xe5,
194 0x26, 0x2a, 0x0d, 0x5d, 0x57, 0x13, 0xc5, 0x4e, 0x2f, 0x12, 0x0e, 0xef,
195 0xa7, 0x81, 0x1e, 0xc3, 0xa5, 0xdb, 0xc9, 0x24, 0xeb, 0x1a, 0xa1, 0xf9,
196 0xf6, 0xa1, 0x78, 0x98, 0x93, 0x77, 0x42, 0x45, 0x03, 0xe2, 0xc9, 0xa2,
197 0xfe, 0x2d, 0x77, 0xc8, 0xc6, 0xac, 0x9b, 0x98, 0x89, 0x6d, 0x9a, 0xe7,
198 0x61, 0x63, 0xb7, 0xf2, 0xec, 0xd6, 0xb1, 0xa1, 0x6e, 0x0a, 0x1a, 0xff,
199 0xfd, 0x43, 0x28, 0xc3, 0x0c, 0xdc, 0xf2, 0x47, 0x4f, 0x27, 0xaa, 0x99,
200 0x04, 0x8e, 0xac, 0xe8, 0x7c, 0x01, 0x02, 0x04, 0x12, 0x34, 0x56, 0x78,
201 0x02, 0x81, 0x81, 0x00, 0xca, 0x69, 0xe5, 0xbb, 0x3a, 0x90, 0x82, 0xcb,
202 0x82, 0x50, 0x2f, 0x29, 0xe2, 0x76, 0x6a, 0x57, 0x55, 0x45, 0x4e, 0x35,
203 0x18, 0x61, 0xe0, 0x12, 0x70, 0xc0, 0xab, 0xc7, 0x80, 0xa2, 0xd4, 0x46,
204 0x34, 0x03, 0xa0, 0x19, 0x26, 0x23, 0x9e, 0xef, 0x1a, 0xcb, 0x75, 0xd6,
205 0xba, 0x81, 0xf4, 0x7e, 0x52, 0xe5, 0x2a, 0xe8, 0xf1, 0x49, 0x6c, 0x0f,
206 0x1a, 0xa0, 0xf9, 0xc6, 0xe7, 0xec, 0x60, 0xe4, 0xcb, 0x2a, 0xb5, 0x56,
207 0xe9, 0x9c, 0xcd, 0x19, 0x75, 0x92, 0xb1, 0x66, 0xce, 0xc3, 0xd9, 0x3d,
208 0x11, 0xcb, 0xc4, 0x09, 0xce, 0x1e, 0x30, 0xba, 0x2f, 0x60, 0x60, 0x55,
209 0x8d, 0x02, 0xdc, 0x5d, 0xaf, 0xf7, 0x52, 0x31, 0x17, 0x07, 0x53, 0x20,
210 0x33, 0xad, 0x8c, 0xd5, 0x2f, 0x5a, 0xd0, 0x57, 0xd7, 0xd1, 0x80, 0xd6,
211 0x3a, 0x9b, 0x04, 0x4f, 0x35, 0xbf, 0xe7, 0xd5, 0xbc, 0x8f, 0xd4, 0x81,
212 0x02, 0x81, 0x81, 0x00, 0xc0, 0x9f, 0xf8, 0xcd, 0xf7, 0x3f, 0x26, 0x8a,
213 0x3d, 0x4d, 0x2b, 0x0c, 0x01, 0xd0, 0xa2, 0xb4, 0x18, 0xfe, 0xf7, 0x5e,
214 0x2f, 0x06, 0x13, 0xcd, 0x63, 0xaa, 0x12, 0xa9, 0x24, 0x86, 0xe3, 0xf3,
215 0x7b, 0xda, 0x1a, 0x3c, 0xb1, 0x38, 0x80, 0x80, 0xef, 0x64, 0x64, 0xa1,
216 0x9b, 0xfe, 0x76, 0x63, 0x8e, 0x83, 0xd2, 0xd9, 0xb9, 0x86, 0xb0, 0xe6,
217 0xa6, 0x0c, 0x7e, 0xa8, 0x84, 0x90, 0x98, 0x0c, 0x1e, 0xf3, 0x14, 0x77,
218 0xe0, 0x5f, 0x81, 0x08, 0x11, 0x8f, 0xa6, 0x23, 0xc4, 0xba, 0xc0, 0x8a,
219 0xe4, 0xc6, 0xe3, 0x5c, 0xbe, 0xc5, 0xec, 0x2c, 0xb9, 0xd8, 0x8c, 0x4d,
220 0x1a, 0x9d, 0xe7, 0x7c, 0x85, 0x4c, 0x0d, 0x71, 0x4e, 0x72, 0x33, 0x1b,
221 0xfe, 0xa9, 0x17, 0x72, 0x76, 0x56, 0x9d, 0x74, 0x7e, 0x52, 0x67, 0x9a,
222 0x87, 0x9a, 0xdb, 0x30, 0xde, 0xe4, 0x49, 0x28, 0x3b, 0xd2, 0x67, 0xaf,
223 0x02, 0x81, 0x81, 0x00, 0x89, 0x74, 0x9a, 0x8e, 0xa7, 0xb9, 0xa5, 0x28,
224 0xc0, 0x68, 0xe5, 0x6e, 0x63, 0x1c, 0x99, 0x20, 0x8f, 0x86, 0x8e, 0x12,
225 0x9e, 0x69, 0x30, 0xfa, 0x34, 0xd9, 0x92, 0x8d, 0xdb, 0x7c, 0x37, 0xfd,
226 0x28, 0xab, 0x61, 0x98, 0x52, 0x7f, 0x14, 0x1a, 0x39, 0xae, 0xfb, 0x6a,
227 0x03, 0xa3, 0xe6, 0xbd, 0xb6, 0x5b, 0x6b, 0xe5, 0x5e, 0x9d, 0xc6, 0xa5,
228 0x07, 0x27, 0x54, 0x17, 0xd0, 0x3d, 0x84, 0x9b, 0x3a, 0xa0, 0xd9, 0x1e,
229 0x99, 0x6c, 0x63, 0x17, 0xab, 0xf1, 0x1f, 0x49, 0xba, 0x95, 0xe3, 0x3b,
230 0x86, 0x8f, 0x42, 0xa4, 0x89, 0xf5, 0x94, 0x8f, 0x8b, 0x46, 0xbe, 0x84,
231 0xba, 0x4a, 0xbc, 0x0d, 0x5f, 0x46, 0xeb, 0xe8, 0xec, 0x43, 0x8c, 0x1e,
232 0xad, 0x19, 0x69, 0x2f, 0x08, 0x86, 0x7a, 0x3f, 0x7d, 0x0f, 0x07, 0x97,
233 0xf3, 0x9a, 0x7b, 0xb5, 0xb2, 0xc1, 0x8c, 0x95, 0x68, 0x04, 0xa0, 0x81,
234 0x02, 0x81, 0x80, 0x4e, 0xbf, 0x7e, 0x1b, 0xcb, 0x13, 0x61, 0x75, 0x3b,
235 0xdb, 0x59, 0x5f, 0xb1, 0xd4, 0xb8, 0xeb, 0x9e, 0x73, 0xb5, 0xe7, 0xf6,
236 0x89, 0x3d, 0x1c, 0xda, 0xf0, 0x36, 0xff, 0x35, 0xbd, 0x1e, 0x0b, 0x74,
237 0xe3, 0x9e, 0xf0, 0xf2, 0xf7, 0xd7, 0x82, 0xb7, 0x7b, 0x6a, 0x1b, 0x0e,
238 0x30, 0x4a, 0x98, 0x0e, 0xb4, 0xf9, 0x81, 0x07, 0xe4, 0x75, 0x39, 0xe9,
239 0x53, 0xca, 0xbb, 0x5c, 0xaa, 0x93, 0x07, 0x0e, 0xa8, 0x2f, 0xba, 0x98,
240 0x49, 0x30, 0xa7, 0xcc, 0x1a, 0x3c, 0x68, 0x0c, 0xe1, 0xa4, 0xb1, 0x05,
241 0xe6, 0xe0, 0x25, 0x78, 0x58, 0x14, 0x37, 0xf5, 0x1f, 0xe3, 0x22, 0xef,
242 0xa8, 0x0e, 0x22, 0xa0, 0x94, 0x3a, 0xf6, 0xc9, 0x13, 0xe6, 0x06, 0xbf,
243 0x7f, 0x99, 0xc6, 0xcc, 0xd8, 0xc6, 0xbe, 0xd9, 0x2e, 0x24, 0xc7, 0x69,
244 0x8c, 0x95, 0xba, 0xf6, 0x04, 0xb3, 0x0a, 0xf4, 0xcb, 0xf0, 0xce,
245};
246
Matt Caswell71ea6b42015-02-09 09:45:35 +0000247static const unsigned char kMsg[] = { 1, 2, 3, 4 };
248
249static const unsigned char kSignature[] = {
250 0xa5, 0xf0, 0x8a, 0x47, 0x5d, 0x3c, 0xb3, 0xcc, 0xa9, 0x79, 0xaf, 0x4d,
251 0x8c, 0xae, 0x4c, 0x14, 0xef, 0xc2, 0x0b, 0x34, 0x36, 0xde, 0xf4, 0x3e,
252 0x3d, 0xbb, 0x4a, 0x60, 0x5c, 0xc8, 0x91, 0x28, 0xda, 0xfb, 0x7e, 0x04,
253 0x96, 0x7e, 0x63, 0x13, 0x90, 0xce, 0xb9, 0xb4, 0x62, 0x7a, 0xfd, 0x09,
254 0x3d, 0xc7, 0x67, 0x78, 0x54, 0x04, 0xeb, 0x52, 0x62, 0x6e, 0x24, 0x67,
255 0xb4, 0x40, 0xfc, 0x57, 0x62, 0xc6, 0xf1, 0x67, 0xc1, 0x97, 0x8f, 0x6a,
256 0xa8, 0xae, 0x44, 0x46, 0x5e, 0xab, 0x67, 0x17, 0x53, 0x19, 0x3a, 0xda,
257 0x5a, 0xc8, 0x16, 0x3e, 0x86, 0xd5, 0xc5, 0x71, 0x2f, 0xfc, 0x23, 0x48,
258 0xd9, 0x0b, 0x13, 0xdd, 0x7b, 0x5a, 0x25, 0x79, 0xef, 0xa5, 0x7b, 0x04,
259 0xed, 0x44, 0xf6, 0x18, 0x55, 0xe4, 0x0a, 0xe9, 0x57, 0x79, 0x5d, 0xd7,
260 0x55, 0xa7, 0xab, 0x45, 0x02, 0x97, 0x60, 0x42,
261};
262
263/*
264 * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8
265 * PrivateKeyInfo.
266 */
267static const unsigned char kExampleRSAKeyPKCS8[] = {
268 0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
269 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
270 0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
271 0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5,
272 0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e,
273 0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34,
274 0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde,
275 0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8,
276 0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b,
277 0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83,
278 0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48,
279 0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a,
280 0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2,
281 0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01,
282 0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a,
283 0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5,
284 0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6,
285 0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8,
286 0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6,
287 0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f,
288 0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c,
289 0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78,
290 0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71,
291 0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60,
292 0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d,
293 0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3,
294 0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d,
295 0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18,
296 0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d,
297 0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32,
298 0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc,
299 0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63,
300 0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05,
301 0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16,
302 0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3,
303 0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85,
304 0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97,
305 0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7,
306 0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99,
307 0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4,
308 0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d,
309 0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40,
310 0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26,
311 0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1,
312 0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c,
313 0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30,
314 0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea,
315 0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b,
316 0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e,
317 0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9,
318 0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae,
319 0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d,
320 0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
321};
322
Matt Caswella9880362015-02-26 10:35:50 +0000323#ifndef OPENSSL_NO_EC
Matt Caswell71ea6b42015-02-09 09:45:35 +0000324/*
325 * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
326 * structure.
327 */
328static const unsigned char kExampleECKeyDER[] = {
329 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a,
330 0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08,
331 0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a,
332 0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
333 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69,
334 0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c,
335 0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9,
336 0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18,
337 0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16,
338 0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22,
339 0xc1,
340};
341
342/*
343 * kExampleBadECKeyDER is a sample EC private key encoded as an ECPrivateKey
344 * structure. The private key is equal to the order and will fail to import
345 */
346static const unsigned char kExampleBadECKeyDER[] = {
347 0x30, 0x66, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48,
348 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03,
349 0x01, 0x07, 0x04, 0x4C, 0x30, 0x4A, 0x02, 0x01, 0x01, 0x04, 0x20, 0xFF,
350 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
351 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, 0xF3,
352 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51, 0xA1, 0x23, 0x03, 0x21, 0x00,
353 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
354 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
355 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
356};
Paul Yangb0004702017-11-01 00:45:24 +0800357
358/* prime256v1 */
359static const unsigned char kExampleECPubKeyDER[] = {
360 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
361 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
362 0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
363 0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
364 0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
365 0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
366 0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
367 0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
368};
369
Bernd Edlinger5dc40a82019-01-30 16:20:31 +0100370/*
David Makepeace87762932019-06-07 10:45:51 +1000371 * kExampleBadECPubKeyDER is a sample EC public key with a wrong OID
Bernd Edlinger5dc40a82019-01-30 16:20:31 +0100372 * 1.2.840.10045.2.2 instead of 1.2.840.10045.2.1 - EC Public Key
373 */
374static const unsigned char kExampleBadECPubKeyDER[] = {
375 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
376 0x02, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
377 0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
378 0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
379 0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
380 0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
381 0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
382 0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
383};
384
Paul Yangb0004702017-11-01 00:45:24 +0800385static const unsigned char pExampleECParamDER[] = {
386 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
387};
Matt Caswell2cf8bb42021-03-09 17:07:48 +0000388
389static const unsigned char kExampleED25519KeyDER[] = {
390 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
391 0x04, 0x22, 0x04, 0x20, 0xba, 0x7b, 0xba, 0x20, 0x1b, 0x02, 0x75, 0x3a,
392 0xe8, 0x88, 0xfe, 0x00, 0xcd, 0x8b, 0xc6, 0xf4, 0x5c, 0x47, 0x09, 0x46,
393 0x66, 0xe4, 0x72, 0x85, 0x25, 0x26, 0x5e, 0x12, 0x33, 0x48, 0xf6, 0x50
394};
395
396static const unsigned char kExampleED25519PubKeyDER[] = {
397 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,
398 0xf5, 0xc5, 0xeb, 0x52, 0x3e, 0x7d, 0x07, 0x86, 0xb2, 0x55, 0x07, 0x45,
399 0xef, 0x5b, 0x7c, 0x20, 0xe8, 0x66, 0x28, 0x30, 0x3c, 0x8a, 0x82, 0x40,
400 0x97, 0xa3, 0x08, 0xdc, 0x65, 0x80, 0x39, 0x29
401};
402
Matt Caswella9880362015-02-26 10:35:50 +0000403#endif
Matt Caswell71ea6b42015-02-09 09:45:35 +0000404
Rich Salzadcd8e32017-04-18 16:33:15 -0400405typedef struct APK_DATA_st {
406 const unsigned char *kder;
407 size_t size;
Shane Lontis5b5eea42020-10-15 13:41:59 +1000408 const char *keytype;
Rich Salzadcd8e32017-04-18 16:33:15 -0400409 int evptype;
Paul Yang2aee35d2017-09-04 22:02:59 +0800410 int check;
Paul Yangb0004702017-11-01 00:45:24 +0800411 int pub_check;
412 int param_check;
413 int type; /* 0 for private, 1 for public, 2 for params */
Rich Salzadcd8e32017-04-18 16:33:15 -0400414} APK_DATA;
415
416static APK_DATA keydata[] = {
Shane Lontis5b5eea42020-10-15 13:41:59 +1000417 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA},
418 {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), "RSA", EVP_PKEY_RSA},
Dr. Stephen Hensonaa24cd12017-04-26 17:08:22 +0100419#ifndef OPENSSL_NO_EC
Shane Lontis5b5eea42020-10-15 13:41:59 +1000420 {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC}
Dr. Stephen Hensonaa24cd12017-04-26 17:08:22 +0100421#endif
Rich Salzadcd8e32017-04-18 16:33:15 -0400422};
423
Paul Yang2aee35d2017-09-04 22:02:59 +0800424static APK_DATA keycheckdata[] = {
Matt Caswell2cf8bb42021-03-09 17:07:48 +0000425 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA, 1, 1, 1,
426 0},
Shane Lontis5b5eea42020-10-15 13:41:59 +1000427 {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), "RSA", EVP_PKEY_RSA,
Richard Levittee6774a72020-11-06 10:37:43 +0100428 0, 1, 1, 0},
Paul Yang2aee35d2017-09-04 22:02:59 +0800429#ifndef OPENSSL_NO_EC
Shane Lontis5b5eea42020-10-15 13:41:59 +1000430 {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC, 1, 1, 1, 0},
Paul Yangb0004702017-11-01 00:45:24 +0800431 /* group is also associated in our pub key */
Matt Caswell2cf8bb42021-03-09 17:07:48 +0000432 {kExampleECPubKeyDER, sizeof(kExampleECPubKeyDER), "EC", EVP_PKEY_EC, 0, 1,
433 1, 1},
434 {pExampleECParamDER, sizeof(pExampleECParamDER), "EC", EVP_PKEY_EC, 0, 0, 1,
435 2},
436 {kExampleED25519KeyDER, sizeof(kExampleED25519KeyDER), "ED25519",
437 EVP_PKEY_ED25519, 1, 1, 1, 0},
438 {kExampleED25519PubKeyDER, sizeof(kExampleED25519PubKeyDER), "ED25519",
439 EVP_PKEY_ED25519, 0, 1, 1, 1},
Paul Yang2aee35d2017-09-04 22:02:59 +0800440#endif
441};
442
Richard Levitted7e498a2020-10-04 16:34:31 +0200443static EVP_PKEY *load_example_key(const char *keytype,
444 const unsigned char *data, size_t data_len)
445{
446 const unsigned char **pdata = &data;
447 EVP_PKEY *pkey = NULL;
448 OSSL_DECODER_CTX *dctx =
Tomas Mrazfe757662021-02-11 16:57:37 +0100449 OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", NULL, keytype, 0,
Jon Spillett062490d2021-03-09 20:42:57 +1000450 testctx, testpropq);
Richard Levitted7e498a2020-10-04 16:34:31 +0200451
452 /* |pkey| will be NULL on error */
453 (void)OSSL_DECODER_from_data(dctx, pdata, &data_len);
454 OSSL_DECODER_CTX_free(dctx);
455 return pkey;
456}
457
Matt Caswell71ea6b42015-02-09 09:45:35 +0000458static EVP_PKEY *load_example_rsa_key(void)
459{
Richard Levitted7e498a2020-10-04 16:34:31 +0200460 return load_example_key("RSA", kExampleRSAKeyDER,
461 sizeof(kExampleRSAKeyDER));
Matt Caswell71ea6b42015-02-09 09:45:35 +0000462}
463
Matt Caswellf650ab42019-11-07 09:24:18 +0000464#ifndef OPENSSL_NO_DSA
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100465static EVP_PKEY *load_example_dsa_key(void)
466{
Richard Levitte6ed40222020-12-18 13:17:33 +0100467 return load_example_key("DSA", kExampleDSAKeyDER,
468 sizeof(kExampleDSAKeyDER));
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100469}
Matt Caswellf650ab42019-11-07 09:24:18 +0000470#endif
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100471
Matt Caswell6d242fa2020-01-09 15:21:14 +0000472static EVP_PKEY *load_example_hmac_key(void)
473{
474 EVP_PKEY *pkey = NULL;
475 unsigned char key[] = {
476 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
477 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
478 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
479 };
480
481 pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, key, sizeof(key));
482 if (!TEST_ptr(pkey))
483 return NULL;
484
485 return pkey;
486}
487
Paulif9e504e2020-06-12 10:34:46 +1000488static int test_EVP_set_default_properties(void)
489{
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +0300490 OSSL_LIB_CTX *ctx;
Paulif9e504e2020-06-12 10:34:46 +1000491 EVP_MD *md = NULL;
492 int res = 0;
493
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +0300494 if (!TEST_ptr(ctx = OSSL_LIB_CTX_new())
Paulif9e504e2020-06-12 10:34:46 +1000495 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
496 goto err;
497 EVP_MD_free(md);
498 md = NULL;
499
500 if (!TEST_true(EVP_set_default_properties(ctx, "provider=fizzbang"))
501 || !TEST_ptr_null(md = EVP_MD_fetch(ctx, "sha256", NULL))
502 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", "-provider")))
503 goto err;
504 EVP_MD_free(md);
505 md = NULL;
506
507 if (!TEST_true(EVP_set_default_properties(ctx, NULL))
508 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
509 goto err;
510 res = 1;
511err:
512 EVP_MD_free(md);
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +0300513 OSSL_LIB_CTX_free(ctx);
Paulif9e504e2020-06-12 10:34:46 +1000514 return res;
515}
516
Matt Caswellb8a12722021-01-21 15:14:15 +0000517#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
518static int test_fromdata(char *keytype, OSSL_PARAM *params)
519{
520 EVP_PKEY_CTX *pctx = NULL;
521 EVP_PKEY *pkey = NULL;
522 int testresult = 0;
523
Jon Spillett062490d2021-03-09 20:42:57 +1000524 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, keytype, testpropq)))
Matt Caswellb8a12722021-01-21 15:14:15 +0000525 goto err;
Shane Lontis2db985b2021-02-05 13:55:50 +1000526 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
527 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
528 params), 0))
Matt Caswellb8a12722021-01-21 15:14:15 +0000529 goto err;
530
531 if (!TEST_ptr(pkey))
532 goto err;
533
534 testresult = 1;
535 err:
536 EVP_PKEY_free(pkey);
537 EVP_PKEY_CTX_free(pctx);
538
539 return testresult;
540}
541#endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA || !OPENSSL_NO_EC */
542
Jon Spillett2c04b342021-01-13 14:10:51 +1000543/*
Matt Caswell8a9394c2021-01-21 09:19:16 +0000544 * Test combinations of private, public, missing and private + public key
Jon Spillett2c04b342021-01-13 14:10:51 +1000545 * params to ensure they are all accepted
546 */
Matt Caswellb8a12722021-01-21 15:14:15 +0000547#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA)
Jon Spillett2c04b342021-01-13 14:10:51 +1000548static int test_EVP_PKEY_ffc_priv_pub(char *keytype)
549{
550 OSSL_PARAM_BLD *bld = NULL;
551 OSSL_PARAM *params = NULL;
552 BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
Jon Spillett2c04b342021-01-13 14:10:51 +1000553 int ret = 0;
554
555 /*
556 * Setup the parameters for our pkey object. For our purposes they don't
557 * have to actually be *valid* parameters. We just need to set something.
558 */
Matt Caswellb8a12722021-01-21 15:14:15 +0000559 if (!TEST_ptr(p = BN_new())
Jon Spillett2c04b342021-01-13 14:10:51 +1000560 || !TEST_ptr(q = BN_new())
561 || !TEST_ptr(g = BN_new())
562 || !TEST_ptr(pub = BN_new())
563 || !TEST_ptr(priv = BN_new()))
564 goto err;
565
566 /* Test !priv and !pub */
567 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
568 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
569 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
570 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)))
571 goto err;
572 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
573 goto err;
574
Matt Caswellb8a12722021-01-21 15:14:15 +0000575 if (!test_fromdata(keytype, params))
Jon Spillett2c04b342021-01-13 14:10:51 +1000576 goto err;
Shane Lontis3f883c72021-04-07 13:45:19 +1000577 OSSL_PARAM_free(params);
Jon Spillett2c04b342021-01-13 14:10:51 +1000578 OSSL_PARAM_BLD_free(bld);
579
580 /* Test priv and !pub */
581 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
582 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
583 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
584 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
585 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
586 priv)))
587 goto err;
588 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
589 goto err;
590
Matt Caswellb8a12722021-01-21 15:14:15 +0000591 if (!test_fromdata(keytype, params))
Jon Spillett2c04b342021-01-13 14:10:51 +1000592 goto err;
Shane Lontis3f883c72021-04-07 13:45:19 +1000593 OSSL_PARAM_free(params);
Jon Spillett2c04b342021-01-13 14:10:51 +1000594 OSSL_PARAM_BLD_free(bld);
595
596 /* Test !priv and pub */
597 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
598 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
599 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
600 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
601 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
602 pub)))
603 goto err;
604 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
605 goto err;
606
Matt Caswellb8a12722021-01-21 15:14:15 +0000607 if (!test_fromdata(keytype, params))
Jon Spillett2c04b342021-01-13 14:10:51 +1000608 goto err;
Shane Lontis3f883c72021-04-07 13:45:19 +1000609 OSSL_PARAM_free(params);
Jon Spillett2c04b342021-01-13 14:10:51 +1000610 OSSL_PARAM_BLD_free(bld);
611
612 /* Test priv and pub */
613 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
614 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
615 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
616 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
617 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
618 pub))
619 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
620 priv)))
621 goto err;
622 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
623 goto err;
624
Matt Caswellb8a12722021-01-21 15:14:15 +0000625 if (!test_fromdata(keytype, params))
Jon Spillett2c04b342021-01-13 14:10:51 +1000626 goto err;
627
628 ret = 1;
629 err:
Shane Lontis3f883c72021-04-07 13:45:19 +1000630 OSSL_PARAM_free(params);
Jon Spillett2c04b342021-01-13 14:10:51 +1000631 OSSL_PARAM_BLD_free(bld);
632 BN_free(p);
633 BN_free(q);
634 BN_free(g);
635 BN_free(pub);
636 BN_free(priv);
637
638 return ret;
639}
Matt Caswell8a9394c2021-01-21 09:19:16 +0000640#endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA */
Jon Spillett2c04b342021-01-13 14:10:51 +1000641
Matt Caswellb8a12722021-01-21 15:14:15 +0000642/*
643 * Test combinations of private, public, missing and private + public key
644 * params to ensure they are all accepted for EC keys
645 */
646#ifndef OPENSSL_NO_EC
647static unsigned char ec_priv[] = {
648 0xe9, 0x25, 0xf7, 0x66, 0x58, 0xa4, 0xdd, 0x99, 0x61, 0xe7, 0xe8, 0x23,
649 0x85, 0xc2, 0xe8, 0x33, 0x27, 0xc5, 0x5c, 0xeb, 0xdb, 0x43, 0x9f, 0xd5,
650 0xf2, 0x5a, 0x75, 0x55, 0xd0, 0x2e, 0x6d, 0x16
651};
652static unsigned char ec_pub[] = {
653 0x04, 0xad, 0x11, 0x90, 0x77, 0x4b, 0x46, 0xee, 0x72, 0x51, 0x15, 0x97,
654 0x4a, 0x6a, 0xa7, 0xaf, 0x59, 0xfa, 0x4b, 0xf2, 0x41, 0xc8, 0x3a, 0x81,
655 0x23, 0xb6, 0x90, 0x04, 0x6c, 0x67, 0x66, 0xd0, 0xdc, 0xf2, 0x15, 0x1d,
656 0x41, 0x61, 0xb7, 0x95, 0x85, 0x38, 0x5a, 0x84, 0x56, 0xe8, 0xb3, 0x0e,
657 0xf5, 0xc6, 0x5d, 0xa4, 0x54, 0x26, 0xb0, 0xf7, 0xa5, 0x4a, 0x33, 0xf1,
658 0x08, 0x09, 0xb8, 0xdb, 0x03
659};
660
661static int test_EC_priv_pub(void)
662{
663 OSSL_PARAM_BLD *bld = NULL;
664 OSSL_PARAM *params = NULL;
665 BIGNUM *priv = NULL;
666 int ret = 0;
667
668 /*
669 * Setup the parameters for our pkey object. For our purposes they don't
670 * have to actually be *valid* parameters. We just need to set something.
671 */
672 if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
673 goto err;
674
675 /* Test !priv and !pub */
676 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
677 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
678 OSSL_PKEY_PARAM_GROUP_NAME,
679 "P-256", 0)))
680 goto err;
681 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
682 goto err;
683
684 if (!test_fromdata("EC", params))
685 goto err;
Shane Lontis3f883c72021-04-07 13:45:19 +1000686 OSSL_PARAM_free(params);
Matt Caswellb8a12722021-01-21 15:14:15 +0000687 OSSL_PARAM_BLD_free(bld);
688
689 /* Test priv and !pub */
690 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
691 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
692 OSSL_PKEY_PARAM_GROUP_NAME,
693 "P-256", 0))
694 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
695 priv)))
696 goto err;
697 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
698 goto err;
699
700 if (!test_fromdata("EC", params))
701 goto err;
Shane Lontis3f883c72021-04-07 13:45:19 +1000702 OSSL_PARAM_free(params);
Matt Caswellb8a12722021-01-21 15:14:15 +0000703 OSSL_PARAM_BLD_free(bld);
704
705 /* Test !priv and pub */
706 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
707 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
708 OSSL_PKEY_PARAM_GROUP_NAME,
709 "P-256", 0))
710 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
711 OSSL_PKEY_PARAM_PUB_KEY,
712 ec_pub, sizeof(ec_pub))))
713 goto err;
714 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
715 goto err;
716
717 if (!test_fromdata("EC", params))
718 goto err;
Shane Lontis3f883c72021-04-07 13:45:19 +1000719 OSSL_PARAM_free(params);
Matt Caswellb8a12722021-01-21 15:14:15 +0000720 OSSL_PARAM_BLD_free(bld);
721
722 /* Test priv and pub */
723 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
724 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
725 OSSL_PKEY_PARAM_GROUP_NAME,
726 "P-256", 0))
727 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
728 OSSL_PKEY_PARAM_PUB_KEY,
729 ec_pub, sizeof(ec_pub)))
Matt Caswelld36a5dd2021-03-01 10:48:59 +0000730 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
731 priv)))
Matt Caswellb8a12722021-01-21 15:14:15 +0000732 goto err;
733 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
734 goto err;
735
736 if (!test_fromdata("EC", params))
737 goto err;
738
739 ret = 1;
740 err:
Shane Lontis3f883c72021-04-07 13:45:19 +1000741 OSSL_PARAM_free(params);
Matt Caswellb8a12722021-01-21 15:14:15 +0000742 OSSL_PARAM_BLD_free(bld);
743 BN_free(priv);
744
745 return ret;
746}
747
748/* Test that using a legacy EC key with only a private key in it works */
749# ifndef OPENSSL_NO_DEPRECATED_3_0
750static int test_EC_priv_only_legacy(void)
751{
752 BIGNUM *priv = NULL;
753 int ret = 0;
754 EC_KEY *eckey = NULL;
Tomas Mraz2145ba52021-03-19 18:45:43 +0100755 EVP_PKEY *pkey = NULL, *dup_pk = NULL;
Matt Caswellb8a12722021-01-21 15:14:15 +0000756 EVP_MD_CTX *ctx = NULL;
757
758 /* Create the low level EC_KEY */
759 if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
760 goto err;
761
762 eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
763 if (!TEST_ptr(eckey))
764 goto err;
765
766 if (!TEST_true(EC_KEY_set_private_key(eckey, priv)))
767 goto err;
768
769 pkey = EVP_PKEY_new();
770 if (!TEST_ptr(pkey))
771 goto err;
772
773 if (!TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
774 goto err;
775 eckey = NULL;
776
Tomas Mraz2145ba52021-03-19 18:45:43 +0100777 while (dup_pk == NULL) {
778 ret = 0;
779 ctx = EVP_MD_CTX_new();
780 if (!TEST_ptr(ctx))
781 goto err;
Matt Caswellb8a12722021-01-21 15:14:15 +0000782
Tomas Mraz2145ba52021-03-19 18:45:43 +0100783 /*
784 * The EVP_DigestSignInit function should create the key on the
785 * provider side which is sufficient for this test.
786 */
787 if (!TEST_true(EVP_DigestSignInit_ex(ctx, NULL, NULL, testctx,
788 testpropq, pkey, NULL)))
789 goto err;
790 EVP_MD_CTX_free(ctx);
791 ctx = NULL;
Matt Caswellb8a12722021-01-21 15:14:15 +0000792
Tomas Mraz2145ba52021-03-19 18:45:43 +0100793 if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pkey)))
794 goto err;
795 /* EVP_PKEY_eq() returns -2 with missing public keys */
796 ret = TEST_int_eq(EVP_PKEY_eq(pkey, dup_pk), -2);
797 EVP_PKEY_free(pkey);
798 pkey = dup_pk;
799 if (!ret)
800 goto err;
801 }
Matt Caswellb8a12722021-01-21 15:14:15 +0000802
803 err:
804 EVP_MD_CTX_free(ctx);
805 EVP_PKEY_free(pkey);
806 EC_KEY_free(eckey);
807 BN_free(priv);
808
809 return ret;
810}
811# endif /* OPENSSL_NO_DEPRECATED_3_0 */
812#endif /* OPENSSL_NO_EC */
813
Shane Lontis2eb2b4f2018-09-06 08:34:45 +1000814static int test_EVP_Enveloped(void)
815{
816 int ret = 0;
817 EVP_CIPHER_CTX *ctx = NULL;
818 EVP_PKEY *keypair = NULL;
819 unsigned char *kek = NULL;
820 unsigned char iv[EVP_MAX_IV_LENGTH];
821 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
822 int len, kek_len, ciphertext_len, plaintext_len;
823 unsigned char ciphertext[32], plaintext[16];
Jon Spillett062490d2021-03-09 20:42:57 +1000824 const EVP_CIPHER *type = NULL;
825
826 if (nullprov != NULL)
827 return TEST_skip("Test does not support a non-default library context");
828
829 type = EVP_aes_256_cbc();
Shane Lontis2eb2b4f2018-09-06 08:34:45 +1000830
831 if (!TEST_ptr(keypair = load_example_rsa_key())
832 || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_size(keypair)))
833 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
834 || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
835 &keypair, 1))
836 || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
837 msg, sizeof(msg)))
838 || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
839 &len)))
840 goto err;
841
842 ciphertext_len += len;
843
844 if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
845 || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
846 ciphertext, ciphertext_len))
847 || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
848 goto err;
849
850 plaintext_len += len;
851 if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
852 goto err;
853
854 ret = 1;
855err:
856 OPENSSL_free(kek);
857 EVP_PKEY_free(keypair);
858 EVP_CIPHER_CTX_free(ctx);
859 return ret;
860}
861
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100862/*
Matt Caswell6d242fa2020-01-09 15:21:14 +0000863 * Test 0: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, RSA)
864 * Test 1: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, DSA)
865 * Test 2: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, HMAC)
866 * Test 3: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, RSA)
867 * Test 4: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, DSA)
868 * Test 5: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch diegst, HMAC)
869 * Test 6: Use an MD BIO to do the Update calls instead (RSA)
870 * Test 7: Use an MD BIO to do the Update calls instead (DSA)
871 * Test 8: Use an MD BIO to do the Update calls instead (HMAC)
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100872 */
873static int test_EVP_DigestSignInit(int tst)
Matt Caswell71ea6b42015-02-09 09:45:35 +0000874{
875 int ret = 0;
876 EVP_PKEY *pkey = NULL;
877 unsigned char *sig = NULL;
878 size_t sig_len = 0;
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100879 EVP_MD_CTX *md_ctx = NULL, *md_ctx_verify = NULL;
880 EVP_MD_CTX *a_md_ctx = NULL, *a_md_ctx_verify = NULL;
881 BIO *mdbio = NULL, *membio = NULL;
882 size_t written;
Matt Caswell6d242fa2020-01-09 15:21:14 +0000883 const EVP_MD *md;
884 EVP_MD *mdexp = NULL;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000885
Jon Spillett062490d2021-03-09 20:42:57 +1000886 if (nullprov != NULL)
887 return TEST_skip("Test does not support a non-default library context");
888
Matt Caswell6d242fa2020-01-09 15:21:14 +0000889 if (tst >= 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100890 membio = BIO_new(BIO_s_mem());
891 mdbio = BIO_new(BIO_f_md());
892 if (!TEST_ptr(membio) || !TEST_ptr(mdbio))
893 goto out;
894 BIO_push(mdbio, membio);
895 if (!TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx), 0))
896 goto out;
897 } else {
898 if (!TEST_ptr(a_md_ctx = md_ctx = EVP_MD_CTX_new())
899 || !TEST_ptr(a_md_ctx_verify = md_ctx_verify = EVP_MD_CTX_new()))
900 goto out;
901 }
902
Matt Caswell6d242fa2020-01-09 15:21:14 +0000903 if (tst == 0 || tst == 3 || tst == 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100904 if (!TEST_ptr(pkey = load_example_rsa_key()))
905 goto out;
Matt Caswell6d242fa2020-01-09 15:21:14 +0000906 } else if (tst == 1 || tst == 4 || tst == 7) {
Matt Caswellf650ab42019-11-07 09:24:18 +0000907#ifndef OPENSSL_NO_DSA
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100908 if (!TEST_ptr(pkey = load_example_dsa_key()))
909 goto out;
Matt Caswellf650ab42019-11-07 09:24:18 +0000910#else
911 ret = 1;
912 goto out;
913#endif
Matt Caswell6d242fa2020-01-09 15:21:14 +0000914 } else {
915 if (!TEST_ptr(pkey = load_example_hmac_key()))
916 goto out;
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100917 }
918
Matt Caswell6d242fa2020-01-09 15:21:14 +0000919 if (tst >= 3 && tst <= 5)
920 md = mdexp = EVP_MD_fetch(NULL, "SHA256", NULL);
921 else
922 md = EVP_sha256();
923
924 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, md, NULL, pkey)))
Richard Levitte6e59a892015-11-27 14:02:12 +0100925 goto out;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000926
Matt Caswell6d242fa2020-01-09 15:21:14 +0000927 if (tst >= 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100928 if (!BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written))
929 goto out;
930 } else {
931 if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
932 goto out;
933 }
Rich Salzadcd8e32017-04-18 16:33:15 -0400934
Matt Caswell71ea6b42015-02-09 09:45:35 +0000935 /* Determine the size of the signature. */
Rich Salzadcd8e32017-04-18 16:33:15 -0400936 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
Richard Levitte0a054d22020-01-09 21:37:32 +0100937 || !TEST_ptr(sig = OPENSSL_malloc(sig_len))
Rich Salzadcd8e32017-04-18 16:33:15 -0400938 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000939 goto out;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000940
Matt Caswell6d242fa2020-01-09 15:21:14 +0000941 if (tst >= 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100942 if (!TEST_int_gt(BIO_reset(mdbio), 0)
943 || !TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx_verify), 0))
944 goto out;
945 }
946
Matt Caswell6d242fa2020-01-09 15:21:14 +0000947 /*
948 * Ensure that the signature round-trips (Verification isn't supported for
949 * HMAC via EVP_DigestVerify*)
950 */
951 if (tst != 2 && tst != 5 && tst != 8) {
952 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, md,
953 NULL, pkey)))
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100954 goto out;
Matt Caswell6d242fa2020-01-09 15:21:14 +0000955
956 if (tst >= 6) {
957 if (!TEST_true(BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written)))
958 goto out;
959 } else {
960 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg,
961 sizeof(kMsg))))
962 goto out;
963 }
964 if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100965 goto out;
966 }
Matt Caswell71ea6b42015-02-09 09:45:35 +0000967
968 ret = 1;
969
970 out:
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100971 BIO_free(membio);
972 BIO_free(mdbio);
973 EVP_MD_CTX_free(a_md_ctx);
974 EVP_MD_CTX_free(a_md_ctx_verify);
Rich Salzc5ba2d92015-03-28 10:54:15 -0400975 EVP_PKEY_free(pkey);
Rich Salzb548a1f2015-05-01 10:02:07 -0400976 OPENSSL_free(sig);
Matt Caswell6d242fa2020-01-09 15:21:14 +0000977 EVP_MD_free(mdexp);
Matt Caswell71ea6b42015-02-09 09:45:35 +0000978
979 return ret;
980}
981
982static int test_EVP_DigestVerifyInit(void)
983{
984 int ret = 0;
985 EVP_PKEY *pkey = NULL;
Rich Salzadcd8e32017-04-18 16:33:15 -0400986 EVP_MD_CTX *md_ctx = NULL;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000987
Jon Spillett062490d2021-03-09 20:42:57 +1000988 if (nullprov != NULL)
989 return TEST_skip("Test does not support a non-default library context");
990
Rich Salzadcd8e32017-04-18 16:33:15 -0400991 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
992 || !TEST_ptr(pkey = load_example_rsa_key()))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000993 goto out;
Rich Salzadcd8e32017-04-18 16:33:15 -0400994
995 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
996 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
997 || !TEST_true(EVP_DigestVerifyFinal(md_ctx, kSignature,
998 sizeof(kSignature))))
999 goto out;
Matt Caswell71ea6b42015-02-09 09:45:35 +00001000 ret = 1;
1001
1002 out:
Richard Levittebfb06412015-12-02 00:49:35 +01001003 EVP_MD_CTX_free(md_ctx);
Rich Salzc5ba2d92015-03-28 10:54:15 -04001004 EVP_PKEY_free(pkey);
Matt Caswell71ea6b42015-02-09 09:45:35 +00001005 return ret;
1006}
1007
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001008/*
1009 * Test corner cases of EVP_DigestInit/Update/Final API call behavior.
1010 */
1011static int test_EVP_Digest(void)
1012{
1013 int ret = 0;
1014 EVP_MD_CTX *md_ctx = NULL;
1015 unsigned char md[EVP_MAX_MD_SIZE];
Jon Spillett062490d2021-03-09 20:42:57 +10001016 EVP_MD *sha256 = NULL;
1017 EVP_MD *shake256 = NULL;
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001018
1019 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1020 goto out;
1021
Jon Spillett062490d2021-03-09 20:42:57 +10001022 if (!TEST_ptr(sha256 = EVP_MD_fetch(testctx, "sha256", testpropq))
1023 || !TEST_ptr(shake256 = EVP_MD_fetch(testctx, "shake256", testpropq)))
1024 goto out;
1025
1026 if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001027 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1028 || !TEST_true(EVP_DigestFinal(md_ctx, md, NULL))
1029 /* EVP_DigestFinal resets the EVP_MD_CTX. */
Rich Salzf6c95e42021-02-16 17:51:56 -05001030 || !TEST_ptr_eq(EVP_MD_CTX_get0_md(md_ctx), NULL))
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001031 goto out;
1032
Jon Spillett062490d2021-03-09 20:42:57 +10001033 if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001034 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1035 || !TEST_true(EVP_DigestFinal_ex(md_ctx, md, NULL))
1036 /* EVP_DigestFinal_ex does not reset the EVP_MD_CTX. */
Rich Salzf6c95e42021-02-16 17:51:56 -05001037 || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001038 /*
1039 * EVP_DigestInit_ex with NULL type should work on
1040 * pre-initialized context.
1041 */
1042 || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1043 goto out;
1044
Jon Spillett062490d2021-03-09 20:42:57 +10001045 if (!TEST_true(EVP_DigestInit_ex(md_ctx, shake256, NULL))
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001046 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1047 || !TEST_true(EVP_DigestFinalXOF(md_ctx, md, sizeof(md)))
1048 /* EVP_DigestFinalXOF does not reset the EVP_MD_CTX. */
Rich Salzf6c95e42021-02-16 17:51:56 -05001049 || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001050 || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1051 goto out;
1052 ret = 1;
1053
1054 out:
1055 EVP_MD_CTX_free(md_ctx);
Jon Spillett062490d2021-03-09 20:42:57 +10001056 EVP_MD_free(sha256);
1057 EVP_MD_free(shake256);
Tomas Mraz8d8dd092020-11-13 14:16:35 +01001058 return ret;
1059}
1060
Rich Salzadcd8e32017-04-18 16:33:15 -04001061static int test_d2i_AutoPrivateKey(int i)
Matt Caswell71ea6b42015-02-09 09:45:35 +00001062{
1063 int ret = 0;
1064 const unsigned char *p;
1065 EVP_PKEY *pkey = NULL;
Rich Salzadcd8e32017-04-18 16:33:15 -04001066 const APK_DATA *ak = &keydata[i];
1067 const unsigned char *input = ak->kder;
1068 size_t input_len = ak->size;
1069 int expected_id = ak->evptype;
Matt Caswell71ea6b42015-02-09 09:45:35 +00001070
1071 p = input;
Rich Salzadcd8e32017-04-18 16:33:15 -04001072 if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
1073 || !TEST_ptr_eq(p, input + input_len)
1074 || !TEST_int_eq(EVP_PKEY_id(pkey), expected_id))
Matt Caswell71ea6b42015-02-09 09:45:35 +00001075 goto done;
Matt Caswell71ea6b42015-02-09 09:45:35 +00001076
1077 ret = 1;
1078
1079 done:
Rich Salzc5ba2d92015-03-28 10:54:15 -04001080 EVP_PKEY_free(pkey);
Matt Caswell71ea6b42015-02-09 09:45:35 +00001081 return ret;
1082}
1083
Matt Caswella9880362015-02-26 10:35:50 +00001084#ifndef OPENSSL_NO_EC
Shane Lontiscad83472019-03-27 17:38:28 +10001085
1086static const unsigned char ec_public_sect163k1_validxy[] = {
1087 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1088 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1089 0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1090 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x02, 0xd1, 0x7b,
1091 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1092 0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1093};
1094
1095static const unsigned char ec_public_sect163k1_badx[] = {
1096 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1097 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1098 0x0a, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1099 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0xb0, 0x02, 0xd1, 0x7b,
1100 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1101 0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1102};
1103
1104static const unsigned char ec_public_sect163k1_bady[] = {
1105 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1106 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1107 0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1108 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x0a, 0xd1, 0x7b,
1109 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1110 0x6a, 0xd8, 0x17, 0x65, 0x41, 0xe6
1111};
1112
1113static struct ec_der_pub_keys_st {
1114 const unsigned char *der;
1115 size_t len;
1116 int valid;
1117} ec_der_pub_keys[] = {
1118 { ec_public_sect163k1_validxy, sizeof(ec_public_sect163k1_validxy), 1 },
1119 { ec_public_sect163k1_badx, sizeof(ec_public_sect163k1_badx), 0 },
1120 { ec_public_sect163k1_bady, sizeof(ec_public_sect163k1_bady), 0 },
1121};
1122
1123/*
1124 * Tests the range of the decoded EC char2 public point.
1125 * See ec_GF2m_simple_oct2point().
1126 */
1127static int test_invalide_ec_char2_pub_range_decode(int id)
1128{
1129 int ret = 0;
Shane Lontis5b5eea42020-10-15 13:41:59 +10001130 EVP_PKEY *pkey;
Shane Lontiscad83472019-03-27 17:38:28 +10001131
Shane Lontis5b5eea42020-10-15 13:41:59 +10001132 pkey = load_example_key("EC", ec_der_pub_keys[id].der,
1133 ec_der_pub_keys[id].len);
1134
1135 ret = (ec_der_pub_keys[id].valid && TEST_ptr(pkey))
1136 || TEST_ptr_null(pkey);
1137 EVP_PKEY_free(pkey);
Shane Lontiscad83472019-03-27 17:38:28 +10001138 return ret;
1139}
1140
Matt Caswell71ea6b42015-02-09 09:45:35 +00001141/* Tests loading a bad key in PKCS8 format */
1142static int test_EVP_PKCS82PKEY(void)
1143{
1144 int ret = 0;
1145 const unsigned char *derp = kExampleBadECKeyDER;
1146 PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1147 EVP_PKEY *pkey = NULL;
1148
Rich Salzadcd8e32017-04-18 16:33:15 -04001149 if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
1150 sizeof(kExampleBadECKeyDER))))
Matt Caswell71ea6b42015-02-09 09:45:35 +00001151 goto done;
Matt Caswell71ea6b42015-02-09 09:45:35 +00001152
Rich Salzadcd8e32017-04-18 16:33:15 -04001153 if (!TEST_ptr_eq(derp,
1154 kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
Matt Caswell71ea6b42015-02-09 09:45:35 +00001155 goto done;
Rich Salzadcd8e32017-04-18 16:33:15 -04001156
1157 if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
1158 goto done;
Matt Caswell71ea6b42015-02-09 09:45:35 +00001159
1160 ret = 1;
1161
1162 done:
Rich Salze0e920b2015-04-11 16:32:54 -04001163 PKCS8_PRIV_KEY_INFO_free(p8inf);
Rich Salzc5ba2d92015-03-28 10:54:15 -04001164 EVP_PKEY_free(pkey);
Matt Caswell71ea6b42015-02-09 09:45:35 +00001165
1166 return ret;
1167}
Matt Caswella9880362015-02-26 10:35:50 +00001168#endif
Matt Caswell71ea6b42015-02-09 09:45:35 +00001169
Richard Levitte29c49b22020-05-18 08:35:29 +02001170/* This uses kExampleRSAKeyDER and kExampleRSAKeyPKCS8 to verify encoding */
1171static int test_privatekey_to_pkcs8(void)
1172{
1173 EVP_PKEY *pkey = NULL;
1174 BIO *membio = NULL;
1175 char *membuf = NULL;
Shane Lontise2cc68c2020-07-06 17:35:23 +10001176 long membuf_len = 0;
Richard Levitte29c49b22020-05-18 08:35:29 +02001177 int ok = 0;
1178
1179 if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1180 || !TEST_ptr(pkey = load_example_rsa_key())
1181 || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1182 NULL, 0, NULL, NULL),
1183 0)
Shane Lontise2cc68c2020-07-06 17:35:23 +10001184 || !TEST_int_gt(membuf_len = BIO_get_mem_data(membio, &membuf), 0)
1185 || !TEST_ptr(membuf)
1186 || !TEST_mem_eq(membuf, (size_t)membuf_len,
Richard Levitte29c49b22020-05-18 08:35:29 +02001187 kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8))
1188 /*
1189 * We try to write PEM as well, just to see that it doesn't err, but
1190 * assume that the result is correct.
1191 */
1192 || !TEST_int_gt(PEM_write_bio_PKCS8PrivateKey(membio, pkey, NULL,
1193 NULL, 0, NULL, NULL),
1194 0))
1195 goto done;
1196
1197 ok = 1;
1198 done:
1199 EVP_PKEY_free(pkey);
1200 BIO_free_all(membio);
1201 return ok;
1202}
1203
Richard Levittef0c62c52020-09-11 08:36:54 +02001204#ifndef OPENSSL_NO_EC
1205static const struct {
1206 int encoding;
1207 const char *encoding_name;
1208} ec_encodings[] = {
1209 { OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT },
1210 { OPENSSL_EC_NAMED_CURVE, OSSL_PKEY_EC_ENCODING_GROUP }
1211};
1212
1213static int ec_export_get_encoding_cb(const OSSL_PARAM params[], void *arg)
1214{
1215 const OSSL_PARAM *p;
1216 const char *enc_name = NULL;
1217 int *enc = arg;
1218 size_t i;
1219
1220 *enc = -1;
1221
1222 if (!TEST_ptr(p = OSSL_PARAM_locate_const(params,
1223 OSSL_PKEY_PARAM_EC_ENCODING))
1224 || !TEST_true(OSSL_PARAM_get_utf8_string_ptr(p, &enc_name)))
1225 return 0;
1226
1227 for (i = 0; i < OSSL_NELEM(ec_encodings); i++) {
1228 if (strcasecmp(enc_name, ec_encodings[i].encoding_name) == 0) {
1229 *enc = ec_encodings[i].encoding;
1230 break;
1231 }
1232 }
1233
1234 return (*enc != -1);
1235}
1236
1237static int test_EC_keygen_with_enc(int idx)
1238{
1239 EVP_PKEY *params = NULL, *key = NULL;
1240 EVP_PKEY_CTX *pctx = NULL, *kctx = NULL;
1241 int enc;
1242 int ret = 0;
1243
1244 enc = ec_encodings[idx].encoding;
1245
1246 /* Create key parameters */
1247 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "EC", NULL))
1248 || !TEST_true(EVP_PKEY_paramgen_init(pctx))
1249 || !TEST_true(EVP_PKEY_CTX_set_group_name(pctx, "P-256"))
1250 || !TEST_true(EVP_PKEY_CTX_set_ec_param_enc(pctx, enc))
1251 || !TEST_true(EVP_PKEY_paramgen(pctx, &params))
1252 || !TEST_ptr(params))
1253 goto done;
1254
1255 /* Create key */
1256 if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx, params, NULL))
1257 || !TEST_true(EVP_PKEY_keygen_init(kctx))
1258 || !TEST_true(EVP_PKEY_keygen(kctx, &key))
1259 || !TEST_ptr(key))
1260 goto done;
1261
1262 /* Check that the encoding got all the way into the key */
1263 if (!TEST_true(evp_keymgmt_util_export(key, OSSL_KEYMGMT_SELECT_ALL,
1264 ec_export_get_encoding_cb, &enc))
1265 || !TEST_int_eq(enc, ec_encodings[idx].encoding))
1266 goto done;
1267
1268 ret = 1;
1269 done:
1270 EVP_PKEY_free(key);
1271 EVP_PKEY_free(params);
1272 EVP_PKEY_CTX_free(kctx);
1273 EVP_PKEY_CTX_free(pctx);
1274 return ret;
1275}
1276#endif
1277
Richard Levittef844f9e2020-04-13 22:34:56 +02001278#if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
Jack Lloydddb634f2018-06-18 15:51:56 -04001279
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001280static int test_EVP_SM2_verify(void)
1281{
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001282 const char *pubkey =
Paul Yangd0b79f82020-03-04 23:49:43 +08001283 "-----BEGIN PUBLIC KEY-----\n"
1284 "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEp1KLWq1ZE2jmoAnnBJE1LBGxVr18\n"
1285 "YvvqECWCpXfAQ9qUJ+UmthnUPf0iM3SaXKHe6PlLIDyNlWMWb9RUh/yU3g==\n"
1286 "-----END PUBLIC KEY-----\n";
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001287
1288 const char *msg = "message digest";
1289 const char *id = "ALICE123@YAHOO.COM";
1290
1291 const uint8_t signature[] = {
Paul Yangd0b79f82020-03-04 23:49:43 +08001292 0x30, 0x44, 0x02, 0x20, 0x5b, 0xdb, 0xab, 0x81, 0x4f, 0xbb,
1293 0x8b, 0x69, 0xb1, 0x05, 0x9c, 0x99, 0x3b, 0xb2, 0x45, 0x06,
1294 0x4a, 0x30, 0x15, 0x59, 0x84, 0xcd, 0xee, 0x30, 0x60, 0x36,
1295 0x57, 0x87, 0xef, 0x5c, 0xd0, 0xbe, 0x02, 0x20, 0x43, 0x8d,
1296 0x1f, 0xc7, 0x77, 0x72, 0x39, 0xbb, 0x72, 0xe1, 0xfd, 0x07,
1297 0x58, 0xd5, 0x82, 0xc8, 0x2d, 0xba, 0x3b, 0x2c, 0x46, 0x24,
1298 0xe3, 0x50, 0xff, 0x04, 0xc7, 0xa0, 0x71, 0x9f, 0xa4, 0x70
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001299 };
1300
1301 int rc = 0;
1302 BIO *bio = NULL;
1303 EVP_PKEY *pkey = NULL;
1304 EVP_MD_CTX *mctx = NULL;
1305 EVP_PKEY_CTX *pctx = NULL;
Jon Spillett062490d2021-03-09 20:42:57 +10001306 EVP_MD *sm3 = NULL;
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001307
1308 bio = BIO_new_mem_buf(pubkey, strlen(pubkey));
1309 if (!TEST_true(bio != NULL))
1310 goto done;
1311
Jon Spillett062490d2021-03-09 20:42:57 +10001312 pkey = PEM_read_bio_PUBKEY_ex(bio, NULL, NULL, NULL, testctx, testpropq);
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001313 if (!TEST_true(pkey != NULL))
1314 goto done;
1315
Richard Levitte8a288602020-09-23 06:18:06 +02001316 if (!TEST_true(EVP_PKEY_is_a(pkey, "SM2")))
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001317 goto done;
1318
1319 if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
1320 goto done;
1321
Jon Spillett062490d2021-03-09 20:42:57 +10001322 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001323 goto done;
1324
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001325 EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
1326
Jon Spillett062490d2021-03-09 20:42:57 +10001327 if (!TEST_ptr(sm3 = EVP_MD_fetch(testctx, "sm3", testpropq)))
1328 goto done;
1329
1330 if (!TEST_true(EVP_DigestVerifyInit(mctx, NULL, sm3, NULL, pkey)))
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001331 goto done;
1332
Paul Yangd0b79f82020-03-04 23:49:43 +08001333 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, id, strlen(id)), 0))
1334 goto done;
1335
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001336 if (!TEST_true(EVP_DigestVerifyUpdate(mctx, msg, strlen(msg))))
1337 goto done;
1338
1339 if (!TEST_true(EVP_DigestVerifyFinal(mctx, signature, sizeof(signature))))
1340 goto done;
1341 rc = 1;
1342
1343 done:
1344 BIO_free(bio);
1345 EVP_PKEY_free(pkey);
1346 EVP_PKEY_CTX_free(pctx);
1347 EVP_MD_CTX_free(mctx);
Jon Spillett062490d2021-03-09 20:42:57 +10001348 EVP_MD_free(sm3);
Jack Lloyda6c4cb82018-09-04 23:25:29 +08001349 return rc;
1350}
1351
Jack Lloydddb634f2018-06-18 15:51:56 -04001352static int test_EVP_SM2(void)
1353{
1354 int ret = 0;
1355 EVP_PKEY *pkey = NULL;
Matt Caswellbfb56a92020-09-18 11:57:24 +01001356 EVP_PKEY *pkeyparams = NULL;
Jack Lloydddb634f2018-06-18 15:51:56 -04001357 EVP_PKEY_CTX *pctx = NULL;
1358 EVP_PKEY_CTX *kctx = NULL;
Paul Yang48037172018-09-04 17:21:10 +08001359 EVP_PKEY_CTX *sctx = NULL;
Jack Lloydddb634f2018-06-18 15:51:56 -04001360 size_t sig_len = 0;
1361 unsigned char *sig = NULL;
1362 EVP_MD_CTX *md_ctx = NULL;
1363 EVP_MD_CTX *md_ctx_verify = NULL;
1364 EVP_PKEY_CTX *cctx = NULL;
Richard Levitte42423ac2021-03-10 12:53:51 +01001365 EVP_MD *check_md = NULL;
Jack Lloydddb634f2018-06-18 15:51:56 -04001366
1367 uint8_t ciphertext[128];
1368 size_t ctext_len = sizeof(ciphertext);
1369
1370 uint8_t plaintext[8];
1371 size_t ptext_len = sizeof(plaintext);
1372
Paul Yang48037172018-09-04 17:21:10 +08001373 uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
1374
Matt Caswellbfb56a92020-09-18 11:57:24 +01001375 OSSL_PARAM sparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1376 OSSL_PARAM gparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1377 int i;
Richard Levittea0fff542021-03-11 16:04:16 +01001378 char mdname[OSSL_MAX_NAME_SIZE];
Matt Caswellbfb56a92020-09-18 11:57:24 +01001379
Richard Levitte42423ac2021-03-10 12:53:51 +01001380 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx,
1381 "SM2", testpropq)))
Jack Lloydddb634f2018-06-18 15:51:56 -04001382 goto done;
1383
1384 if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
1385 goto done;
1386
1387 if (!TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2)))
1388 goto done;
1389
Matt Caswellbfb56a92020-09-18 11:57:24 +01001390 if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
Jack Lloydddb634f2018-06-18 15:51:56 -04001391 goto done;
1392
Richard Levitte42423ac2021-03-10 12:53:51 +01001393 if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx,
1394 pkeyparams, testpropq)))
Jack Lloydddb634f2018-06-18 15:51:56 -04001395 goto done;
1396
1397 if (!TEST_true(EVP_PKEY_keygen_init(kctx)))
1398 goto done;
1399
1400 if (!TEST_true(EVP_PKEY_keygen(kctx, &pkey)))
1401 goto done;
1402
Jack Lloydddb634f2018-06-18 15:51:56 -04001403 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1404 goto done;
1405
1406 if (!TEST_ptr(md_ctx_verify = EVP_MD_CTX_new()))
1407 goto done;
1408
Jon Spillett062490d2021-03-09 20:42:57 +10001409 if (!TEST_ptr(sctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
Paul Yang48037172018-09-04 17:21:10 +08001410 goto done;
1411
1412 EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
1413 EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
1414
Richard Levitte42423ac2021-03-10 12:53:51 +01001415 if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, "sm3", testpropq)))
Jon Spillett062490d2021-03-09 20:42:57 +10001416 goto done;
1417
Richard Levitte42423ac2021-03-10 12:53:51 +01001418 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, check_md, NULL, pkey)))
Paul Yang48037172018-09-04 17:21:10 +08001419 goto done;
1420
Paul Yangd0b79f82020-03-04 23:49:43 +08001421 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
Jack Lloydddb634f2018-06-18 15:51:56 -04001422 goto done;
1423
Richard Levitte42423ac2021-03-10 12:53:51 +01001424 if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
Jack Lloydddb634f2018-06-18 15:51:56 -04001425 goto done;
1426
1427 /* Determine the size of the signature. */
1428 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len)))
1429 goto done;
1430
Jack Lloydddb634f2018-06-18 15:51:56 -04001431 if (!TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1432 goto done;
1433
1434 if (!TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1435 goto done;
1436
1437 /* Ensure that the signature round-trips. */
1438
Richard Levitte42423ac2021-03-10 12:53:51 +01001439 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
1440 pkey)))
Jack Lloydddb634f2018-06-18 15:51:56 -04001441 goto done;
1442
Paul Yangd0b79f82020-03-04 23:49:43 +08001443 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1444 goto done;
1445
Jack Lloydddb634f2018-06-18 15:51:56 -04001446 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1447 goto done;
1448
1449 if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
1450 goto done;
1451
1452 /* now check encryption/decryption */
1453
Matt Caswellbfb56a92020-09-18 11:57:24 +01001454 gparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1455 mdname, sizeof(mdname));
1456 for (i = 0; i < 2; i++) {
Richard Levitte42423ac2021-03-10 12:53:51 +01001457 const char *mdnames[] = {
1458#ifndef OPENSSL_NO_SM3
1459 "SM3",
1460#else
1461 NULL,
1462#endif
1463 "SHA2-256" };
Matt Caswellbfb56a92020-09-18 11:57:24 +01001464 EVP_PKEY_CTX_free(cctx);
Jack Lloydddb634f2018-06-18 15:51:56 -04001465
Richard Levitte42423ac2021-03-10 12:53:51 +01001466 if (mdnames[i] == NULL)
1467 continue;
Jack Lloydddb634f2018-06-18 15:51:56 -04001468
Richard Levitte42423ac2021-03-10 12:53:51 +01001469 sparams[0] =
1470 OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1471 (char *)mdnames[i], 0);
1472
1473 if (!TEST_ptr(cctx = EVP_PKEY_CTX_new_from_pkey(testctx,
1474 pkey, testpropq)))
Matt Caswellbfb56a92020-09-18 11:57:24 +01001475 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001476
Matt Caswellbfb56a92020-09-18 11:57:24 +01001477 if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
1478 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001479
Matt Caswellbfb56a92020-09-18 11:57:24 +01001480 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1481 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001482
Matt Caswellbfb56a92020-09-18 11:57:24 +01001483 if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg,
1484 sizeof(kMsg))))
1485 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001486
Matt Caswellbfb56a92020-09-18 11:57:24 +01001487 if (!TEST_true(EVP_PKEY_decrypt_init(cctx)))
1488 goto done;
1489
1490 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1491 goto done;
1492
1493 if (!TEST_true(EVP_PKEY_decrypt(cctx, plaintext, &ptext_len, ciphertext,
1494 ctext_len)))
1495 goto done;
1496
1497 if (!TEST_true(EVP_PKEY_CTX_get_params(cctx, gparams)))
1498 goto done;
1499
Richard Levitte42423ac2021-03-10 12:53:51 +01001500 /*
1501 * Test we're still using the digest we think we are.
1502 * Because of aliases, the easiest is to fetch the digest and
1503 * check the name with EVP_MD_is_a().
1504 */
1505 EVP_MD_free(check_md);
1506 if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, mdname, testpropq)))
Matt Caswellbfb56a92020-09-18 11:57:24 +01001507 goto done;
Richard Levitte42423ac2021-03-10 12:53:51 +01001508 if (!TEST_true(EVP_MD_is_a(check_md, mdnames[i]))) {
1509 TEST_info("Fetched md %s isn't %s", mdname, mdnames[i]);
Matt Caswellbfb56a92020-09-18 11:57:24 +01001510 goto done;
Richard Levitte42423ac2021-03-10 12:53:51 +01001511 }
Matt Caswellbfb56a92020-09-18 11:57:24 +01001512
1513 if (!TEST_true(ptext_len == sizeof(kMsg)))
1514 goto done;
1515
1516 if (!TEST_true(memcmp(plaintext, kMsg, sizeof(kMsg)) == 0))
1517 goto done;
1518 }
Jack Lloydddb634f2018-06-18 15:51:56 -04001519
1520 ret = 1;
1521done:
1522 EVP_PKEY_CTX_free(pctx);
1523 EVP_PKEY_CTX_free(kctx);
Paul Yang48037172018-09-04 17:21:10 +08001524 EVP_PKEY_CTX_free(sctx);
Jack Lloydddb634f2018-06-18 15:51:56 -04001525 EVP_PKEY_CTX_free(cctx);
1526 EVP_PKEY_free(pkey);
Matt Caswellbfb56a92020-09-18 11:57:24 +01001527 EVP_PKEY_free(pkeyparams);
Jack Lloydddb634f2018-06-18 15:51:56 -04001528 EVP_MD_CTX_free(md_ctx);
1529 EVP_MD_CTX_free(md_ctx_verify);
Richard Levitte42423ac2021-03-10 12:53:51 +01001530 EVP_MD_free(check_md);
Jack Lloydddb634f2018-06-18 15:51:56 -04001531 OPENSSL_free(sig);
1532 return ret;
1533}
1534
1535#endif
1536
Matt Caswellbb5f2812018-06-01 15:06:52 +01001537static struct keys_st {
1538 int type;
1539 char *priv;
1540 char *pub;
1541} keys[] = {
1542 {
1543 EVP_PKEY_HMAC, "0123456789", NULL
1544 }, {
1545 EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
1546 }, {
1547 EVP_PKEY_SIPHASH, "0123456789012345", NULL
Matt Caswell896dcb82018-06-08 11:20:34 +01001548 },
1549#ifndef OPENSSL_NO_EC
1550 {
Matt Caswellbb5f2812018-06-01 15:06:52 +01001551 EVP_PKEY_X25519, "01234567890123456789012345678901",
1552 "abcdefghijklmnopqrstuvwxyzabcdef"
1553 }, {
1554 EVP_PKEY_ED25519, "01234567890123456789012345678901",
1555 "abcdefghijklmnopqrstuvwxyzabcdef"
1556 }, {
1557 EVP_PKEY_X448,
1558 "01234567890123456789012345678901234567890123456789012345",
1559 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
1560 }, {
1561 EVP_PKEY_ED448,
1562 "012345678901234567890123456789012345678901234567890123456",
1563 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde"
1564 }
Matt Caswell896dcb82018-06-08 11:20:34 +01001565#endif
Matt Caswellbb5f2812018-06-01 15:06:52 +01001566};
1567
Matt Caswell86dc26b2020-04-27 17:17:05 +01001568static int test_set_get_raw_keys_int(int tst, int pub, int uselibctx)
Matt Caswellbb5f2812018-06-01 15:06:52 +01001569{
1570 int ret = 0;
1571 unsigned char buf[80];
1572 unsigned char *in;
1573 size_t inlen, len = 0;
1574 EVP_PKEY *pkey;
1575
Jon Spillett062490d2021-03-09 20:42:57 +10001576 if (nullprov != NULL)
1577 return TEST_skip("Test does not support a non-default library context");
1578
Matt Caswellbb5f2812018-06-01 15:06:52 +01001579 /* Check if this algorithm supports public keys */
1580 if (keys[tst].pub == NULL)
1581 return 1;
1582
1583 memset(buf, 0, sizeof(buf));
1584
1585 if (pub) {
1586 inlen = strlen(keys[tst].pub);
1587 in = (unsigned char *)keys[tst].pub;
Matt Caswell86dc26b2020-04-27 17:17:05 +01001588 if (uselibctx) {
Matt Caswelld8652be2020-09-24 10:42:23 +01001589 pkey = EVP_PKEY_new_raw_public_key_ex(
Matt Caswell86dc26b2020-04-27 17:17:05 +01001590 testctx,
1591 OBJ_nid2sn(keys[tst].type),
1592 NULL,
1593 in,
1594 inlen);
1595 } else {
1596 pkey = EVP_PKEY_new_raw_public_key(keys[tst].type,
1597 NULL,
1598 in,
1599 inlen);
1600 }
Matt Caswellbb5f2812018-06-01 15:06:52 +01001601 } else {
1602 inlen = strlen(keys[tst].priv);
1603 in = (unsigned char *)keys[tst].priv;
Matt Caswell86dc26b2020-04-27 17:17:05 +01001604 if (uselibctx) {
Matt Caswelld8652be2020-09-24 10:42:23 +01001605 pkey = EVP_PKEY_new_raw_private_key_ex(
Matt Caswell86dc26b2020-04-27 17:17:05 +01001606 testctx, OBJ_nid2sn(keys[tst].type),
1607 NULL,
1608 in,
1609 inlen);
1610 } else {
1611 pkey = EVP_PKEY_new_raw_private_key(keys[tst].type,
1612 NULL,
1613 in,
1614 inlen);
1615 }
Matt Caswellbb5f2812018-06-01 15:06:52 +01001616 }
1617
1618 if (!TEST_ptr(pkey)
1619 || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
1620 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
1621 || !TEST_true(len == inlen)
1622 || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, buf, &len)))
1623 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, buf, &len)))
1624 || !TEST_mem_eq(in, inlen, buf, len))
1625 goto done;
1626
1627 ret = 1;
1628 done:
1629 EVP_PKEY_free(pkey);
1630 return ret;
1631}
1632
1633static int test_set_get_raw_keys(int tst)
1634{
Matt Caswell86dc26b2020-04-27 17:17:05 +01001635 return test_set_get_raw_keys_int(tst, 0, 0)
1636 && test_set_get_raw_keys_int(tst, 0, 1)
1637 && test_set_get_raw_keys_int(tst, 1, 0)
1638 && test_set_get_raw_keys_int(tst, 1, 1);
Matt Caswellbb5f2812018-06-01 15:06:52 +01001639}
1640
Pauli41bbba52020-02-13 11:00:57 +10001641#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001642static int pkey_custom_check(EVP_PKEY *pkey)
1643{
1644 return 0xbeef;
1645}
1646
Paul Yangb0004702017-11-01 00:45:24 +08001647static int pkey_custom_pub_check(EVP_PKEY *pkey)
1648{
1649 return 0xbeef;
1650}
1651
1652static int pkey_custom_param_check(EVP_PKEY *pkey)
1653{
1654 return 0xbeef;
1655}
1656
Paul Yang2aee35d2017-09-04 22:02:59 +08001657static EVP_PKEY_METHOD *custom_pmeth;
Pauli41bbba52020-02-13 11:00:57 +10001658#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001659
1660static int test_EVP_PKEY_check(int i)
1661{
1662 int ret = 0;
Paul Yang2aee35d2017-09-04 22:02:59 +08001663 EVP_PKEY *pkey = NULL;
1664 EVP_PKEY_CTX *ctx = NULL;
Pauli41bbba52020-02-13 11:00:57 +10001665#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001666 EVP_PKEY_CTX *ctx2 = NULL;
Pauli41bbba52020-02-13 11:00:57 +10001667#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001668 const APK_DATA *ak = &keycheckdata[i];
1669 const unsigned char *input = ak->kder;
1670 size_t input_len = ak->size;
1671 int expected_id = ak->evptype;
1672 int expected_check = ak->check;
Paul Yangb0004702017-11-01 00:45:24 +08001673 int expected_pub_check = ak->pub_check;
1674 int expected_param_check = ak->param_check;
1675 int type = ak->type;
Paul Yang2aee35d2017-09-04 22:02:59 +08001676
Shane Lontis5b5eea42020-10-15 13:41:59 +10001677 if (!TEST_ptr(pkey = load_example_key(ak->keytype, input, input_len)))
1678 goto done;
1679 if (type == 0
1680 && !TEST_int_eq(EVP_PKEY_id(pkey), expected_id))
1681 goto done;
Paul Yang2aee35d2017-09-04 22:02:59 +08001682
Jon Spillett062490d2021-03-09 20:42:57 +10001683 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
Paul Yang2aee35d2017-09-04 22:02:59 +08001684 goto done;
1685
Paul Yangb0004702017-11-01 00:45:24 +08001686 if (!TEST_int_eq(EVP_PKEY_check(ctx), expected_check))
1687 goto done;
1688
1689 if (!TEST_int_eq(EVP_PKEY_public_check(ctx), expected_pub_check))
1690 goto done;
1691
1692 if (!TEST_int_eq(EVP_PKEY_param_check(ctx), expected_param_check))
1693 goto done;
Paul Yang2aee35d2017-09-04 22:02:59 +08001694
Pauli41bbba52020-02-13 11:00:57 +10001695#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001696 ctx2 = EVP_PKEY_CTX_new_id(0xdefaced, NULL);
1697 /* assign the pkey directly, as an internal test */
1698 EVP_PKEY_up_ref(pkey);
1699 ctx2->pkey = pkey;
1700
1701 if (!TEST_int_eq(EVP_PKEY_check(ctx2), 0xbeef))
1702 goto done;
1703
Paul Yangb0004702017-11-01 00:45:24 +08001704 if (!TEST_int_eq(EVP_PKEY_public_check(ctx2), 0xbeef))
1705 goto done;
1706
1707 if (!TEST_int_eq(EVP_PKEY_param_check(ctx2), 0xbeef))
1708 goto done;
Pauli41bbba52020-02-13 11:00:57 +10001709#endif
Paul Yangb0004702017-11-01 00:45:24 +08001710
Paul Yang2aee35d2017-09-04 22:02:59 +08001711 ret = 1;
1712
1713 done:
1714 EVP_PKEY_CTX_free(ctx);
Pauli41bbba52020-02-13 11:00:57 +10001715#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001716 EVP_PKEY_CTX_free(ctx2);
Pauli41bbba52020-02-13 11:00:57 +10001717#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001718 EVP_PKEY_free(pkey);
1719 return ret;
1720}
1721
Richard Levittefab8fde2020-05-14 17:15:05 +02001722#ifndef OPENSSL_NO_CMAC
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001723static int get_cmac_val(EVP_PKEY *pkey, unsigned char *mac)
1724{
1725 EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
1726 const char msg[] = "Hello World";
1727 size_t maclen;
1728 int ret = 1;
1729
1730 if (!TEST_ptr(mdctx)
Jon Spillett062490d2021-03-09 20:42:57 +10001731 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, NULL, testctx,
1732 testpropq, pkey, NULL))
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001733 || !TEST_true(EVP_DigestSignUpdate(mdctx, msg, sizeof(msg)))
1734 || !TEST_true(EVP_DigestSignFinal(mdctx, mac, &maclen))
1735 || !TEST_size_t_eq(maclen, AES_BLOCK_SIZE))
1736 ret = 0;
1737
1738 EVP_MD_CTX_free(mdctx);
1739
1740 return ret;
1741}
Richard Levittea87820e2020-05-12 15:27:32 +02001742static int test_CMAC_keygen(void)
1743{
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001744 static unsigned char key[] = {
1745 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1746 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1747 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
1748 };
Jon Spillett062490d2021-03-09 20:42:57 +10001749 EVP_PKEY_CTX *kctx = NULL;
Richard Levittea87820e2020-05-12 15:27:32 +02001750 int ret = 0;
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001751 EVP_PKEY *pkey = NULL;
Rich Salza3d267f2020-12-08 10:13:54 -05001752 unsigned char mac[AES_BLOCK_SIZE];
1753# if !defined(OPENSSL_NO_DEPRECATED_3_0)
1754 unsigned char mac2[AES_BLOCK_SIZE];
1755# endif
Richard Levittea87820e2020-05-12 15:27:32 +02001756
Jon Spillett062490d2021-03-09 20:42:57 +10001757 if (nullprov != NULL)
1758 return TEST_skip("Test does not support a non-default library context");
1759
1760 /*
1761 * This is a legacy method for CMACs, but should still work.
1762 * This verifies that it works without an ENGINE.
1763 */
1764 kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_CMAC, NULL);
1765
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001766 /* Test a CMAC key created using the "generated" method */
1767 if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
1768 || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
1769 EVP_PKEY_CTRL_CIPHER,
1770 0, (void *)EVP_aes_256_ecb()), 0)
1771 || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
1772 EVP_PKEY_CTRL_SET_MAC_KEY,
1773 sizeof(key), (void *)key), 0)
1774 || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0)
1775 || !TEST_ptr(pkey)
1776 || !TEST_true(get_cmac_val(pkey, mac)))
Richard Levittea87820e2020-05-12 15:27:32 +02001777 goto done;
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001778
Rich Salza3d267f2020-12-08 10:13:54 -05001779# if !defined(OPENSSL_NO_DEPRECATED_3_0)
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001780 EVP_PKEY_free(pkey);
1781
1782 /*
1783 * Test a CMAC key using the direct method, and compare with the mac
1784 * created above.
1785 */
1786 pkey = EVP_PKEY_new_CMAC_key(NULL, key, sizeof(key), EVP_aes_256_ecb());
1787 if (!TEST_ptr(pkey)
1788 || !TEST_true(get_cmac_val(pkey, mac2))
1789 || !TEST_mem_eq(mac, sizeof(mac), mac2, sizeof(mac2)))
1790 goto done;
Rich Salza3d267f2020-12-08 10:13:54 -05001791# endif
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001792
Richard Levittea87820e2020-05-12 15:27:32 +02001793 ret = 1;
1794
1795 done:
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001796 EVP_PKEY_free(pkey);
Richard Levittea87820e2020-05-12 15:27:32 +02001797 EVP_PKEY_CTX_free(kctx);
1798 return ret;
1799}
Richard Levittefab8fde2020-05-14 17:15:05 +02001800#endif
Richard Levittea87820e2020-05-12 15:27:32 +02001801
Matt Caswell10d5b412018-10-26 12:45:27 +01001802static int test_HKDF(void)
1803{
1804 EVP_PKEY_CTX *pctx;
1805 unsigned char out[20];
1806 size_t outlen;
1807 int i, ret = 0;
1808 unsigned char salt[] = "0123456789";
1809 unsigned char key[] = "012345678901234567890123456789";
1810 unsigned char info[] = "infostring";
1811 const unsigned char expected[] = {
1812 0xe5, 0x07, 0x70, 0x7f, 0xc6, 0x78, 0xd6, 0x54, 0x32, 0x5f, 0x7e, 0xc5,
1813 0x7b, 0x59, 0x3e, 0xd8, 0x03, 0x6b, 0xed, 0xca
1814 };
1815 size_t expectedlen = sizeof(expected);
1816
Jon Spillett062490d2021-03-09 20:42:57 +10001817 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
Matt Caswell10d5b412018-10-26 12:45:27 +01001818 goto done;
1819
1820 /* We do this twice to test reuse of the EVP_PKEY_CTX */
1821 for (i = 0; i < 2; i++) {
1822 outlen = sizeof(out);
1823 memset(out, 0, outlen);
1824
1825 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
1826 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
1827 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
1828 sizeof(salt) - 1), 0)
1829 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
1830 sizeof(key) - 1), 0)
1831 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
1832 sizeof(info) - 1), 0)
1833 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
1834 || !TEST_mem_eq(out, outlen, expected, expectedlen))
1835 goto done;
1836 }
1837
1838 ret = 1;
1839
1840 done:
1841 EVP_PKEY_CTX_free(pctx);
1842
1843 return ret;
1844}
1845
Benjamin Kaduk2cd3ebc2020-05-21 12:53:59 -07001846static int test_emptyikm_HKDF(void)
1847{
1848 EVP_PKEY_CTX *pctx;
1849 unsigned char out[20];
1850 size_t outlen;
1851 int ret = 0;
1852 unsigned char salt[] = "9876543210";
1853 unsigned char key[] = "";
1854 unsigned char info[] = "stringinfo";
1855 const unsigned char expected[] = {
1856 0x68, 0x81, 0xa5, 0x3e, 0x5b, 0x9c, 0x7b, 0x6f, 0x2e, 0xec, 0xc8, 0x47,
1857 0x7c, 0xfa, 0x47, 0x35, 0x66, 0x82, 0x15, 0x30
1858 };
1859 size_t expectedlen = sizeof(expected);
1860
Jon Spillett062490d2021-03-09 20:42:57 +10001861 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
Benjamin Kaduk2cd3ebc2020-05-21 12:53:59 -07001862 goto done;
1863
1864 outlen = sizeof(out);
1865 memset(out, 0, outlen);
1866
1867 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
1868 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
1869 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
1870 sizeof(salt) - 1), 0)
1871 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
1872 sizeof(key) - 1), 0)
1873 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
1874 sizeof(info) - 1), 0)
1875 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
1876 || !TEST_mem_eq(out, outlen, expected, expectedlen))
1877 goto done;
1878
1879 ret = 1;
1880
1881 done:
1882 EVP_PKEY_CTX_free(pctx);
1883
1884 return ret;
1885}
1886
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001887#ifndef OPENSSL_NO_EC
1888static int test_X509_PUBKEY_inplace(void)
1889{
Pauli808c63c2021-03-25 12:05:54 +10001890 int ret = 0;
1891 X509_PUBKEY *xp = NULL;
1892 const unsigned char *p = kExampleECPubKeyDER;
1893 size_t input_len = sizeof(kExampleECPubKeyDER);
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001894
Pauli808c63c2021-03-25 12:05:54 +10001895 if (!TEST_ptr(xp = d2i_X509_PUBKEY(NULL, &p, input_len)))
1896 goto done;
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001897
Pauli808c63c2021-03-25 12:05:54 +10001898 if (!TEST_ptr(X509_PUBKEY_get0(xp)))
1899 goto done;
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001900
Pauli808c63c2021-03-25 12:05:54 +10001901 p = kExampleBadECPubKeyDER;
1902 input_len = sizeof(kExampleBadECPubKeyDER);
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001903
Pauli808c63c2021-03-25 12:05:54 +10001904 if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len)))
1905 goto done;
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001906
Pauli808c63c2021-03-25 12:05:54 +10001907 if (!TEST_true(X509_PUBKEY_get0(xp) == NULL))
1908 goto done;
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001909
Pauli808c63c2021-03-25 12:05:54 +10001910 ret = 1;
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001911
Pauli808c63c2021-03-25 12:05:54 +10001912 done:
1913 X509_PUBKEY_free(xp);
1914 return ret;
1915}
1916
1917static int test_X509_PUBKEY_dup(void)
1918{
1919 int ret = 0;
1920 X509_PUBKEY *xp = NULL, *xq = NULL;
1921 const unsigned char *p = kExampleECPubKeyDER;
1922 size_t input_len = sizeof(kExampleECPubKeyDER);
1923
1924 if (!TEST_ptr(xp = d2i_X509_PUBKEY(NULL, &p, input_len))
1925 || !TEST_ptr(xq = X509_PUBKEY_dup(xp))
1926 || !TEST_ptr_ne(xp, xq))
1927 goto done;
1928
1929 if (!TEST_ptr(X509_PUBKEY_get0(xq))
1930 || !TEST_ptr(X509_PUBKEY_get0(xp))
1931 || !TEST_ptr_eq(X509_PUBKEY_get0(xq), X509_PUBKEY_get0(xp)))
1932 goto done;
1933
1934 X509_PUBKEY_free(xq);
1935 xq = NULL;
1936 p = kExampleBadECPubKeyDER;
1937 input_len = sizeof(kExampleBadECPubKeyDER);
1938
1939 if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len))
1940 || !TEST_ptr(xq = X509_PUBKEY_dup(xp)))
1941 goto done;
1942
1943 X509_PUBKEY_free(xp);
1944 xp = NULL;
1945 if (!TEST_true(X509_PUBKEY_get0(xq) == NULL))
1946 goto done;
1947
1948 ret = 1;
1949
1950 done:
1951 X509_PUBKEY_free(xp);
1952 X509_PUBKEY_free(xq);
1953 return ret;
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001954}
Shane Lontis7bb82f92019-09-15 19:55:10 +10001955#endif /* OPENSSL_NO_EC */
Shane Lontis784883f2019-08-19 09:30:59 +10001956
Matt Caswell9c452222019-09-04 12:46:02 +01001957/* Test getting and setting parameters on an EVP_PKEY_CTX */
Richard Levittef54a4102019-12-02 11:26:15 +01001958static int test_EVP_PKEY_CTX_get_set_params(EVP_PKEY *pkey)
Matt Caswell9c452222019-09-04 12:46:02 +01001959{
Matt Caswell9a071fe2019-09-25 11:49:04 +01001960 EVP_MD_CTX *mdctx = NULL;
Matt Caswell9c452222019-09-04 12:46:02 +01001961 EVP_PKEY_CTX *ctx = NULL;
Matt Caswell9c452222019-09-04 12:46:02 +01001962 const OSSL_PARAM *params;
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001963 OSSL_PARAM ourparams[2], *param = ourparams, *param_md;
Matt Caswell9c452222019-09-04 12:46:02 +01001964 int ret = 0;
1965 const EVP_MD *md;
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001966 char mdname[OSSL_MAX_NAME_SIZE];
Matt Caswell9a071fe2019-09-25 11:49:04 +01001967 char ssl3ms[48];
Matt Caswell9c452222019-09-04 12:46:02 +01001968
Matt Caswell9c452222019-09-04 12:46:02 +01001969 /* Initialise a sign operation */
Jon Spillett062490d2021-03-09 20:42:57 +10001970 ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq);
Matt Caswell9c452222019-09-04 12:46:02 +01001971 if (!TEST_ptr(ctx)
Richard Levittec9c4a352019-10-30 17:06:48 +01001972 || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0))
Matt Caswell9c452222019-09-04 12:46:02 +01001973 goto err;
1974
1975 /*
Richard Levittef54a4102019-12-02 11:26:15 +01001976 * We should be able to query the parameters now.
Matt Caswell9c452222019-09-04 12:46:02 +01001977 */
1978 params = EVP_PKEY_CTX_settable_params(ctx);
1979 if (!TEST_ptr(params)
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001980 || !TEST_ptr(OSSL_PARAM_locate_const(params,
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001981 OSSL_SIGNATURE_PARAM_DIGEST)))
Matt Caswell9c452222019-09-04 12:46:02 +01001982 goto err;
1983
Matt Caswell9c452222019-09-04 12:46:02 +01001984 params = EVP_PKEY_CTX_gettable_params(ctx);
1985 if (!TEST_ptr(params)
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001986 || !TEST_ptr(OSSL_PARAM_locate_const(params,
1987 OSSL_SIGNATURE_PARAM_ALGORITHM_ID))
1988 || !TEST_ptr(OSSL_PARAM_locate_const(params,
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001989 OSSL_SIGNATURE_PARAM_DIGEST)))
Matt Caswell9c452222019-09-04 12:46:02 +01001990 goto err;
1991
1992 /*
1993 * Test getting and setting params via EVP_PKEY_CTX_set_params() and
1994 * EVP_PKEY_CTX_get_params()
1995 */
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001996 strcpy(mdname, "SHA512");
1997 param_md = param;
1998 *param++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1999 mdname, 0);
Matt Caswell9c452222019-09-04 12:46:02 +01002000 *param++ = OSSL_PARAM_construct_end();
2001
2002 if (!TEST_true(EVP_PKEY_CTX_set_params(ctx, ourparams)))
2003 goto err;
2004
Richard Levitte00bc1ad2020-02-02 12:55:05 +01002005 mdname[0] = '\0';
2006 *param_md = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2007 mdname, sizeof(mdname));
Matt Caswell9c452222019-09-04 12:46:02 +01002008 if (!TEST_true(EVP_PKEY_CTX_get_params(ctx, ourparams))
Richard Levitte00bc1ad2020-02-02 12:55:05 +01002009 || !TEST_str_eq(mdname, "SHA512"))
Matt Caswell9c452222019-09-04 12:46:02 +01002010 goto err;
2011
2012 /*
2013 * Test the TEST_PKEY_CTX_set_signature_md() and
2014 * TEST_PKEY_CTX_get_signature_md() functions
2015 */
2016 if (!TEST_int_gt(EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()), 0)
2017 || !TEST_int_gt(EVP_PKEY_CTX_get_signature_md(ctx, &md), 0)
2018 || !TEST_ptr_eq(md, EVP_sha256()))
2019 goto err;
2020
Matt Caswell9a071fe2019-09-25 11:49:04 +01002021 /*
2022 * Test getting MD parameters via an associated EVP_PKEY_CTX
2023 */
2024 mdctx = EVP_MD_CTX_new();
2025 if (!TEST_ptr(mdctx)
Jon Spillett062490d2021-03-09 20:42:57 +10002026 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, "SHA1", testctx, testpropq,
Pauliaf6171b2021-03-02 22:41:24 +10002027 pkey, NULL)))
Matt Caswell9a071fe2019-09-25 11:49:04 +01002028 goto err;
2029
2030 /*
2031 * We now have an EVP_MD_CTX with an EVP_PKEY_CTX inside it. We should be
2032 * able to obtain the digest's settable parameters from the provider.
2033 */
2034 params = EVP_MD_CTX_settable_params(mdctx);
2035 if (!TEST_ptr(params)
2036 || !TEST_int_eq(strcmp(params[0].key, OSSL_DIGEST_PARAM_SSL3_MS), 0)
2037 /* The final key should be NULL */
2038 || !TEST_ptr_null(params[1].key))
2039 goto err;
2040
2041 param = ourparams;
2042 memset(ssl3ms, 0, sizeof(ssl3ms));
2043 *param++ = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
2044 ssl3ms, sizeof(ssl3ms));
2045 *param++ = OSSL_PARAM_construct_end();
2046
2047 if (!TEST_true(EVP_MD_CTX_set_params(mdctx, ourparams)))
2048 goto err;
2049
Matt Caswell9c452222019-09-04 12:46:02 +01002050 ret = 1;
2051
2052 err:
Matt Caswell9a071fe2019-09-25 11:49:04 +01002053 EVP_MD_CTX_free(mdctx);
Matt Caswell9c452222019-09-04 12:46:02 +01002054 EVP_PKEY_CTX_free(ctx);
Richard Levittef54a4102019-12-02 11:26:15 +01002055
2056 return ret;
2057}
2058
2059#ifndef OPENSSL_NO_DSA
2060static int test_DSA_get_set_params(void)
2061{
Richard Levitte6ed40222020-12-18 13:17:33 +01002062 OSSL_PARAM_BLD *bld = NULL;
2063 OSSL_PARAM *params = NULL;
Richard Levittef54a4102019-12-02 11:26:15 +01002064 BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
Richard Levitte6ed40222020-12-18 13:17:33 +01002065 EVP_PKEY_CTX *pctx = NULL;
Richard Levittef54a4102019-12-02 11:26:15 +01002066 EVP_PKEY *pkey = NULL;
2067 int ret = 0;
2068
2069 /*
2070 * Setup the parameters for our DSA object. For our purposes they don't
2071 * have to actually be *valid* parameters. We just need to set something.
2072 */
Richard Levitte6ed40222020-12-18 13:17:33 +01002073 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "DSA", NULL))
2074 || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2075 || !TEST_ptr(p = BN_new())
2076 || !TEST_ptr(q = BN_new())
2077 || !TEST_ptr(g = BN_new())
2078 || !TEST_ptr(pub = BN_new())
2079 || !TEST_ptr(priv = BN_new()))
Richard Levittef54a4102019-12-02 11:26:15 +01002080 goto err;
Richard Levitte6ed40222020-12-18 13:17:33 +01002081 if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
2082 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
2083 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
2084 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
2085 pub))
2086 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
2087 priv)))
2088 goto err;
2089 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
Richard Levittef54a4102019-12-02 11:26:15 +01002090 goto err;
2091
Shane Lontis2db985b2021-02-05 13:55:50 +10002092 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2093 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2094 params), 0))
Richard Levitte6ed40222020-12-18 13:17:33 +01002095 goto err;
2096
2097 if (!TEST_ptr(pkey))
2098 goto err;
Richard Levittef54a4102019-12-02 11:26:15 +01002099
2100 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2101
2102 err:
Matt Caswell9c452222019-09-04 12:46:02 +01002103 EVP_PKEY_free(pkey);
Richard Levitte6ed40222020-12-18 13:17:33 +01002104 EVP_PKEY_CTX_free(pctx);
Shane Lontis3f883c72021-04-07 13:45:19 +10002105 OSSL_PARAM_free(params);
Richard Levitte6ed40222020-12-18 13:17:33 +01002106 OSSL_PARAM_BLD_free(bld);
Matt Caswell9c452222019-09-04 12:46:02 +01002107 BN_free(p);
2108 BN_free(q);
2109 BN_free(g);
Richard Levittecd32a0f2019-10-15 11:35:09 +02002110 BN_free(pub);
2111 BN_free(priv);
Matt Caswell9c452222019-09-04 12:46:02 +01002112
2113 return ret;
2114}
Jon Spillett2c04b342021-01-13 14:10:51 +10002115
2116/*
Matt Caswell8a9394c2021-01-21 09:19:16 +00002117 * Test combinations of private, public, missing and private + public key
Jon Spillett2c04b342021-01-13 14:10:51 +10002118 * params to ensure they are all accepted
2119 */
2120static int test_DSA_priv_pub(void)
2121{
2122 return test_EVP_PKEY_ffc_priv_pub("DSA");
2123}
2124
2125#endif /* !OPENSSL_NO_DSA */
Matt Caswell9c452222019-09-04 12:46:02 +01002126
Richard Levittef54a4102019-12-02 11:26:15 +01002127static int test_RSA_get_set_params(void)
2128{
Richard Levitted7e498a2020-10-04 16:34:31 +02002129 OSSL_PARAM_BLD *bld = NULL;
2130 OSSL_PARAM *params = NULL;
Richard Levittef54a4102019-12-02 11:26:15 +01002131 BIGNUM *n = NULL, *e = NULL, *d = NULL;
Richard Levitted7e498a2020-10-04 16:34:31 +02002132 EVP_PKEY_CTX *pctx = NULL;
Richard Levittef54a4102019-12-02 11:26:15 +01002133 EVP_PKEY *pkey = NULL;
2134 int ret = 0;
2135
2136 /*
2137 * Setup the parameters for our RSA object. For our purposes they don't
2138 * have to actually be *valid* parameters. We just need to set something.
2139 */
Richard Levitted7e498a2020-10-04 16:34:31 +02002140 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", NULL))
2141 || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2142 || !TEST_ptr(n = BN_new())
2143 || !TEST_ptr(e = BN_new())
2144 || !TEST_ptr(d = BN_new()))
Richard Levittef54a4102019-12-02 11:26:15 +01002145 goto err;
Richard Levitted7e498a2020-10-04 16:34:31 +02002146 if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
2147 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
2148 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d)))
2149 goto err;
2150 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
Richard Levittef54a4102019-12-02 11:26:15 +01002151 goto err;
2152
Shane Lontis2db985b2021-02-05 13:55:50 +10002153 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2154 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2155 params), 0))
Richard Levitted7e498a2020-10-04 16:34:31 +02002156 goto err;
2157
2158 if (!TEST_ptr(pkey))
2159 goto err;
Richard Levittef54a4102019-12-02 11:26:15 +01002160
2161 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2162
2163 err:
2164 EVP_PKEY_free(pkey);
Richard Levitted7e498a2020-10-04 16:34:31 +02002165 EVP_PKEY_CTX_free(pctx);
Shane Lontis3f883c72021-04-07 13:45:19 +10002166 OSSL_PARAM_free(params);
Richard Levitted7e498a2020-10-04 16:34:31 +02002167 OSSL_PARAM_BLD_free(bld);
Richard Levittef54a4102019-12-02 11:26:15 +01002168 BN_free(n);
2169 BN_free(e);
2170 BN_free(d);
2171
2172 return ret;
2173}
2174
Matt Caswellb4be6932019-05-31 14:32:55 +01002175#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2176static int test_decrypt_null_chunks(void)
2177{
2178 EVP_CIPHER_CTX* ctx = NULL;
Jon Spillett062490d2021-03-09 20:42:57 +10002179 EVP_CIPHER *cipher = NULL;
Matt Caswellb4be6932019-05-31 14:32:55 +01002180 const unsigned char key[32] = {
2181 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2182 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2183 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1
2184 };
2185 unsigned char iv[12] = {
2186 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
2187 };
2188 unsigned char msg[] = "It was the best of times, it was the worst of times";
2189 unsigned char ciphertext[80];
2190 unsigned char plaintext[80];
2191 /* We initialise tmp to a non zero value on purpose */
2192 int ctlen, ptlen, tmp = 99;
2193 int ret = 0;
2194 const int enc_offset = 10, dec_offset = 20;
2195
Jon Spillett062490d2021-03-09 20:42:57 +10002196 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, "ChaCha20-Poly1305", testpropq))
2197 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
2198 || !TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL,
Matt Caswellb4be6932019-05-31 14:32:55 +01002199 key, iv))
2200 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &ctlen, msg,
2201 enc_offset))
2202 /* Deliberate add a zero length update */
2203 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp, NULL,
2204 0))
2205 || !TEST_int_eq(tmp, 0)
2206 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp,
2207 msg + enc_offset,
2208 sizeof(msg) - enc_offset))
2209 || !TEST_int_eq(ctlen += tmp, sizeof(msg))
2210 || !TEST_true(EVP_EncryptFinal(ctx, ciphertext + ctlen, &tmp))
2211 || !TEST_int_eq(tmp, 0))
2212 goto err;
2213
2214 /* Deliberately initialise tmp to a non zero value */
2215 tmp = 99;
Jon Spillett062490d2021-03-09 20:42:57 +10002216 if (!TEST_true(EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv))
Matt Caswellb4be6932019-05-31 14:32:55 +01002217 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext, &ptlen, ciphertext,
2218 dec_offset))
2219 /*
2220 * Deliberately add a zero length update. We also deliberately do
2221 * this at a different offset than for encryption.
2222 */
2223 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp, NULL,
2224 0))
2225 || !TEST_int_eq(tmp, 0)
2226 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp,
2227 ciphertext + dec_offset,
2228 ctlen - dec_offset))
2229 || !TEST_int_eq(ptlen += tmp, sizeof(msg))
2230 || !TEST_true(EVP_DecryptFinal(ctx, plaintext + ptlen, &tmp))
2231 || !TEST_int_eq(tmp, 0)
2232 || !TEST_mem_eq(msg, sizeof(msg), plaintext, ptlen))
2233 goto err;
2234
2235 ret = 1;
2236 err:
2237 EVP_CIPHER_CTX_free(ctx);
Jon Spillett062490d2021-03-09 20:42:57 +10002238 EVP_CIPHER_free(cipher);
Matt Caswellb4be6932019-05-31 14:32:55 +01002239 return ret;
2240}
2241#endif /* !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) */
2242
Jon Spillett2c04b342021-01-13 14:10:51 +10002243#ifndef OPENSSL_NO_DH
2244/*
Matt Caswell8a9394c2021-01-21 09:19:16 +00002245 * Test combinations of private, public, missing and private + public key
Jon Spillett2c04b342021-01-13 14:10:51 +10002246 * params to ensure they are all accepted
2247 */
2248static int test_DH_priv_pub(void)
2249{
2250 return test_EVP_PKEY_ffc_priv_pub("DH");
2251}
2252
2253# ifndef OPENSSL_NO_DEPRECATED_3_0
Matt Caswelle295de12019-12-09 12:03:02 +00002254static int test_EVP_PKEY_set1_DH(void)
2255{
Shane Lontisca2bf552020-01-31 08:18:46 +10002256 DH *x942dh = NULL, *noqdh = NULL;
2257 EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
Matt Caswelle295de12019-12-09 12:03:02 +00002258 int ret = 0;
Shane Lontisca2bf552020-01-31 08:18:46 +10002259 BIGNUM *p, *g = NULL;
2260
2261 if (!TEST_ptr(p = BN_new())
2262 || !TEST_ptr(g = BN_new())
2263 || !BN_set_word(p, 9999)
2264 || !BN_set_word(g, 2)
2265 || !TEST_ptr(noqdh = DH_new())
2266 || !DH_set0_pqg(noqdh, p, NULL, g))
2267 goto err;
2268 p = g = NULL;
Matt Caswelle295de12019-12-09 12:03:02 +00002269
2270 x942dh = DH_get_2048_256();
Matt Caswelle295de12019-12-09 12:03:02 +00002271 pkey1 = EVP_PKEY_new();
2272 pkey2 = EVP_PKEY_new();
2273 if (!TEST_ptr(x942dh)
Shane Lontisca2bf552020-01-31 08:18:46 +10002274 || !TEST_ptr(noqdh)
Matt Caswelle295de12019-12-09 12:03:02 +00002275 || !TEST_ptr(pkey1)
2276 || !TEST_ptr(pkey2))
2277 goto err;
2278
2279 if(!TEST_true(EVP_PKEY_set1_DH(pkey1, x942dh))
2280 || !TEST_int_eq(EVP_PKEY_id(pkey1), EVP_PKEY_DHX))
2281 goto err;
2282
Shane Lontisca2bf552020-01-31 08:18:46 +10002283 if(!TEST_true(EVP_PKEY_set1_DH(pkey2, noqdh))
Matt Caswelle295de12019-12-09 12:03:02 +00002284 || !TEST_int_eq(EVP_PKEY_id(pkey2), EVP_PKEY_DH))
2285 goto err;
2286
2287 ret = 1;
2288 err:
Shane Lontisca2bf552020-01-31 08:18:46 +10002289 BN_free(p);
2290 BN_free(g);
Matt Caswelle295de12019-12-09 12:03:02 +00002291 EVP_PKEY_free(pkey1);
2292 EVP_PKEY_free(pkey2);
2293 DH_free(x942dh);
Shane Lontisca2bf552020-01-31 08:18:46 +10002294 DH_free(noqdh);
Matt Caswelle295de12019-12-09 12:03:02 +00002295
2296 return ret;
2297}
Jon Spillett2c04b342021-01-13 14:10:51 +10002298# endif /* !OPENSSL_NO_DEPRECATED_3_0 */
2299#endif /* !OPENSSL_NO_DH */
Matt Caswelle295de12019-12-09 12:03:02 +00002300
Richard Levitte8a5cb592020-04-15 13:36:19 +02002301/*
2302 * We test what happens with an empty template. For the sake of this test,
2303 * the template must be ignored, and we know that's the case for RSA keys
2304 * (this might arguably be a misfeature, but that's what we currently do,
2305 * even in provider code, since that's how the legacy RSA implementation
2306 * does things)
2307 */
2308static int test_keygen_with_empty_template(int n)
2309{
2310 EVP_PKEY_CTX *ctx = NULL;
2311 EVP_PKEY *pkey = NULL;
2312 EVP_PKEY *tkey = NULL;
2313 int ret = 0;
2314
Jon Spillett062490d2021-03-09 20:42:57 +10002315 if (nullprov != NULL)
2316 return TEST_skip("Test does not support a non-default library context");
2317
Richard Levitte8a5cb592020-04-15 13:36:19 +02002318 switch (n) {
2319 case 0:
2320 /* We do test with no template at all as well */
2321 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
2322 goto err;
2323 break;
2324 case 1:
2325 /* Here we create an empty RSA key that serves as our template */
2326 if (!TEST_ptr(tkey = EVP_PKEY_new())
2327 || !TEST_true(EVP_PKEY_set_type(tkey, EVP_PKEY_RSA))
2328 || !TEST_ptr(ctx = EVP_PKEY_CTX_new(tkey, NULL)))
2329 goto err;
2330 break;
2331 }
2332
2333 if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
2334 || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0))
2335 goto err;
2336
2337 ret = 1;
2338 err:
2339 EVP_PKEY_CTX_free(ctx);
2340 EVP_PKEY_free(pkey);
2341 EVP_PKEY_free(tkey);
2342 return ret;
2343}
2344
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002345/*
2346 * Test that we fail if we attempt to use an algorithm that is not available
Richard Levitte08497fc2020-09-04 10:52:20 +02002347 * in the current library context (unless we are using an algorithm that
2348 * should be made available via legacy codepaths).
2349 *
2350 * 0: RSA
2351 * 1: SM2
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002352 */
2353static int test_pkey_ctx_fail_without_provider(int tst)
2354{
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03002355 OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
Jon Spillett062490d2021-03-09 20:42:57 +10002356 OSSL_PROVIDER *tmpnullprov = NULL;
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002357 EVP_PKEY_CTX *pctx = NULL;
Richard Levitte08497fc2020-09-04 10:52:20 +02002358 const char *keytype = NULL;
2359 int expect_null = 0;
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002360 int ret = 0;
2361
2362 if (!TEST_ptr(tmpctx))
2363 goto err;
2364
Jon Spillett062490d2021-03-09 20:42:57 +10002365 tmpnullprov = OSSL_PROVIDER_load(tmpctx, "null");
2366 if (!TEST_ptr(tmpnullprov))
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002367 goto err;
2368
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002369 /*
Richard Levitte08497fc2020-09-04 10:52:20 +02002370 * We check for certain algos in the null provider.
2371 * If an algo is expected to have a provider keymgmt, contructing an
2372 * EVP_PKEY_CTX is expected to fail (return NULL).
2373 * Otherwise, if it's expected to have legacy support, contructing an
2374 * EVP_PKEY_CTX is expected to succeed (return non-NULL).
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002375 */
Richard Levitte08497fc2020-09-04 10:52:20 +02002376 switch (tst) {
2377 case 0:
2378 keytype = "RSA";
2379 expect_null = 1;
2380 break;
2381 case 1:
2382 keytype = "SM2";
Paul Yangd0b79f82020-03-04 23:49:43 +08002383 expect_null = 1;
Richard Levitte08497fc2020-09-04 10:52:20 +02002384#ifdef OPENSSL_NO_EC
2385 TEST_info("EC disable, skipping SM2 check...");
2386 goto end;
2387#endif
2388#ifdef OPENSSL_NO_SM2
2389 TEST_info("SM2 disable, skipping SM2 check...");
2390 goto end;
2391#endif
2392 break;
2393 default:
2394 TEST_error("No test for case %d", tst);
2395 goto err;
2396 }
2397
2398 pctx = EVP_PKEY_CTX_new_from_name(tmpctx, keytype, "");
2399 if (expect_null ? !TEST_ptr_null(pctx) : !TEST_ptr(pctx))
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002400 goto err;
2401
Richard Levitte08497fc2020-09-04 10:52:20 +02002402#if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_SM2)
2403 end:
2404#endif
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002405 ret = 1;
2406
2407 err:
2408 EVP_PKEY_CTX_free(pctx);
Jon Spillett062490d2021-03-09 20:42:57 +10002409 OSSL_PROVIDER_unload(tmpnullprov);
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03002410 OSSL_LIB_CTX_free(tmpctx);
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002411 return ret;
2412}
2413
Pauli1c19ff32020-06-11 11:07:13 +10002414static int test_rand_agglomeration(void)
2415{
2416 EVP_RAND *rand;
2417 EVP_RAND_CTX *ctx;
2418 OSSL_PARAM params[3], *p = params;
2419 int res;
2420 unsigned int step = 7;
2421 static unsigned char seed[] = "It does not matter how slowly you go "
2422 "as long as you do not stop.";
2423 unsigned char out[sizeof(seed)];
2424
2425 if (!TEST_int_ne(sizeof(seed) % step, 0)
Jon Spillett062490d2021-03-09 20:42:57 +10002426 || !TEST_ptr(rand = EVP_RAND_fetch(testctx, "TEST-RAND", testpropq)))
Pauli1c19ff32020-06-11 11:07:13 +10002427 return 0;
2428 ctx = EVP_RAND_CTX_new(rand, NULL);
2429 EVP_RAND_free(rand);
2430 if (!TEST_ptr(ctx))
2431 return 0;
2432
2433 memset(out, 0, sizeof(out));
2434 *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
2435 seed, sizeof(seed));
Pauli0d4460d2020-10-30 15:53:47 +10002436 *p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
Pauli1c19ff32020-06-11 11:07:13 +10002437 *p = OSSL_PARAM_construct_end();
Paulie494fac2021-04-16 09:13:43 +10002438 res = TEST_true(EVP_RAND_CTX_set_params(ctx, params))
Pauli1c19ff32020-06-11 11:07:13 +10002439 && TEST_true(EVP_RAND_generate(ctx, out, sizeof(out), 0, 1, NULL, 0))
2440 && TEST_mem_eq(seed, sizeof(seed), out, sizeof(out));
2441 EVP_RAND_CTX_free(ctx);
2442 return res;
2443}
2444
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002445/*
2446 * Test that we correctly return the original or "running" IV after
2447 * an encryption operation.
2448 * Run multiple times for some different relevant algorithms/modes.
2449 */
Tomas Mraza4afa6c2021-04-15 11:53:42 +02002450static int test_evp_iv_aes(int idx)
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002451{
2452 int ret = 0;
2453 EVP_CIPHER_CTX *ctx = NULL;
2454 unsigned char key[16] = {0x4c, 0x43, 0xdb, 0xdd, 0x42, 0x73, 0x47, 0xd1,
2455 0xe5, 0x62, 0x7d, 0xcd, 0x4d, 0x76, 0x4d, 0x57};
2456 unsigned char init_iv[EVP_MAX_IV_LENGTH] =
2457 {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98, 0x82,
2458 0x5a, 0x55, 0x91, 0x81, 0x42, 0xa8, 0x89, 0x34};
2459 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
2460 9, 10, 11, 12, 13, 14, 15, 16 };
2461 unsigned char ciphertext[32], oiv[16], iv[16];
2462 unsigned char *ref_iv;
2463 unsigned char cbc_state[16] = {0x10, 0x2f, 0x05, 0xcc, 0xc2, 0x55, 0x72, 0xb9,
2464 0x88, 0xe6, 0x4a, 0x17, 0x10, 0x74, 0x22, 0x5e};
2465
2466 unsigned char ofb_state[16] = {0x76, 0xe6, 0x66, 0x61, 0xd0, 0x8a, 0xe4, 0x64,
2467 0xdd, 0x66, 0xbf, 0x00, 0xf0, 0xe3, 0x6f, 0xfd};
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002468 unsigned char cfb_state[16] = {0x77, 0xe4, 0x65, 0x65, 0xd5, 0x8c, 0xe3, 0x6c,
2469 0xd4, 0x6c, 0xb4, 0x0c, 0xfd, 0xed, 0x60, 0xed};
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002470 unsigned char gcm_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
2471 0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
2472 unsigned char ccm_state[7] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98};
2473#ifndef OPENSSL_NO_OCB
2474 unsigned char ocb_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
2475 0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
2476#endif
2477 int len = sizeof(ciphertext);
2478 size_t ivlen, ref_len;
2479 const EVP_CIPHER *type = NULL;
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002480 int iv_reset = 0;
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002481
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002482 if (nullprov != NULL && idx < 6)
Jon Spillett062490d2021-03-09 20:42:57 +10002483 return TEST_skip("Test does not support a non-default library context");
2484
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002485 switch(idx) {
2486 case 0:
2487 type = EVP_aes_128_cbc();
2488 /* FALLTHROUGH */
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002489 case 6:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002490 type = (type != NULL) ? type :
Jon Spillett062490d2021-03-09 20:42:57 +10002491 EVP_CIPHER_fetch(testctx, "aes-128-cbc", testpropq);
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002492 ref_iv = cbc_state;
2493 ref_len = sizeof(cbc_state);
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002494 iv_reset = 1;
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002495 break;
2496 case 1:
2497 type = EVP_aes_128_ofb();
2498 /* FALLTHROUGH */
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002499 case 7:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002500 type = (type != NULL) ? type :
Jon Spillett062490d2021-03-09 20:42:57 +10002501 EVP_CIPHER_fetch(testctx, "aes-128-ofb", testpropq);
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002502 ref_iv = ofb_state;
2503 ref_len = sizeof(ofb_state);
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002504 iv_reset = 1;
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002505 break;
2506 case 2:
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002507 type = EVP_aes_128_cfb();
2508 /* FALLTHROUGH */
2509 case 8:
2510 type = (type != NULL) ? type :
2511 EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq);
2512 ref_iv = cfb_state;
2513 ref_len = sizeof(cfb_state);
2514 iv_reset = 1;
2515 break;
2516 case 3:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002517 type = EVP_aes_128_gcm();
2518 /* FALLTHROUGH */
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002519 case 9:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002520 type = (type != NULL) ? type :
Jon Spillett062490d2021-03-09 20:42:57 +10002521 EVP_CIPHER_fetch(testctx, "aes-128-gcm", testpropq);
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002522 ref_iv = gcm_state;
2523 ref_len = sizeof(gcm_state);
2524 break;
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002525 case 4:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002526 type = EVP_aes_128_ccm();
2527 /* FALLTHROUGH */
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002528 case 10:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002529 type = (type != NULL) ? type :
Jon Spillett062490d2021-03-09 20:42:57 +10002530 EVP_CIPHER_fetch(testctx, "aes-128-ccm", testpropq);
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002531 ref_iv = ccm_state;
2532 ref_len = sizeof(ccm_state);
2533 break;
2534#ifdef OPENSSL_NO_OCB
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002535 case 5:
2536 case 11:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002537 return 1;
2538#else
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002539 case 5:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002540 type = EVP_aes_128_ocb();
2541 /* FALLTHROUGH */
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002542 case 11:
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002543 type = (type != NULL) ? type :
Jon Spillett062490d2021-03-09 20:42:57 +10002544 EVP_CIPHER_fetch(testctx, "aes-128-ocb", testpropq);
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002545 ref_iv = ocb_state;
2546 ref_len = sizeof(ocb_state);
2547 break;
2548#endif
2549 default:
2550 return 0;
2551 }
2552
2553 if (!TEST_ptr(type)
2554 || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
2555 || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
2556 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
2557 (int)sizeof(msg)))
Tomas Mraz0d83b7b2021-01-14 15:19:46 +01002558 || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
2559 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002560 || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
2561 goto err;
2562 ivlen = EVP_CIPHER_CTX_iv_length(ctx);
2563 if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
2564 || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
2565 goto err;
2566
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002567 /* CBC, OFB, and CFB modes: the updated iv must be reset after reinit */
2568 if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
2569 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
2570 goto err;
2571 if (iv_reset) {
2572 if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
2573 goto err;
2574 } else {
2575 if (!TEST_mem_eq(ref_iv, ivlen, iv, ivlen))
2576 goto err;
2577 }
2578
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002579 ret = 1;
2580err:
2581 EVP_CIPHER_CTX_free(ctx);
Tomas Mraz4ec4b062021-04-09 12:01:16 +02002582 if (idx >= 6)
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002583 EVP_CIPHER_free((EVP_CIPHER *)type);
2584 return ret;
2585}
2586
Tomas Mraza4afa6c2021-04-15 11:53:42 +02002587#ifndef OPENSSL_NO_DES
2588static int test_evp_iv_des(int idx)
2589{
2590 int ret = 0;
2591 EVP_CIPHER_CTX *ctx = NULL;
2592 static const unsigned char key[24] = {
2593 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2594 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
2595 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
2596 };
2597 static const unsigned char init_iv[8] = {
2598 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
2599 };
2600 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
2601 9, 10, 11, 12, 13, 14, 15, 16 };
2602 unsigned char ciphertext[32], oiv[8], iv[8];
2603 unsigned const char *ref_iv;
2604 static const unsigned char cbc_state_des[8] = {
2605 0x4f, 0xa3, 0x85, 0xcd, 0x8b, 0xf3, 0x06, 0x2a
2606 };
2607 static const unsigned char cbc_state_3des[8] = {
2608 0x35, 0x27, 0x7d, 0x65, 0x6c, 0xfb, 0x50, 0xd9
2609 };
2610 static const unsigned char ofb_state_des[8] = {
2611 0xa7, 0x0d, 0x1d, 0x45, 0xf9, 0x96, 0x3f, 0x2c
2612 };
2613 static const unsigned char ofb_state_3des[8] = {
2614 0xab, 0x16, 0x24, 0xbb, 0x5b, 0xac, 0xed, 0x5e
2615 };
2616 static const unsigned char cfb_state_des[8] = {
2617 0x91, 0xeb, 0x6d, 0x29, 0x4b, 0x08, 0xbd, 0x73
2618 };
2619 static const unsigned char cfb_state_3des[8] = {
2620 0x34, 0xdd, 0xfb, 0x47, 0x33, 0x1c, 0x61, 0xf7
2621 };
2622 int len = sizeof(ciphertext);
2623 size_t ivlen, ref_len;
2624 EVP_CIPHER *type = NULL;
2625
2626 if (lgcyprov == NULL && idx < 3)
2627 return TEST_skip("Test requires legacy provider to be loaded");
2628
2629 switch(idx) {
2630 case 0:
2631 type = EVP_CIPHER_fetch(testctx, "des-cbc", testpropq);
2632 ref_iv = cbc_state_des;
2633 ref_len = sizeof(cbc_state_des);
2634 break;
2635 case 1:
2636 type = EVP_CIPHER_fetch(testctx, "des-ofb", testpropq);
2637 ref_iv = ofb_state_des;
2638 ref_len = sizeof(ofb_state_des);
2639 break;
2640 case 2:
2641 type = EVP_CIPHER_fetch(testctx, "des-cfb", testpropq);
2642 ref_iv = cfb_state_des;
2643 ref_len = sizeof(cfb_state_des);
2644 break;
2645 case 3:
2646 type = EVP_CIPHER_fetch(testctx, "des-ede3-cbc", testpropq);
2647 ref_iv = cbc_state_3des;
2648 ref_len = sizeof(cbc_state_3des);
2649 break;
2650 case 4:
2651 type = EVP_CIPHER_fetch(testctx, "des-ede3-ofb", testpropq);
2652 ref_iv = ofb_state_3des;
2653 ref_len = sizeof(ofb_state_3des);
2654 break;
2655 case 5:
2656 type = EVP_CIPHER_fetch(testctx, "des-ede3-cfb", testpropq);
2657 ref_iv = cfb_state_3des;
2658 ref_len = sizeof(cfb_state_3des);
2659 break;
2660 default:
2661 return 0;
2662 }
2663
2664 if (!TEST_ptr(type)
2665 || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
2666 || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
2667 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
2668 (int)sizeof(msg)))
2669 || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
2670 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
2671 || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
2672 goto err;
2673 ivlen = EVP_CIPHER_CTX_iv_length(ctx);
2674 if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
2675 || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
2676 goto err;
2677
2678 if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
2679 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
2680 goto err;
2681 if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
2682 goto err;
2683
2684 ret = 1;
2685err:
2686 EVP_CIPHER_CTX_free(ctx);
2687 EVP_CIPHER_free(type);
2688 return ret;
2689}
2690#endif
2691
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002692#ifndef OPENSSL_NO_EC
2693static int ecpub_nids[] = { NID_brainpoolP256r1, NID_X9_62_prime256v1,
2694 NID_secp384r1, NID_secp521r1, NID_sect233k1, NID_sect233r1, NID_sect283r1,
2695 NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1,
2696 NID_brainpoolP384r1, NID_brainpoolP512r1};
2697
2698static int test_ecpub(int idx)
2699{
Benjamin Kadukad7cb0b2021-02-19 13:46:49 -08002700 int ret = 0, len, savelen;
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002701 int nid;
2702 unsigned char buf[1024];
2703 unsigned char *p;
2704 EVP_PKEY *pkey = NULL;
2705 EVP_PKEY_CTX *ctx = NULL;
Benjamin Kaduk3d364722021-02-19 13:20:00 -08002706# ifndef OPENSSL_NO_DEPRECATED_3_0
2707 const unsigned char *q;
2708 EVP_PKEY *pkey2 = NULL;
2709 EC_KEY *ec = NULL;
2710# endif
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002711
Jon Spillett062490d2021-03-09 20:42:57 +10002712 if (nullprov != NULL)
2713 return TEST_skip("Test does not support a non-default library context");
2714
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002715 nid = ecpub_nids[idx];
2716
2717 ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
2718 if (!TEST_ptr(ctx)
2719 || !TEST_true(EVP_PKEY_keygen_init(ctx))
2720 || !TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid))
2721 || !TEST_true(EVP_PKEY_keygen(ctx, &pkey)))
2722 goto done;
2723 len = i2d_PublicKey(pkey, NULL);
Benjamin Kadukad7cb0b2021-02-19 13:46:49 -08002724 savelen = len;
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002725 if (!TEST_int_ge(len, 1)
2726 || !TEST_int_lt(len, 1024))
2727 goto done;
2728 p = buf;
2729 len = i2d_PublicKey(pkey, &p);
Benjamin Kadukad7cb0b2021-02-19 13:46:49 -08002730 if (!TEST_int_ge(len, 1)
2731 || !TEST_int_eq(len, savelen))
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002732 goto done;
2733
Benjamin Kaduk3d364722021-02-19 13:20:00 -08002734# ifndef OPENSSL_NO_DEPRECATED_3_0
2735 /* Now try to decode the just-created DER. */
2736 q = buf;
2737 if (!TEST_ptr((pkey2 = EVP_PKEY_new()))
2738 || !TEST_ptr((ec = EC_KEY_new_by_curve_name(nid)))
2739 || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey2, ec)))
2740 goto done;
2741 /* EC_KEY ownership transferred */
2742 ec = NULL;
2743 if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_EC, &pkey2, &q, savelen)))
2744 goto done;
2745 /* The keys should match. */
2746 if (!TEST_int_eq(EVP_PKEY_cmp(pkey, pkey2), 1))
2747 goto done;
2748# endif
2749
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002750 ret = 1;
2751
2752 done:
2753 EVP_PKEY_CTX_free(ctx);
2754 EVP_PKEY_free(pkey);
Benjamin Kaduk3d364722021-02-19 13:20:00 -08002755# ifndef OPENSSL_NO_DEPRECATED_3_0
2756 EVP_PKEY_free(pkey2);
2757 EC_KEY_free(ec);
2758# endif
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002759 return ret;
2760}
2761#endif
2762
Daniel Beveniuse947a062020-10-09 06:07:43 +02002763static int test_EVP_rsa_pss_with_keygen_bits(void)
2764{
Jon Spillett062490d2021-03-09 20:42:57 +10002765 int ret = 0;
2766 EVP_PKEY_CTX *ctx = NULL;
2767 EVP_PKEY *pkey = NULL;
2768 EVP_MD *md;
Daniel Beveniuse947a062020-10-09 06:07:43 +02002769
Jon Spillett062490d2021-03-09 20:42:57 +10002770 md = EVP_MD_fetch(testctx, "sha256", testpropq);
2771 ret = TEST_ptr(md)
2772 && TEST_ptr((ctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", testpropq)))
Daniel Beveniuse947a062020-10-09 06:07:43 +02002773 && TEST_true(EVP_PKEY_keygen_init(ctx))
2774 && TEST_int_gt(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 512), 0)
2775 && TEST_true(EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md))
2776 && TEST_true(EVP_PKEY_keygen(ctx, &pkey));
2777
Jon Spillett062490d2021-03-09 20:42:57 +10002778 EVP_MD_free(md);
Daniel Beveniuse947a062020-10-09 06:07:43 +02002779 EVP_PKEY_free(pkey);
2780 EVP_PKEY_CTX_free(ctx);
Daniel Beveniuse947a062020-10-09 06:07:43 +02002781 return ret;
2782}
2783
Matt Caswell5eb73cf2021-02-19 17:47:21 +00002784static int success = 1;
2785static void md_names(const char *name, void *vctx)
2786{
2787 OSSL_LIB_CTX *ctx = (OSSL_LIB_CTX *)vctx;
2788 /* Force a namemap update */
2789 EVP_CIPHER *aes128 = EVP_CIPHER_fetch(ctx, "AES-128-CBC", NULL);
2790
2791 if (!TEST_ptr(aes128))
2792 success = 0;
2793
2794 EVP_CIPHER_free(aes128);
2795}
2796
2797/*
2798 * Test that changing the namemap in a user callback works in a names_do_all
2799 * function.
2800 */
2801static int test_names_do_all(void)
2802{
2803 /* We use a custom libctx so that we know the state of the namemap */
2804 OSSL_LIB_CTX *ctx = OSSL_LIB_CTX_new();
2805 EVP_MD *sha256 = NULL;
2806 int testresult = 0;
2807
2808 if (!TEST_ptr(ctx))
2809 goto err;
2810
2811 sha256 = EVP_MD_fetch(ctx, "SHA2-256", NULL);
2812 if (!TEST_ptr(sha256))
2813 goto err;
2814
2815 /*
2816 * We loop through all the names for a given digest. This should still work
2817 * even if the namemap changes part way through.
2818 */
2819 if (!TEST_true(EVP_MD_names_do_all(sha256, md_names, ctx)))
2820 goto err;
2821
2822 if (!TEST_true(success))
2823 goto err;
2824
2825 testresult = 1;
2826 err:
2827 EVP_MD_free(sha256);
2828 OSSL_LIB_CTX_free(ctx);
2829 return testresult;
2830}
Daniel Beveniuse947a062020-10-09 06:07:43 +02002831
Jon Spillett062490d2021-03-09 20:42:57 +10002832typedef enum OPTION_choice {
2833 OPT_ERR = -1,
2834 OPT_EOF = 0,
2835 OPT_CONTEXT,
2836 OPT_TEST_ENUM
2837} OPTION_CHOICE;
2838
2839const OPTIONS *test_get_options(void)
2840{
2841 static const OPTIONS options[] = {
2842 OPT_TEST_OPTIONS_DEFAULT_USAGE,
2843 { "context", OPT_CONTEXT, '-', "Explicitly use a non-default library context" },
2844 { NULL }
2845 };
2846 return options;
2847}
2848
Pauliad887412017-07-18 11:48:27 +10002849int setup_tests(void)
Matt Caswell71ea6b42015-02-09 09:45:35 +00002850{
Jon Spillett062490d2021-03-09 20:42:57 +10002851 OPTION_CHOICE o;
Matt Caswell86dc26b2020-04-27 17:17:05 +01002852
Jon Spillett062490d2021-03-09 20:42:57 +10002853 while ((o = opt_next()) != OPT_EOF) {
2854 switch (o) {
2855 case OPT_CONTEXT:
2856 /* Set up an alternate library context */
2857 testctx = OSSL_LIB_CTX_new();
2858 if (!TEST_ptr(testctx))
2859 return 0;
2860 /* Swap the libctx to test non-default context only */
2861 nullprov = OSSL_PROVIDER_load(NULL, "null");
2862 deflprov = OSSL_PROVIDER_load(testctx, "default");
2863 lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
2864 break;
2865 case OPT_TEST_CASES:
2866 break;
2867 default:
2868 return 0;
2869 }
2870 }
Matt Caswell86dc26b2020-04-27 17:17:05 +01002871
Paulif9e504e2020-06-12 10:34:46 +10002872 ADD_TEST(test_EVP_set_default_properties);
Matt Caswell6d242fa2020-01-09 15:21:14 +00002873 ADD_ALL_TESTS(test_EVP_DigestSignInit, 9);
Rich Salzadcd8e32017-04-18 16:33:15 -04002874 ADD_TEST(test_EVP_DigestVerifyInit);
Tomas Mraz8d8dd092020-11-13 14:16:35 +01002875 ADD_TEST(test_EVP_Digest);
Shane Lontis2eb2b4f2018-09-06 08:34:45 +10002876 ADD_TEST(test_EVP_Enveloped);
Pauliad887412017-07-18 11:48:27 +10002877 ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
Richard Levitte29c49b22020-05-18 08:35:29 +02002878 ADD_TEST(test_privatekey_to_pkcs8);
Matt Caswella9880362015-02-26 10:35:50 +00002879#ifndef OPENSSL_NO_EC
Rich Salzadcd8e32017-04-18 16:33:15 -04002880 ADD_TEST(test_EVP_PKCS82PKEY);
Matt Caswella9880362015-02-26 10:35:50 +00002881#endif
Richard Levittef0c62c52020-09-11 08:36:54 +02002882#ifndef OPENSSL_NO_EC
2883 ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings));
2884#endif
Richard Levittef844f9e2020-04-13 22:34:56 +02002885#if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
Jack Lloydddb634f2018-06-18 15:51:56 -04002886 ADD_TEST(test_EVP_SM2);
Jack Lloyda6c4cb82018-09-04 23:25:29 +08002887 ADD_TEST(test_EVP_SM2_verify);
Jack Lloydddb634f2018-06-18 15:51:56 -04002888#endif
Matt Caswellbb5f2812018-06-01 15:06:52 +01002889 ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
Pauli41bbba52020-02-13 11:00:57 +10002890#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08002891 custom_pmeth = EVP_PKEY_meth_new(0xdefaced, 0);
2892 if (!TEST_ptr(custom_pmeth))
2893 return 0;
2894 EVP_PKEY_meth_set_check(custom_pmeth, pkey_custom_check);
Paul Yangb0004702017-11-01 00:45:24 +08002895 EVP_PKEY_meth_set_public_check(custom_pmeth, pkey_custom_pub_check);
2896 EVP_PKEY_meth_set_param_check(custom_pmeth, pkey_custom_param_check);
Paul Yang2aee35d2017-09-04 22:02:59 +08002897 if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
2898 return 0;
Pauli41bbba52020-02-13 11:00:57 +10002899#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08002900 ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
Richard Levittefab8fde2020-05-14 17:15:05 +02002901#ifndef OPENSSL_NO_CMAC
Richard Levittea87820e2020-05-12 15:27:32 +02002902 ADD_TEST(test_CMAC_keygen);
Richard Levittefab8fde2020-05-14 17:15:05 +02002903#endif
Matt Caswell10d5b412018-10-26 12:45:27 +01002904 ADD_TEST(test_HKDF);
Benjamin Kaduk2cd3ebc2020-05-21 12:53:59 -07002905 ADD_TEST(test_emptyikm_HKDF);
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01002906#ifndef OPENSSL_NO_EC
2907 ADD_TEST(test_X509_PUBKEY_inplace);
Pauli808c63c2021-03-25 12:05:54 +10002908 ADD_TEST(test_X509_PUBKEY_dup);
Shane Lontiscad83472019-03-27 17:38:28 +10002909 ADD_ALL_TESTS(test_invalide_ec_char2_pub_range_decode,
2910 OSSL_NELEM(ec_der_pub_keys));
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01002911#endif
Matt Caswell8d0f8c82019-09-11 10:04:23 +01002912#ifndef OPENSSL_NO_DSA
Richard Levittef54a4102019-12-02 11:26:15 +01002913 ADD_TEST(test_DSA_get_set_params);
Jon Spillett2c04b342021-01-13 14:10:51 +10002914 ADD_TEST(test_DSA_priv_pub);
Matt Caswell8d0f8c82019-09-11 10:04:23 +01002915#endif
Richard Levittef54a4102019-12-02 11:26:15 +01002916 ADD_TEST(test_RSA_get_set_params);
Matt Caswellb4be6932019-05-31 14:32:55 +01002917#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2918 ADD_TEST(test_decrypt_null_chunks);
2919#endif
Jon Spillett2c04b342021-01-13 14:10:51 +10002920#ifndef OPENSSL_NO_DH
2921 ADD_TEST(test_DH_priv_pub);
2922# ifndef OPENSSL_NO_DEPRECATED_3_0
Matt Caswelle295de12019-12-09 12:03:02 +00002923 ADD_TEST(test_EVP_PKEY_set1_DH);
Jon Spillett2c04b342021-01-13 14:10:51 +10002924# endif
Matt Caswell501fcfb2019-12-18 11:00:42 +00002925#endif
Matt Caswellb8a12722021-01-21 15:14:15 +00002926#ifndef OPENSSL_NO_EC
2927 ADD_TEST(test_EC_priv_pub);
2928# ifndef OPENSSL_NO_DEPRECATED_3_0
2929 ADD_TEST(test_EC_priv_only_legacy);
2930# endif
2931#endif
Richard Levitte8a5cb592020-04-15 13:36:19 +02002932 ADD_ALL_TESTS(test_keygen_with_empty_template, 2);
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002933 ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
Matt Caswelle295de12019-12-09 12:03:02 +00002934
Pauli1c19ff32020-06-11 11:07:13 +10002935 ADD_TEST(test_rand_agglomeration);
Tomas Mraza4afa6c2021-04-15 11:53:42 +02002936 ADD_ALL_TESTS(test_evp_iv_aes, 12);
2937#ifndef OPENSSL_NO_DES
2938 ADD_ALL_TESTS(test_evp_iv_des, 6);
2939#endif
Daniel Beveniuse947a062020-10-09 06:07:43 +02002940 ADD_TEST(test_EVP_rsa_pss_with_keygen_bits);
Benjamin Kadukc0ff1932021-01-25 12:19:16 -08002941#ifndef OPENSSL_NO_EC
2942 ADD_ALL_TESTS(test_ecpub, OSSL_NELEM(ecpub_nids));
2943#endif
Pauli1c19ff32020-06-11 11:07:13 +10002944
Matt Caswell5eb73cf2021-02-19 17:47:21 +00002945 ADD_TEST(test_names_do_all);
2946
Pauliad887412017-07-18 11:48:27 +10002947 return 1;
Matt Caswell71ea6b42015-02-09 09:45:35 +00002948}
Matt Caswell86dc26b2020-04-27 17:17:05 +01002949
2950void cleanup_tests(void)
2951{
Jon Spillett062490d2021-03-09 20:42:57 +10002952 OSSL_PROVIDER_unload(nullprov);
2953 OSSL_PROVIDER_unload(deflprov);
2954 OSSL_PROVIDER_unload(lgcyprov);
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03002955 OSSL_LIB_CTX_free(testctx);
Matt Caswell86dc26b2020-04-27 17:17:05 +01002956}