]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/evp_extra_test.c
Fix check of EVP_CIPHER_CTX_ctrl
[thirdparty/openssl.git] / test / evp_extra_test.c
1 /*
2 * Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /* We need to use some deprecated APIs */
11 #define OPENSSL_SUPPRESS_DEPRECATED
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <openssl/bio.h>
17 #include <openssl/conf.h>
18 #include <openssl/crypto.h>
19 #include <openssl/err.h>
20 #include <openssl/evp.h>
21 #include <openssl/x509.h>
22 #include <openssl/pem.h>
23 #include <openssl/kdf.h>
24 #include <openssl/provider.h>
25 #include <openssl/core_names.h>
26 #include <openssl/params.h>
27 #include <openssl/param_build.h>
28 #include <openssl/dsa.h>
29 #include <openssl/dh.h>
30 #include <openssl/aes.h>
31 #include <openssl/decoder.h>
32 #include <openssl/rsa.h>
33 #include <openssl/engine.h>
34 #include "testutil.h"
35 #include "internal/nelem.h"
36 #include "internal/sizes.h"
37 #include "crypto/evp.h"
38
39 static OSSL_LIB_CTX *testctx = NULL;
40 static char *testpropq = NULL;
41
42 static OSSL_PROVIDER *nullprov = NULL;
43 static OSSL_PROVIDER *deflprov = NULL;
44 static OSSL_PROVIDER *lgcyprov = NULL;
45
46 /*
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 */
50 static 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
104 /*
105 * 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 */
108 #ifndef OPENSSL_NO_DSA
109 static 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 };
149 #endif
150
151 /*
152 * kExampleBadRSAKeyDER is an RSA private key in ASN.1, DER format. The private
153 * components are not correct.
154 */
155 static 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
247 static const unsigned char kMsg[] = { 1, 2, 3, 4 };
248
249 static 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 */
267 static 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
323 #ifndef OPENSSL_NO_EC
324 /*
325 * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
326 * structure.
327 */
328 static 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 */
346 static 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 };
357
358 /* prime256v1 */
359 static 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
370 /*
371 * kExampleBadECPubKeyDER is a sample EC public key with a wrong OID
372 * 1.2.840.10045.2.2 instead of 1.2.840.10045.2.1 - EC Public Key
373 */
374 static 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
385 static const unsigned char pExampleECParamDER[] = {
386 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
387 };
388
389 static 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
396 static 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
403 # ifndef OPENSSL_NO_DEPRECATED_3_0
404 static const unsigned char kExampleX25519KeyDER[] = {
405 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e,
406 0x04, 0x22, 0x04, 0x20, 0xa0, 0x24, 0x3a, 0x31, 0x24, 0xc3, 0x3f, 0xf6,
407 0x7b, 0x96, 0x0b, 0xd4, 0x8f, 0xd1, 0xee, 0x67, 0xf2, 0x9b, 0x88, 0xac,
408 0x50, 0xce, 0x97, 0x36, 0xdd, 0xaf, 0x25, 0xf6, 0x10, 0x34, 0x96, 0x6e
409 };
410 # endif
411 #endif
412
413 /* kExampleDHKeyDER is a DH private key in ASN.1, DER format. */
414 #ifndef OPENSSL_NO_DEPRECATED_3_0
415 # ifndef OPENSSL_NO_DH
416 static const unsigned char kExampleDHKeyDER[] = {
417 0x30, 0x82, 0x01, 0x21, 0x02, 0x01, 0x00, 0x30, 0x81, 0x95, 0x06, 0x09,
418 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x03, 0x01, 0x30, 0x81, 0x87,
419 0x02, 0x81, 0x81, 0x00, 0xf7, 0x52, 0xc2, 0x68, 0xcc, 0x66, 0xc4, 0x8d,
420 0x03, 0x3f, 0xfa, 0x9c, 0x52, 0xd0, 0xd8, 0x33, 0xf2, 0xe1, 0xc9, 0x9e,
421 0xb7, 0xe7, 0x6e, 0x90, 0x97, 0xeb, 0x92, 0x91, 0x6a, 0x9a, 0x85, 0x63,
422 0x92, 0x79, 0xab, 0xb6, 0x3d, 0x23, 0x58, 0x5a, 0xe8, 0x45, 0x06, 0x81,
423 0x97, 0x77, 0xe1, 0xcc, 0x34, 0x4e, 0xae, 0x36, 0x80, 0xf2, 0xc4, 0x7f,
424 0x8a, 0x52, 0xb8, 0xdb, 0x58, 0xc8, 0x4b, 0x12, 0x4c, 0xf1, 0x4c, 0x53,
425 0xc1, 0x89, 0x39, 0x8d, 0xb6, 0x06, 0xd8, 0xea, 0x7f, 0x2d, 0x36, 0x53,
426 0x96, 0x29, 0xbe, 0xb6, 0x75, 0xfc, 0xe7, 0xf3, 0x36, 0xd6, 0xf4, 0x8f,
427 0x16, 0xa6, 0xc7, 0xec, 0x7b, 0xce, 0x42, 0x8d, 0x48, 0x2e, 0xb7, 0x74,
428 0x00, 0x11, 0x52, 0x61, 0xb4, 0x19, 0x35, 0xec, 0x5c, 0xe4, 0xbe, 0x34,
429 0xc6, 0x59, 0x64, 0x5e, 0x42, 0x61, 0x70, 0x54, 0xf4, 0xe9, 0x6b, 0x53,
430 0x02, 0x01, 0x02, 0x04, 0x81, 0x83, 0x02, 0x81, 0x80, 0x64, 0xc2, 0xe3,
431 0x09, 0x69, 0x37, 0x3c, 0xd2, 0x4a, 0xba, 0xc3, 0x78, 0x6a, 0x9b, 0x8a,
432 0x2a, 0xdb, 0xe7, 0xe6, 0xc0, 0xfa, 0x3a, 0xbe, 0x39, 0x67, 0xc0, 0xa9,
433 0x2a, 0xf0, 0x0a, 0xc1, 0x53, 0x1c, 0xdb, 0xfa, 0x1a, 0x26, 0x98, 0xb0,
434 0x8c, 0xc6, 0x06, 0x4a, 0xa2, 0x48, 0xd3, 0xa4, 0x3b, 0xbd, 0x05, 0x48,
435 0xea, 0x59, 0xdb, 0x18, 0xa4, 0xca, 0x66, 0xd9, 0x5d, 0xb8, 0x95, 0xd1,
436 0xeb, 0x97, 0x3d, 0x66, 0x97, 0x5c, 0x86, 0x8f, 0x7e, 0x90, 0xd3, 0x43,
437 0xd1, 0xa2, 0x0d, 0xcb, 0xe7, 0xeb, 0x90, 0xea, 0x09, 0x40, 0xb1, 0x6f,
438 0xf7, 0x4c, 0xf2, 0x41, 0x83, 0x1d, 0xd0, 0x76, 0xef, 0xaf, 0x55, 0x6f,
439 0x5d, 0xa9, 0xa3, 0x55, 0x81, 0x2a, 0xd1, 0x5d, 0x9d, 0x22, 0x77, 0x97,
440 0x83, 0xde, 0xad, 0xb6, 0x5d, 0x19, 0xc1, 0x53, 0xec, 0xfb, 0xaf, 0x06,
441 0x2e, 0x87, 0x2a, 0x0b, 0x7a
442 };
443 # endif
444 #endif
445
446 static const unsigned char kCFBDefaultKey[] = {
447 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88,
448 0x09, 0xCF, 0x4F, 0x3C
449 };
450
451 static const unsigned char kGCMDefaultKey[32] = { 0 };
452
453 static const unsigned char kGCMResetKey[] = {
454 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94,
455 0x67, 0x30, 0x83, 0x08, 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
456 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
457 };
458
459 static const unsigned char iCFBIV[] = {
460 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
461 0x0C, 0x0D, 0x0E, 0x0F
462 };
463
464 static const unsigned char iGCMDefaultIV[12] = { 0 };
465
466 static const unsigned char iGCMResetIV1[] = {
467 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad
468 };
469
470 static const unsigned char iGCMResetIV2[] = {
471 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88
472 };
473
474 static const unsigned char cfbPlaintext[] = {
475 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11,
476 0x73, 0x93, 0x17, 0x2A
477 };
478
479 static const unsigned char gcmDefaultPlaintext[16] = { 0 };
480
481 static const unsigned char gcmResetPlaintext[] = {
482 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5,
483 0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
484 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95,
485 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
486 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39
487 };
488
489 static const unsigned char cfbCiphertext[] = {
490 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8,
491 0xE8, 0x3C, 0xFB, 0x4A
492 };
493
494 static const unsigned char gcmDefaultCiphertext[] = {
495 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3,
496 0xba, 0xf3, 0x9d, 0x18
497 };
498
499 static const unsigned char gcmResetCiphertext1[] = {
500 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, 0xae, 0x47, 0xc1, 0x3b,
501 0xf1, 0x98, 0x44, 0xcb, 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
502 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, 0xfe, 0xb5, 0x82, 0xd3,
503 0x39, 0x34, 0xa4, 0xf0, 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
504 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, 0xf4, 0x7c, 0x9b, 0x1f
505 };
506
507 static const unsigned char gcmResetCiphertext2[] = {
508 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3,
509 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
510 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48,
511 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
512 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62
513 };
514
515 static const unsigned char gcmAAD[] = {
516 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce,
517 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2
518 };
519
520 static const unsigned char gcmDefaultTag[] = {
521 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, 0x26, 0x5b, 0x98, 0xb5,
522 0xd4, 0x8a, 0xb9, 0x19
523 };
524
525 static const unsigned char gcmResetTag1[] = {
526 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, 0x5e, 0x45, 0x49, 0x13,
527 0xfe, 0x2e, 0xa8, 0xf2
528 };
529
530 static const unsigned char gcmResetTag2[] = {
531 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, 0xcd, 0xdf, 0x88, 0x53,
532 0xbb, 0x2d, 0x55, 0x1b
533 };
534
535 typedef struct APK_DATA_st {
536 const unsigned char *kder;
537 size_t size;
538 const char *keytype;
539 int evptype;
540 int check;
541 int pub_check;
542 int param_check;
543 int type; /* 0 for private, 1 for public, 2 for params */
544 } APK_DATA;
545
546 static APK_DATA keydata[] = {
547 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA},
548 {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), "RSA", EVP_PKEY_RSA},
549 #ifndef OPENSSL_NO_EC
550 {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC}
551 #endif
552 };
553
554 static APK_DATA keycheckdata[] = {
555 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA, 1, 1, 1,
556 0},
557 {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), "RSA", EVP_PKEY_RSA,
558 0, 1, 1, 0},
559 #ifndef OPENSSL_NO_EC
560 {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC, 1, 1, 1, 0},
561 /* group is also associated in our pub key */
562 {kExampleECPubKeyDER, sizeof(kExampleECPubKeyDER), "EC", EVP_PKEY_EC, 0, 1,
563 1, 1},
564 {pExampleECParamDER, sizeof(pExampleECParamDER), "EC", EVP_PKEY_EC, 0, 0, 1,
565 2},
566 {kExampleED25519KeyDER, sizeof(kExampleED25519KeyDER), "ED25519",
567 EVP_PKEY_ED25519, 1, 1, 1, 0},
568 {kExampleED25519PubKeyDER, sizeof(kExampleED25519PubKeyDER), "ED25519",
569 EVP_PKEY_ED25519, 0, 1, 1, 1},
570 #endif
571 };
572
573 static EVP_PKEY *load_example_key(const char *keytype,
574 const unsigned char *data, size_t data_len)
575 {
576 const unsigned char **pdata = &data;
577 EVP_PKEY *pkey = NULL;
578 OSSL_DECODER_CTX *dctx =
579 OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", NULL, keytype, 0,
580 testctx, testpropq);
581
582 /* |pkey| will be NULL on error */
583 (void)OSSL_DECODER_from_data(dctx, pdata, &data_len);
584 OSSL_DECODER_CTX_free(dctx);
585 return pkey;
586 }
587
588 static EVP_PKEY *load_example_rsa_key(void)
589 {
590 return load_example_key("RSA", kExampleRSAKeyDER,
591 sizeof(kExampleRSAKeyDER));
592 }
593
594 #ifndef OPENSSL_NO_DSA
595 static EVP_PKEY *load_example_dsa_key(void)
596 {
597 return load_example_key("DSA", kExampleDSAKeyDER,
598 sizeof(kExampleDSAKeyDER));
599 }
600 #endif
601
602 #ifndef OPENSSL_NO_EC
603 static EVP_PKEY *load_example_ec_key(void)
604 {
605 return load_example_key("EC", kExampleECKeyDER,
606 sizeof(kExampleECKeyDER));
607 }
608 #endif
609
610 #ifndef OPENSSL_NO_DEPRECATED_3_0
611 # ifndef OPENSSL_NO_DH
612 static EVP_PKEY *load_example_dh_key(void)
613 {
614 return load_example_key("DH", kExampleDHKeyDER,
615 sizeof(kExampleDHKeyDER));
616 }
617 # endif
618
619 # ifndef OPENSSL_NO_EC
620 static EVP_PKEY *load_example_ed25519_key(void)
621 {
622 return load_example_key("ED25519", kExampleED25519KeyDER,
623 sizeof(kExampleED25519KeyDER));
624 }
625
626 static EVP_PKEY *load_example_x25519_key(void)
627 {
628 return load_example_key("X25519", kExampleX25519KeyDER,
629 sizeof(kExampleX25519KeyDER));
630 }
631 # endif
632 #endif /* OPENSSL_NO_DEPRECATED_3_0 */
633
634 static EVP_PKEY *load_example_hmac_key(void)
635 {
636 EVP_PKEY *pkey = NULL;
637 unsigned char key[] = {
638 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
639 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
640 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
641 };
642
643 pkey = EVP_PKEY_new_raw_private_key_ex(testctx, "HMAC",
644 NULL, key, sizeof(key));
645 if (!TEST_ptr(pkey))
646 return NULL;
647
648 return pkey;
649 }
650
651 static int test_EVP_set_default_properties(void)
652 {
653 OSSL_LIB_CTX *ctx;
654 EVP_MD *md = NULL;
655 int res = 0;
656
657 if (!TEST_ptr(ctx = OSSL_LIB_CTX_new())
658 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
659 goto err;
660 EVP_MD_free(md);
661 md = NULL;
662
663 if (!TEST_true(EVP_set_default_properties(ctx, "provider=fizzbang"))
664 || !TEST_ptr_null(md = EVP_MD_fetch(ctx, "sha256", NULL))
665 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", "-provider")))
666 goto err;
667 EVP_MD_free(md);
668 md = NULL;
669
670 if (!TEST_true(EVP_set_default_properties(ctx, NULL))
671 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
672 goto err;
673 res = 1;
674 err:
675 EVP_MD_free(md);
676 OSSL_LIB_CTX_free(ctx);
677 return res;
678 }
679
680 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
681 static EVP_PKEY *make_key_fromdata(char *keytype, OSSL_PARAM *params)
682 {
683 EVP_PKEY_CTX *pctx = NULL;
684 EVP_PKEY *tmp_pkey = NULL, *pkey = NULL;
685
686 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, keytype, testpropq)))
687 goto err;
688 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
689 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &tmp_pkey, EVP_PKEY_KEYPAIR,
690 params), 0))
691 goto err;
692
693 if (!TEST_ptr(tmp_pkey))
694 goto err;
695
696 pkey = tmp_pkey;
697 tmp_pkey = NULL;
698 err:
699 EVP_PKEY_free(tmp_pkey);
700 EVP_PKEY_CTX_free(pctx);
701 return pkey;
702 }
703
704 static int test_selection(EVP_PKEY *pkey, int selection)
705 {
706 int testresult = 0;
707 int ret;
708 BIO *bio = BIO_new(BIO_s_mem());
709
710 ret = PEM_write_bio_PUBKEY(bio, pkey);
711 if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
712 if (!TEST_true(ret))
713 goto err;
714 } else {
715 if (!TEST_false(ret))
716 goto err;
717 }
718 ret = PEM_write_bio_PrivateKey_ex(bio, pkey, NULL, NULL, 0, NULL, NULL,
719 testctx, NULL);
720 if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
721 if (!TEST_true(ret))
722 goto err;
723 } else {
724 if (!TEST_false(ret))
725 goto err;
726 }
727
728 testresult = 1;
729 err:
730 BIO_free(bio);
731
732 return testresult;
733 }
734 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA || !OPENSSL_NO_EC */
735
736 /*
737 * Test combinations of private, public, missing and private + public key
738 * params to ensure they are all accepted
739 */
740 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA)
741 static int test_EVP_PKEY_ffc_priv_pub(char *keytype)
742 {
743 OSSL_PARAM_BLD *bld = NULL;
744 OSSL_PARAM *params = NULL;
745 EVP_PKEY *just_params = NULL;
746 EVP_PKEY *params_and_priv = NULL;
747 EVP_PKEY *params_and_pub = NULL;
748 EVP_PKEY *params_and_keypair = NULL;
749 BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
750 int ret = 0;
751
752 /*
753 * Setup the parameters for our pkey object. For our purposes they don't
754 * have to actually be *valid* parameters. We just need to set something.
755 */
756 if (!TEST_ptr(p = BN_new())
757 || !TEST_ptr(q = BN_new())
758 || !TEST_ptr(g = BN_new())
759 || !TEST_ptr(pub = BN_new())
760 || !TEST_ptr(priv = BN_new()))
761 goto err;
762
763 /* Test !priv and !pub */
764 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
765 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
766 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
767 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)))
768 goto err;
769 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
770 || !TEST_ptr(just_params = make_key_fromdata(keytype, params)))
771 goto err;
772
773 OSSL_PARAM_free(params);
774 OSSL_PARAM_BLD_free(bld);
775 params = NULL;
776 bld = NULL;
777
778 if (!test_selection(just_params, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
779 || test_selection(just_params, OSSL_KEYMGMT_SELECT_KEYPAIR))
780 goto err;
781
782 /* Test priv and !pub */
783 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
784 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
785 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
786 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
787 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
788 priv)))
789 goto err;
790 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
791 || !TEST_ptr(params_and_priv = make_key_fromdata(keytype, params)))
792 goto err;
793
794 OSSL_PARAM_free(params);
795 OSSL_PARAM_BLD_free(bld);
796 params = NULL;
797 bld = NULL;
798
799 if (!test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
800 || test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PUBLIC_KEY))
801 goto err;
802
803 /* Test !priv and pub */
804 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
805 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
806 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
807 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
808 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
809 pub)))
810 goto err;
811 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
812 || !TEST_ptr(params_and_pub = make_key_fromdata(keytype, params)))
813 goto err;
814
815 OSSL_PARAM_free(params);
816 OSSL_PARAM_BLD_free(bld);
817 params = NULL;
818 bld = NULL;
819
820 if (!test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
821 || test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PRIVATE_KEY))
822 goto err;
823
824 /* Test priv and pub */
825 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
826 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
827 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
828 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
829 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
830 pub))
831 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
832 priv)))
833 goto err;
834 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
835 || !TEST_ptr(params_and_keypair = make_key_fromdata(keytype, params)))
836 goto err;
837
838 if (!test_selection(params_and_keypair, EVP_PKEY_KEYPAIR))
839 goto err;
840
841 ret = 1;
842 err:
843 OSSL_PARAM_free(params);
844 OSSL_PARAM_BLD_free(bld);
845 EVP_PKEY_free(just_params);
846 EVP_PKEY_free(params_and_priv);
847 EVP_PKEY_free(params_and_pub);
848 EVP_PKEY_free(params_and_keypair);
849 BN_free(p);
850 BN_free(q);
851 BN_free(g);
852 BN_free(pub);
853 BN_free(priv);
854
855 return ret;
856 }
857 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA */
858
859 /*
860 * Test combinations of private, public, missing and private + public key
861 * params to ensure they are all accepted for EC keys
862 */
863 #ifndef OPENSSL_NO_EC
864 static unsigned char ec_priv[] = {
865 0xe9, 0x25, 0xf7, 0x66, 0x58, 0xa4, 0xdd, 0x99, 0x61, 0xe7, 0xe8, 0x23,
866 0x85, 0xc2, 0xe8, 0x33, 0x27, 0xc5, 0x5c, 0xeb, 0xdb, 0x43, 0x9f, 0xd5,
867 0xf2, 0x5a, 0x75, 0x55, 0xd0, 0x2e, 0x6d, 0x16
868 };
869 static unsigned char ec_pub[] = {
870 0x04, 0xad, 0x11, 0x90, 0x77, 0x4b, 0x46, 0xee, 0x72, 0x51, 0x15, 0x97,
871 0x4a, 0x6a, 0xa7, 0xaf, 0x59, 0xfa, 0x4b, 0xf2, 0x41, 0xc8, 0x3a, 0x81,
872 0x23, 0xb6, 0x90, 0x04, 0x6c, 0x67, 0x66, 0xd0, 0xdc, 0xf2, 0x15, 0x1d,
873 0x41, 0x61, 0xb7, 0x95, 0x85, 0x38, 0x5a, 0x84, 0x56, 0xe8, 0xb3, 0x0e,
874 0xf5, 0xc6, 0x5d, 0xa4, 0x54, 0x26, 0xb0, 0xf7, 0xa5, 0x4a, 0x33, 0xf1,
875 0x08, 0x09, 0xb8, 0xdb, 0x03
876 };
877
878 static int test_EC_priv_pub(void)
879 {
880 OSSL_PARAM_BLD *bld = NULL;
881 OSSL_PARAM *params = NULL;
882 EVP_PKEY *just_params = NULL;
883 EVP_PKEY *params_and_priv = NULL;
884 EVP_PKEY *params_and_pub = NULL;
885 EVP_PKEY *params_and_keypair = NULL;
886 BIGNUM *priv = NULL;
887 int ret = 0;
888
889 /*
890 * Setup the parameters for our pkey object. For our purposes they don't
891 * have to actually be *valid* parameters. We just need to set something.
892 */
893 if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
894 goto err;
895
896 /* Test !priv and !pub */
897 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
898 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
899 OSSL_PKEY_PARAM_GROUP_NAME,
900 "P-256", 0)))
901 goto err;
902 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
903 || !TEST_ptr(just_params = make_key_fromdata("EC", params)))
904 goto err;
905
906 OSSL_PARAM_free(params);
907 OSSL_PARAM_BLD_free(bld);
908 params = NULL;
909 bld = NULL;
910
911 if (!test_selection(just_params, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
912 || test_selection(just_params, OSSL_KEYMGMT_SELECT_KEYPAIR))
913 goto err;
914
915 /* Test priv and !pub */
916 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
917 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
918 OSSL_PKEY_PARAM_GROUP_NAME,
919 "P-256", 0))
920 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
921 priv)))
922 goto err;
923 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
924 || !TEST_ptr(params_and_priv = make_key_fromdata("EC", params)))
925 goto err;
926
927 OSSL_PARAM_free(params);
928 OSSL_PARAM_BLD_free(bld);
929 params = NULL;
930 bld = NULL;
931
932 /*
933 * We indicate only parameters here, in spite of having built a key that
934 * has a private part, because the PEM_write_bio_PrivateKey_ex call is
935 * expected to fail because it does not support exporting a private EC
936 * key without a corresponding public key
937 */
938 if (!test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
939 || test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PUBLIC_KEY))
940 goto err;
941
942 /* Test !priv and pub */
943 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
944 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
945 OSSL_PKEY_PARAM_GROUP_NAME,
946 "P-256", 0))
947 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
948 OSSL_PKEY_PARAM_PUB_KEY,
949 ec_pub, sizeof(ec_pub))))
950 goto err;
951 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
952 || !TEST_ptr(params_and_pub = make_key_fromdata("EC", params)))
953 goto err;
954
955 OSSL_PARAM_free(params);
956 OSSL_PARAM_BLD_free(bld);
957 params = NULL;
958 bld = NULL;
959
960 if (!test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
961 || test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PRIVATE_KEY))
962 goto err;
963
964 /* Test priv and pub */
965 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
966 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
967 OSSL_PKEY_PARAM_GROUP_NAME,
968 "P-256", 0))
969 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
970 OSSL_PKEY_PARAM_PUB_KEY,
971 ec_pub, sizeof(ec_pub)))
972 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
973 priv)))
974 goto err;
975 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
976 || !TEST_ptr(params_and_keypair = make_key_fromdata("EC", params)))
977 goto err;
978
979 if (!test_selection(params_and_keypair, EVP_PKEY_KEYPAIR))
980 goto err;
981
982 /* Try key equality */
983 if (!TEST_int_gt(EVP_PKEY_parameters_eq(just_params, just_params), 0)
984 || !TEST_int_gt(EVP_PKEY_parameters_eq(just_params, params_and_pub),
985 0)
986 || !TEST_int_gt(EVP_PKEY_parameters_eq(just_params, params_and_priv),
987 0)
988 || !TEST_int_gt(EVP_PKEY_parameters_eq(just_params, params_and_keypair),
989 0)
990 || !TEST_int_gt(EVP_PKEY_eq(params_and_pub, params_and_pub), 0)
991 || !TEST_int_gt(EVP_PKEY_eq(params_and_priv, params_and_priv), 0)
992 || !TEST_int_gt(EVP_PKEY_eq(params_and_keypair, params_and_pub), 0)
993 || !TEST_int_gt(EVP_PKEY_eq(params_and_keypair, params_and_priv), 0))
994 goto err;
995
996 ret = 1;
997 err:
998 OSSL_PARAM_free(params);
999 OSSL_PARAM_BLD_free(bld);
1000 EVP_PKEY_free(just_params);
1001 EVP_PKEY_free(params_and_priv);
1002 EVP_PKEY_free(params_and_pub);
1003 EVP_PKEY_free(params_and_keypair);
1004 BN_free(priv);
1005
1006 return ret;
1007 }
1008
1009 /* Test that using a legacy EC key with only a private key in it works */
1010 # ifndef OPENSSL_NO_DEPRECATED_3_0
1011 static int test_EC_priv_only_legacy(void)
1012 {
1013 BIGNUM *priv = NULL;
1014 int ret = 0;
1015 EC_KEY *eckey = NULL;
1016 EVP_PKEY *pkey = NULL, *dup_pk = NULL;
1017 EVP_MD_CTX *ctx = NULL;
1018
1019 /* Create the low level EC_KEY */
1020 if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
1021 goto err;
1022
1023 eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1024 if (!TEST_ptr(eckey))
1025 goto err;
1026
1027 if (!TEST_true(EC_KEY_set_private_key(eckey, priv)))
1028 goto err;
1029
1030 pkey = EVP_PKEY_new();
1031 if (!TEST_ptr(pkey))
1032 goto err;
1033
1034 if (!TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
1035 goto err;
1036 eckey = NULL;
1037
1038 while (dup_pk == NULL) {
1039 ret = 0;
1040 ctx = EVP_MD_CTX_new();
1041 if (!TEST_ptr(ctx))
1042 goto err;
1043
1044 /*
1045 * The EVP_DigestSignInit function should create the key on the
1046 * provider side which is sufficient for this test.
1047 */
1048 if (!TEST_true(EVP_DigestSignInit_ex(ctx, NULL, NULL, testctx,
1049 testpropq, pkey, NULL)))
1050 goto err;
1051 EVP_MD_CTX_free(ctx);
1052 ctx = NULL;
1053
1054 if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pkey)))
1055 goto err;
1056 /* EVP_PKEY_eq() returns -2 with missing public keys */
1057 ret = TEST_int_eq(EVP_PKEY_eq(pkey, dup_pk), -2);
1058 EVP_PKEY_free(pkey);
1059 pkey = dup_pk;
1060 if (!ret)
1061 goto err;
1062 }
1063
1064 err:
1065 EVP_MD_CTX_free(ctx);
1066 EVP_PKEY_free(pkey);
1067 EC_KEY_free(eckey);
1068 BN_free(priv);
1069
1070 return ret;
1071 }
1072 # endif /* OPENSSL_NO_DEPRECATED_3_0 */
1073 #endif /* OPENSSL_NO_EC */
1074
1075 static int test_EVP_PKEY_sign(int tst)
1076 {
1077 int ret = 0;
1078 EVP_PKEY *pkey = NULL;
1079 unsigned char *sig = NULL;
1080 size_t sig_len = 0, shortsig_len = 1;
1081 EVP_PKEY_CTX *ctx = NULL;
1082 unsigned char tbs[] = {
1083 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1084 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13
1085 };
1086
1087 if (tst == 0) {
1088 if (!TEST_ptr(pkey = load_example_rsa_key()))
1089 goto out;
1090 } else if (tst == 1) {
1091 #ifndef OPENSSL_NO_DSA
1092 if (!TEST_ptr(pkey = load_example_dsa_key()))
1093 goto out;
1094 #else
1095 ret = 1;
1096 goto out;
1097 #endif
1098 } else {
1099 #ifndef OPENSSL_NO_EC
1100 if (!TEST_ptr(pkey = load_example_ec_key()))
1101 goto out;
1102 #else
1103 ret = 1;
1104 goto out;
1105 #endif
1106 }
1107
1108 ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, NULL);
1109 if (!TEST_ptr(ctx)
1110 || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0)
1111 || !TEST_int_gt(EVP_PKEY_sign(ctx, NULL, &sig_len, tbs,
1112 sizeof(tbs)), 0))
1113 goto out;
1114 sig = OPENSSL_malloc(sig_len);
1115 if (!TEST_ptr(sig)
1116 /* Test sending a signature buffer that is too short is rejected */
1117 || !TEST_int_le(EVP_PKEY_sign(ctx, sig, &shortsig_len, tbs,
1118 sizeof(tbs)), 0)
1119 || !TEST_int_gt(EVP_PKEY_sign(ctx, sig, &sig_len, tbs, sizeof(tbs)),
1120 0)
1121 /* Test the signature round-trips */
1122 || !TEST_int_gt(EVP_PKEY_verify_init(ctx), 0)
1123 || !TEST_int_gt(EVP_PKEY_verify(ctx, sig, sig_len, tbs, sizeof(tbs)),
1124 0))
1125 goto out;
1126
1127 ret = 1;
1128 out:
1129 EVP_PKEY_CTX_free(ctx);
1130 OPENSSL_free(sig);
1131 EVP_PKEY_free(pkey);
1132 return ret;
1133 }
1134
1135 /*
1136 * n = 0 => test using legacy cipher
1137 * n = 1 => test using fetched cipher
1138 */
1139 static int test_EVP_Enveloped(int n)
1140 {
1141 int ret = 0;
1142 EVP_CIPHER_CTX *ctx = NULL;
1143 EVP_PKEY *keypair = NULL;
1144 unsigned char *kek = NULL;
1145 unsigned char iv[EVP_MAX_IV_LENGTH];
1146 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1147 int len, kek_len, ciphertext_len, plaintext_len;
1148 unsigned char ciphertext[32], plaintext[16];
1149 EVP_CIPHER *type = NULL;
1150
1151 if (nullprov != NULL)
1152 return TEST_skip("Test does not support a non-default library context");
1153
1154 if (n == 0)
1155 type = (EVP_CIPHER *)EVP_aes_256_cbc();
1156 else if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "AES-256-CBC",
1157 testpropq)))
1158 goto err;
1159
1160 if (!TEST_ptr(keypair = load_example_rsa_key())
1161 || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_get_size(keypair)))
1162 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
1163 || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
1164 &keypair, 1))
1165 || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
1166 msg, sizeof(msg)))
1167 || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
1168 &len)))
1169 goto err;
1170
1171 ciphertext_len += len;
1172
1173 if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
1174 || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
1175 ciphertext, ciphertext_len))
1176 || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
1177 goto err;
1178
1179 plaintext_len += len;
1180 if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
1181 goto err;
1182
1183 ret = 1;
1184 err:
1185 if (n != 0)
1186 EVP_CIPHER_free(type);
1187 OPENSSL_free(kek);
1188 EVP_PKEY_free(keypair);
1189 EVP_CIPHER_CTX_free(ctx);
1190 return ret;
1191 }
1192
1193 /*
1194 * Test 0: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, RSA)
1195 * Test 1: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, DSA)
1196 * Test 2: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, HMAC)
1197 * Test 3: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, RSA)
1198 * Test 4: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, DSA)
1199 * Test 5: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch diegst, HMAC)
1200 * Test 6: Use an MD BIO to do the Update calls instead (RSA)
1201 * Test 7: Use an MD BIO to do the Update calls instead (DSA)
1202 * Test 8: Use an MD BIO to do the Update calls instead (HMAC)
1203 * Test 9: Use EVP_DigestSign (Implicit fetch digest, RSA, short sig)
1204 * Test 10: Use EVP_DigestSign (Implicit fetch digest, DSA, short sig)
1205 * Test 11: Use EVP_DigestSign (Implicit fetch digest, HMAC, short sig)
1206 * Test 12: Use EVP_DigestSign (Implicit fetch digest, RSA)
1207 * Test 13: Use EVP_DigestSign (Implicit fetch digest, DSA)
1208 * Test 14: Use EVP_DigestSign (Implicit fetch digest, HMAC)
1209 * Test 15-29: Same as above with reinitialization
1210 */
1211 static int test_EVP_DigestSignInit(int tst)
1212 {
1213 int ret = 0;
1214 EVP_PKEY *pkey = NULL;
1215 unsigned char *sig = NULL, *sig2 = NULL;
1216 size_t sig_len = 0, sig2_len = 0, shortsig_len = 1;
1217 EVP_MD_CTX *md_ctx = NULL, *md_ctx_verify = NULL;
1218 EVP_MD_CTX *a_md_ctx = NULL, *a_md_ctx_verify = NULL;
1219 BIO *mdbio = NULL, *membio = NULL;
1220 size_t written;
1221 const EVP_MD *md;
1222 EVP_MD *mdexp = NULL;
1223 int reinit = 0;
1224
1225 if (nullprov != NULL)
1226 return TEST_skip("Test does not support a non-default library context");
1227
1228 if (tst >= 15) {
1229 reinit = 1;
1230 tst -= 15;
1231 }
1232
1233 if (tst >= 6 && tst <= 8) {
1234 membio = BIO_new(BIO_s_mem());
1235 mdbio = BIO_new(BIO_f_md());
1236 if (!TEST_ptr(membio) || !TEST_ptr(mdbio))
1237 goto out;
1238 BIO_push(mdbio, membio);
1239 if (!TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx), 0))
1240 goto out;
1241 } else {
1242 if (!TEST_ptr(a_md_ctx = md_ctx = EVP_MD_CTX_new())
1243 || !TEST_ptr(a_md_ctx_verify = md_ctx_verify = EVP_MD_CTX_new()))
1244 goto out;
1245 }
1246
1247 if (tst % 3 == 0) {
1248 if (!TEST_ptr(pkey = load_example_rsa_key()))
1249 goto out;
1250 } else if (tst % 3 == 1) {
1251 #ifndef OPENSSL_NO_DSA
1252 if (!TEST_ptr(pkey = load_example_dsa_key()))
1253 goto out;
1254 #else
1255 ret = 1;
1256 goto out;
1257 #endif
1258 } else {
1259 if (!TEST_ptr(pkey = load_example_hmac_key()))
1260 goto out;
1261 }
1262
1263 if (tst >= 3 && tst <= 5)
1264 md = mdexp = EVP_MD_fetch(NULL, "SHA256", NULL);
1265 else
1266 md = EVP_sha256();
1267
1268 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, md, NULL, pkey)))
1269 goto out;
1270
1271 if (reinit && !TEST_true(EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, NULL)))
1272 goto out;
1273
1274 if (tst >= 6 && tst <= 8) {
1275 if (!BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written))
1276 goto out;
1277 } else if (tst < 6) {
1278 if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1279 goto out;
1280 }
1281
1282 if (tst >= 9) {
1283 /* Determine the size of the signature. */
1284 if (!TEST_true(EVP_DigestSign(md_ctx, NULL, &sig_len, kMsg,
1285 sizeof(kMsg)))
1286 || !TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1287 goto out;
1288 if (tst <= 11) {
1289 /* Test that supply a short sig buffer fails */
1290 if (!TEST_false(EVP_DigestSign(md_ctx, sig, &shortsig_len, kMsg,
1291 sizeof(kMsg))))
1292 goto out;
1293 /*
1294 * We end here because once EVP_DigestSign() has failed you should
1295 * not call it again without re-initing the ctx
1296 */
1297 ret = 1;
1298 goto out;
1299 }
1300 if (!TEST_true(EVP_DigestSign(md_ctx, sig, &sig_len, kMsg,
1301 sizeof(kMsg))))
1302 goto out;
1303 } else {
1304 /* Determine the size of the signature. */
1305 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
1306 || !TEST_ptr(sig = OPENSSL_malloc(sig_len))
1307 /*
1308 * Trying to create a signature with a deliberately short
1309 * buffer should fail.
1310 */
1311 || !TEST_false(EVP_DigestSignFinal(md_ctx, sig, &shortsig_len))
1312 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1313 goto out;
1314 }
1315
1316 /*
1317 * Ensure that the signature round-trips (Verification isn't supported for
1318 * HMAC via EVP_DigestVerify*)
1319 */
1320 if (tst % 3 != 2) {
1321 if (tst >= 6 && tst <= 8) {
1322 if (!TEST_int_gt(BIO_reset(mdbio), 0)
1323 || !TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx_verify), 0))
1324 goto out;
1325 }
1326
1327 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, md,
1328 NULL, pkey)))
1329 goto out;
1330
1331 if (tst >= 6 && tst <= 8) {
1332 if (!TEST_true(BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written)))
1333 goto out;
1334 } else {
1335 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg,
1336 sizeof(kMsg))))
1337 goto out;
1338 }
1339 if (!TEST_int_gt(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1340 goto out;
1341
1342 /* Multiple calls to EVP_DigestVerifyFinal should work */
1343 if (!TEST_int_gt(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1344 goto out;
1345 } else {
1346 /*
1347 * For HMAC a doubled call to DigestSignFinal should produce the same
1348 * value as finalization should not happen.
1349 */
1350 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig2_len))
1351 || !TEST_ptr(sig2 = OPENSSL_malloc(sig2_len))
1352 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig2, &sig2_len)))
1353 goto out;
1354
1355 if (!TEST_mem_eq(sig, sig_len, sig2, sig2_len))
1356 goto out;
1357 }
1358
1359 ret = 1;
1360
1361 out:
1362 BIO_free(membio);
1363 BIO_free(mdbio);
1364 EVP_MD_CTX_free(a_md_ctx);
1365 EVP_MD_CTX_free(a_md_ctx_verify);
1366 EVP_PKEY_free(pkey);
1367 OPENSSL_free(sig);
1368 OPENSSL_free(sig2);
1369 EVP_MD_free(mdexp);
1370
1371 return ret;
1372 }
1373
1374 static int test_EVP_DigestVerifyInit(void)
1375 {
1376 int ret = 0;
1377 EVP_PKEY *pkey = NULL;
1378 EVP_MD_CTX *md_ctx = NULL;
1379
1380 if (nullprov != NULL)
1381 return TEST_skip("Test does not support a non-default library context");
1382
1383 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
1384 || !TEST_ptr(pkey = load_example_rsa_key()))
1385 goto out;
1386
1387 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
1388 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
1389 || !TEST_int_gt(EVP_DigestVerifyFinal(md_ctx, kSignature,
1390 sizeof(kSignature)), 0))
1391 goto out;
1392
1393 /* test with reinitialization */
1394 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, NULL))
1395 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
1396 || !TEST_int_gt(EVP_DigestVerifyFinal(md_ctx, kSignature,
1397 sizeof(kSignature)), 0))
1398 goto out;
1399 ret = 1;
1400
1401 out:
1402 EVP_MD_CTX_free(md_ctx);
1403 EVP_PKEY_free(pkey);
1404 return ret;
1405 }
1406
1407 #ifndef OPENSSL_NO_SIPHASH
1408 /* test SIPHASH MAC via EVP_PKEY with non-default parameters and reinit */
1409 static int test_siphash_digestsign(void)
1410 {
1411 unsigned char key[16];
1412 unsigned char buf[8], digest[8];
1413 unsigned char expected[8] = {
1414 0x6d, 0x3e, 0x54, 0xc2, 0x2f, 0xf1, 0xfe, 0xe2
1415 };
1416 EVP_PKEY *pkey = NULL;
1417 EVP_MD_CTX *mdctx = NULL;
1418 EVP_PKEY_CTX *ctx = NULL;
1419 int ret = 0;
1420 size_t len = 8;
1421
1422 if (nullprov != NULL)
1423 return TEST_skip("Test does not support a non-default library context");
1424
1425 memset(buf, 0, 8);
1426 memset(key, 1, 16);
1427 if (!TEST_ptr(pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_SIPHASH, NULL,
1428 key, 16)))
1429 goto out;
1430
1431 if (!TEST_ptr(mdctx = EVP_MD_CTX_create()))
1432 goto out;
1433
1434 if (!TEST_true(EVP_DigestSignInit(mdctx, &ctx, NULL, NULL, pkey)))
1435 goto out;
1436 if (!TEST_int_eq(EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_SIGNCTX,
1437 EVP_PKEY_CTRL_SET_DIGEST_SIZE,
1438 8, NULL), 1))
1439 goto out;
1440 /* reinitialize */
1441 if (!TEST_true(EVP_DigestSignInit(mdctx, NULL, NULL, NULL, NULL)))
1442 goto out;
1443 if (!TEST_true(EVP_DigestSignUpdate(mdctx, buf, 8)))
1444 goto out;
1445 if (!TEST_true(EVP_DigestSignFinal(mdctx, digest, &len)))
1446 goto out;
1447 if (!TEST_mem_eq(digest, len, expected, sizeof(expected)))
1448 goto out;
1449
1450 ret = 1;
1451 out:
1452 EVP_PKEY_free(pkey);
1453 EVP_MD_CTX_free(mdctx);
1454 return ret;
1455 }
1456 #endif
1457
1458 /*
1459 * Test corner cases of EVP_DigestInit/Update/Final API call behavior.
1460 */
1461 static int test_EVP_Digest(void)
1462 {
1463 int ret = 0;
1464 EVP_MD_CTX *md_ctx = NULL;
1465 unsigned char md[EVP_MAX_MD_SIZE];
1466 EVP_MD *sha256 = NULL;
1467 EVP_MD *shake256 = NULL;
1468
1469 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1470 goto out;
1471
1472 if (!TEST_ptr(sha256 = EVP_MD_fetch(testctx, "sha256", testpropq))
1473 || !TEST_ptr(shake256 = EVP_MD_fetch(testctx, "shake256", testpropq)))
1474 goto out;
1475
1476 if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
1477 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1478 || !TEST_true(EVP_DigestFinal(md_ctx, md, NULL))
1479 /* EVP_DigestFinal resets the EVP_MD_CTX. */
1480 || !TEST_ptr_eq(EVP_MD_CTX_get0_md(md_ctx), NULL))
1481 goto out;
1482
1483 if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
1484 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1485 || !TEST_true(EVP_DigestFinal_ex(md_ctx, md, NULL))
1486 /* EVP_DigestFinal_ex does not reset the EVP_MD_CTX. */
1487 || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
1488 /*
1489 * EVP_DigestInit_ex with NULL type should work on
1490 * pre-initialized context.
1491 */
1492 || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1493 goto out;
1494
1495 if (!TEST_true(EVP_DigestInit_ex(md_ctx, shake256, NULL))
1496 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1497 || !TEST_true(EVP_DigestFinalXOF(md_ctx, md, sizeof(md)))
1498 /* EVP_DigestFinalXOF does not reset the EVP_MD_CTX. */
1499 || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
1500 || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1501 goto out;
1502 ret = 1;
1503
1504 out:
1505 EVP_MD_CTX_free(md_ctx);
1506 EVP_MD_free(sha256);
1507 EVP_MD_free(shake256);
1508 return ret;
1509 }
1510
1511 static int test_EVP_md_null(void)
1512 {
1513 int ret = 0;
1514 EVP_MD_CTX *md_ctx = NULL;
1515 const EVP_MD *md_null = EVP_md_null();
1516 unsigned char md_value[EVP_MAX_MD_SIZE];
1517 unsigned int md_len = sizeof(md_value);
1518
1519 if (nullprov != NULL)
1520 return TEST_skip("Test does not support a non-default library context");
1521
1522 if (!TEST_ptr(md_null)
1523 || !TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1524 goto out;
1525
1526 if (!TEST_true(EVP_DigestInit_ex(md_ctx, md_null, NULL))
1527 || !TEST_true(EVP_DigestUpdate(md_ctx, "test", 4))
1528 || !TEST_true(EVP_DigestFinal_ex(md_ctx, md_value, &md_len)))
1529 goto out;
1530
1531 if (!TEST_uint_eq(md_len, 0))
1532 goto out;
1533
1534 ret = 1;
1535 out:
1536 EVP_MD_CTX_free(md_ctx);
1537 return ret;
1538 }
1539
1540 static int test_d2i_AutoPrivateKey(int i)
1541 {
1542 int ret = 0;
1543 const unsigned char *p;
1544 EVP_PKEY *pkey = NULL;
1545 const APK_DATA *ak = &keydata[i];
1546 const unsigned char *input = ak->kder;
1547 size_t input_len = ak->size;
1548 int expected_id = ak->evptype;
1549
1550 p = input;
1551 if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
1552 || !TEST_ptr_eq(p, input + input_len)
1553 || !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
1554 goto done;
1555
1556 ret = 1;
1557
1558 done:
1559 EVP_PKEY_free(pkey);
1560 return ret;
1561 }
1562
1563 #ifndef OPENSSL_NO_EC
1564
1565 static const unsigned char ec_public_sect163k1_validxy[] = {
1566 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1567 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1568 0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1569 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x02, 0xd1, 0x7b,
1570 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1571 0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1572 };
1573
1574 static const unsigned char ec_public_sect163k1_badx[] = {
1575 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1576 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1577 0x0a, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1578 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0xb0, 0x02, 0xd1, 0x7b,
1579 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1580 0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1581 };
1582
1583 static const unsigned char ec_public_sect163k1_bady[] = {
1584 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1585 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1586 0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1587 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x0a, 0xd1, 0x7b,
1588 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1589 0x6a, 0xd8, 0x17, 0x65, 0x41, 0xe6
1590 };
1591
1592 static struct ec_der_pub_keys_st {
1593 const unsigned char *der;
1594 size_t len;
1595 int valid;
1596 } ec_der_pub_keys[] = {
1597 { ec_public_sect163k1_validxy, sizeof(ec_public_sect163k1_validxy), 1 },
1598 { ec_public_sect163k1_badx, sizeof(ec_public_sect163k1_badx), 0 },
1599 { ec_public_sect163k1_bady, sizeof(ec_public_sect163k1_bady), 0 },
1600 };
1601
1602 /*
1603 * Tests the range of the decoded EC char2 public point.
1604 * See ec_GF2m_simple_oct2point().
1605 */
1606 static int test_invalide_ec_char2_pub_range_decode(int id)
1607 {
1608 int ret = 0;
1609 EVP_PKEY *pkey;
1610
1611 pkey = load_example_key("EC", ec_der_pub_keys[id].der,
1612 ec_der_pub_keys[id].len);
1613
1614 ret = (ec_der_pub_keys[id].valid && TEST_ptr(pkey))
1615 || TEST_ptr_null(pkey);
1616 EVP_PKEY_free(pkey);
1617 return ret;
1618 }
1619
1620 /* Tests loading a bad key in PKCS8 format */
1621 static int test_EVP_PKCS82PKEY(void)
1622 {
1623 int ret = 0;
1624 const unsigned char *derp = kExampleBadECKeyDER;
1625 PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1626 EVP_PKEY *pkey = NULL;
1627
1628 if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
1629 sizeof(kExampleBadECKeyDER))))
1630 goto done;
1631
1632 if (!TEST_ptr_eq(derp,
1633 kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
1634 goto done;
1635
1636 if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
1637 goto done;
1638
1639 ret = 1;
1640
1641 done:
1642 PKCS8_PRIV_KEY_INFO_free(p8inf);
1643 EVP_PKEY_free(pkey);
1644
1645 return ret;
1646 }
1647
1648 #endif
1649 static int test_EVP_PKCS82PKEY_wrong_tag(void)
1650 {
1651 EVP_PKEY *pkey = NULL;
1652 EVP_PKEY *pkey2 = NULL;
1653 BIO *membio = NULL;
1654 char *membuf = NULL;
1655 PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1656 int ok = 0;
1657
1658 if (testctx != NULL)
1659 /* test not supported with non-default context */
1660 return 1;
1661
1662 if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1663 || !TEST_ptr(pkey = load_example_rsa_key())
1664 || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1665 NULL, 0, NULL, NULL),
1666 0)
1667 || !TEST_int_gt(BIO_get_mem_data(membio, &membuf), 0)
1668 || !TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(membio, NULL))
1669 || !TEST_ptr(pkey2 = EVP_PKCS82PKEY(p8inf))
1670 || !TEST_int_eq(ERR_peek_last_error(), 0)) {
1671 goto done;
1672 }
1673
1674 ok = 1;
1675 done:
1676 EVP_PKEY_free(pkey);
1677 EVP_PKEY_free(pkey2);
1678 PKCS8_PRIV_KEY_INFO_free(p8inf);
1679 BIO_free_all(membio);
1680 return ok;
1681 }
1682
1683 /* This uses kExampleRSAKeyDER and kExampleRSAKeyPKCS8 to verify encoding */
1684 static int test_privatekey_to_pkcs8(void)
1685 {
1686 EVP_PKEY *pkey = NULL;
1687 BIO *membio = NULL;
1688 char *membuf = NULL;
1689 long membuf_len = 0;
1690 int ok = 0;
1691
1692 if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1693 || !TEST_ptr(pkey = load_example_rsa_key())
1694 || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1695 NULL, 0, NULL, NULL),
1696 0)
1697 || !TEST_int_gt(membuf_len = BIO_get_mem_data(membio, &membuf), 0)
1698 || !TEST_ptr(membuf)
1699 || !TEST_mem_eq(membuf, (size_t)membuf_len,
1700 kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8))
1701 /*
1702 * We try to write PEM as well, just to see that it doesn't err, but
1703 * assume that the result is correct.
1704 */
1705 || !TEST_int_gt(PEM_write_bio_PKCS8PrivateKey(membio, pkey, NULL,
1706 NULL, 0, NULL, NULL),
1707 0))
1708 goto done;
1709
1710 ok = 1;
1711 done:
1712 EVP_PKEY_free(pkey);
1713 BIO_free_all(membio);
1714 return ok;
1715 }
1716
1717 #ifndef OPENSSL_NO_EC
1718 static const struct {
1719 int encoding;
1720 const char *encoding_name;
1721 } ec_encodings[] = {
1722 { OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT },
1723 { OPENSSL_EC_NAMED_CURVE, OSSL_PKEY_EC_ENCODING_GROUP }
1724 };
1725
1726 static int ec_export_get_encoding_cb(const OSSL_PARAM params[], void *arg)
1727 {
1728 const OSSL_PARAM *p;
1729 const char *enc_name = NULL;
1730 int *enc = arg;
1731 size_t i;
1732
1733 *enc = -1;
1734
1735 if (!TEST_ptr(p = OSSL_PARAM_locate_const(params,
1736 OSSL_PKEY_PARAM_EC_ENCODING))
1737 || !TEST_true(OSSL_PARAM_get_utf8_string_ptr(p, &enc_name)))
1738 return 0;
1739
1740 for (i = 0; i < OSSL_NELEM(ec_encodings); i++) {
1741 if (OPENSSL_strcasecmp(enc_name, ec_encodings[i].encoding_name) == 0) {
1742 *enc = ec_encodings[i].encoding;
1743 break;
1744 }
1745 }
1746
1747 return (*enc != -1);
1748 }
1749
1750 static int test_EC_keygen_with_enc(int idx)
1751 {
1752 EVP_PKEY *params = NULL, *key = NULL;
1753 EVP_PKEY_CTX *pctx = NULL, *kctx = NULL;
1754 int enc;
1755 int ret = 0;
1756
1757 enc = ec_encodings[idx].encoding;
1758
1759 /* Create key parameters */
1760 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "EC", NULL))
1761 || !TEST_int_gt(EVP_PKEY_paramgen_init(pctx), 0)
1762 || !TEST_true(EVP_PKEY_CTX_set_group_name(pctx, "P-256"))
1763 || !TEST_true(EVP_PKEY_CTX_set_ec_param_enc(pctx, enc))
1764 || !TEST_true(EVP_PKEY_paramgen(pctx, &params))
1765 || !TEST_ptr(params))
1766 goto done;
1767
1768 /* Create key */
1769 if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx, params, NULL))
1770 || !TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
1771 || !TEST_true(EVP_PKEY_keygen(kctx, &key))
1772 || !TEST_ptr(key))
1773 goto done;
1774
1775 /* Check that the encoding got all the way into the key */
1776 if (!TEST_true(evp_keymgmt_util_export(key, OSSL_KEYMGMT_SELECT_ALL,
1777 ec_export_get_encoding_cb, &enc))
1778 || !TEST_int_eq(enc, ec_encodings[idx].encoding))
1779 goto done;
1780
1781 ret = 1;
1782 done:
1783 EVP_PKEY_free(key);
1784 EVP_PKEY_free(params);
1785 EVP_PKEY_CTX_free(kctx);
1786 EVP_PKEY_CTX_free(pctx);
1787 return ret;
1788 }
1789 #endif
1790
1791 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
1792
1793 static int test_EVP_SM2_verify(void)
1794 {
1795 const char *pubkey =
1796 "-----BEGIN PUBLIC KEY-----\n"
1797 "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEp1KLWq1ZE2jmoAnnBJE1LBGxVr18\n"
1798 "YvvqECWCpXfAQ9qUJ+UmthnUPf0iM3SaXKHe6PlLIDyNlWMWb9RUh/yU3g==\n"
1799 "-----END PUBLIC KEY-----\n";
1800
1801 const char *msg = "message digest";
1802 const char *id = "ALICE123@YAHOO.COM";
1803
1804 const uint8_t signature[] = {
1805 0x30, 0x44, 0x02, 0x20, 0x5b, 0xdb, 0xab, 0x81, 0x4f, 0xbb,
1806 0x8b, 0x69, 0xb1, 0x05, 0x9c, 0x99, 0x3b, 0xb2, 0x45, 0x06,
1807 0x4a, 0x30, 0x15, 0x59, 0x84, 0xcd, 0xee, 0x30, 0x60, 0x36,
1808 0x57, 0x87, 0xef, 0x5c, 0xd0, 0xbe, 0x02, 0x20, 0x43, 0x8d,
1809 0x1f, 0xc7, 0x77, 0x72, 0x39, 0xbb, 0x72, 0xe1, 0xfd, 0x07,
1810 0x58, 0xd5, 0x82, 0xc8, 0x2d, 0xba, 0x3b, 0x2c, 0x46, 0x24,
1811 0xe3, 0x50, 0xff, 0x04, 0xc7, 0xa0, 0x71, 0x9f, 0xa4, 0x70
1812 };
1813
1814 int rc = 0;
1815 BIO *bio = NULL;
1816 EVP_PKEY *pkey = NULL;
1817 EVP_MD_CTX *mctx = NULL;
1818 EVP_PKEY_CTX *pctx = NULL;
1819 EVP_MD *sm3 = NULL;
1820
1821 bio = BIO_new_mem_buf(pubkey, strlen(pubkey));
1822 if (!TEST_true(bio != NULL))
1823 goto done;
1824
1825 pkey = PEM_read_bio_PUBKEY_ex(bio, NULL, NULL, NULL, testctx, testpropq);
1826 if (!TEST_true(pkey != NULL))
1827 goto done;
1828
1829 if (!TEST_true(EVP_PKEY_is_a(pkey, "SM2")))
1830 goto done;
1831
1832 if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
1833 goto done;
1834
1835 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1836 goto done;
1837
1838 EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
1839
1840 if (!TEST_ptr(sm3 = EVP_MD_fetch(testctx, "sm3", testpropq)))
1841 goto done;
1842
1843 if (!TEST_true(EVP_DigestVerifyInit(mctx, NULL, sm3, NULL, pkey)))
1844 goto done;
1845
1846 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, id, strlen(id)), 0))
1847 goto done;
1848
1849 if (!TEST_true(EVP_DigestVerifyUpdate(mctx, msg, strlen(msg))))
1850 goto done;
1851
1852 if (!TEST_int_gt(EVP_DigestVerifyFinal(mctx, signature, sizeof(signature)), 0))
1853 goto done;
1854 rc = 1;
1855
1856 done:
1857 BIO_free(bio);
1858 EVP_PKEY_free(pkey);
1859 EVP_PKEY_CTX_free(pctx);
1860 EVP_MD_CTX_free(mctx);
1861 EVP_MD_free(sm3);
1862 return rc;
1863 }
1864
1865 static int test_EVP_SM2(void)
1866 {
1867 int ret = 0;
1868 EVP_PKEY *pkey = NULL;
1869 EVP_PKEY *pkeyparams = NULL;
1870 EVP_PKEY_CTX *pctx = NULL;
1871 EVP_PKEY_CTX *kctx = NULL;
1872 EVP_PKEY_CTX *sctx = NULL;
1873 size_t sig_len = 0;
1874 unsigned char *sig = NULL;
1875 EVP_MD_CTX *md_ctx = NULL;
1876 EVP_MD_CTX *md_ctx_verify = NULL;
1877 EVP_PKEY_CTX *cctx = NULL;
1878 EVP_MD *check_md = NULL;
1879
1880 uint8_t ciphertext[128];
1881 size_t ctext_len = sizeof(ciphertext);
1882
1883 uint8_t plaintext[8];
1884 size_t ptext_len = sizeof(plaintext);
1885
1886 uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
1887
1888 OSSL_PARAM sparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1889 OSSL_PARAM gparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1890 int i;
1891 char mdname[OSSL_MAX_NAME_SIZE];
1892
1893 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx,
1894 "SM2", testpropq)))
1895 goto done;
1896
1897 if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
1898 goto done;
1899
1900 if (!TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2)))
1901 goto done;
1902
1903 if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
1904 goto done;
1905
1906 if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx,
1907 pkeyparams, testpropq)))
1908 goto done;
1909
1910 if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0))
1911 goto done;
1912
1913 if (!TEST_true(EVP_PKEY_keygen(kctx, &pkey)))
1914 goto done;
1915
1916 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1917 goto done;
1918
1919 if (!TEST_ptr(md_ctx_verify = EVP_MD_CTX_new()))
1920 goto done;
1921
1922 if (!TEST_ptr(sctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1923 goto done;
1924
1925 EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
1926 EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
1927
1928 if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, "sm3", testpropq)))
1929 goto done;
1930
1931 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, check_md, NULL, pkey)))
1932 goto done;
1933
1934 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1935 goto done;
1936
1937 if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1938 goto done;
1939
1940 /* Determine the size of the signature. */
1941 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len)))
1942 goto done;
1943
1944 if (!TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1945 goto done;
1946
1947 if (!TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1948 goto done;
1949
1950 /* Ensure that the signature round-trips. */
1951
1952 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
1953 pkey)))
1954 goto done;
1955
1956 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1957 goto done;
1958
1959 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1960 goto done;
1961
1962 if (!TEST_int_gt(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1963 goto done;
1964
1965 /*
1966 * Try verify again with non-matching 0 length id but ensure that it can
1967 * be set on the context and overrides the previous value.
1968 */
1969
1970 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
1971 pkey)))
1972 goto done;
1973
1974 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, NULL, 0), 0))
1975 goto done;
1976
1977 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1978 goto done;
1979
1980 if (!TEST_int_eq(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1981 goto done;
1982
1983 /* now check encryption/decryption */
1984
1985 gparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1986 mdname, sizeof(mdname));
1987 for (i = 0; i < 2; i++) {
1988 const char *mdnames[] = {
1989 #ifndef OPENSSL_NO_SM3
1990 "SM3",
1991 #else
1992 NULL,
1993 #endif
1994 "SHA2-256" };
1995 EVP_PKEY_CTX_free(cctx);
1996
1997 if (mdnames[i] == NULL)
1998 continue;
1999
2000 sparams[0] =
2001 OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
2002 (char *)mdnames[i], 0);
2003
2004 if (!TEST_ptr(cctx = EVP_PKEY_CTX_new_from_pkey(testctx,
2005 pkey, testpropq)))
2006 goto done;
2007
2008 if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
2009 goto done;
2010
2011 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
2012 goto done;
2013
2014 if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg,
2015 sizeof(kMsg))))
2016 goto done;
2017
2018 if (!TEST_true(EVP_PKEY_decrypt_init(cctx)))
2019 goto done;
2020
2021 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
2022 goto done;
2023
2024 if (!TEST_int_gt(EVP_PKEY_decrypt(cctx, plaintext, &ptext_len, ciphertext,
2025 ctext_len), 0))
2026 goto done;
2027
2028 if (!TEST_true(EVP_PKEY_CTX_get_params(cctx, gparams)))
2029 goto done;
2030
2031 /*
2032 * Test we're still using the digest we think we are.
2033 * Because of aliases, the easiest is to fetch the digest and
2034 * check the name with EVP_MD_is_a().
2035 */
2036 EVP_MD_free(check_md);
2037 if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, mdname, testpropq)))
2038 goto done;
2039 if (!TEST_true(EVP_MD_is_a(check_md, mdnames[i]))) {
2040 TEST_info("Fetched md %s isn't %s", mdname, mdnames[i]);
2041 goto done;
2042 }
2043
2044 if (!TEST_true(ptext_len == sizeof(kMsg)))
2045 goto done;
2046
2047 if (!TEST_true(memcmp(plaintext, kMsg, sizeof(kMsg)) == 0))
2048 goto done;
2049 }
2050
2051 ret = 1;
2052 done:
2053 EVP_PKEY_CTX_free(pctx);
2054 EVP_PKEY_CTX_free(kctx);
2055 EVP_PKEY_CTX_free(sctx);
2056 EVP_PKEY_CTX_free(cctx);
2057 EVP_PKEY_free(pkey);
2058 EVP_PKEY_free(pkeyparams);
2059 EVP_MD_CTX_free(md_ctx);
2060 EVP_MD_CTX_free(md_ctx_verify);
2061 EVP_MD_free(check_md);
2062 OPENSSL_free(sig);
2063 return ret;
2064 }
2065
2066 #endif
2067
2068 static struct keys_st {
2069 int type;
2070 char *priv;
2071 char *pub;
2072 } keys[] = {
2073 {
2074 EVP_PKEY_HMAC, "0123456789", NULL
2075 },
2076 {
2077 EVP_PKEY_HMAC, "", NULL
2078 #ifndef OPENSSL_NO_POLY1305
2079 }, {
2080 EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
2081 #endif
2082 #ifndef OPENSSL_NO_SIPHASH
2083 }, {
2084 EVP_PKEY_SIPHASH, "0123456789012345", NULL
2085 #endif
2086 },
2087 #ifndef OPENSSL_NO_EC
2088 {
2089 EVP_PKEY_X25519, "01234567890123456789012345678901",
2090 "abcdefghijklmnopqrstuvwxyzabcdef"
2091 }, {
2092 EVP_PKEY_ED25519, "01234567890123456789012345678901",
2093 "abcdefghijklmnopqrstuvwxyzabcdef"
2094 }, {
2095 EVP_PKEY_X448,
2096 "01234567890123456789012345678901234567890123456789012345",
2097 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
2098 }, {
2099 EVP_PKEY_ED448,
2100 "012345678901234567890123456789012345678901234567890123456",
2101 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde"
2102 }
2103 #endif
2104 };
2105
2106 static int test_set_get_raw_keys_int(int tst, int pub, int uselibctx)
2107 {
2108 int ret = 0;
2109 unsigned char buf[80];
2110 unsigned char *in;
2111 size_t inlen, len = 0, shortlen = 1;
2112 EVP_PKEY *pkey;
2113
2114 /* Check if this algorithm supports public keys */
2115 if (pub && keys[tst].pub == NULL)
2116 return 1;
2117
2118 memset(buf, 0, sizeof(buf));
2119
2120 if (pub) {
2121 #ifndef OPENSSL_NO_EC
2122 inlen = strlen(keys[tst].pub);
2123 in = (unsigned char *)keys[tst].pub;
2124 if (uselibctx) {
2125 pkey = EVP_PKEY_new_raw_public_key_ex(
2126 testctx,
2127 OBJ_nid2sn(keys[tst].type),
2128 NULL,
2129 in,
2130 inlen);
2131 } else {
2132 pkey = EVP_PKEY_new_raw_public_key(keys[tst].type,
2133 NULL,
2134 in,
2135 inlen);
2136 }
2137 #else
2138 return 1;
2139 #endif
2140 } else {
2141 inlen = strlen(keys[tst].priv);
2142 in = (unsigned char *)keys[tst].priv;
2143 if (uselibctx) {
2144 pkey = EVP_PKEY_new_raw_private_key_ex(
2145 testctx, OBJ_nid2sn(keys[tst].type),
2146 NULL,
2147 in,
2148 inlen);
2149 } else {
2150 pkey = EVP_PKEY_new_raw_private_key(keys[tst].type,
2151 NULL,
2152 in,
2153 inlen);
2154 }
2155 }
2156
2157 if (!TEST_ptr(pkey)
2158 || !TEST_int_eq(EVP_PKEY_eq(pkey, pkey), 1)
2159 || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
2160 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
2161 || !TEST_true(len == inlen))
2162 goto done;
2163 if (tst != 1) {
2164 /*
2165 * Test that supplying a buffer that is too small fails. Doesn't apply
2166 * to HMAC with a zero length key
2167 */
2168 if ((!pub && !TEST_false(EVP_PKEY_get_raw_private_key(pkey, buf,
2169 &shortlen)))
2170 || (pub && !TEST_false(EVP_PKEY_get_raw_public_key(pkey, buf,
2171 &shortlen))))
2172 goto done;
2173 }
2174 if ((!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, buf, &len)))
2175 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, buf, &len)))
2176 || !TEST_mem_eq(in, inlen, buf, len))
2177 goto done;
2178
2179 ret = 1;
2180 done:
2181 EVP_PKEY_free(pkey);
2182 return ret;
2183 }
2184
2185 static int test_set_get_raw_keys(int tst)
2186 {
2187 return (nullprov != NULL || test_set_get_raw_keys_int(tst, 0, 0))
2188 && test_set_get_raw_keys_int(tst, 0, 1)
2189 && (nullprov != NULL || test_set_get_raw_keys_int(tst, 1, 0))
2190 && test_set_get_raw_keys_int(tst, 1, 1);
2191 }
2192
2193 #ifndef OPENSSL_NO_DEPRECATED_3_0
2194 static int pkey_custom_check(EVP_PKEY *pkey)
2195 {
2196 return 0xbeef;
2197 }
2198
2199 static int pkey_custom_pub_check(EVP_PKEY *pkey)
2200 {
2201 return 0xbeef;
2202 }
2203
2204 static int pkey_custom_param_check(EVP_PKEY *pkey)
2205 {
2206 return 0xbeef;
2207 }
2208
2209 static EVP_PKEY_METHOD *custom_pmeth;
2210 #endif
2211
2212 static int test_EVP_PKEY_check(int i)
2213 {
2214 int ret = 0;
2215 EVP_PKEY *pkey = NULL;
2216 EVP_PKEY_CTX *ctx = NULL;
2217 #ifndef OPENSSL_NO_DEPRECATED_3_0
2218 EVP_PKEY_CTX *ctx2 = NULL;
2219 #endif
2220 const APK_DATA *ak = &keycheckdata[i];
2221 const unsigned char *input = ak->kder;
2222 size_t input_len = ak->size;
2223 int expected_id = ak->evptype;
2224 int expected_check = ak->check;
2225 int expected_pub_check = ak->pub_check;
2226 int expected_param_check = ak->param_check;
2227 int type = ak->type;
2228
2229 if (!TEST_ptr(pkey = load_example_key(ak->keytype, input, input_len)))
2230 goto done;
2231 if (type == 0
2232 && !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
2233 goto done;
2234
2235 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
2236 goto done;
2237
2238 if (!TEST_int_eq(EVP_PKEY_check(ctx), expected_check))
2239 goto done;
2240
2241 if (!TEST_int_eq(EVP_PKEY_public_check(ctx), expected_pub_check))
2242 goto done;
2243
2244 if (!TEST_int_eq(EVP_PKEY_param_check(ctx), expected_param_check))
2245 goto done;
2246
2247 #ifndef OPENSSL_NO_DEPRECATED_3_0
2248 ctx2 = EVP_PKEY_CTX_new_id(0xdefaced, NULL);
2249 /* assign the pkey directly, as an internal test */
2250 EVP_PKEY_up_ref(pkey);
2251 ctx2->pkey = pkey;
2252
2253 if (!TEST_int_eq(EVP_PKEY_check(ctx2), 0xbeef))
2254 goto done;
2255
2256 if (!TEST_int_eq(EVP_PKEY_public_check(ctx2), 0xbeef))
2257 goto done;
2258
2259 if (!TEST_int_eq(EVP_PKEY_param_check(ctx2), 0xbeef))
2260 goto done;
2261 #endif
2262
2263 ret = 1;
2264
2265 done:
2266 EVP_PKEY_CTX_free(ctx);
2267 #ifndef OPENSSL_NO_DEPRECATED_3_0
2268 EVP_PKEY_CTX_free(ctx2);
2269 #endif
2270 EVP_PKEY_free(pkey);
2271 return ret;
2272 }
2273
2274 #ifndef OPENSSL_NO_CMAC
2275 static int get_cmac_val(EVP_PKEY *pkey, unsigned char *mac)
2276 {
2277 EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
2278 const char msg[] = "Hello World";
2279 size_t maclen = AES_BLOCK_SIZE;
2280 int ret = 1;
2281
2282 if (!TEST_ptr(mdctx)
2283 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, NULL, testctx,
2284 testpropq, pkey, NULL))
2285 || !TEST_true(EVP_DigestSignUpdate(mdctx, msg, sizeof(msg)))
2286 || !TEST_true(EVP_DigestSignFinal(mdctx, mac, &maclen))
2287 || !TEST_size_t_eq(maclen, AES_BLOCK_SIZE))
2288 ret = 0;
2289
2290 EVP_MD_CTX_free(mdctx);
2291
2292 return ret;
2293 }
2294 static int test_CMAC_keygen(void)
2295 {
2296 static unsigned char key[] = {
2297 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2298 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2299 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
2300 };
2301 EVP_PKEY_CTX *kctx = NULL;
2302 int ret = 0;
2303 EVP_PKEY *pkey = NULL;
2304 unsigned char mac[AES_BLOCK_SIZE];
2305 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
2306 unsigned char mac2[AES_BLOCK_SIZE];
2307 # endif
2308
2309 if (nullprov != NULL)
2310 return TEST_skip("Test does not support a non-default library context");
2311
2312 /*
2313 * This is a legacy method for CMACs, but should still work.
2314 * This verifies that it works without an ENGINE.
2315 */
2316 kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_CMAC, NULL);
2317
2318 /* Test a CMAC key created using the "generated" method */
2319 if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
2320 || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
2321 EVP_PKEY_CTRL_CIPHER,
2322 0, (void *)EVP_aes_256_ecb()), 0)
2323 || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
2324 EVP_PKEY_CTRL_SET_MAC_KEY,
2325 sizeof(key), (void *)key), 0)
2326 || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0)
2327 || !TEST_ptr(pkey)
2328 || !TEST_true(get_cmac_val(pkey, mac)))
2329 goto done;
2330
2331 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
2332 EVP_PKEY_free(pkey);
2333
2334 /*
2335 * Test a CMAC key using the direct method, and compare with the mac
2336 * created above.
2337 */
2338 pkey = EVP_PKEY_new_CMAC_key(NULL, key, sizeof(key), EVP_aes_256_ecb());
2339 if (!TEST_ptr(pkey)
2340 || !TEST_true(get_cmac_val(pkey, mac2))
2341 || !TEST_mem_eq(mac, sizeof(mac), mac2, sizeof(mac2)))
2342 goto done;
2343 # endif
2344
2345 ret = 1;
2346
2347 done:
2348 EVP_PKEY_free(pkey);
2349 EVP_PKEY_CTX_free(kctx);
2350 return ret;
2351 }
2352 #endif
2353
2354 static int test_HKDF(void)
2355 {
2356 EVP_PKEY_CTX *pctx;
2357 unsigned char out[20];
2358 size_t outlen;
2359 int i, ret = 0;
2360 unsigned char salt[] = "0123456789";
2361 unsigned char key[] = "012345678901234567890123456789";
2362 unsigned char info[] = "infostring";
2363 const unsigned char expected[] = {
2364 0xe5, 0x07, 0x70, 0x7f, 0xc6, 0x78, 0xd6, 0x54, 0x32, 0x5f, 0x7e, 0xc5,
2365 0x7b, 0x59, 0x3e, 0xd8, 0x03, 0x6b, 0xed, 0xca
2366 };
2367 size_t expectedlen = sizeof(expected);
2368
2369 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
2370 goto done;
2371
2372 /* We do this twice to test reuse of the EVP_PKEY_CTX */
2373 for (i = 0; i < 2; i++) {
2374 outlen = sizeof(out);
2375 memset(out, 0, outlen);
2376
2377 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
2378 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
2379 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
2380 sizeof(salt) - 1), 0)
2381 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
2382 sizeof(key) - 1), 0)
2383 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
2384 sizeof(info) - 1), 0)
2385 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
2386 || !TEST_mem_eq(out, outlen, expected, expectedlen))
2387 goto done;
2388 }
2389
2390 ret = 1;
2391
2392 done:
2393 EVP_PKEY_CTX_free(pctx);
2394
2395 return ret;
2396 }
2397
2398 static int test_emptyikm_HKDF(void)
2399 {
2400 EVP_PKEY_CTX *pctx;
2401 unsigned char out[20];
2402 size_t outlen;
2403 int ret = 0;
2404 unsigned char salt[] = "9876543210";
2405 unsigned char key[] = "";
2406 unsigned char info[] = "stringinfo";
2407 const unsigned char expected[] = {
2408 0x68, 0x81, 0xa5, 0x3e, 0x5b, 0x9c, 0x7b, 0x6f, 0x2e, 0xec, 0xc8, 0x47,
2409 0x7c, 0xfa, 0x47, 0x35, 0x66, 0x82, 0x15, 0x30
2410 };
2411 size_t expectedlen = sizeof(expected);
2412
2413 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
2414 goto done;
2415
2416 outlen = sizeof(out);
2417 memset(out, 0, outlen);
2418
2419 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
2420 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
2421 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
2422 sizeof(salt) - 1), 0)
2423 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
2424 sizeof(key) - 1), 0)
2425 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
2426 sizeof(info) - 1), 0)
2427 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
2428 || !TEST_mem_eq(out, outlen, expected, expectedlen))
2429 goto done;
2430
2431 ret = 1;
2432
2433 done:
2434 EVP_PKEY_CTX_free(pctx);
2435
2436 return ret;
2437 }
2438
2439 #ifndef OPENSSL_NO_EC
2440 static int test_X509_PUBKEY_inplace(void)
2441 {
2442 int ret = 0;
2443 X509_PUBKEY *xp = X509_PUBKEY_new_ex(testctx, testpropq);
2444 const unsigned char *p = kExampleECPubKeyDER;
2445 size_t input_len = sizeof(kExampleECPubKeyDER);
2446
2447 if (!TEST_ptr(xp))
2448 goto done;
2449 if (!TEST_ptr(d2i_X509_PUBKEY(&xp, &p, input_len)))
2450 goto done;
2451
2452 if (!TEST_ptr(X509_PUBKEY_get0(xp)))
2453 goto done;
2454
2455 p = kExampleBadECPubKeyDER;
2456 input_len = sizeof(kExampleBadECPubKeyDER);
2457
2458 if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len)))
2459 goto done;
2460
2461 if (!TEST_true(X509_PUBKEY_get0(xp) == NULL))
2462 goto done;
2463
2464 ret = 1;
2465
2466 done:
2467 X509_PUBKEY_free(xp);
2468 return ret;
2469 }
2470
2471 static int test_X509_PUBKEY_dup(void)
2472 {
2473 int ret = 0;
2474 X509_PUBKEY *xp = NULL, *xq = NULL;
2475 const unsigned char *p = kExampleECPubKeyDER;
2476 size_t input_len = sizeof(kExampleECPubKeyDER);
2477
2478 xp = X509_PUBKEY_new_ex(testctx, testpropq);
2479 if (!TEST_ptr(xp)
2480 || !TEST_ptr(d2i_X509_PUBKEY(&xp, &p, input_len))
2481 || !TEST_ptr(xq = X509_PUBKEY_dup(xp))
2482 || !TEST_ptr_ne(xp, xq))
2483 goto done;
2484
2485 if (!TEST_ptr(X509_PUBKEY_get0(xq))
2486 || !TEST_ptr(X509_PUBKEY_get0(xp))
2487 || !TEST_ptr_ne(X509_PUBKEY_get0(xq), X509_PUBKEY_get0(xp)))
2488 goto done;
2489
2490 X509_PUBKEY_free(xq);
2491 xq = NULL;
2492 p = kExampleBadECPubKeyDER;
2493 input_len = sizeof(kExampleBadECPubKeyDER);
2494
2495 if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len))
2496 || !TEST_ptr(xq = X509_PUBKEY_dup(xp)))
2497 goto done;
2498
2499 X509_PUBKEY_free(xp);
2500 xp = NULL;
2501 if (!TEST_true(X509_PUBKEY_get0(xq) == NULL))
2502 goto done;
2503
2504 ret = 1;
2505
2506 done:
2507 X509_PUBKEY_free(xp);
2508 X509_PUBKEY_free(xq);
2509 return ret;
2510 }
2511 #endif /* OPENSSL_NO_EC */
2512
2513 /* Test getting and setting parameters on an EVP_PKEY_CTX */
2514 static int test_EVP_PKEY_CTX_get_set_params(EVP_PKEY *pkey)
2515 {
2516 EVP_MD_CTX *mdctx = NULL;
2517 EVP_PKEY_CTX *ctx = NULL;
2518 const OSSL_PARAM *params;
2519 OSSL_PARAM ourparams[2], *param = ourparams, *param_md;
2520 int ret = 0;
2521 const EVP_MD *md;
2522 char mdname[OSSL_MAX_NAME_SIZE];
2523 char ssl3ms[48];
2524
2525 /* Initialise a sign operation */
2526 ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq);
2527 if (!TEST_ptr(ctx)
2528 || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0))
2529 goto err;
2530
2531 /*
2532 * We should be able to query the parameters now.
2533 */
2534 params = EVP_PKEY_CTX_settable_params(ctx);
2535 if (!TEST_ptr(params)
2536 || !TEST_ptr(OSSL_PARAM_locate_const(params,
2537 OSSL_SIGNATURE_PARAM_DIGEST)))
2538 goto err;
2539
2540 params = EVP_PKEY_CTX_gettable_params(ctx);
2541 if (!TEST_ptr(params)
2542 || !TEST_ptr(OSSL_PARAM_locate_const(params,
2543 OSSL_SIGNATURE_PARAM_ALGORITHM_ID))
2544 || !TEST_ptr(OSSL_PARAM_locate_const(params,
2545 OSSL_SIGNATURE_PARAM_DIGEST)))
2546 goto err;
2547
2548 /*
2549 * Test getting and setting params via EVP_PKEY_CTX_set_params() and
2550 * EVP_PKEY_CTX_get_params()
2551 */
2552 strcpy(mdname, "SHA512");
2553 param_md = param;
2554 *param++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2555 mdname, 0);
2556 *param++ = OSSL_PARAM_construct_end();
2557
2558 if (!TEST_true(EVP_PKEY_CTX_set_params(ctx, ourparams)))
2559 goto err;
2560
2561 mdname[0] = '\0';
2562 *param_md = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2563 mdname, sizeof(mdname));
2564 if (!TEST_true(EVP_PKEY_CTX_get_params(ctx, ourparams))
2565 || !TEST_str_eq(mdname, "SHA512"))
2566 goto err;
2567
2568 /*
2569 * Test the TEST_PKEY_CTX_set_signature_md() and
2570 * TEST_PKEY_CTX_get_signature_md() functions
2571 */
2572 if (!TEST_int_gt(EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()), 0)
2573 || !TEST_int_gt(EVP_PKEY_CTX_get_signature_md(ctx, &md), 0)
2574 || !TEST_ptr_eq(md, EVP_sha256()))
2575 goto err;
2576
2577 /*
2578 * Test getting MD parameters via an associated EVP_PKEY_CTX
2579 */
2580 mdctx = EVP_MD_CTX_new();
2581 if (!TEST_ptr(mdctx)
2582 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, "SHA1", testctx, testpropq,
2583 pkey, NULL)))
2584 goto err;
2585
2586 /*
2587 * We now have an EVP_MD_CTX with an EVP_PKEY_CTX inside it. We should be
2588 * able to obtain the digest's settable parameters from the provider.
2589 */
2590 params = EVP_MD_CTX_settable_params(mdctx);
2591 if (!TEST_ptr(params)
2592 || !TEST_int_eq(strcmp(params[0].key, OSSL_DIGEST_PARAM_SSL3_MS), 0)
2593 /* The final key should be NULL */
2594 || !TEST_ptr_null(params[1].key))
2595 goto err;
2596
2597 param = ourparams;
2598 memset(ssl3ms, 0, sizeof(ssl3ms));
2599 *param++ = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
2600 ssl3ms, sizeof(ssl3ms));
2601 *param++ = OSSL_PARAM_construct_end();
2602
2603 if (!TEST_true(EVP_MD_CTX_set_params(mdctx, ourparams)))
2604 goto err;
2605
2606 ret = 1;
2607
2608 err:
2609 EVP_MD_CTX_free(mdctx);
2610 EVP_PKEY_CTX_free(ctx);
2611
2612 return ret;
2613 }
2614
2615 #ifndef OPENSSL_NO_DSA
2616 static int test_DSA_get_set_params(void)
2617 {
2618 OSSL_PARAM_BLD *bld = NULL;
2619 OSSL_PARAM *params = NULL;
2620 BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
2621 EVP_PKEY_CTX *pctx = NULL;
2622 EVP_PKEY *pkey = NULL;
2623 int ret = 0;
2624
2625 /*
2626 * Setup the parameters for our DSA object. For our purposes they don't
2627 * have to actually be *valid* parameters. We just need to set something.
2628 */
2629 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "DSA", NULL))
2630 || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2631 || !TEST_ptr(p = BN_new())
2632 || !TEST_ptr(q = BN_new())
2633 || !TEST_ptr(g = BN_new())
2634 || !TEST_ptr(pub = BN_new())
2635 || !TEST_ptr(priv = BN_new()))
2636 goto err;
2637 if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
2638 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
2639 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
2640 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
2641 pub))
2642 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
2643 priv)))
2644 goto err;
2645 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2646 goto err;
2647
2648 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2649 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2650 params), 0))
2651 goto err;
2652
2653 if (!TEST_ptr(pkey))
2654 goto err;
2655
2656 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2657
2658 err:
2659 EVP_PKEY_free(pkey);
2660 EVP_PKEY_CTX_free(pctx);
2661 OSSL_PARAM_free(params);
2662 OSSL_PARAM_BLD_free(bld);
2663 BN_free(p);
2664 BN_free(q);
2665 BN_free(g);
2666 BN_free(pub);
2667 BN_free(priv);
2668
2669 return ret;
2670 }
2671
2672 /*
2673 * Test combinations of private, public, missing and private + public key
2674 * params to ensure they are all accepted
2675 */
2676 static int test_DSA_priv_pub(void)
2677 {
2678 return test_EVP_PKEY_ffc_priv_pub("DSA");
2679 }
2680
2681 #endif /* !OPENSSL_NO_DSA */
2682
2683 static int test_RSA_get_set_params(void)
2684 {
2685 OSSL_PARAM_BLD *bld = NULL;
2686 OSSL_PARAM *params = NULL;
2687 BIGNUM *n = NULL, *e = NULL, *d = NULL;
2688 EVP_PKEY_CTX *pctx = NULL;
2689 EVP_PKEY *pkey = NULL;
2690 int ret = 0;
2691
2692 /*
2693 * Setup the parameters for our RSA object. For our purposes they don't
2694 * have to actually be *valid* parameters. We just need to set something.
2695 */
2696 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", NULL))
2697 || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2698 || !TEST_ptr(n = BN_new())
2699 || !TEST_ptr(e = BN_new())
2700 || !TEST_ptr(d = BN_new()))
2701 goto err;
2702 if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
2703 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
2704 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d)))
2705 goto err;
2706 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2707 goto err;
2708
2709 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2710 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2711 params), 0))
2712 goto err;
2713
2714 if (!TEST_ptr(pkey))
2715 goto err;
2716
2717 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2718
2719 err:
2720 EVP_PKEY_free(pkey);
2721 EVP_PKEY_CTX_free(pctx);
2722 OSSL_PARAM_free(params);
2723 OSSL_PARAM_BLD_free(bld);
2724 BN_free(n);
2725 BN_free(e);
2726 BN_free(d);
2727
2728 return ret;
2729 }
2730
2731 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2732 static int test_decrypt_null_chunks(void)
2733 {
2734 EVP_CIPHER_CTX* ctx = NULL;
2735 EVP_CIPHER *cipher = NULL;
2736 const unsigned char key[32] = {
2737 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2738 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2739 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1
2740 };
2741 unsigned char iv[12] = {
2742 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
2743 };
2744 unsigned char msg[] = "It was the best of times, it was the worst of times";
2745 unsigned char ciphertext[80];
2746 unsigned char plaintext[80];
2747 /* We initialise tmp to a non zero value on purpose */
2748 int ctlen, ptlen, tmp = 99;
2749 int ret = 0;
2750 const int enc_offset = 10, dec_offset = 20;
2751
2752 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, "ChaCha20-Poly1305", testpropq))
2753 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
2754 || !TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL,
2755 key, iv))
2756 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &ctlen, msg,
2757 enc_offset))
2758 /* Deliberate add a zero length update */
2759 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp, NULL,
2760 0))
2761 || !TEST_int_eq(tmp, 0)
2762 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp,
2763 msg + enc_offset,
2764 sizeof(msg) - enc_offset))
2765 || !TEST_int_eq(ctlen += tmp, sizeof(msg))
2766 || !TEST_true(EVP_EncryptFinal(ctx, ciphertext + ctlen, &tmp))
2767 || !TEST_int_eq(tmp, 0))
2768 goto err;
2769
2770 /* Deliberately initialise tmp to a non zero value */
2771 tmp = 99;
2772 if (!TEST_true(EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv))
2773 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext, &ptlen, ciphertext,
2774 dec_offset))
2775 /*
2776 * Deliberately add a zero length update. We also deliberately do
2777 * this at a different offset than for encryption.
2778 */
2779 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp, NULL,
2780 0))
2781 || !TEST_int_eq(tmp, 0)
2782 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp,
2783 ciphertext + dec_offset,
2784 ctlen - dec_offset))
2785 || !TEST_int_eq(ptlen += tmp, sizeof(msg))
2786 || !TEST_true(EVP_DecryptFinal(ctx, plaintext + ptlen, &tmp))
2787 || !TEST_int_eq(tmp, 0)
2788 || !TEST_mem_eq(msg, sizeof(msg), plaintext, ptlen))
2789 goto err;
2790
2791 ret = 1;
2792 err:
2793 EVP_CIPHER_CTX_free(ctx);
2794 EVP_CIPHER_free(cipher);
2795 return ret;
2796 }
2797 #endif /* !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) */
2798
2799 #ifndef OPENSSL_NO_DH
2800 /*
2801 * Test combinations of private, public, missing and private + public key
2802 * params to ensure they are all accepted
2803 */
2804 static int test_DH_priv_pub(void)
2805 {
2806 return test_EVP_PKEY_ffc_priv_pub("DH");
2807 }
2808
2809 # ifndef OPENSSL_NO_DEPRECATED_3_0
2810 static int test_EVP_PKEY_set1_DH(void)
2811 {
2812 DH *x942dh = NULL, *noqdh = NULL;
2813 EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
2814 int ret = 0;
2815 BIGNUM *p, *g = NULL;
2816 BIGNUM *pubkey = NULL;
2817 unsigned char pub[2048 / 8];
2818 size_t len = 0;
2819
2820 if (!TEST_ptr(p = BN_new())
2821 || !TEST_ptr(g = BN_new())
2822 || !TEST_ptr(pubkey = BN_new())
2823 || !TEST_true(BN_set_word(p, 9999))
2824 || !TEST_true(BN_set_word(g, 2))
2825 || !TEST_true(BN_set_word(pubkey, 4321))
2826 || !TEST_ptr(noqdh = DH_new())
2827 || !TEST_true(DH_set0_pqg(noqdh, p, NULL, g))
2828 || !TEST_true(DH_set0_key(noqdh, pubkey, NULL))
2829 || !TEST_ptr(pubkey = BN_new())
2830 || !TEST_true(BN_set_word(pubkey, 4321)))
2831 goto err;
2832 p = g = NULL;
2833
2834 x942dh = DH_get_2048_256();
2835 pkey1 = EVP_PKEY_new();
2836 pkey2 = EVP_PKEY_new();
2837 if (!TEST_ptr(x942dh)
2838 || !TEST_ptr(noqdh)
2839 || !TEST_ptr(pkey1)
2840 || !TEST_ptr(pkey2)
2841 || !TEST_true(DH_set0_key(x942dh, pubkey, NULL)))
2842 goto err;
2843 pubkey = NULL;
2844
2845 if (!TEST_true(EVP_PKEY_set1_DH(pkey1, x942dh))
2846 || !TEST_int_eq(EVP_PKEY_get_id(pkey1), EVP_PKEY_DHX))
2847 goto err;
2848
2849 if (!TEST_true(EVP_PKEY_get_bn_param(pkey1, OSSL_PKEY_PARAM_PUB_KEY,
2850 &pubkey))
2851 || !TEST_ptr(pubkey))
2852 goto err;
2853
2854 if (!TEST_true(EVP_PKEY_set1_DH(pkey2, noqdh))
2855 || !TEST_int_eq(EVP_PKEY_get_id(pkey2), EVP_PKEY_DH))
2856 goto err;
2857
2858 if (!TEST_true(EVP_PKEY_get_octet_string_param(pkey2,
2859 OSSL_PKEY_PARAM_PUB_KEY,
2860 pub, sizeof(pub), &len))
2861 || !TEST_size_t_ne(len, 0))
2862 goto err;
2863
2864 ret = 1;
2865 err:
2866 BN_free(p);
2867 BN_free(g);
2868 BN_free(pubkey);
2869 EVP_PKEY_free(pkey1);
2870 EVP_PKEY_free(pkey2);
2871 DH_free(x942dh);
2872 DH_free(noqdh);
2873
2874 return ret;
2875 }
2876 # endif /* !OPENSSL_NO_DEPRECATED_3_0 */
2877 #endif /* !OPENSSL_NO_DH */
2878
2879 /*
2880 * We test what happens with an empty template. For the sake of this test,
2881 * the template must be ignored, and we know that's the case for RSA keys
2882 * (this might arguably be a misfeature, but that's what we currently do,
2883 * even in provider code, since that's how the legacy RSA implementation
2884 * does things)
2885 */
2886 static int test_keygen_with_empty_template(int n)
2887 {
2888 EVP_PKEY_CTX *ctx = NULL;
2889 EVP_PKEY *pkey = NULL;
2890 EVP_PKEY *tkey = NULL;
2891 int ret = 0;
2892
2893 if (nullprov != NULL)
2894 return TEST_skip("Test does not support a non-default library context");
2895
2896 switch (n) {
2897 case 0:
2898 /* We do test with no template at all as well */
2899 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
2900 goto err;
2901 break;
2902 case 1:
2903 /* Here we create an empty RSA key that serves as our template */
2904 if (!TEST_ptr(tkey = EVP_PKEY_new())
2905 || !TEST_true(EVP_PKEY_set_type(tkey, EVP_PKEY_RSA))
2906 || !TEST_ptr(ctx = EVP_PKEY_CTX_new(tkey, NULL)))
2907 goto err;
2908 break;
2909 }
2910
2911 if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
2912 || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0))
2913 goto err;
2914
2915 ret = 1;
2916 err:
2917 EVP_PKEY_CTX_free(ctx);
2918 EVP_PKEY_free(pkey);
2919 EVP_PKEY_free(tkey);
2920 return ret;
2921 }
2922
2923 /*
2924 * Test that we fail if we attempt to use an algorithm that is not available
2925 * in the current library context (unless we are using an algorithm that
2926 * should be made available via legacy codepaths).
2927 *
2928 * 0: RSA
2929 * 1: SM2
2930 */
2931 static int test_pkey_ctx_fail_without_provider(int tst)
2932 {
2933 OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
2934 OSSL_PROVIDER *tmpnullprov = NULL;
2935 EVP_PKEY_CTX *pctx = NULL;
2936 const char *keytype = NULL;
2937 int expect_null = 0;
2938 int ret = 0;
2939
2940 if (!TEST_ptr(tmpctx))
2941 goto err;
2942
2943 tmpnullprov = OSSL_PROVIDER_load(tmpctx, "null");
2944 if (!TEST_ptr(tmpnullprov))
2945 goto err;
2946
2947 /*
2948 * We check for certain algos in the null provider.
2949 * If an algo is expected to have a provider keymgmt, constructing an
2950 * EVP_PKEY_CTX is expected to fail (return NULL).
2951 * Otherwise, if it's expected to have legacy support, constructing an
2952 * EVP_PKEY_CTX is expected to succeed (return non-NULL).
2953 */
2954 switch (tst) {
2955 case 0:
2956 keytype = "RSA";
2957 expect_null = 1;
2958 break;
2959 case 1:
2960 keytype = "SM2";
2961 expect_null = 1;
2962 #ifdef OPENSSL_NO_EC
2963 TEST_info("EC disable, skipping SM2 check...");
2964 goto end;
2965 #endif
2966 #ifdef OPENSSL_NO_SM2
2967 TEST_info("SM2 disable, skipping SM2 check...");
2968 goto end;
2969 #endif
2970 break;
2971 default:
2972 TEST_error("No test for case %d", tst);
2973 goto err;
2974 }
2975
2976 pctx = EVP_PKEY_CTX_new_from_name(tmpctx, keytype, "");
2977 if (expect_null ? !TEST_ptr_null(pctx) : !TEST_ptr(pctx))
2978 goto err;
2979
2980 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_SM2)
2981 end:
2982 #endif
2983 ret = 1;
2984
2985 err:
2986 EVP_PKEY_CTX_free(pctx);
2987 OSSL_PROVIDER_unload(tmpnullprov);
2988 OSSL_LIB_CTX_free(tmpctx);
2989 return ret;
2990 }
2991
2992 static int test_rand_agglomeration(void)
2993 {
2994 EVP_RAND *rand;
2995 EVP_RAND_CTX *ctx;
2996 OSSL_PARAM params[3], *p = params;
2997 int res;
2998 unsigned int step = 7;
2999 static unsigned char seed[] = "It does not matter how slowly you go "
3000 "as long as you do not stop.";
3001 unsigned char out[sizeof(seed)];
3002
3003 if (!TEST_int_ne(sizeof(seed) % step, 0)
3004 || !TEST_ptr(rand = EVP_RAND_fetch(testctx, "TEST-RAND", testpropq)))
3005 return 0;
3006 ctx = EVP_RAND_CTX_new(rand, NULL);
3007 EVP_RAND_free(rand);
3008 if (!TEST_ptr(ctx))
3009 return 0;
3010
3011 memset(out, 0, sizeof(out));
3012 *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
3013 seed, sizeof(seed));
3014 *p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
3015 *p = OSSL_PARAM_construct_end();
3016 res = TEST_true(EVP_RAND_CTX_set_params(ctx, params))
3017 && TEST_true(EVP_RAND_generate(ctx, out, sizeof(out), 0, 1, NULL, 0))
3018 && TEST_mem_eq(seed, sizeof(seed), out, sizeof(out));
3019 EVP_RAND_CTX_free(ctx);
3020 return res;
3021 }
3022
3023 /*
3024 * Test that we correctly return the original or "running" IV after
3025 * an encryption operation.
3026 * Run multiple times for some different relevant algorithms/modes.
3027 */
3028 static int test_evp_iv_aes(int idx)
3029 {
3030 int ret = 0;
3031 EVP_CIPHER_CTX *ctx = NULL;
3032 unsigned char key[16] = {0x4c, 0x43, 0xdb, 0xdd, 0x42, 0x73, 0x47, 0xd1,
3033 0xe5, 0x62, 0x7d, 0xcd, 0x4d, 0x76, 0x4d, 0x57};
3034 unsigned char init_iv[EVP_MAX_IV_LENGTH] =
3035 {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98, 0x82,
3036 0x5a, 0x55, 0x91, 0x81, 0x42, 0xa8, 0x89, 0x34};
3037 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
3038 9, 10, 11, 12, 13, 14, 15, 16 };
3039 unsigned char ciphertext[32], oiv[16], iv[16];
3040 unsigned char *ref_iv;
3041 unsigned char cbc_state[16] = {0x10, 0x2f, 0x05, 0xcc, 0xc2, 0x55, 0x72, 0xb9,
3042 0x88, 0xe6, 0x4a, 0x17, 0x10, 0x74, 0x22, 0x5e};
3043
3044 unsigned char ofb_state[16] = {0x76, 0xe6, 0x66, 0x61, 0xd0, 0x8a, 0xe4, 0x64,
3045 0xdd, 0x66, 0xbf, 0x00, 0xf0, 0xe3, 0x6f, 0xfd};
3046 unsigned char cfb_state[16] = {0x77, 0xe4, 0x65, 0x65, 0xd5, 0x8c, 0xe3, 0x6c,
3047 0xd4, 0x6c, 0xb4, 0x0c, 0xfd, 0xed, 0x60, 0xed};
3048 unsigned char gcm_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
3049 0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
3050 unsigned char ccm_state[7] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98};
3051 #ifndef OPENSSL_NO_OCB
3052 unsigned char ocb_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
3053 0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
3054 #endif
3055 int len = sizeof(ciphertext);
3056 size_t ivlen, ref_len;
3057 const EVP_CIPHER *type = NULL;
3058 int iv_reset = 0;
3059
3060 if (nullprov != NULL && idx < 6)
3061 return TEST_skip("Test does not support a non-default library context");
3062
3063 switch (idx) {
3064 case 0:
3065 type = EVP_aes_128_cbc();
3066 /* FALLTHROUGH */
3067 case 6:
3068 type = (type != NULL) ? type :
3069 EVP_CIPHER_fetch(testctx, "aes-128-cbc", testpropq);
3070 ref_iv = cbc_state;
3071 ref_len = sizeof(cbc_state);
3072 iv_reset = 1;
3073 break;
3074 case 1:
3075 type = EVP_aes_128_ofb();
3076 /* FALLTHROUGH */
3077 case 7:
3078 type = (type != NULL) ? type :
3079 EVP_CIPHER_fetch(testctx, "aes-128-ofb", testpropq);
3080 ref_iv = ofb_state;
3081 ref_len = sizeof(ofb_state);
3082 iv_reset = 1;
3083 break;
3084 case 2:
3085 type = EVP_aes_128_cfb();
3086 /* FALLTHROUGH */
3087 case 8:
3088 type = (type != NULL) ? type :
3089 EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq);
3090 ref_iv = cfb_state;
3091 ref_len = sizeof(cfb_state);
3092 iv_reset = 1;
3093 break;
3094 case 3:
3095 type = EVP_aes_128_gcm();
3096 /* FALLTHROUGH */
3097 case 9:
3098 type = (type != NULL) ? type :
3099 EVP_CIPHER_fetch(testctx, "aes-128-gcm", testpropq);
3100 ref_iv = gcm_state;
3101 ref_len = sizeof(gcm_state);
3102 break;
3103 case 4:
3104 type = EVP_aes_128_ccm();
3105 /* FALLTHROUGH */
3106 case 10:
3107 type = (type != NULL) ? type :
3108 EVP_CIPHER_fetch(testctx, "aes-128-ccm", testpropq);
3109 ref_iv = ccm_state;
3110 ref_len = sizeof(ccm_state);
3111 break;
3112 #ifdef OPENSSL_NO_OCB
3113 case 5:
3114 case 11:
3115 return 1;
3116 #else
3117 case 5:
3118 type = EVP_aes_128_ocb();
3119 /* FALLTHROUGH */
3120 case 11:
3121 type = (type != NULL) ? type :
3122 EVP_CIPHER_fetch(testctx, "aes-128-ocb", testpropq);
3123 ref_iv = ocb_state;
3124 ref_len = sizeof(ocb_state);
3125 break;
3126 #endif
3127 default:
3128 return 0;
3129 }
3130
3131 if (!TEST_ptr(type)
3132 || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
3133 || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
3134 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
3135 (int)sizeof(msg)))
3136 || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
3137 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
3138 || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
3139 goto err;
3140 ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
3141 if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
3142 || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
3143 goto err;
3144
3145 /* CBC, OFB, and CFB modes: the updated iv must be reset after reinit */
3146 if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
3147 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
3148 goto err;
3149 if (iv_reset) {
3150 if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
3151 goto err;
3152 } else {
3153 if (!TEST_mem_eq(ref_iv, ivlen, iv, ivlen))
3154 goto err;
3155 }
3156
3157 ret = 1;
3158 err:
3159 EVP_CIPHER_CTX_free(ctx);
3160 if (idx >= 6)
3161 EVP_CIPHER_free((EVP_CIPHER *)type);
3162 return ret;
3163 }
3164
3165 #ifndef OPENSSL_NO_DES
3166 static int test_evp_iv_des(int idx)
3167 {
3168 int ret = 0;
3169 EVP_CIPHER_CTX *ctx = NULL;
3170 static const unsigned char key[24] = {
3171 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
3172 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
3173 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
3174 };
3175 static const unsigned char init_iv[8] = {
3176 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
3177 };
3178 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
3179 9, 10, 11, 12, 13, 14, 15, 16 };
3180 unsigned char ciphertext[32], oiv[8], iv[8];
3181 unsigned const char *ref_iv;
3182 static const unsigned char cbc_state_des[8] = {
3183 0x4f, 0xa3, 0x85, 0xcd, 0x8b, 0xf3, 0x06, 0x2a
3184 };
3185 static const unsigned char cbc_state_3des[8] = {
3186 0x35, 0x27, 0x7d, 0x65, 0x6c, 0xfb, 0x50, 0xd9
3187 };
3188 static const unsigned char ofb_state_des[8] = {
3189 0xa7, 0x0d, 0x1d, 0x45, 0xf9, 0x96, 0x3f, 0x2c
3190 };
3191 static const unsigned char ofb_state_3des[8] = {
3192 0xab, 0x16, 0x24, 0xbb, 0x5b, 0xac, 0xed, 0x5e
3193 };
3194 static const unsigned char cfb_state_des[8] = {
3195 0x91, 0xeb, 0x6d, 0x29, 0x4b, 0x08, 0xbd, 0x73
3196 };
3197 static const unsigned char cfb_state_3des[8] = {
3198 0x34, 0xdd, 0xfb, 0x47, 0x33, 0x1c, 0x61, 0xf7
3199 };
3200 int len = sizeof(ciphertext);
3201 size_t ivlen, ref_len;
3202 EVP_CIPHER *type = NULL;
3203
3204 if (lgcyprov == NULL && idx < 3)
3205 return TEST_skip("Test requires legacy provider to be loaded");
3206
3207 switch (idx) {
3208 case 0:
3209 type = EVP_CIPHER_fetch(testctx, "des-cbc", testpropq);
3210 ref_iv = cbc_state_des;
3211 ref_len = sizeof(cbc_state_des);
3212 break;
3213 case 1:
3214 type = EVP_CIPHER_fetch(testctx, "des-ofb", testpropq);
3215 ref_iv = ofb_state_des;
3216 ref_len = sizeof(ofb_state_des);
3217 break;
3218 case 2:
3219 type = EVP_CIPHER_fetch(testctx, "des-cfb", testpropq);
3220 ref_iv = cfb_state_des;
3221 ref_len = sizeof(cfb_state_des);
3222 break;
3223 case 3:
3224 type = EVP_CIPHER_fetch(testctx, "des-ede3-cbc", testpropq);
3225 ref_iv = cbc_state_3des;
3226 ref_len = sizeof(cbc_state_3des);
3227 break;
3228 case 4:
3229 type = EVP_CIPHER_fetch(testctx, "des-ede3-ofb", testpropq);
3230 ref_iv = ofb_state_3des;
3231 ref_len = sizeof(ofb_state_3des);
3232 break;
3233 case 5:
3234 type = EVP_CIPHER_fetch(testctx, "des-ede3-cfb", testpropq);
3235 ref_iv = cfb_state_3des;
3236 ref_len = sizeof(cfb_state_3des);
3237 break;
3238 default:
3239 return 0;
3240 }
3241
3242 if (!TEST_ptr(type)
3243 || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
3244 || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
3245 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
3246 (int)sizeof(msg)))
3247 || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
3248 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
3249 || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
3250 goto err;
3251 ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
3252 if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
3253 || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
3254 goto err;
3255
3256 if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
3257 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
3258 goto err;
3259 if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
3260 goto err;
3261
3262 ret = 1;
3263 err:
3264 EVP_CIPHER_CTX_free(ctx);
3265 EVP_CIPHER_free(type);
3266 return ret;
3267 }
3268 #endif
3269
3270 #ifndef OPENSSL_NO_BF
3271 static int test_evp_bf_default_keylen(int idx)
3272 {
3273 int ret = 0;
3274 static const char *algos[4] = {
3275 "bf-ecb", "bf-cbc", "bf-cfb", "bf-ofb"
3276 };
3277 int ivlen[4] = { 0, 8, 8, 8 };
3278 EVP_CIPHER *cipher = NULL;
3279
3280 if (lgcyprov == NULL)
3281 return TEST_skip("Test requires legacy provider to be loaded");
3282
3283 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, algos[idx], testpropq))
3284 || !TEST_int_eq(EVP_CIPHER_get_key_length(cipher), 16)
3285 || !TEST_int_eq(EVP_CIPHER_get_iv_length(cipher), ivlen[idx]))
3286 goto err;
3287
3288 ret = 1;
3289 err:
3290 EVP_CIPHER_free(cipher);
3291 return ret;
3292 }
3293 #endif
3294
3295 #ifndef OPENSSL_NO_EC
3296 static int ecpub_nids[] = {
3297 NID_brainpoolP256r1, NID_X9_62_prime256v1,
3298 NID_secp384r1, NID_secp521r1,
3299 # ifndef OPENSSL_NO_EC2M
3300 NID_sect233k1, NID_sect233r1, NID_sect283r1,
3301 NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1,
3302 # endif
3303 NID_brainpoolP384r1, NID_brainpoolP512r1
3304 };
3305
3306 static int test_ecpub(int idx)
3307 {
3308 int ret = 0, len, savelen;
3309 int nid;
3310 unsigned char buf[1024];
3311 unsigned char *p;
3312 EVP_PKEY *pkey = NULL;
3313 EVP_PKEY_CTX *ctx = NULL;
3314 # ifndef OPENSSL_NO_DEPRECATED_3_0
3315 const unsigned char *q;
3316 EVP_PKEY *pkey2 = NULL;
3317 EC_KEY *ec = NULL;
3318 # endif
3319
3320 if (nullprov != NULL)
3321 return TEST_skip("Test does not support a non-default library context");
3322
3323 nid = ecpub_nids[idx];
3324
3325 ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
3326 if (!TEST_ptr(ctx)
3327 || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
3328 || !TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid))
3329 || !TEST_true(EVP_PKEY_keygen(ctx, &pkey)))
3330 goto done;
3331 len = i2d_PublicKey(pkey, NULL);
3332 savelen = len;
3333 if (!TEST_int_ge(len, 1)
3334 || !TEST_int_lt(len, 1024))
3335 goto done;
3336 p = buf;
3337 len = i2d_PublicKey(pkey, &p);
3338 if (!TEST_int_ge(len, 1)
3339 || !TEST_int_eq(len, savelen))
3340 goto done;
3341
3342 # ifndef OPENSSL_NO_DEPRECATED_3_0
3343 /* Now try to decode the just-created DER. */
3344 q = buf;
3345 if (!TEST_ptr((pkey2 = EVP_PKEY_new()))
3346 || !TEST_ptr((ec = EC_KEY_new_by_curve_name(nid)))
3347 || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey2, ec)))
3348 goto done;
3349 /* EC_KEY ownership transferred */
3350 ec = NULL;
3351 if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_EC, &pkey2, &q, savelen)))
3352 goto done;
3353 /* The keys should match. */
3354 if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
3355 goto done;
3356 # endif
3357
3358 ret = 1;
3359
3360 done:
3361 EVP_PKEY_CTX_free(ctx);
3362 EVP_PKEY_free(pkey);
3363 # ifndef OPENSSL_NO_DEPRECATED_3_0
3364 EVP_PKEY_free(pkey2);
3365 EC_KEY_free(ec);
3366 # endif
3367 return ret;
3368 }
3369 #endif
3370
3371 static int test_EVP_rsa_pss_with_keygen_bits(void)
3372 {
3373 int ret = 0;
3374 EVP_PKEY_CTX *ctx = NULL;
3375 EVP_PKEY *pkey = NULL;
3376 EVP_MD *md;
3377
3378 md = EVP_MD_fetch(testctx, "sha256", testpropq);
3379 ret = TEST_ptr(md)
3380 && TEST_ptr((ctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", testpropq)))
3381 && TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
3382 && TEST_int_gt(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 512), 0)
3383 && TEST_true(EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md))
3384 && TEST_true(EVP_PKEY_keygen(ctx, &pkey));
3385
3386 EVP_MD_free(md);
3387 EVP_PKEY_free(pkey);
3388 EVP_PKEY_CTX_free(ctx);
3389 return ret;
3390 }
3391
3392 static int test_EVP_rsa_pss_set_saltlen(void)
3393 {
3394 int ret = 0;
3395 EVP_PKEY *pkey = NULL;
3396 EVP_PKEY_CTX *pkey_ctx = NULL;
3397 EVP_MD *sha256 = NULL;
3398 EVP_MD_CTX *sha256_ctx = NULL;
3399 int saltlen = 9999; /* buggy EVP_PKEY_CTX_get_rsa_pss_saltlen() didn't update this */
3400 const int test_value = 32;
3401
3402 ret = TEST_ptr(pkey = load_example_rsa_key())
3403 && TEST_ptr(sha256 = EVP_MD_fetch(testctx, "sha256", NULL))
3404 && TEST_ptr(sha256_ctx = EVP_MD_CTX_new())
3405 && TEST_true(EVP_DigestSignInit(sha256_ctx, &pkey_ctx, sha256, NULL, pkey))
3406 && TEST_true(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING))
3407 && TEST_true(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, test_value))
3408 && TEST_true(EVP_PKEY_CTX_get_rsa_pss_saltlen(pkey_ctx, &saltlen))
3409 && TEST_int_eq(saltlen, test_value);
3410
3411 EVP_MD_CTX_free(sha256_ctx);
3412 EVP_PKEY_free(pkey);
3413 EVP_MD_free(sha256);
3414
3415 return ret;
3416 }
3417
3418 static int success = 1;
3419 static void md_names(const char *name, void *vctx)
3420 {
3421 OSSL_LIB_CTX *ctx = (OSSL_LIB_CTX *)vctx;
3422 /* Force a namemap update */
3423 EVP_CIPHER *aes128 = EVP_CIPHER_fetch(ctx, "AES-128-CBC", NULL);
3424
3425 if (!TEST_ptr(aes128))
3426 success = 0;
3427
3428 EVP_CIPHER_free(aes128);
3429 }
3430
3431 /*
3432 * Test that changing the namemap in a user callback works in a names_do_all
3433 * function.
3434 */
3435 static int test_names_do_all(void)
3436 {
3437 /* We use a custom libctx so that we know the state of the namemap */
3438 OSSL_LIB_CTX *ctx = OSSL_LIB_CTX_new();
3439 EVP_MD *sha256 = NULL;
3440 int testresult = 0;
3441
3442 if (!TEST_ptr(ctx))
3443 goto err;
3444
3445 sha256 = EVP_MD_fetch(ctx, "SHA2-256", NULL);
3446 if (!TEST_ptr(sha256))
3447 goto err;
3448
3449 /*
3450 * We loop through all the names for a given digest. This should still work
3451 * even if the namemap changes part way through.
3452 */
3453 if (!TEST_true(EVP_MD_names_do_all(sha256, md_names, ctx)))
3454 goto err;
3455
3456 if (!TEST_true(success))
3457 goto err;
3458
3459 testresult = 1;
3460 err:
3461 EVP_MD_free(sha256);
3462 OSSL_LIB_CTX_free(ctx);
3463 return testresult;
3464 }
3465
3466 typedef struct {
3467 const char *cipher;
3468 const unsigned char *key;
3469 const unsigned char *iv;
3470 const unsigned char *input;
3471 const unsigned char *expected;
3472 const unsigned char *tag;
3473 size_t ivlen; /* 0 if we do not need to set a specific IV len */
3474 size_t inlen;
3475 size_t expectedlen;
3476 size_t taglen;
3477 int keyfirst;
3478 int initenc;
3479 int finalenc;
3480 } EVP_INIT_TEST_st;
3481
3482 static const EVP_INIT_TEST_st evp_init_tests[] = {
3483 {
3484 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbPlaintext,
3485 cfbCiphertext, NULL, 0, sizeof(cfbPlaintext), sizeof(cfbCiphertext),
3486 0, 1, 0, 1
3487 },
3488 {
3489 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultPlaintext,
3490 gcmDefaultCiphertext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3491 sizeof(gcmDefaultPlaintext), sizeof(gcmDefaultCiphertext),
3492 sizeof(gcmDefaultTag), 1, 0, 1
3493 },
3494 {
3495 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbPlaintext,
3496 cfbCiphertext, NULL, 0, sizeof(cfbPlaintext), sizeof(cfbCiphertext),
3497 0, 0, 0, 1
3498 },
3499 {
3500 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultPlaintext,
3501 gcmDefaultCiphertext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3502 sizeof(gcmDefaultPlaintext), sizeof(gcmDefaultCiphertext),
3503 sizeof(gcmDefaultTag), 0, 0, 1
3504 },
3505 {
3506 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbCiphertext,
3507 cfbPlaintext, NULL, 0, sizeof(cfbCiphertext), sizeof(cfbPlaintext),
3508 0, 1, 1, 0
3509 },
3510 {
3511 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultCiphertext,
3512 gcmDefaultPlaintext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3513 sizeof(gcmDefaultCiphertext), sizeof(gcmDefaultPlaintext),
3514 sizeof(gcmDefaultTag), 1, 1, 0
3515 },
3516 {
3517 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbCiphertext,
3518 cfbPlaintext, NULL, 0, sizeof(cfbCiphertext), sizeof(cfbPlaintext),
3519 0, 0, 1, 0
3520 },
3521 {
3522 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultCiphertext,
3523 gcmDefaultPlaintext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3524 sizeof(gcmDefaultCiphertext), sizeof(gcmDefaultPlaintext),
3525 sizeof(gcmDefaultTag), 0, 1, 0
3526 }
3527 };
3528
3529 static int evp_init_seq_set_iv(EVP_CIPHER_CTX *ctx, const EVP_INIT_TEST_st *t)
3530 {
3531 int res = 0;
3532
3533 if (t->ivlen != 0) {
3534 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen, NULL), 0))
3535 goto err;
3536 }
3537 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, t->iv, -1)))
3538 goto err;
3539 res = 1;
3540 err:
3541 return res;
3542 }
3543
3544 /*
3545 * Test step-wise cipher initialization via EVP_CipherInit_ex where the
3546 * arguments are given one at a time and a final adjustment to the enc
3547 * parameter sets the correct operation.
3548 */
3549 static int test_evp_init_seq(int idx)
3550 {
3551 int outlen1, outlen2;
3552 int testresult = 0;
3553 unsigned char outbuf[1024];
3554 unsigned char tag[16];
3555 const EVP_INIT_TEST_st *t = &evp_init_tests[idx];
3556 EVP_CIPHER_CTX *ctx = NULL;
3557 EVP_CIPHER *type = NULL;
3558 size_t taglen = sizeof(tag);
3559 char *errmsg = NULL;
3560
3561 ctx = EVP_CIPHER_CTX_new();
3562 if (ctx == NULL) {
3563 errmsg = "CTX_ALLOC";
3564 goto err;
3565 }
3566 if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, t->cipher, testpropq))) {
3567 errmsg = "CIPHER_FETCH";
3568 goto err;
3569 }
3570 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, NULL, NULL, t->initenc))) {
3571 errmsg = "EMPTY_ENC_INIT";
3572 goto err;
3573 }
3574 if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3575 errmsg = "PADDING";
3576 goto err;
3577 }
3578 if (t->keyfirst && !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, t->key, NULL, -1))) {
3579 errmsg = "KEY_INIT (before iv)";
3580 goto err;
3581 }
3582 if (!evp_init_seq_set_iv(ctx, t)) {
3583 errmsg = "IV_INIT";
3584 goto err;
3585 }
3586 if (t->keyfirst == 0 && !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, t->key, NULL, -1))) {
3587 errmsg = "KEY_INIT (after iv)";
3588 goto err;
3589 }
3590 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, t->finalenc))) {
3591 errmsg = "FINAL_ENC_INIT";
3592 goto err;
3593 }
3594 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3595 errmsg = "CIPHER_UPDATE";
3596 goto err;
3597 }
3598 if (t->finalenc == 0 && t->tag != NULL) {
3599 /* Set expected tag */
3600 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
3601 t->taglen, (void *)t->tag), 0)) {
3602 errmsg = "SET_TAG";
3603 goto err;
3604 }
3605 }
3606 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3607 errmsg = "CIPHER_FINAL";
3608 goto err;
3609 }
3610 if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3611 errmsg = "WRONG_RESULT";
3612 goto err;
3613 }
3614 if (t->finalenc != 0 && t->tag != NULL) {
3615 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag), 0)) {
3616 errmsg = "GET_TAG";
3617 goto err;
3618 }
3619 if (!TEST_mem_eq(t->tag, t->taglen, tag, taglen)) {
3620 errmsg = "TAG_ERROR";
3621 goto err;
3622 }
3623 }
3624 testresult = 1;
3625 err:
3626 if (errmsg != NULL)
3627 TEST_info("evp_init_test %d: %s", idx, errmsg);
3628 EVP_CIPHER_CTX_free(ctx);
3629 EVP_CIPHER_free(type);
3630 return testresult;
3631 }
3632
3633 typedef struct {
3634 const unsigned char *input;
3635 const unsigned char *expected;
3636 size_t inlen;
3637 size_t expectedlen;
3638 int enc;
3639 } EVP_RESET_TEST_st;
3640
3641 static const EVP_RESET_TEST_st evp_reset_tests[] = {
3642 {
3643 cfbPlaintext, cfbCiphertext,
3644 sizeof(cfbPlaintext), sizeof(cfbCiphertext), 1
3645 },
3646 {
3647 cfbCiphertext, cfbPlaintext,
3648 sizeof(cfbCiphertext), sizeof(cfbPlaintext), 0
3649 }
3650 };
3651
3652 /*
3653 * Test a reset of a cipher via EVP_CipherInit_ex after the cipher has already
3654 * been used.
3655 */
3656 static int test_evp_reset(int idx)
3657 {
3658 const EVP_RESET_TEST_st *t = &evp_reset_tests[idx];
3659 int outlen1, outlen2;
3660 int testresult = 0;
3661 unsigned char outbuf[1024];
3662 EVP_CIPHER_CTX *ctx = NULL;
3663 EVP_CIPHER *type = NULL;
3664 char *errmsg = NULL;
3665
3666 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3667 errmsg = "CTX_ALLOC";
3668 goto err;
3669 }
3670 if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq))) {
3671 errmsg = "CIPHER_FETCH";
3672 goto err;
3673 }
3674 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, kCFBDefaultKey, iCFBIV, t->enc))) {
3675 errmsg = "CIPHER_INIT";
3676 goto err;
3677 }
3678 if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3679 errmsg = "PADDING";
3680 goto err;
3681 }
3682 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3683 errmsg = "CIPHER_UPDATE";
3684 goto err;
3685 }
3686 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3687 errmsg = "CIPHER_FINAL";
3688 goto err;
3689 }
3690 if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3691 errmsg = "WRONG_RESULT";
3692 goto err;
3693 }
3694 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, -1))) {
3695 errmsg = "CIPHER_REINIT";
3696 goto err;
3697 }
3698 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3699 errmsg = "CIPHER_UPDATE (reinit)";
3700 goto err;
3701 }
3702 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3703 errmsg = "CIPHER_FINAL (reinit)";
3704 goto err;
3705 }
3706 if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3707 errmsg = "WRONG_RESULT (reinit)";
3708 goto err;
3709 }
3710 testresult = 1;
3711 err:
3712 if (errmsg != NULL)
3713 TEST_info("test_evp_reset %d: %s", idx, errmsg);
3714 EVP_CIPHER_CTX_free(ctx);
3715 EVP_CIPHER_free(type);
3716 return testresult;
3717 }
3718
3719 typedef struct {
3720 const char *cipher;
3721 int enc;
3722 } EVP_UPDATED_IV_TEST_st;
3723
3724 static const EVP_UPDATED_IV_TEST_st evp_updated_iv_tests[] = {
3725 {
3726 "aes-128-cfb", 1
3727 },
3728 {
3729 "aes-128-cfb", 0
3730 },
3731 {
3732 "aes-128-cfb1", 1
3733 },
3734 {
3735 "aes-128-cfb1", 0
3736 },
3737 {
3738 "aes-128-cfb8", 1
3739 },
3740 {
3741 "aes-128-cfb8", 0
3742 },
3743 {
3744 "aes-128-ofb", 1
3745 },
3746 {
3747 "aes-128-ofb", 0
3748 },
3749 {
3750 "aes-128-ctr", 1
3751 },
3752 {
3753 "aes-128-ctr", 0
3754 },
3755 {
3756 "aes-128-cbc", 1
3757 },
3758 {
3759 "aes-128-cbc", 0
3760 }
3761 };
3762
3763 /*
3764 * Test that the IV in the context is updated during a crypto operation for CFB
3765 * and OFB.
3766 */
3767 static int test_evp_updated_iv(int idx)
3768 {
3769 const EVP_UPDATED_IV_TEST_st *t = &evp_updated_iv_tests[idx];
3770 int outlen1, outlen2;
3771 int testresult = 0;
3772 unsigned char outbuf[1024];
3773 EVP_CIPHER_CTX *ctx = NULL;
3774 EVP_CIPHER *type = NULL;
3775 unsigned char updated_iv[EVP_MAX_IV_LENGTH];
3776 int iv_len;
3777 char *errmsg = NULL;
3778
3779 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3780 errmsg = "CTX_ALLOC";
3781 goto err;
3782 }
3783 if ((type = EVP_CIPHER_fetch(testctx, t->cipher, testpropq)) == NULL) {
3784 TEST_info("cipher %s not supported, skipping", t->cipher);
3785 goto ok;
3786 }
3787
3788 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, kCFBDefaultKey, iCFBIV, t->enc))) {
3789 errmsg = "CIPHER_INIT";
3790 goto err;
3791 }
3792 if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3793 errmsg = "PADDING";
3794 goto err;
3795 }
3796 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, cfbPlaintext, sizeof(cfbPlaintext)))) {
3797 errmsg = "CIPHER_UPDATE";
3798 goto err;
3799 }
3800 if (!TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, updated_iv, sizeof(updated_iv)))) {
3801 errmsg = "CIPHER_CTX_GET_UPDATED_IV";
3802 goto err;
3803 }
3804 if (!TEST_true(iv_len = EVP_CIPHER_CTX_get_iv_length(ctx))) {
3805 errmsg = "CIPHER_CTX_GET_IV_LEN";
3806 goto err;
3807 }
3808 if (!TEST_mem_ne(iCFBIV, sizeof(iCFBIV), updated_iv, iv_len)) {
3809 errmsg = "IV_NOT_UPDATED";
3810 goto err;
3811 }
3812 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3813 errmsg = "CIPHER_FINAL";
3814 goto err;
3815 }
3816 ok:
3817 testresult = 1;
3818 err:
3819 if (errmsg != NULL)
3820 TEST_info("test_evp_updated_iv %d: %s", idx, errmsg);
3821 EVP_CIPHER_CTX_free(ctx);
3822 EVP_CIPHER_free(type);
3823 return testresult;
3824 }
3825
3826 typedef struct {
3827 const unsigned char *iv1;
3828 const unsigned char *iv2;
3829 const unsigned char *expected1;
3830 const unsigned char *expected2;
3831 const unsigned char *tag1;
3832 const unsigned char *tag2;
3833 size_t ivlen1;
3834 size_t ivlen2;
3835 size_t expectedlen1;
3836 size_t expectedlen2;
3837 } TEST_GCM_IV_REINIT_st;
3838
3839 static const TEST_GCM_IV_REINIT_st gcm_reinit_tests[] = {
3840 {
3841 iGCMResetIV1, iGCMResetIV2, gcmResetCiphertext1, gcmResetCiphertext2,
3842 gcmResetTag1, gcmResetTag2, sizeof(iGCMResetIV1), sizeof(iGCMResetIV2),
3843 sizeof(gcmResetCiphertext1), sizeof(gcmResetCiphertext2)
3844 },
3845 {
3846 iGCMResetIV2, iGCMResetIV1, gcmResetCiphertext2, gcmResetCiphertext1,
3847 gcmResetTag2, gcmResetTag1, sizeof(iGCMResetIV2), sizeof(iGCMResetIV1),
3848 sizeof(gcmResetCiphertext2), sizeof(gcmResetCiphertext1)
3849 }
3850 };
3851
3852 static int test_gcm_reinit(int idx)
3853 {
3854 int outlen1, outlen2, outlen3;
3855 int testresult = 0;
3856 unsigned char outbuf[1024];
3857 unsigned char tag[16];
3858 const TEST_GCM_IV_REINIT_st *t = &gcm_reinit_tests[idx];
3859 EVP_CIPHER_CTX *ctx = NULL;
3860 EVP_CIPHER *type = NULL;
3861 size_t taglen = sizeof(tag);
3862 char *errmsg = NULL;
3863
3864 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3865 errmsg = "CTX_ALLOC";
3866 goto err;
3867 }
3868 if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "aes-256-gcm", testpropq))) {
3869 errmsg = "CIPHER_FETCH";
3870 goto err;
3871 }
3872 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, NULL, NULL, 1))) {
3873 errmsg = "ENC_INIT";
3874 goto err;
3875 }
3876 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen1, NULL), 0)) {
3877 errmsg = "SET_IVLEN1";
3878 goto err;
3879 }
3880 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, kGCMResetKey, t->iv1, 1))) {
3881 errmsg = "SET_IV1";
3882 goto err;
3883 }
3884 if (!TEST_true(EVP_CipherUpdate(ctx, NULL, &outlen3, gcmAAD, sizeof(gcmAAD)))) {
3885 errmsg = "AAD1";
3886 goto err;
3887 }
3888 EVP_CIPHER_CTX_set_padding(ctx, 0);
3889 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, gcmResetPlaintext,
3890 sizeof(gcmResetPlaintext)))) {
3891 errmsg = "CIPHER_UPDATE1";
3892 goto err;
3893 }
3894 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3895 errmsg = "CIPHER_FINAL1";
3896 goto err;
3897 }
3898 if (!TEST_mem_eq(t->expected1, t->expectedlen1, outbuf, outlen1 + outlen2)) {
3899 errmsg = "WRONG_RESULT1";
3900 goto err;
3901 }
3902 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag), 0)) {
3903 errmsg = "GET_TAG1";
3904 goto err;
3905 }
3906 if (!TEST_mem_eq(t->tag1, taglen, tag, taglen)) {
3907 errmsg = "TAG_ERROR1";
3908 goto err;
3909 }
3910 /* Now reinit */
3911 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen2, NULL), 0)) {
3912 errmsg = "SET_IVLEN2";
3913 goto err;
3914 }
3915 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, t->iv2, -1))) {
3916 errmsg = "SET_IV2";
3917 goto err;
3918 }
3919 if (!TEST_true(EVP_CipherUpdate(ctx, NULL, &outlen3, gcmAAD, sizeof(gcmAAD)))) {
3920 errmsg = "AAD2";
3921 goto err;
3922 }
3923 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, gcmResetPlaintext,
3924 sizeof(gcmResetPlaintext)))) {
3925 errmsg = "CIPHER_UPDATE2";
3926 goto err;
3927 }
3928 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3929 errmsg = "CIPHER_FINAL2";
3930 goto err;
3931 }
3932 if (!TEST_mem_eq(t->expected2, t->expectedlen2, outbuf, outlen1 + outlen2)) {
3933 errmsg = "WRONG_RESULT2";
3934 goto err;
3935 }
3936 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag), 0)) {
3937 errmsg = "GET_TAG2";
3938 goto err;
3939 }
3940 if (!TEST_mem_eq(t->tag2, taglen, tag, taglen)) {
3941 errmsg = "TAG_ERROR2";
3942 goto err;
3943 }
3944 testresult = 1;
3945 err:
3946 if (errmsg != NULL)
3947 TEST_info("evp_init_test %d: %s", idx, errmsg);
3948 EVP_CIPHER_CTX_free(ctx);
3949 EVP_CIPHER_free(type);
3950 return testresult;
3951 }
3952
3953 #ifndef OPENSSL_NO_DEPRECATED_3_0
3954 static EVP_PKEY_METHOD *custom_pmeth = NULL;
3955 static const EVP_PKEY_METHOD *orig_pmeth = NULL;
3956
3957 # define EVP_PKEY_CTRL_MY_COMMAND 9999
3958
3959 static int custom_pmeth_init(EVP_PKEY_CTX *ctx)
3960 {
3961 int (*pinit)(EVP_PKEY_CTX *ctx);
3962
3963 EVP_PKEY_meth_get_init(orig_pmeth, &pinit);
3964 return pinit(ctx);
3965 }
3966
3967 static void custom_pmeth_cleanup(EVP_PKEY_CTX *ctx)
3968 {
3969 void (*pcleanup)(EVP_PKEY_CTX *ctx);
3970
3971 EVP_PKEY_meth_get_cleanup(orig_pmeth, &pcleanup);
3972 pcleanup(ctx);
3973 }
3974
3975 static int custom_pmeth_sign(EVP_PKEY_CTX *ctx, unsigned char *out,
3976 size_t *outlen, const unsigned char *in,
3977 size_t inlen)
3978 {
3979 int (*psign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
3980 const unsigned char *tbs, size_t tbslen);
3981
3982 EVP_PKEY_meth_get_sign(orig_pmeth, NULL, &psign);
3983 return psign(ctx, out, outlen, in, inlen);
3984 }
3985
3986 static int custom_pmeth_digestsign(EVP_MD_CTX *ctx, unsigned char *sig,
3987 size_t *siglen, const unsigned char *tbs,
3988 size_t tbslen)
3989 {
3990 int (*pdigestsign)(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen,
3991 const unsigned char *tbs, size_t tbslen);
3992
3993 EVP_PKEY_meth_get_digestsign(orig_pmeth, &pdigestsign);
3994 return pdigestsign(ctx, sig, siglen, tbs, tbslen);
3995 }
3996
3997 static int custom_pmeth_derive(EVP_PKEY_CTX *ctx, unsigned char *key,
3998 size_t *keylen)
3999 {
4000 int (*pderive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
4001
4002 EVP_PKEY_meth_get_derive(orig_pmeth, NULL, &pderive);
4003 return pderive(ctx, key, keylen);
4004 }
4005
4006 static int custom_pmeth_copy(EVP_PKEY_CTX *dst, const EVP_PKEY_CTX *src)
4007 {
4008 int (*pcopy)(EVP_PKEY_CTX *dst, const EVP_PKEY_CTX *src);
4009
4010 EVP_PKEY_meth_get_copy(orig_pmeth, &pcopy);
4011 return pcopy(dst, src);
4012 }
4013
4014 static int ctrl_called;
4015
4016 static int custom_pmeth_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
4017 {
4018 int (*pctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
4019
4020 EVP_PKEY_meth_get_ctrl(orig_pmeth, &pctrl, NULL);
4021
4022 if (type == EVP_PKEY_CTRL_MY_COMMAND) {
4023 ctrl_called = 1;
4024 return 1;
4025 }
4026
4027 return pctrl(ctx, type, p1, p2);
4028 }
4029
4030 static int test_custom_pmeth(int idx)
4031 {
4032 EVP_PKEY_CTX *pctx = NULL;
4033 EVP_MD_CTX *ctx = NULL;
4034 EVP_PKEY *pkey = NULL;
4035 int id, orig_id, orig_flags;
4036 int testresult = 0;
4037 size_t reslen;
4038 unsigned char *res = NULL;
4039 unsigned char msg[] = { 'H', 'e', 'l', 'l', 'o' };
4040 const EVP_MD *md = EVP_sha256();
4041 int doderive = 0;
4042
4043 ctrl_called = 0;
4044
4045 /* We call deprecated APIs so this test doesn't support a custom libctx */
4046 if (testctx != NULL)
4047 return 1;
4048
4049 switch (idx) {
4050 case 0:
4051 case 6:
4052 id = EVP_PKEY_RSA;
4053 pkey = load_example_rsa_key();
4054 break;
4055 case 1:
4056 case 7:
4057 # ifndef OPENSSL_NO_DSA
4058 id = EVP_PKEY_DSA;
4059 pkey = load_example_dsa_key();
4060 break;
4061 # else
4062 return 1;
4063 # endif
4064 case 2:
4065 case 8:
4066 # ifndef OPENSSL_NO_EC
4067 id = EVP_PKEY_EC;
4068 pkey = load_example_ec_key();
4069 break;
4070 # else
4071 return 1;
4072 # endif
4073 case 3:
4074 case 9:
4075 # ifndef OPENSSL_NO_EC
4076 id = EVP_PKEY_ED25519;
4077 md = NULL;
4078 pkey = load_example_ed25519_key();
4079 break;
4080 # else
4081 return 1;
4082 # endif
4083 case 4:
4084 case 10:
4085 # ifndef OPENSSL_NO_DH
4086 id = EVP_PKEY_DH;
4087 doderive = 1;
4088 pkey = load_example_dh_key();
4089 break;
4090 # else
4091 return 1;
4092 # endif
4093 case 5:
4094 case 11:
4095 # ifndef OPENSSL_NO_EC
4096 id = EVP_PKEY_X25519;
4097 doderive = 1;
4098 pkey = load_example_x25519_key();
4099 break;
4100 # else
4101 return 1;
4102 # endif
4103 default:
4104 TEST_error("Should not happen");
4105 goto err;
4106 }
4107
4108 if (!TEST_ptr(pkey))
4109 goto err;
4110
4111 if (idx < 6) {
4112 if (!TEST_true(evp_pkey_is_provided(pkey)))
4113 goto err;
4114 } else {
4115 EVP_PKEY *tmp = pkey;
4116
4117 /* Convert to a legacy key */
4118 pkey = EVP_PKEY_new();
4119 if (!TEST_ptr(pkey)) {
4120 pkey = tmp;
4121 goto err;
4122 }
4123 if (!TEST_true(evp_pkey_copy_downgraded(&pkey, tmp))) {
4124 EVP_PKEY_free(tmp);
4125 goto err;
4126 }
4127 EVP_PKEY_free(tmp);
4128 if (!TEST_true(evp_pkey_is_legacy(pkey)))
4129 goto err;
4130 }
4131
4132 if (!TEST_ptr(orig_pmeth = EVP_PKEY_meth_find(id))
4133 || !TEST_ptr(pkey))
4134 goto err;
4135
4136 EVP_PKEY_meth_get0_info(&orig_id, &orig_flags, orig_pmeth);
4137 if (!TEST_int_eq(orig_id, id)
4138 || !TEST_ptr(custom_pmeth = EVP_PKEY_meth_new(id, orig_flags)))
4139 goto err;
4140
4141 if (id == EVP_PKEY_ED25519) {
4142 EVP_PKEY_meth_set_digestsign(custom_pmeth, custom_pmeth_digestsign);
4143 } if (id == EVP_PKEY_DH || id == EVP_PKEY_X25519) {
4144 EVP_PKEY_meth_set_derive(custom_pmeth, NULL, custom_pmeth_derive);
4145 } else {
4146 EVP_PKEY_meth_set_sign(custom_pmeth, NULL, custom_pmeth_sign);
4147 }
4148 if (id != EVP_PKEY_ED25519 && id != EVP_PKEY_X25519) {
4149 EVP_PKEY_meth_set_init(custom_pmeth, custom_pmeth_init);
4150 EVP_PKEY_meth_set_cleanup(custom_pmeth, custom_pmeth_cleanup);
4151 EVP_PKEY_meth_set_copy(custom_pmeth, custom_pmeth_copy);
4152 }
4153 EVP_PKEY_meth_set_ctrl(custom_pmeth, custom_pmeth_ctrl, NULL);
4154 if (!TEST_true(EVP_PKEY_meth_add0(custom_pmeth)))
4155 goto err;
4156
4157 if (doderive) {
4158 pctx = EVP_PKEY_CTX_new(pkey, NULL);
4159 if (!TEST_ptr(pctx)
4160 || !TEST_int_eq(EVP_PKEY_derive_init(pctx), 1)
4161 || !TEST_int_ge(EVP_PKEY_CTX_ctrl(pctx, -1, -1,
4162 EVP_PKEY_CTRL_MY_COMMAND, 0, NULL),
4163 1)
4164 || !TEST_int_eq(ctrl_called, 1)
4165 || !TEST_int_ge(EVP_PKEY_derive_set_peer(pctx, pkey), 1)
4166 || !TEST_int_ge(EVP_PKEY_derive(pctx, NULL, &reslen), 1)
4167 || !TEST_ptr(res = OPENSSL_malloc(reslen))
4168 || !TEST_int_ge(EVP_PKEY_derive(pctx, res, &reslen), 1))
4169 goto err;
4170 } else {
4171 ctx = EVP_MD_CTX_new();
4172 reslen = EVP_PKEY_size(pkey);
4173 res = OPENSSL_malloc(reslen);
4174 if (!TEST_ptr(ctx)
4175 || !TEST_ptr(res)
4176 || !TEST_true(EVP_DigestSignInit(ctx, &pctx, md, NULL, pkey))
4177 || !TEST_int_ge(EVP_PKEY_CTX_ctrl(pctx, -1, -1,
4178 EVP_PKEY_CTRL_MY_COMMAND, 0, NULL),
4179 1)
4180 || !TEST_int_eq(ctrl_called, 1))
4181 goto err;
4182
4183 if (id == EVP_PKEY_ED25519) {
4184 if (!TEST_true(EVP_DigestSign(ctx, res, &reslen, msg, sizeof(msg))))
4185 goto err;
4186 } else {
4187 if (!TEST_true(EVP_DigestUpdate(ctx, msg, sizeof(msg)))
4188 || !TEST_true(EVP_DigestSignFinal(ctx, res, &reslen)))
4189 goto err;
4190 }
4191 }
4192
4193 testresult = 1;
4194 err:
4195 OPENSSL_free(res);
4196 EVP_MD_CTX_free(ctx);
4197 if (doderive)
4198 EVP_PKEY_CTX_free(pctx);
4199 EVP_PKEY_free(pkey);
4200 EVP_PKEY_meth_remove(custom_pmeth);
4201 EVP_PKEY_meth_free(custom_pmeth);
4202 custom_pmeth = NULL;
4203 return testresult;
4204 }
4205
4206 static int test_evp_md_cipher_meth(void)
4207 {
4208 EVP_MD *md = EVP_MD_meth_dup(EVP_sha256());
4209 EVP_CIPHER *ciph = EVP_CIPHER_meth_dup(EVP_aes_128_cbc());
4210 int testresult = 0;
4211
4212 if (!TEST_ptr(md) || !TEST_ptr(ciph))
4213 goto err;
4214
4215 testresult = 1;
4216
4217 err:
4218 EVP_MD_meth_free(md);
4219 EVP_CIPHER_meth_free(ciph);
4220
4221 return testresult;
4222 }
4223
4224 typedef struct {
4225 int data;
4226 } custom_dgst_ctx;
4227
4228 static int custom_md_init_called = 0;
4229 static int custom_md_cleanup_called = 0;
4230
4231 static int custom_md_init(EVP_MD_CTX *ctx)
4232 {
4233 custom_dgst_ctx *p = EVP_MD_CTX_md_data(ctx);
4234
4235 if (p == NULL)
4236 return 0;
4237
4238 custom_md_init_called++;
4239 return 1;
4240 }
4241
4242 static int custom_md_cleanup(EVP_MD_CTX *ctx)
4243 {
4244 custom_dgst_ctx *p = EVP_MD_CTX_md_data(ctx);
4245
4246 if (p == NULL)
4247 /* Nothing to do */
4248 return 1;
4249
4250 custom_md_cleanup_called++;
4251 return 1;
4252 }
4253
4254 static int test_custom_md_meth(void)
4255 {
4256 EVP_MD_CTX *mdctx = NULL;
4257 EVP_MD *tmp = NULL;
4258 char mess[] = "Test Message\n";
4259 unsigned char md_value[EVP_MAX_MD_SIZE];
4260 unsigned int md_len;
4261 int testresult = 0;
4262 int nid;
4263
4264 /*
4265 * We are testing deprecated functions. We don't support a non-default
4266 * library context in this test.
4267 */
4268 if (testctx != NULL)
4269 return 1;
4270
4271 custom_md_init_called = custom_md_cleanup_called = 0;
4272
4273 nid = OBJ_create("1.3.6.1.4.1.16604.998866.1", "custom-md", "custom-md");
4274 if (!TEST_int_ne(nid, NID_undef))
4275 goto err;
4276 tmp = EVP_MD_meth_new(nid, NID_undef);
4277 if (!TEST_ptr(tmp))
4278 goto err;
4279
4280 if (!TEST_true(EVP_MD_meth_set_init(tmp, custom_md_init))
4281 || !TEST_true(EVP_MD_meth_set_cleanup(tmp, custom_md_cleanup))
4282 || !TEST_true(EVP_MD_meth_set_app_datasize(tmp,
4283 sizeof(custom_dgst_ctx))))
4284 goto err;
4285
4286 mdctx = EVP_MD_CTX_new();
4287 if (!TEST_ptr(mdctx)
4288 /*
4289 * Initing our custom md and then initing another md should
4290 * result in the init and cleanup functions of the custom md
4291 * from being called.
4292 */
4293 || !TEST_true(EVP_DigestInit_ex(mdctx, tmp, NULL))
4294 || !TEST_true(EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
4295 || !TEST_true(EVP_DigestUpdate(mdctx, mess, strlen(mess)))
4296 || !TEST_true(EVP_DigestFinal_ex(mdctx, md_value, &md_len))
4297 || !TEST_int_eq(custom_md_init_called, 1)
4298 || !TEST_int_eq(custom_md_cleanup_called, 1))
4299 goto err;
4300
4301 testresult = 1;
4302 err:
4303 EVP_MD_CTX_free(mdctx);
4304 EVP_MD_meth_free(tmp);
4305 return testresult;
4306 }
4307
4308 # ifndef OPENSSL_NO_DYNAMIC_ENGINE
4309 /* Test we can create a signature keys with an associated ENGINE */
4310 static int test_signatures_with_engine(int tst)
4311 {
4312 ENGINE *e;
4313 const char *engine_id = "dasync";
4314 EVP_PKEY *pkey = NULL;
4315 const unsigned char badcmackey[] = { 0x00, 0x01 };
4316 const unsigned char cmackey[] = {
4317 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4318 0x0c, 0x0d, 0x0e, 0x0f
4319 };
4320 const unsigned char ed25519key[] = {
4321 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4322 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
4323 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
4324 };
4325 const unsigned char msg[] = { 0x00, 0x01, 0x02, 0x03 };
4326 int testresult = 0;
4327 EVP_MD_CTX *ctx = NULL;
4328 unsigned char *mac = NULL;
4329 size_t maclen = 0;
4330 int ret;
4331
4332 # ifdef OPENSSL_NO_CMAC
4333 /* Skip CMAC tests in a no-cmac build */
4334 if (tst <= 1)
4335 return 1;
4336 # endif
4337
4338 if (!TEST_ptr(e = ENGINE_by_id(engine_id)))
4339 return 0;
4340
4341 if (!TEST_true(ENGINE_init(e))) {
4342 ENGINE_free(e);
4343 return 0;
4344 }
4345
4346 switch (tst) {
4347 case 0:
4348 pkey = EVP_PKEY_new_CMAC_key(e, cmackey, sizeof(cmackey),
4349 EVP_aes_128_cbc());
4350 break;
4351 case 1:
4352 pkey = EVP_PKEY_new_CMAC_key(e, badcmackey, sizeof(badcmackey),
4353 EVP_aes_128_cbc());
4354 break;
4355 case 2:
4356 pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, e, ed25519key,
4357 sizeof(ed25519key));
4358 break;
4359 default:
4360 TEST_error("Invalid test case");
4361 goto err;
4362 }
4363 if (!TEST_ptr(pkey))
4364 goto err;
4365
4366 if (!TEST_ptr(ctx = EVP_MD_CTX_new()))
4367 goto err;
4368
4369 ret = EVP_DigestSignInit(ctx, NULL, tst == 2 ? NULL : EVP_sha256(), NULL,
4370 pkey);
4371 if (tst == 0) {
4372 if (!TEST_true(ret))
4373 goto err;
4374
4375 if (!TEST_true(EVP_DigestSignUpdate(ctx, msg, sizeof(msg)))
4376 || !TEST_true(EVP_DigestSignFinal(ctx, NULL, &maclen)))
4377 goto err;
4378
4379 if (!TEST_ptr(mac = OPENSSL_malloc(maclen)))
4380 goto err;
4381
4382 if (!TEST_true(EVP_DigestSignFinal(ctx, mac, &maclen)))
4383 goto err;
4384 } else {
4385 /* We used a bad key. We expect a failure here */
4386 if (!TEST_false(ret))
4387 goto err;
4388 }
4389
4390 testresult = 1;
4391 err:
4392 EVP_MD_CTX_free(ctx);
4393 OPENSSL_free(mac);
4394 EVP_PKEY_free(pkey);
4395 ENGINE_finish(e);
4396 ENGINE_free(e);
4397
4398 return testresult;
4399 }
4400
4401 static int test_cipher_with_engine(void)
4402 {
4403 ENGINE *e;
4404 const char *engine_id = "dasync";
4405 const unsigned char keyiv[] = {
4406 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4407 0x0c, 0x0d, 0x0e, 0x0f
4408 };
4409 const unsigned char msg[] = { 0x00, 0x01, 0x02, 0x03 };
4410 int testresult = 0;
4411 EVP_CIPHER_CTX *ctx = NULL, *ctx2 = NULL;
4412 unsigned char buf[AES_BLOCK_SIZE];
4413 int len = 0;
4414
4415 if (!TEST_ptr(e = ENGINE_by_id(engine_id)))
4416 return 0;
4417
4418 if (!TEST_true(ENGINE_init(e))) {
4419 ENGINE_free(e);
4420 return 0;
4421 }
4422
4423 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
4424 || !TEST_ptr(ctx2 = EVP_CIPHER_CTX_new()))
4425 goto err;
4426
4427 if (!TEST_true(EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), e, keyiv, keyiv)))
4428 goto err;
4429
4430 /* Copy the ctx, and complete the operation with the new ctx */
4431 if (!TEST_true(EVP_CIPHER_CTX_copy(ctx2, ctx)))
4432 goto err;
4433
4434 if (!TEST_true(EVP_EncryptUpdate(ctx2, buf, &len, msg, sizeof(msg)))
4435 || !TEST_true(EVP_EncryptFinal_ex(ctx2, buf + len, &len)))
4436 goto err;
4437
4438 testresult = 1;
4439 err:
4440 EVP_CIPHER_CTX_free(ctx);
4441 EVP_CIPHER_CTX_free(ctx2);
4442 ENGINE_finish(e);
4443 ENGINE_free(e);
4444
4445 return testresult;
4446 }
4447 # endif /* OPENSSL_NO_DYNAMIC_ENGINE */
4448 #endif /* OPENSSL_NO_DEPRECATED_3_0 */
4449
4450 static int ecxnids[] = {
4451 NID_X25519,
4452 NID_X448,
4453 NID_ED25519,
4454 NID_ED448
4455 };
4456
4457 /* Test that creating ECX keys with a short private key fails as expected */
4458 static int test_ecx_short_keys(int tst)
4459 {
4460 unsigned char ecxkeydata = 1;
4461 EVP_PKEY *pkey;
4462
4463
4464 pkey = EVP_PKEY_new_raw_private_key(ecxnids[tst], NULL, &ecxkeydata, 1);
4465 if (!TEST_ptr_null(pkey)) {
4466 EVP_PKEY_free(pkey);
4467 return 0;
4468 }
4469 return 1;
4470 }
4471
4472 typedef enum OPTION_choice {
4473 OPT_ERR = -1,
4474 OPT_EOF = 0,
4475 OPT_CONTEXT,
4476 OPT_TEST_ENUM
4477 } OPTION_CHOICE;
4478
4479 const OPTIONS *test_get_options(void)
4480 {
4481 static const OPTIONS options[] = {
4482 OPT_TEST_OPTIONS_DEFAULT_USAGE,
4483 { "context", OPT_CONTEXT, '-', "Explicitly use a non-default library context" },
4484 { NULL }
4485 };
4486 return options;
4487 }
4488
4489 int setup_tests(void)
4490 {
4491 OPTION_CHOICE o;
4492
4493 while ((o = opt_next()) != OPT_EOF) {
4494 switch (o) {
4495 case OPT_CONTEXT:
4496 /* Set up an alternate library context */
4497 testctx = OSSL_LIB_CTX_new();
4498 if (!TEST_ptr(testctx))
4499 return 0;
4500 /* Swap the libctx to test non-default context only */
4501 nullprov = OSSL_PROVIDER_load(NULL, "null");
4502 deflprov = OSSL_PROVIDER_load(testctx, "default");
4503 lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
4504 break;
4505 case OPT_TEST_CASES:
4506 break;
4507 default:
4508 return 0;
4509 }
4510 }
4511
4512 ADD_TEST(test_EVP_set_default_properties);
4513 ADD_ALL_TESTS(test_EVP_DigestSignInit, 30);
4514 ADD_TEST(test_EVP_DigestVerifyInit);
4515 #ifndef OPENSSL_NO_SIPHASH
4516 ADD_TEST(test_siphash_digestsign);
4517 #endif
4518 ADD_TEST(test_EVP_Digest);
4519 ADD_TEST(test_EVP_md_null);
4520 ADD_ALL_TESTS(test_EVP_PKEY_sign, 3);
4521 ADD_ALL_TESTS(test_EVP_Enveloped, 2);
4522 ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
4523 ADD_TEST(test_privatekey_to_pkcs8);
4524 ADD_TEST(test_EVP_PKCS82PKEY_wrong_tag);
4525 #ifndef OPENSSL_NO_EC
4526 ADD_TEST(test_EVP_PKCS82PKEY);
4527 #endif
4528 #ifndef OPENSSL_NO_EC
4529 ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings));
4530 #endif
4531 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
4532 ADD_TEST(test_EVP_SM2);
4533 ADD_TEST(test_EVP_SM2_verify);
4534 #endif
4535 ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
4536 #ifndef OPENSSL_NO_DEPRECATED_3_0
4537 custom_pmeth = EVP_PKEY_meth_new(0xdefaced, 0);
4538 if (!TEST_ptr(custom_pmeth))
4539 return 0;
4540 EVP_PKEY_meth_set_check(custom_pmeth, pkey_custom_check);
4541 EVP_PKEY_meth_set_public_check(custom_pmeth, pkey_custom_pub_check);
4542 EVP_PKEY_meth_set_param_check(custom_pmeth, pkey_custom_param_check);
4543 if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
4544 return 0;
4545 #endif
4546 ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
4547 #ifndef OPENSSL_NO_CMAC
4548 ADD_TEST(test_CMAC_keygen);
4549 #endif
4550 ADD_TEST(test_HKDF);
4551 ADD_TEST(test_emptyikm_HKDF);
4552 #ifndef OPENSSL_NO_EC
4553 ADD_TEST(test_X509_PUBKEY_inplace);
4554 ADD_TEST(test_X509_PUBKEY_dup);
4555 ADD_ALL_TESTS(test_invalide_ec_char2_pub_range_decode,
4556 OSSL_NELEM(ec_der_pub_keys));
4557 #endif
4558 #ifndef OPENSSL_NO_DSA
4559 ADD_TEST(test_DSA_get_set_params);
4560 ADD_TEST(test_DSA_priv_pub);
4561 #endif
4562 ADD_TEST(test_RSA_get_set_params);
4563 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4564 ADD_TEST(test_decrypt_null_chunks);
4565 #endif
4566 #ifndef OPENSSL_NO_DH
4567 ADD_TEST(test_DH_priv_pub);
4568 # ifndef OPENSSL_NO_DEPRECATED_3_0
4569 ADD_TEST(test_EVP_PKEY_set1_DH);
4570 # endif
4571 #endif
4572 #ifndef OPENSSL_NO_EC
4573 ADD_TEST(test_EC_priv_pub);
4574 # ifndef OPENSSL_NO_DEPRECATED_3_0
4575 ADD_TEST(test_EC_priv_only_legacy);
4576 # endif
4577 #endif
4578 ADD_ALL_TESTS(test_keygen_with_empty_template, 2);
4579 ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
4580
4581 ADD_TEST(test_rand_agglomeration);
4582 ADD_ALL_TESTS(test_evp_iv_aes, 12);
4583 #ifndef OPENSSL_NO_DES
4584 ADD_ALL_TESTS(test_evp_iv_des, 6);
4585 #endif
4586 #ifndef OPENSSL_NO_BF
4587 ADD_ALL_TESTS(test_evp_bf_default_keylen, 4);
4588 #endif
4589 ADD_TEST(test_EVP_rsa_pss_with_keygen_bits);
4590 ADD_TEST(test_EVP_rsa_pss_set_saltlen);
4591 #ifndef OPENSSL_NO_EC
4592 ADD_ALL_TESTS(test_ecpub, OSSL_NELEM(ecpub_nids));
4593 #endif
4594
4595 ADD_TEST(test_names_do_all);
4596
4597 ADD_ALL_TESTS(test_evp_init_seq, OSSL_NELEM(evp_init_tests));
4598 ADD_ALL_TESTS(test_evp_reset, OSSL_NELEM(evp_reset_tests));
4599 ADD_ALL_TESTS(test_gcm_reinit, OSSL_NELEM(gcm_reinit_tests));
4600 ADD_ALL_TESTS(test_evp_updated_iv, OSSL_NELEM(evp_updated_iv_tests));
4601
4602 #ifndef OPENSSL_NO_DEPRECATED_3_0
4603 ADD_ALL_TESTS(test_custom_pmeth, 12);
4604 ADD_TEST(test_evp_md_cipher_meth);
4605 ADD_TEST(test_custom_md_meth);
4606
4607 # ifndef OPENSSL_NO_DYNAMIC_ENGINE
4608 /* Tests only support the default libctx */
4609 if (testctx == NULL) {
4610 # ifndef OPENSSL_NO_EC
4611 ADD_ALL_TESTS(test_signatures_with_engine, 3);
4612 # else
4613 ADD_ALL_TESTS(test_signatures_with_engine, 2);
4614 # endif
4615 ADD_TEST(test_cipher_with_engine);
4616 }
4617 # endif
4618 #endif
4619
4620 ADD_ALL_TESTS(test_ecx_short_keys, OSSL_NELEM(ecxnids));
4621
4622 return 1;
4623 }
4624
4625 void cleanup_tests(void)
4626 {
4627 OSSL_PROVIDER_unload(nullprov);
4628 OSSL_PROVIDER_unload(deflprov);
4629 OSSL_PROVIDER_unload(lgcyprov);
4630 OSSL_LIB_CTX_free(testctx);
4631 }