Fix up path generation to use OPENSSL_MODULES
[openssl.git] / test / evp_extra_test.c
1 /*
2  * Copyright 2015-2021 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 "testutil.h"
34 #include "internal/nelem.h"
35 #include "internal/sizes.h"
36 #include "crypto/evp.h"
37 #include "../e_os.h" /* strcasecmp */
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 #endif
404
405 static const unsigned char kCFBDefaultKey[] = {
406     0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88,
407     0x09, 0xCF, 0x4F, 0x3C
408 };
409
410 static const unsigned char kGCMDefaultKey[32] = { 0 };
411
412 static const unsigned char kGCMResetKey[] = {
413     0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94,
414     0x67, 0x30, 0x83, 0x08, 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
415     0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
416 };
417
418 static const unsigned char iCFBIV[] = {
419     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
420     0x0C, 0x0D, 0x0E, 0x0F
421 };
422
423 static const unsigned char iGCMDefaultIV[12] = { 0 };
424
425 static const unsigned char iGCMResetIV1[] = {
426     0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad
427 };
428
429 static const unsigned char iGCMResetIV2[] = {
430     0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88
431 };
432
433 static const unsigned char cfbPlaintext[] = {
434     0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11,
435     0x73, 0x93, 0x17, 0x2A
436 };
437
438 static const unsigned char gcmDefaultPlaintext[16] = { 0 };
439
440 static const unsigned char gcmResetPlaintext[] = {
441     0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5,
442     0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
443     0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95,
444     0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
445     0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39
446 };
447
448 static const unsigned char cfbCiphertext[] = {
449     0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8,
450     0xE8, 0x3C, 0xFB, 0x4A
451 };
452
453 static const unsigned char gcmDefaultCiphertext[] = {
454     0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3,
455     0xba, 0xf3, 0x9d, 0x18
456 };
457
458 static const unsigned char gcmResetCiphertext1[] = {
459     0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, 0xae, 0x47, 0xc1, 0x3b,
460     0xf1, 0x98, 0x44, 0xcb, 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
461     0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, 0xfe, 0xb5, 0x82, 0xd3,
462     0x39, 0x34, 0xa4, 0xf0, 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
463     0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, 0xf4, 0x7c, 0x9b, 0x1f
464 };
465
466 static const unsigned char gcmResetCiphertext2[] = {
467     0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3,
468     0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
469     0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48,
470     0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
471     0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62
472 };
473
474 static const unsigned char gcmAAD[] = {
475     0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce,
476     0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2
477 };
478
479 static const unsigned char gcmDefaultTag[] = {
480     0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, 0x26, 0x5b, 0x98, 0xb5,
481     0xd4, 0x8a, 0xb9, 0x19
482 };
483
484 static const unsigned char gcmResetTag1[] = {
485     0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, 0x5e, 0x45, 0x49, 0x13,
486     0xfe, 0x2e, 0xa8, 0xf2
487 };
488
489 static const unsigned char gcmResetTag2[] = {
490     0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, 0xcd, 0xdf, 0x88, 0x53,
491     0xbb, 0x2d, 0x55, 0x1b
492 };
493
494 typedef struct APK_DATA_st {
495     const unsigned char *kder;
496     size_t size;
497     const char *keytype;
498     int evptype;
499     int check;
500     int pub_check;
501     int param_check;
502     int type; /* 0 for private, 1 for public, 2 for params */
503 } APK_DATA;
504
505 static APK_DATA keydata[] = {
506     {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA},
507     {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), "RSA", EVP_PKEY_RSA},
508 #ifndef OPENSSL_NO_EC
509     {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC}
510 #endif
511 };
512
513 static APK_DATA keycheckdata[] = {
514     {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA, 1, 1, 1,
515      0},
516     {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), "RSA", EVP_PKEY_RSA,
517      0, 1, 1, 0},
518 #ifndef OPENSSL_NO_EC
519     {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC, 1, 1, 1, 0},
520     /* group is also associated in our pub key */
521     {kExampleECPubKeyDER, sizeof(kExampleECPubKeyDER), "EC", EVP_PKEY_EC, 0, 1,
522      1, 1},
523     {pExampleECParamDER, sizeof(pExampleECParamDER), "EC", EVP_PKEY_EC, 0, 0, 1,
524      2},
525     {kExampleED25519KeyDER, sizeof(kExampleED25519KeyDER), "ED25519",
526      EVP_PKEY_ED25519, 1, 1, 1, 0},
527     {kExampleED25519PubKeyDER, sizeof(kExampleED25519PubKeyDER), "ED25519",
528      EVP_PKEY_ED25519, 0, 1, 1, 1},
529 #endif
530 };
531
532 static EVP_PKEY *load_example_key(const char *keytype,
533                                   const unsigned char *data, size_t data_len)
534 {
535     const unsigned char **pdata = &data;
536     EVP_PKEY *pkey = NULL;
537     OSSL_DECODER_CTX *dctx =
538         OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", NULL, keytype, 0,
539                                       testctx, testpropq);
540
541     /* |pkey| will be NULL on error */
542     (void)OSSL_DECODER_from_data(dctx, pdata, &data_len);
543     OSSL_DECODER_CTX_free(dctx);
544     return pkey;
545 }
546
547 static EVP_PKEY *load_example_rsa_key(void)
548 {
549     return load_example_key("RSA", kExampleRSAKeyDER,
550                             sizeof(kExampleRSAKeyDER));
551 }
552
553 #ifndef OPENSSL_NO_DSA
554 static EVP_PKEY *load_example_dsa_key(void)
555 {
556     return load_example_key("DSA", kExampleDSAKeyDER,
557                             sizeof(kExampleDSAKeyDER));
558 }
559 #endif
560
561 static EVP_PKEY *load_example_hmac_key(void)
562 {
563     EVP_PKEY *pkey = NULL;
564     unsigned char key[] = {
565         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
566         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
567         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
568     };
569
570     pkey = EVP_PKEY_new_raw_private_key_ex(testctx, "HMAC",
571                                            NULL, key, sizeof(key));
572     if (!TEST_ptr(pkey))
573         return NULL;
574
575     return pkey;
576 }
577
578 static int test_EVP_set_default_properties(void)
579 {
580     OSSL_LIB_CTX *ctx;
581     EVP_MD *md = NULL;
582     int res = 0;
583
584     if (!TEST_ptr(ctx = OSSL_LIB_CTX_new())
585             || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
586         goto err;
587     EVP_MD_free(md);
588     md = NULL;
589
590     if (!TEST_true(EVP_set_default_properties(ctx, "provider=fizzbang"))
591             || !TEST_ptr_null(md = EVP_MD_fetch(ctx, "sha256", NULL))
592             || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", "-provider")))
593         goto err;
594     EVP_MD_free(md);
595     md = NULL;
596
597     if (!TEST_true(EVP_set_default_properties(ctx, NULL))
598             || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
599         goto err;
600     res = 1;
601 err:
602     EVP_MD_free(md);
603     OSSL_LIB_CTX_free(ctx);
604     return res;
605 }
606
607 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
608 static int test_fromdata(char *keytype, OSSL_PARAM *params)
609 {
610     EVP_PKEY_CTX *pctx = NULL;
611     EVP_PKEY *pkey = NULL;
612     int testresult = 0;
613
614     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, keytype, testpropq)))
615         goto err;
616     if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
617         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
618                                           params), 0))
619         goto err;
620
621     if (!TEST_ptr(pkey))
622         goto err;
623
624     testresult = 1;
625  err:
626     EVP_PKEY_free(pkey);
627     EVP_PKEY_CTX_free(pctx);
628
629     return testresult;
630 }
631 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA || !OPENSSL_NO_EC */
632
633 /*
634  * Test combinations of private, public, missing and private + public key
635  * params to ensure they are all accepted
636  */
637 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA)
638 static int test_EVP_PKEY_ffc_priv_pub(char *keytype)
639 {
640     OSSL_PARAM_BLD *bld = NULL;
641     OSSL_PARAM *params = NULL;
642     BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
643     int ret = 0;
644
645     /*
646      * Setup the parameters for our pkey object. For our purposes they don't
647      * have to actually be *valid* parameters. We just need to set something.
648      */
649     if (!TEST_ptr(p = BN_new())
650         || !TEST_ptr(q = BN_new())
651         || !TEST_ptr(g = BN_new())
652         || !TEST_ptr(pub = BN_new())
653         || !TEST_ptr(priv = BN_new()))
654         goto err;
655
656     /* Test !priv and !pub */
657     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
658         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
659         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
660         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)))
661         goto err;
662     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
663         goto err;
664
665     if (!test_fromdata(keytype, params))
666         goto err;
667     OSSL_PARAM_free(params);
668     params = NULL;
669     OSSL_PARAM_BLD_free(bld);
670
671     /* Test priv and !pub */
672     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
673         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
674         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
675         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
676         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
677                                              priv)))
678         goto err;
679     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
680         goto err;
681
682     if (!test_fromdata(keytype, params))
683         goto err;
684     OSSL_PARAM_free(params);
685     params = NULL;
686     OSSL_PARAM_BLD_free(bld);
687
688     /* Test !priv and pub */
689     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
690         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
691         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
692         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
693         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
694                                              pub)))
695         goto err;
696     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
697         goto err;
698
699     if (!test_fromdata(keytype, params))
700         goto err;
701     OSSL_PARAM_free(params);
702     params = NULL;
703     OSSL_PARAM_BLD_free(bld);
704
705     /* Test priv and pub */
706     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
707         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
708         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
709         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
710         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
711                                              pub))
712         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
713                                              priv)))
714         goto err;
715     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
716         goto err;
717
718     if (!test_fromdata(keytype, params))
719         goto err;
720
721     ret = 1;
722  err:
723     OSSL_PARAM_free(params);
724     OSSL_PARAM_BLD_free(bld);
725     BN_free(p);
726     BN_free(q);
727     BN_free(g);
728     BN_free(pub);
729     BN_free(priv);
730
731     return ret;
732 }
733 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA */
734
735 /*
736  * Test combinations of private, public, missing and private + public key
737  * params to ensure they are all accepted for EC keys
738  */
739 #ifndef OPENSSL_NO_EC
740 static unsigned char ec_priv[] = {
741     0xe9, 0x25, 0xf7, 0x66, 0x58, 0xa4, 0xdd, 0x99, 0x61, 0xe7, 0xe8, 0x23,
742     0x85, 0xc2, 0xe8, 0x33, 0x27, 0xc5, 0x5c, 0xeb, 0xdb, 0x43, 0x9f, 0xd5,
743     0xf2, 0x5a, 0x75, 0x55, 0xd0, 0x2e, 0x6d, 0x16
744 };
745 static unsigned char ec_pub[] = {
746     0x04, 0xad, 0x11, 0x90, 0x77, 0x4b, 0x46, 0xee, 0x72, 0x51, 0x15, 0x97,
747     0x4a, 0x6a, 0xa7, 0xaf, 0x59, 0xfa, 0x4b, 0xf2, 0x41, 0xc8, 0x3a, 0x81,
748     0x23, 0xb6, 0x90, 0x04, 0x6c, 0x67, 0x66, 0xd0, 0xdc, 0xf2, 0x15, 0x1d,
749     0x41, 0x61, 0xb7, 0x95, 0x85, 0x38, 0x5a, 0x84, 0x56, 0xe8, 0xb3, 0x0e,
750     0xf5, 0xc6, 0x5d, 0xa4, 0x54, 0x26, 0xb0, 0xf7, 0xa5, 0x4a, 0x33, 0xf1,
751     0x08, 0x09, 0xb8, 0xdb, 0x03
752 };
753
754 static int test_EC_priv_pub(void)
755 {
756     OSSL_PARAM_BLD *bld = NULL;
757     OSSL_PARAM *params = NULL;
758     BIGNUM *priv = NULL;
759     int ret = 0;
760
761     /*
762      * Setup the parameters for our pkey object. For our purposes they don't
763      * have to actually be *valid* parameters. We just need to set something.
764      */
765     if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
766         goto err;
767
768     /* Test !priv and !pub */
769     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
770         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
771                                                       OSSL_PKEY_PARAM_GROUP_NAME,
772                                                       "P-256", 0)))
773         goto err;
774     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
775         goto err;
776
777     if (!test_fromdata("EC", params))
778         goto err;
779     OSSL_PARAM_free(params);
780     params = NULL;
781     OSSL_PARAM_BLD_free(bld);
782
783     /* Test priv and !pub */
784     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
785         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
786                                                       OSSL_PKEY_PARAM_GROUP_NAME,
787                                                       "P-256", 0))
788         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
789                                              priv)))
790         goto err;
791     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
792         goto err;
793
794     if (!test_fromdata("EC", params))
795         goto err;
796     OSSL_PARAM_free(params);
797     params = NULL;
798     OSSL_PARAM_BLD_free(bld);
799
800     /* Test !priv and pub */
801     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
802         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
803                                                       OSSL_PKEY_PARAM_GROUP_NAME,
804                                                       "P-256", 0))
805         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
806                                                        OSSL_PKEY_PARAM_PUB_KEY,
807                                                        ec_pub, sizeof(ec_pub))))
808         goto err;
809     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
810         goto err;
811
812     if (!test_fromdata("EC", params))
813         goto err;
814     OSSL_PARAM_free(params);
815     params = NULL;
816     OSSL_PARAM_BLD_free(bld);
817
818     /* Test priv and pub */
819     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
820         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
821                                                       OSSL_PKEY_PARAM_GROUP_NAME,
822                                                       "P-256", 0))
823         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
824                                                        OSSL_PKEY_PARAM_PUB_KEY,
825                                                        ec_pub, sizeof(ec_pub)))
826         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
827                                              priv)))
828         goto err;
829     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
830         goto err;
831
832     if (!test_fromdata("EC", params))
833         goto err;
834
835     ret = 1;
836  err:
837     OSSL_PARAM_free(params);
838     OSSL_PARAM_BLD_free(bld);
839     BN_free(priv);
840
841     return ret;
842 }
843
844 /* Test that using a legacy EC key with only a private key in it works */
845 # ifndef OPENSSL_NO_DEPRECATED_3_0
846 static int test_EC_priv_only_legacy(void)
847 {
848     BIGNUM *priv = NULL;
849     int ret = 0;
850     EC_KEY *eckey = NULL;
851     EVP_PKEY *pkey = NULL, *dup_pk = NULL;
852     EVP_MD_CTX *ctx = NULL;
853
854     /* Create the low level EC_KEY */
855     if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
856         goto err;
857
858     eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
859     if (!TEST_ptr(eckey))
860         goto err;
861
862     if (!TEST_true(EC_KEY_set_private_key(eckey, priv)))
863         goto err;
864
865     pkey = EVP_PKEY_new();
866     if (!TEST_ptr(pkey))
867         goto err;
868
869     if (!TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
870         goto err;
871     eckey = NULL;
872
873     while (dup_pk == NULL) {
874         ret = 0;
875         ctx = EVP_MD_CTX_new();
876         if (!TEST_ptr(ctx))
877             goto err;
878
879         /*
880          * The EVP_DigestSignInit function should create the key on the
881          * provider side which is sufficient for this test.
882          */
883         if (!TEST_true(EVP_DigestSignInit_ex(ctx, NULL, NULL, testctx,
884                                              testpropq, pkey, NULL)))
885             goto err;
886         EVP_MD_CTX_free(ctx);
887         ctx = NULL;
888
889         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pkey)))
890             goto err;
891         /* EVP_PKEY_eq() returns -2 with missing public keys */
892         ret = TEST_int_eq(EVP_PKEY_eq(pkey, dup_pk), -2);
893         EVP_PKEY_free(pkey);
894         pkey = dup_pk;
895         if (!ret)
896             goto err;
897     }
898
899  err:
900     EVP_MD_CTX_free(ctx);
901     EVP_PKEY_free(pkey);
902     EC_KEY_free(eckey);
903     BN_free(priv);
904
905     return ret;
906 }
907 # endif /* OPENSSL_NO_DEPRECATED_3_0 */
908 #endif /* OPENSSL_NO_EC */
909
910 /*
911  * n = 0 => test using legacy cipher
912  * n = 1 => test using fetched cipher
913  */
914 static int test_EVP_Enveloped(int n)
915 {
916     int ret = 0;
917     EVP_CIPHER_CTX *ctx = NULL;
918     EVP_PKEY *keypair = NULL;
919     unsigned char *kek = NULL;
920     unsigned char iv[EVP_MAX_IV_LENGTH];
921     static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
922     int len, kek_len, ciphertext_len, plaintext_len;
923     unsigned char ciphertext[32], plaintext[16];
924     EVP_CIPHER *type = NULL;
925
926     if (nullprov != NULL)
927         return TEST_skip("Test does not support a non-default library context");
928
929     if (n == 0)
930         type = (EVP_CIPHER *)EVP_aes_256_cbc();
931     else if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "AES-256-CBC",
932                                                testpropq)))
933         goto err;
934
935     if (!TEST_ptr(keypair = load_example_rsa_key())
936             || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_get_size(keypair)))
937             || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
938             || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
939                                        &keypair, 1))
940             || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
941                                          msg, sizeof(msg)))
942             || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
943                                         &len)))
944         goto err;
945
946     ciphertext_len += len;
947
948     if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
949             || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
950                                          ciphertext, ciphertext_len))
951             || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
952         goto err;
953
954     plaintext_len += len;
955     if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
956         goto err;
957
958     ret = 1;
959 err:
960     if (n != 0)
961         EVP_CIPHER_free(type);
962     OPENSSL_free(kek);
963     EVP_PKEY_free(keypair);
964     EVP_CIPHER_CTX_free(ctx);
965     return ret;
966 }
967
968 /*
969  * Test 0: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, RSA)
970  * Test 1: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, DSA)
971  * Test 2: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, HMAC)
972  * Test 3: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, RSA)
973  * Test 4: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, DSA)
974  * Test 5: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch diegst, HMAC)
975  * Test 6: Use an MD BIO to do the Update calls instead (RSA)
976  * Test 7: Use an MD BIO to do the Update calls instead (DSA)
977  * Test 8: Use an MD BIO to do the Update calls instead (HMAC)
978  */
979 static int test_EVP_DigestSignInit(int tst)
980 {
981     int ret = 0;
982     EVP_PKEY *pkey = NULL;
983     unsigned char *sig = NULL;
984     size_t sig_len = 0;
985     EVP_MD_CTX *md_ctx = NULL, *md_ctx_verify = NULL;
986     EVP_MD_CTX *a_md_ctx = NULL, *a_md_ctx_verify = NULL;
987     BIO *mdbio = NULL, *membio = NULL;
988     size_t written;
989     const EVP_MD *md;
990     EVP_MD *mdexp = NULL;
991
992     if (nullprov != NULL)
993         return TEST_skip("Test does not support a non-default library context");
994
995     if (tst >= 6) {
996         membio = BIO_new(BIO_s_mem());
997         mdbio = BIO_new(BIO_f_md());
998         if (!TEST_ptr(membio) || !TEST_ptr(mdbio))
999             goto out;
1000         BIO_push(mdbio, membio);
1001         if (!TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx), 0))
1002             goto out;
1003     } else {
1004         if (!TEST_ptr(a_md_ctx = md_ctx = EVP_MD_CTX_new())
1005                 || !TEST_ptr(a_md_ctx_verify = md_ctx_verify = EVP_MD_CTX_new()))
1006             goto out;
1007     }
1008
1009     if (tst == 0 || tst == 3 || tst == 6) {
1010         if (!TEST_ptr(pkey = load_example_rsa_key()))
1011                 goto out;
1012     } else if (tst == 1 || tst == 4 || tst == 7) {
1013 #ifndef OPENSSL_NO_DSA
1014         if (!TEST_ptr(pkey = load_example_dsa_key()))
1015                 goto out;
1016 #else
1017         ret = 1;
1018         goto out;
1019 #endif
1020     } else {
1021         if (!TEST_ptr(pkey = load_example_hmac_key()))
1022                 goto out;
1023     }
1024
1025     if (tst >= 3 && tst <= 5)
1026         md = mdexp = EVP_MD_fetch(NULL, "SHA256", NULL);
1027     else
1028         md = EVP_sha256();
1029
1030     if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, md, NULL, pkey)))
1031         goto out;
1032
1033     if (tst >= 6) {
1034         if (!BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written))
1035             goto out;
1036     } else {
1037         if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1038             goto out;
1039     }
1040
1041     /* Determine the size of the signature. */
1042     if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
1043             || !TEST_ptr(sig = OPENSSL_malloc(sig_len))
1044             || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1045         goto out;
1046
1047     if (tst >= 6) {
1048         if (!TEST_int_gt(BIO_reset(mdbio), 0)
1049                 || !TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx_verify), 0))
1050             goto out;
1051     }
1052
1053     /*
1054      * Ensure that the signature round-trips (Verification isn't supported for
1055      * HMAC via EVP_DigestVerify*)
1056      */
1057     if (tst != 2 && tst != 5 && tst != 8) {
1058         if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, md,
1059                                             NULL, pkey)))
1060             goto out;
1061
1062         if (tst >= 6) {
1063             if (!TEST_true(BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written)))
1064                 goto out;
1065         } else {
1066             if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg,
1067                                                   sizeof(kMsg))))
1068                 goto out;
1069         }
1070         if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
1071             goto out;
1072     }
1073
1074     ret = 1;
1075
1076  out:
1077     BIO_free(membio);
1078     BIO_free(mdbio);
1079     EVP_MD_CTX_free(a_md_ctx);
1080     EVP_MD_CTX_free(a_md_ctx_verify);
1081     EVP_PKEY_free(pkey);
1082     OPENSSL_free(sig);
1083     EVP_MD_free(mdexp);
1084
1085     return ret;
1086 }
1087
1088 static int test_EVP_DigestVerifyInit(void)
1089 {
1090     int ret = 0;
1091     EVP_PKEY *pkey = NULL;
1092     EVP_MD_CTX *md_ctx = NULL;
1093
1094     if (nullprov != NULL)
1095         return TEST_skip("Test does not support a non-default library context");
1096
1097     if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
1098             || !TEST_ptr(pkey = load_example_rsa_key()))
1099         goto out;
1100
1101     if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
1102             || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
1103             || !TEST_true(EVP_DigestVerifyFinal(md_ctx, kSignature,
1104                                                  sizeof(kSignature))))
1105         goto out;
1106     ret = 1;
1107
1108  out:
1109     EVP_MD_CTX_free(md_ctx);
1110     EVP_PKEY_free(pkey);
1111     return ret;
1112 }
1113
1114 /*
1115  * Test corner cases of EVP_DigestInit/Update/Final API call behavior.
1116  */
1117 static int test_EVP_Digest(void)
1118 {
1119     int ret = 0;
1120     EVP_MD_CTX *md_ctx = NULL;
1121     unsigned char md[EVP_MAX_MD_SIZE];
1122     EVP_MD *sha256 = NULL;
1123     EVP_MD *shake256 = NULL;
1124
1125     if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1126         goto out;
1127
1128     if (!TEST_ptr(sha256 = EVP_MD_fetch(testctx, "sha256", testpropq))
1129             || !TEST_ptr(shake256 = EVP_MD_fetch(testctx, "shake256", testpropq)))
1130         goto out;
1131
1132     if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
1133             || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1134             || !TEST_true(EVP_DigestFinal(md_ctx, md, NULL))
1135             /* EVP_DigestFinal resets the EVP_MD_CTX. */
1136             || !TEST_ptr_eq(EVP_MD_CTX_get0_md(md_ctx), NULL))
1137         goto out;
1138
1139     if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
1140             || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1141             || !TEST_true(EVP_DigestFinal_ex(md_ctx, md, NULL))
1142             /* EVP_DigestFinal_ex does not reset the EVP_MD_CTX. */
1143             || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
1144             /*
1145              * EVP_DigestInit_ex with NULL type should work on
1146              * pre-initialized context.
1147              */
1148             || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1149         goto out;
1150
1151     if (!TEST_true(EVP_DigestInit_ex(md_ctx, shake256, NULL))
1152             || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1153             || !TEST_true(EVP_DigestFinalXOF(md_ctx, md, sizeof(md)))
1154             /* EVP_DigestFinalXOF does not reset the EVP_MD_CTX. */
1155             || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
1156             || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1157         goto out;
1158     ret = 1;
1159
1160  out:
1161     EVP_MD_CTX_free(md_ctx);
1162     EVP_MD_free(sha256);
1163     EVP_MD_free(shake256);
1164     return ret;
1165 }
1166
1167 static int test_d2i_AutoPrivateKey(int i)
1168 {
1169     int ret = 0;
1170     const unsigned char *p;
1171     EVP_PKEY *pkey = NULL;
1172     const APK_DATA *ak = &keydata[i];
1173     const unsigned char *input = ak->kder;
1174     size_t input_len = ak->size;
1175     int expected_id = ak->evptype;
1176
1177     p = input;
1178     if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
1179             || !TEST_ptr_eq(p, input + input_len)
1180             || !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
1181         goto done;
1182
1183     ret = 1;
1184
1185  done:
1186     EVP_PKEY_free(pkey);
1187     return ret;
1188 }
1189
1190 #ifndef OPENSSL_NO_EC
1191
1192 static const unsigned char ec_public_sect163k1_validxy[] = {
1193     0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1194     0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1195     0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1196     0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x02, 0xd1, 0x7b,
1197     0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1198     0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1199 };
1200
1201 static const unsigned char ec_public_sect163k1_badx[] = {
1202     0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1203     0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1204     0x0a, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1205     0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0xb0, 0x02, 0xd1, 0x7b,
1206     0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1207     0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1208 };
1209
1210 static const unsigned char ec_public_sect163k1_bady[] = {
1211     0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1212     0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1213     0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1214     0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x0a, 0xd1, 0x7b,
1215     0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1216     0x6a, 0xd8, 0x17, 0x65, 0x41, 0xe6
1217 };
1218
1219 static struct ec_der_pub_keys_st {
1220     const unsigned char *der;
1221     size_t len;
1222     int valid;
1223 } ec_der_pub_keys[] = {
1224     { ec_public_sect163k1_validxy, sizeof(ec_public_sect163k1_validxy), 1 },
1225     { ec_public_sect163k1_badx, sizeof(ec_public_sect163k1_badx), 0 },
1226     { ec_public_sect163k1_bady, sizeof(ec_public_sect163k1_bady), 0 },
1227 };
1228
1229 /*
1230  * Tests the range of the decoded EC char2 public point.
1231  * See ec_GF2m_simple_oct2point().
1232  */
1233 static int test_invalide_ec_char2_pub_range_decode(int id)
1234 {
1235     int ret = 0;
1236     EVP_PKEY *pkey;
1237
1238     pkey = load_example_key("EC", ec_der_pub_keys[id].der,
1239                             ec_der_pub_keys[id].len);
1240
1241     ret = (ec_der_pub_keys[id].valid && TEST_ptr(pkey))
1242           || TEST_ptr_null(pkey);
1243     EVP_PKEY_free(pkey);
1244     return ret;
1245 }
1246
1247 /* Tests loading a bad key in PKCS8 format */
1248 static int test_EVP_PKCS82PKEY(void)
1249 {
1250     int ret = 0;
1251     const unsigned char *derp = kExampleBadECKeyDER;
1252     PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1253     EVP_PKEY *pkey = NULL;
1254
1255     if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
1256                                               sizeof(kExampleBadECKeyDER))))
1257         goto done;
1258
1259     if (!TEST_ptr_eq(derp,
1260                      kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
1261         goto done;
1262
1263     if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
1264         goto done;
1265
1266     ret = 1;
1267
1268  done:
1269     PKCS8_PRIV_KEY_INFO_free(p8inf);
1270     EVP_PKEY_free(pkey);
1271
1272     return ret;
1273 }
1274
1275 #endif
1276 static int test_EVP_PKCS82PKEY_wrong_tag(void)
1277 {
1278     EVP_PKEY *pkey = NULL;
1279     EVP_PKEY *pkey2 = NULL;
1280     BIO *membio = NULL;
1281     char *membuf = NULL;
1282     PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1283     int ok = 0;
1284
1285     if (testctx != NULL)
1286         /* test not supported with non-default context */
1287         return 1;
1288
1289     if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1290         || !TEST_ptr(pkey = load_example_rsa_key())
1291         || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1292                                                 NULL, 0, NULL, NULL),
1293                         0)
1294         || !TEST_int_gt(BIO_get_mem_data(membio, &membuf), 0)
1295         || !TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(membio, NULL))
1296         || !TEST_ptr(pkey2 = EVP_PKCS82PKEY(p8inf))
1297         || !TEST_int_eq(ERR_peek_last_error(), 0)) {
1298         goto done;
1299     }
1300
1301     ok = 1;
1302  done:
1303     EVP_PKEY_free(pkey);
1304     EVP_PKEY_free(pkey2);
1305     PKCS8_PRIV_KEY_INFO_free(p8inf);
1306     BIO_free_all(membio);
1307     return ok;
1308 }
1309
1310 /* This uses kExampleRSAKeyDER and kExampleRSAKeyPKCS8 to verify encoding */
1311 static int test_privatekey_to_pkcs8(void)
1312 {
1313     EVP_PKEY *pkey = NULL;
1314     BIO *membio = NULL;
1315     char *membuf = NULL;
1316     long membuf_len = 0;
1317     int ok = 0;
1318
1319     if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1320         || !TEST_ptr(pkey = load_example_rsa_key())
1321         || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1322                                                 NULL, 0, NULL, NULL),
1323                         0)
1324         || !TEST_int_gt(membuf_len = BIO_get_mem_data(membio, &membuf), 0)
1325         || !TEST_ptr(membuf)
1326         || !TEST_mem_eq(membuf, (size_t)membuf_len,
1327                         kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8))
1328         /*
1329          * We try to write PEM as well, just to see that it doesn't err, but
1330          * assume that the result is correct.
1331          */
1332         || !TEST_int_gt(PEM_write_bio_PKCS8PrivateKey(membio, pkey, NULL,
1333                                                       NULL, 0, NULL, NULL),
1334                         0))
1335         goto done;
1336
1337     ok = 1;
1338  done:
1339     EVP_PKEY_free(pkey);
1340     BIO_free_all(membio);
1341     return ok;
1342 }
1343
1344 #ifndef OPENSSL_NO_EC
1345 static const struct {
1346     int encoding;
1347     const char *encoding_name;
1348 } ec_encodings[] = {
1349     { OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT },
1350     { OPENSSL_EC_NAMED_CURVE,    OSSL_PKEY_EC_ENCODING_GROUP }
1351 };
1352
1353 static int ec_export_get_encoding_cb(const OSSL_PARAM params[], void *arg)
1354 {
1355     const OSSL_PARAM *p;
1356     const char *enc_name = NULL;
1357     int *enc = arg;
1358     size_t i;
1359
1360     *enc = -1;
1361
1362     if (!TEST_ptr(p = OSSL_PARAM_locate_const(params,
1363                                               OSSL_PKEY_PARAM_EC_ENCODING))
1364         || !TEST_true(OSSL_PARAM_get_utf8_string_ptr(p, &enc_name)))
1365         return 0;
1366
1367     for (i = 0; i < OSSL_NELEM(ec_encodings); i++) {
1368         if (strcasecmp(enc_name, ec_encodings[i].encoding_name) == 0) {
1369             *enc = ec_encodings[i].encoding;
1370             break;
1371         }
1372     }
1373
1374     return (*enc != -1);
1375 }
1376
1377 static int test_EC_keygen_with_enc(int idx)
1378 {
1379     EVP_PKEY *params = NULL, *key = NULL;
1380     EVP_PKEY_CTX *pctx = NULL, *kctx = NULL;
1381     int enc;
1382     int ret = 0;
1383
1384     enc = ec_encodings[idx].encoding;
1385
1386     /* Create key parameters */
1387     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "EC", NULL))
1388         || !TEST_true(EVP_PKEY_paramgen_init(pctx))
1389         || !TEST_true(EVP_PKEY_CTX_set_group_name(pctx, "P-256"))
1390         || !TEST_true(EVP_PKEY_CTX_set_ec_param_enc(pctx, enc))
1391         || !TEST_true(EVP_PKEY_paramgen(pctx, &params))
1392         || !TEST_ptr(params))
1393         goto done;
1394
1395     /* Create key */
1396     if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx, params, NULL))
1397         || !TEST_true(EVP_PKEY_keygen_init(kctx))
1398         || !TEST_true(EVP_PKEY_keygen(kctx, &key))
1399         || !TEST_ptr(key))
1400         goto done;
1401
1402     /* Check that the encoding got all the way into the key */
1403     if (!TEST_true(evp_keymgmt_util_export(key, OSSL_KEYMGMT_SELECT_ALL,
1404                                            ec_export_get_encoding_cb, &enc))
1405         || !TEST_int_eq(enc, ec_encodings[idx].encoding))
1406         goto done;
1407
1408     ret = 1;
1409  done:
1410     EVP_PKEY_free(key);
1411     EVP_PKEY_free(params);
1412     EVP_PKEY_CTX_free(kctx);
1413     EVP_PKEY_CTX_free(pctx);
1414     return ret;
1415 }
1416 #endif
1417
1418 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
1419
1420 static int test_EVP_SM2_verify(void)
1421 {
1422     const char *pubkey =
1423         "-----BEGIN PUBLIC KEY-----\n"
1424         "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEp1KLWq1ZE2jmoAnnBJE1LBGxVr18\n"
1425         "YvvqECWCpXfAQ9qUJ+UmthnUPf0iM3SaXKHe6PlLIDyNlWMWb9RUh/yU3g==\n"
1426         "-----END PUBLIC KEY-----\n";
1427
1428     const char *msg = "message digest";
1429     const char *id = "ALICE123@YAHOO.COM";
1430
1431     const uint8_t signature[] = {
1432         0x30, 0x44, 0x02, 0x20, 0x5b, 0xdb, 0xab, 0x81, 0x4f, 0xbb,
1433         0x8b, 0x69, 0xb1, 0x05, 0x9c, 0x99, 0x3b, 0xb2, 0x45, 0x06,
1434         0x4a, 0x30, 0x15, 0x59, 0x84, 0xcd, 0xee, 0x30, 0x60, 0x36,
1435         0x57, 0x87, 0xef, 0x5c, 0xd0, 0xbe, 0x02, 0x20, 0x43, 0x8d,
1436         0x1f, 0xc7, 0x77, 0x72, 0x39, 0xbb, 0x72, 0xe1, 0xfd, 0x07,
1437         0x58, 0xd5, 0x82, 0xc8, 0x2d, 0xba, 0x3b, 0x2c, 0x46, 0x24,
1438         0xe3, 0x50, 0xff, 0x04, 0xc7, 0xa0, 0x71, 0x9f, 0xa4, 0x70
1439     };
1440
1441     int rc = 0;
1442     BIO *bio = NULL;
1443     EVP_PKEY *pkey = NULL;
1444     EVP_MD_CTX *mctx = NULL;
1445     EVP_PKEY_CTX *pctx = NULL;
1446     EVP_MD *sm3 = NULL;
1447
1448     bio = BIO_new_mem_buf(pubkey, strlen(pubkey));
1449     if (!TEST_true(bio != NULL))
1450         goto done;
1451
1452     pkey = PEM_read_bio_PUBKEY_ex(bio, NULL, NULL, NULL, testctx, testpropq);
1453     if (!TEST_true(pkey != NULL))
1454         goto done;
1455
1456     if (!TEST_true(EVP_PKEY_is_a(pkey, "SM2")))
1457         goto done;
1458
1459     if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
1460         goto done;
1461
1462     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1463         goto done;
1464
1465     EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
1466
1467     if (!TEST_ptr(sm3 = EVP_MD_fetch(testctx, "sm3", testpropq)))
1468         goto done;
1469
1470     if (!TEST_true(EVP_DigestVerifyInit(mctx, NULL, sm3, NULL, pkey)))
1471         goto done;
1472
1473     if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, id, strlen(id)), 0))
1474         goto done;
1475
1476     if (!TEST_true(EVP_DigestVerifyUpdate(mctx, msg, strlen(msg))))
1477         goto done;
1478
1479     if (!TEST_true(EVP_DigestVerifyFinal(mctx, signature, sizeof(signature))))
1480         goto done;
1481     rc = 1;
1482
1483  done:
1484     BIO_free(bio);
1485     EVP_PKEY_free(pkey);
1486     EVP_PKEY_CTX_free(pctx);
1487     EVP_MD_CTX_free(mctx);
1488     EVP_MD_free(sm3);
1489     return rc;
1490 }
1491
1492 static int test_EVP_SM2(void)
1493 {
1494     int ret = 0;
1495     EVP_PKEY *pkey = NULL;
1496     EVP_PKEY *pkeyparams = NULL;
1497     EVP_PKEY_CTX *pctx = NULL;
1498     EVP_PKEY_CTX *kctx = NULL;
1499     EVP_PKEY_CTX *sctx = NULL;
1500     size_t sig_len = 0;
1501     unsigned char *sig = NULL;
1502     EVP_MD_CTX *md_ctx = NULL;
1503     EVP_MD_CTX *md_ctx_verify = NULL;
1504     EVP_PKEY_CTX *cctx = NULL;
1505     EVP_MD *check_md = NULL;
1506
1507     uint8_t ciphertext[128];
1508     size_t ctext_len = sizeof(ciphertext);
1509
1510     uint8_t plaintext[8];
1511     size_t ptext_len = sizeof(plaintext);
1512
1513     uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
1514
1515     OSSL_PARAM sparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1516     OSSL_PARAM gparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1517     int i;
1518     char mdname[OSSL_MAX_NAME_SIZE];
1519
1520     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx,
1521                                                     "SM2", testpropq)))
1522         goto done;
1523
1524     if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
1525         goto done;
1526
1527     if (!TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2)))
1528         goto done;
1529
1530     if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
1531         goto done;
1532
1533     if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx,
1534                                                     pkeyparams, testpropq)))
1535         goto done;
1536
1537     if (!TEST_true(EVP_PKEY_keygen_init(kctx)))
1538         goto done;
1539
1540     if (!TEST_true(EVP_PKEY_keygen(kctx, &pkey)))
1541         goto done;
1542
1543     if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1544         goto done;
1545
1546     if (!TEST_ptr(md_ctx_verify = EVP_MD_CTX_new()))
1547         goto done;
1548
1549     if (!TEST_ptr(sctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1550         goto done;
1551
1552     EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
1553     EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
1554
1555     if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, "sm3", testpropq)))
1556         goto done;
1557
1558     if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, check_md, NULL, pkey)))
1559         goto done;
1560
1561     if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1562         goto done;
1563
1564     if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1565         goto done;
1566
1567     /* Determine the size of the signature. */
1568     if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len)))
1569         goto done;
1570
1571     if (!TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1572         goto done;
1573
1574     if (!TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1575         goto done;
1576
1577     /* Ensure that the signature round-trips. */
1578
1579     if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
1580                                         pkey)))
1581         goto done;
1582
1583     if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1584         goto done;
1585
1586     if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1587         goto done;
1588
1589     if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
1590         goto done;
1591
1592     /* now check encryption/decryption */
1593
1594     gparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1595                                                   mdname, sizeof(mdname));
1596     for (i = 0; i < 2; i++) {
1597         const char *mdnames[] = {
1598 #ifndef OPENSSL_NO_SM3
1599             "SM3",
1600 #else
1601             NULL,
1602 #endif
1603             "SHA2-256" };
1604         EVP_PKEY_CTX_free(cctx);
1605
1606         if (mdnames[i] == NULL)
1607             continue;
1608
1609         sparams[0] =
1610             OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1611                                              (char *)mdnames[i], 0);
1612
1613         if (!TEST_ptr(cctx = EVP_PKEY_CTX_new_from_pkey(testctx,
1614                                                         pkey, testpropq)))
1615             goto done;
1616
1617         if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
1618             goto done;
1619
1620         if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1621             goto done;
1622
1623         if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg,
1624                                         sizeof(kMsg))))
1625             goto done;
1626
1627         if (!TEST_true(EVP_PKEY_decrypt_init(cctx)))
1628             goto done;
1629
1630         if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1631             goto done;
1632
1633         if (!TEST_true(EVP_PKEY_decrypt(cctx, plaintext, &ptext_len, ciphertext,
1634                                         ctext_len)))
1635             goto done;
1636
1637         if (!TEST_true(EVP_PKEY_CTX_get_params(cctx, gparams)))
1638             goto done;
1639
1640         /*
1641          * Test we're still using the digest we think we are.
1642          * Because of aliases, the easiest is to fetch the digest and
1643          * check the name with EVP_MD_is_a().
1644          */
1645         EVP_MD_free(check_md);
1646         if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, mdname, testpropq)))
1647             goto done;
1648         if (!TEST_true(EVP_MD_is_a(check_md, mdnames[i]))) {
1649             TEST_info("Fetched md %s isn't %s", mdname, mdnames[i]);
1650             goto done;
1651         }
1652
1653         if (!TEST_true(ptext_len == sizeof(kMsg)))
1654             goto done;
1655
1656         if (!TEST_true(memcmp(plaintext, kMsg, sizeof(kMsg)) == 0))
1657             goto done;
1658     }
1659
1660     ret = 1;
1661 done:
1662     EVP_PKEY_CTX_free(pctx);
1663     EVP_PKEY_CTX_free(kctx);
1664     EVP_PKEY_CTX_free(sctx);
1665     EVP_PKEY_CTX_free(cctx);
1666     EVP_PKEY_free(pkey);
1667     EVP_PKEY_free(pkeyparams);
1668     EVP_MD_CTX_free(md_ctx);
1669     EVP_MD_CTX_free(md_ctx_verify);
1670     EVP_MD_free(check_md);
1671     OPENSSL_free(sig);
1672     return ret;
1673 }
1674
1675 #endif
1676
1677 static struct keys_st {
1678     int type;
1679     char *priv;
1680     char *pub;
1681 } keys[] = {
1682     {
1683         EVP_PKEY_HMAC, "0123456789", NULL
1684     },
1685     {
1686         EVP_PKEY_HMAC, "", NULL
1687 #ifndef OPENSSL_NO_POLY1305
1688     }, {
1689         EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
1690 #endif
1691 #ifndef OPENSSL_NO_SIPHASH
1692     }, {
1693         EVP_PKEY_SIPHASH, "0123456789012345", NULL
1694 #endif
1695     },
1696 #ifndef OPENSSL_NO_EC
1697     {
1698         EVP_PKEY_X25519, "01234567890123456789012345678901",
1699         "abcdefghijklmnopqrstuvwxyzabcdef"
1700     }, {
1701         EVP_PKEY_ED25519, "01234567890123456789012345678901",
1702         "abcdefghijklmnopqrstuvwxyzabcdef"
1703     }, {
1704         EVP_PKEY_X448,
1705         "01234567890123456789012345678901234567890123456789012345",
1706         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
1707     }, {
1708         EVP_PKEY_ED448,
1709         "012345678901234567890123456789012345678901234567890123456",
1710         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde"
1711     }
1712 #endif
1713 };
1714
1715 static int test_set_get_raw_keys_int(int tst, int pub, int uselibctx)
1716 {
1717     int ret = 0;
1718     unsigned char buf[80];
1719     unsigned char *in;
1720     size_t inlen, len = 0;
1721     EVP_PKEY *pkey;
1722
1723     /* Check if this algorithm supports public keys */
1724     if (pub && keys[tst].pub == NULL)
1725         return 1;
1726
1727     memset(buf, 0, sizeof(buf));
1728
1729     if (pub) {
1730 #ifndef OPENSSL_NO_EC
1731         inlen = strlen(keys[tst].pub);
1732         in = (unsigned char *)keys[tst].pub;
1733         if (uselibctx) {
1734             pkey = EVP_PKEY_new_raw_public_key_ex(
1735                         testctx,
1736                         OBJ_nid2sn(keys[tst].type),
1737                         NULL,
1738                         in,
1739                         inlen);
1740         } else {
1741             pkey = EVP_PKEY_new_raw_public_key(keys[tst].type,
1742                                                NULL,
1743                                                in,
1744                                                inlen);
1745         }
1746 #else
1747         return 1;
1748 #endif
1749     } else {
1750         inlen = strlen(keys[tst].priv);
1751         in = (unsigned char *)keys[tst].priv;
1752         if (uselibctx) {
1753             pkey = EVP_PKEY_new_raw_private_key_ex(
1754                         testctx, OBJ_nid2sn(keys[tst].type),
1755                         NULL,
1756                         in,
1757                         inlen);
1758         } else {
1759             pkey = EVP_PKEY_new_raw_private_key(keys[tst].type,
1760                                                 NULL,
1761                                                 in,
1762                                                 inlen);
1763         }
1764     }
1765
1766     if (!TEST_ptr(pkey)
1767             || !TEST_int_eq(EVP_PKEY_eq(pkey, pkey), 1)
1768             || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
1769             || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
1770             || !TEST_true(len == inlen)
1771             || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, buf, &len)))
1772             || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, buf, &len)))
1773             || !TEST_mem_eq(in, inlen, buf, len))
1774         goto done;
1775
1776     ret = 1;
1777  done:
1778     EVP_PKEY_free(pkey);
1779     return ret;
1780 }
1781
1782 static int test_set_get_raw_keys(int tst)
1783 {
1784     return (nullprov != NULL || test_set_get_raw_keys_int(tst, 0, 0))
1785            && test_set_get_raw_keys_int(tst, 0, 1)
1786            && (nullprov != NULL || test_set_get_raw_keys_int(tst, 1, 0))
1787            && test_set_get_raw_keys_int(tst, 1, 1);
1788 }
1789
1790 #ifndef OPENSSL_NO_DEPRECATED_3_0
1791 static int pkey_custom_check(EVP_PKEY *pkey)
1792 {
1793     return 0xbeef;
1794 }
1795
1796 static int pkey_custom_pub_check(EVP_PKEY *pkey)
1797 {
1798     return 0xbeef;
1799 }
1800
1801 static int pkey_custom_param_check(EVP_PKEY *pkey)
1802 {
1803     return 0xbeef;
1804 }
1805
1806 static EVP_PKEY_METHOD *custom_pmeth;
1807 #endif
1808
1809 static int test_EVP_PKEY_check(int i)
1810 {
1811     int ret = 0;
1812     EVP_PKEY *pkey = NULL;
1813     EVP_PKEY_CTX *ctx = NULL;
1814 #ifndef OPENSSL_NO_DEPRECATED_3_0
1815     EVP_PKEY_CTX *ctx2 = NULL;
1816 #endif
1817     const APK_DATA *ak = &keycheckdata[i];
1818     const unsigned char *input = ak->kder;
1819     size_t input_len = ak->size;
1820     int expected_id = ak->evptype;
1821     int expected_check = ak->check;
1822     int expected_pub_check = ak->pub_check;
1823     int expected_param_check = ak->param_check;
1824     int type = ak->type;
1825
1826     if (!TEST_ptr(pkey = load_example_key(ak->keytype, input, input_len)))
1827         goto done;
1828     if (type == 0
1829         && !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
1830         goto done;
1831
1832     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1833         goto done;
1834
1835     if (!TEST_int_eq(EVP_PKEY_check(ctx), expected_check))
1836         goto done;
1837
1838     if (!TEST_int_eq(EVP_PKEY_public_check(ctx), expected_pub_check))
1839         goto done;
1840
1841     if (!TEST_int_eq(EVP_PKEY_param_check(ctx), expected_param_check))
1842         goto done;
1843
1844 #ifndef OPENSSL_NO_DEPRECATED_3_0
1845     ctx2 = EVP_PKEY_CTX_new_id(0xdefaced, NULL);
1846     /* assign the pkey directly, as an internal test */
1847     EVP_PKEY_up_ref(pkey);
1848     ctx2->pkey = pkey;
1849
1850     if (!TEST_int_eq(EVP_PKEY_check(ctx2), 0xbeef))
1851         goto done;
1852
1853     if (!TEST_int_eq(EVP_PKEY_public_check(ctx2), 0xbeef))
1854         goto done;
1855
1856     if (!TEST_int_eq(EVP_PKEY_param_check(ctx2), 0xbeef))
1857         goto done;
1858 #endif
1859
1860     ret = 1;
1861
1862  done:
1863     EVP_PKEY_CTX_free(ctx);
1864 #ifndef OPENSSL_NO_DEPRECATED_3_0
1865     EVP_PKEY_CTX_free(ctx2);
1866 #endif
1867     EVP_PKEY_free(pkey);
1868     return ret;
1869 }
1870
1871 #ifndef OPENSSL_NO_CMAC
1872 static int get_cmac_val(EVP_PKEY *pkey, unsigned char *mac)
1873 {
1874     EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
1875     const char msg[] = "Hello World";
1876     size_t maclen;
1877     int ret = 1;
1878
1879     if (!TEST_ptr(mdctx)
1880             || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, NULL, testctx,
1881                                                 testpropq, pkey, NULL))
1882             || !TEST_true(EVP_DigestSignUpdate(mdctx, msg, sizeof(msg)))
1883             || !TEST_true(EVP_DigestSignFinal(mdctx, mac, &maclen))
1884             || !TEST_size_t_eq(maclen, AES_BLOCK_SIZE))
1885         ret = 0;
1886
1887     EVP_MD_CTX_free(mdctx);
1888
1889     return ret;
1890 }
1891 static int test_CMAC_keygen(void)
1892 {
1893     static unsigned char key[] = {
1894         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1895         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1896         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
1897     };
1898     EVP_PKEY_CTX *kctx = NULL;
1899     int ret = 0;
1900     EVP_PKEY *pkey = NULL;
1901     unsigned char mac[AES_BLOCK_SIZE];
1902 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
1903     unsigned char mac2[AES_BLOCK_SIZE];
1904 # endif
1905
1906     if (nullprov != NULL)
1907         return TEST_skip("Test does not support a non-default library context");
1908
1909     /*
1910      * This is a legacy method for CMACs, but should still work.
1911      * This verifies that it works without an ENGINE.
1912      */
1913     kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_CMAC, NULL);
1914
1915     /* Test a CMAC key created using the "generated" method */
1916     if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
1917             || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
1918                                             EVP_PKEY_CTRL_CIPHER,
1919                                             0, (void *)EVP_aes_256_ecb()), 0)
1920             || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
1921                                             EVP_PKEY_CTRL_SET_MAC_KEY,
1922                                             sizeof(key), (void *)key), 0)
1923             || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0)
1924             || !TEST_ptr(pkey)
1925             || !TEST_true(get_cmac_val(pkey, mac)))
1926         goto done;
1927
1928 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
1929     EVP_PKEY_free(pkey);
1930
1931     /*
1932      * Test a CMAC key using the direct method, and compare with the mac
1933      * created above.
1934      */
1935     pkey = EVP_PKEY_new_CMAC_key(NULL, key, sizeof(key), EVP_aes_256_ecb());
1936     if (!TEST_ptr(pkey)
1937             || !TEST_true(get_cmac_val(pkey, mac2))
1938             || !TEST_mem_eq(mac, sizeof(mac), mac2, sizeof(mac2)))
1939         goto done;
1940 # endif
1941
1942     ret = 1;
1943
1944  done:
1945     EVP_PKEY_free(pkey);
1946     EVP_PKEY_CTX_free(kctx);
1947     return ret;
1948 }
1949 #endif
1950
1951 static int test_HKDF(void)
1952 {
1953     EVP_PKEY_CTX *pctx;
1954     unsigned char out[20];
1955     size_t outlen;
1956     int i, ret = 0;
1957     unsigned char salt[] = "0123456789";
1958     unsigned char key[] = "012345678901234567890123456789";
1959     unsigned char info[] = "infostring";
1960     const unsigned char expected[] = {
1961         0xe5, 0x07, 0x70, 0x7f, 0xc6, 0x78, 0xd6, 0x54, 0x32, 0x5f, 0x7e, 0xc5,
1962         0x7b, 0x59, 0x3e, 0xd8, 0x03, 0x6b, 0xed, 0xca
1963     };
1964     size_t expectedlen = sizeof(expected);
1965
1966     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
1967         goto done;
1968
1969     /* We do this twice to test reuse of the EVP_PKEY_CTX */
1970     for (i = 0; i < 2; i++) {
1971         outlen = sizeof(out);
1972         memset(out, 0, outlen);
1973
1974         if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
1975                 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
1976                 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
1977                                                             sizeof(salt) - 1), 0)
1978                 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
1979                                                            sizeof(key) - 1), 0)
1980                 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
1981                                                             sizeof(info) - 1), 0)
1982                 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
1983                 || !TEST_mem_eq(out, outlen, expected, expectedlen))
1984             goto done;
1985     }
1986
1987     ret = 1;
1988
1989  done:
1990     EVP_PKEY_CTX_free(pctx);
1991
1992     return ret;
1993 }
1994
1995 static int test_emptyikm_HKDF(void)
1996 {
1997     EVP_PKEY_CTX *pctx;
1998     unsigned char out[20];
1999     size_t outlen;
2000     int ret = 0;
2001     unsigned char salt[] = "9876543210";
2002     unsigned char key[] = "";
2003     unsigned char info[] = "stringinfo";
2004     const unsigned char expected[] = {
2005         0x68, 0x81, 0xa5, 0x3e, 0x5b, 0x9c, 0x7b, 0x6f, 0x2e, 0xec, 0xc8, 0x47,
2006         0x7c, 0xfa, 0x47, 0x35, 0x66, 0x82, 0x15, 0x30
2007     };
2008     size_t expectedlen = sizeof(expected);
2009
2010     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
2011         goto done;
2012
2013     outlen = sizeof(out);
2014     memset(out, 0, outlen);
2015
2016     if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
2017             || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
2018             || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
2019                                                         sizeof(salt) - 1), 0)
2020             || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
2021                                                        sizeof(key) - 1), 0)
2022             || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
2023                                                         sizeof(info) - 1), 0)
2024             || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
2025             || !TEST_mem_eq(out, outlen, expected, expectedlen))
2026         goto done;
2027
2028     ret = 1;
2029
2030  done:
2031     EVP_PKEY_CTX_free(pctx);
2032
2033     return ret;
2034 }
2035
2036 #ifndef OPENSSL_NO_EC
2037 static int test_X509_PUBKEY_inplace(void)
2038 {
2039     int ret = 0;
2040     X509_PUBKEY *xp = X509_PUBKEY_new_ex(testctx, testpropq);
2041     const unsigned char *p = kExampleECPubKeyDER;
2042     size_t input_len = sizeof(kExampleECPubKeyDER);
2043
2044     if (!TEST_ptr(xp))
2045         goto done;
2046     if (!TEST_ptr(d2i_X509_PUBKEY(&xp, &p, input_len)))
2047         goto done;
2048
2049     if (!TEST_ptr(X509_PUBKEY_get0(xp)))
2050         goto done;
2051
2052     p = kExampleBadECPubKeyDER;
2053     input_len = sizeof(kExampleBadECPubKeyDER);
2054
2055     if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len)))
2056         goto done;
2057
2058     if (!TEST_true(X509_PUBKEY_get0(xp) == NULL))
2059         goto done;
2060
2061     ret = 1;
2062
2063  done:
2064     X509_PUBKEY_free(xp);
2065     return ret;
2066 }
2067
2068 static int test_X509_PUBKEY_dup(void)
2069 {
2070     int ret = 0;
2071     X509_PUBKEY *xp = NULL, *xq = NULL;
2072     const unsigned char *p = kExampleECPubKeyDER;
2073     size_t input_len = sizeof(kExampleECPubKeyDER);
2074
2075     xp = X509_PUBKEY_new_ex(testctx, testpropq);
2076     if (!TEST_ptr(xp)
2077             || !TEST_ptr(d2i_X509_PUBKEY(&xp, &p, input_len))
2078             || !TEST_ptr(xq = X509_PUBKEY_dup(xp))
2079             || !TEST_ptr_ne(xp, xq))
2080         goto done;
2081
2082     if (!TEST_ptr(X509_PUBKEY_get0(xq))
2083             || !TEST_ptr(X509_PUBKEY_get0(xp))
2084             || !TEST_ptr_eq(X509_PUBKEY_get0(xq), X509_PUBKEY_get0(xp)))
2085         goto done;
2086
2087     X509_PUBKEY_free(xq);
2088     xq = NULL;
2089     p = kExampleBadECPubKeyDER;
2090     input_len = sizeof(kExampleBadECPubKeyDER);
2091
2092     if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len))
2093             || !TEST_ptr(xq = X509_PUBKEY_dup(xp)))
2094         goto done;
2095
2096     X509_PUBKEY_free(xp);
2097     xp = NULL;
2098     if (!TEST_true(X509_PUBKEY_get0(xq) == NULL))
2099         goto done;
2100
2101     ret = 1;
2102
2103  done:
2104     X509_PUBKEY_free(xp);
2105     X509_PUBKEY_free(xq);
2106     return ret;
2107 }
2108 #endif /* OPENSSL_NO_EC */
2109
2110 /* Test getting and setting parameters on an EVP_PKEY_CTX */
2111 static int test_EVP_PKEY_CTX_get_set_params(EVP_PKEY *pkey)
2112 {
2113     EVP_MD_CTX *mdctx = NULL;
2114     EVP_PKEY_CTX *ctx = NULL;
2115     const OSSL_PARAM *params;
2116     OSSL_PARAM ourparams[2], *param = ourparams, *param_md;
2117     int ret = 0;
2118     const EVP_MD *md;
2119     char mdname[OSSL_MAX_NAME_SIZE];
2120     char ssl3ms[48];
2121
2122     /* Initialise a sign operation */
2123     ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq);
2124     if (!TEST_ptr(ctx)
2125             || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0))
2126         goto err;
2127
2128     /*
2129      * We should be able to query the parameters now.
2130      */
2131     params = EVP_PKEY_CTX_settable_params(ctx);
2132     if (!TEST_ptr(params)
2133         || !TEST_ptr(OSSL_PARAM_locate_const(params,
2134                                              OSSL_SIGNATURE_PARAM_DIGEST)))
2135         goto err;
2136
2137     params = EVP_PKEY_CTX_gettable_params(ctx);
2138     if (!TEST_ptr(params)
2139         || !TEST_ptr(OSSL_PARAM_locate_const(params,
2140                                              OSSL_SIGNATURE_PARAM_ALGORITHM_ID))
2141         || !TEST_ptr(OSSL_PARAM_locate_const(params,
2142                                              OSSL_SIGNATURE_PARAM_DIGEST)))
2143         goto err;
2144
2145     /*
2146      * Test getting and setting params via EVP_PKEY_CTX_set_params() and
2147      * EVP_PKEY_CTX_get_params()
2148      */
2149     strcpy(mdname, "SHA512");
2150     param_md = param;
2151     *param++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2152                                                 mdname, 0);
2153     *param++ = OSSL_PARAM_construct_end();
2154
2155     if (!TEST_true(EVP_PKEY_CTX_set_params(ctx, ourparams)))
2156         goto err;
2157
2158     mdname[0] = '\0';
2159     *param_md = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2160                                                  mdname, sizeof(mdname));
2161     if (!TEST_true(EVP_PKEY_CTX_get_params(ctx, ourparams))
2162             || !TEST_str_eq(mdname, "SHA512"))
2163         goto err;
2164
2165     /*
2166      * Test the TEST_PKEY_CTX_set_signature_md() and
2167      * TEST_PKEY_CTX_get_signature_md() functions
2168      */
2169     if (!TEST_int_gt(EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()), 0)
2170             || !TEST_int_gt(EVP_PKEY_CTX_get_signature_md(ctx, &md), 0)
2171             || !TEST_ptr_eq(md, EVP_sha256()))
2172         goto err;
2173
2174     /*
2175      * Test getting MD parameters via an associated EVP_PKEY_CTX
2176      */
2177     mdctx = EVP_MD_CTX_new();
2178     if (!TEST_ptr(mdctx)
2179         || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, "SHA1", testctx, testpropq,
2180                                             pkey, NULL)))
2181         goto err;
2182
2183     /*
2184      * We now have an EVP_MD_CTX with an EVP_PKEY_CTX inside it. We should be
2185      * able to obtain the digest's settable parameters from the provider.
2186      */
2187     params = EVP_MD_CTX_settable_params(mdctx);
2188     if (!TEST_ptr(params)
2189             || !TEST_int_eq(strcmp(params[0].key, OSSL_DIGEST_PARAM_SSL3_MS), 0)
2190                /* The final key should be NULL */
2191             || !TEST_ptr_null(params[1].key))
2192         goto err;
2193
2194     param = ourparams;
2195     memset(ssl3ms, 0, sizeof(ssl3ms));
2196     *param++ = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
2197                                                  ssl3ms, sizeof(ssl3ms));
2198     *param++ = OSSL_PARAM_construct_end();
2199
2200     if (!TEST_true(EVP_MD_CTX_set_params(mdctx, ourparams)))
2201         goto err;
2202
2203     ret = 1;
2204
2205  err:
2206     EVP_MD_CTX_free(mdctx);
2207     EVP_PKEY_CTX_free(ctx);
2208
2209     return ret;
2210 }
2211
2212 #ifndef OPENSSL_NO_DSA
2213 static int test_DSA_get_set_params(void)
2214 {
2215     OSSL_PARAM_BLD *bld = NULL;
2216     OSSL_PARAM *params = NULL;
2217     BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
2218     EVP_PKEY_CTX *pctx = NULL;
2219     EVP_PKEY *pkey = NULL;
2220     int ret = 0;
2221
2222     /*
2223      * Setup the parameters for our DSA object. For our purposes they don't
2224      * have to actually be *valid* parameters. We just need to set something.
2225      */
2226     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "DSA", NULL))
2227         || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2228         || !TEST_ptr(p = BN_new())
2229         || !TEST_ptr(q = BN_new())
2230         || !TEST_ptr(g = BN_new())
2231         || !TEST_ptr(pub = BN_new())
2232         || !TEST_ptr(priv = BN_new()))
2233         goto err;
2234     if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
2235         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
2236         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
2237         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
2238                                              pub))
2239         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
2240                                              priv)))
2241         goto err;
2242     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2243         goto err;
2244
2245     if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2246         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2247                                           params), 0))
2248         goto err;
2249
2250     if (!TEST_ptr(pkey))
2251         goto err;
2252
2253     ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2254
2255  err:
2256     EVP_PKEY_free(pkey);
2257     EVP_PKEY_CTX_free(pctx);
2258     OSSL_PARAM_free(params);
2259     OSSL_PARAM_BLD_free(bld);
2260     BN_free(p);
2261     BN_free(q);
2262     BN_free(g);
2263     BN_free(pub);
2264     BN_free(priv);
2265
2266     return ret;
2267 }
2268
2269 /*
2270  * Test combinations of private, public, missing and private + public key
2271  * params to ensure they are all accepted
2272  */
2273 static int test_DSA_priv_pub(void)
2274 {
2275     return test_EVP_PKEY_ffc_priv_pub("DSA");
2276 }
2277
2278 #endif /* !OPENSSL_NO_DSA */
2279
2280 static int test_RSA_get_set_params(void)
2281 {
2282     OSSL_PARAM_BLD *bld = NULL;
2283     OSSL_PARAM *params = NULL;
2284     BIGNUM *n = NULL, *e = NULL, *d = NULL;
2285     EVP_PKEY_CTX *pctx = NULL;
2286     EVP_PKEY *pkey = NULL;
2287     int ret = 0;
2288
2289     /*
2290      * Setup the parameters for our RSA object. For our purposes they don't
2291      * have to actually be *valid* parameters. We just need to set something.
2292      */
2293     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", NULL))
2294         || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2295         || !TEST_ptr(n = BN_new())
2296         || !TEST_ptr(e = BN_new())
2297         || !TEST_ptr(d = BN_new()))
2298         goto err;
2299     if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
2300         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
2301         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d)))
2302         goto err;
2303     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2304         goto err;
2305
2306     if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2307         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2308                                           params), 0))
2309         goto err;
2310
2311     if (!TEST_ptr(pkey))
2312         goto err;
2313
2314     ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2315
2316  err:
2317     EVP_PKEY_free(pkey);
2318     EVP_PKEY_CTX_free(pctx);
2319     OSSL_PARAM_free(params);
2320     OSSL_PARAM_BLD_free(bld);
2321     BN_free(n);
2322     BN_free(e);
2323     BN_free(d);
2324
2325     return ret;
2326 }
2327
2328 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2329 static int test_decrypt_null_chunks(void)
2330 {
2331     EVP_CIPHER_CTX* ctx = NULL;
2332     EVP_CIPHER *cipher = NULL;
2333     const unsigned char key[32] = {
2334         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2335         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2336         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1
2337     };
2338     unsigned char iv[12] = {
2339         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
2340     };
2341     unsigned char msg[] = "It was the best of times, it was the worst of times";
2342     unsigned char ciphertext[80];
2343     unsigned char plaintext[80];
2344     /* We initialise tmp to a non zero value on purpose */
2345     int ctlen, ptlen, tmp = 99;
2346     int ret = 0;
2347     const int enc_offset = 10, dec_offset = 20;
2348
2349     if (!TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, "ChaCha20-Poly1305", testpropq))
2350             || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
2351             || !TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL,
2352                                              key, iv))
2353             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &ctlen, msg,
2354                                             enc_offset))
2355             /* Deliberate add a zero length update */
2356             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp, NULL,
2357                                             0))
2358             || !TEST_int_eq(tmp, 0)
2359             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp,
2360                                             msg + enc_offset,
2361                                             sizeof(msg) - enc_offset))
2362             || !TEST_int_eq(ctlen += tmp, sizeof(msg))
2363             || !TEST_true(EVP_EncryptFinal(ctx, ciphertext + ctlen, &tmp))
2364             || !TEST_int_eq(tmp, 0))
2365         goto err;
2366
2367     /* Deliberately initialise tmp to a non zero value */
2368     tmp = 99;
2369     if (!TEST_true(EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv))
2370             || !TEST_true(EVP_DecryptUpdate(ctx, plaintext, &ptlen, ciphertext,
2371                                             dec_offset))
2372             /*
2373              * Deliberately add a zero length update. We also deliberately do
2374              * this at a different offset than for encryption.
2375              */
2376             || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp, NULL,
2377                                             0))
2378             || !TEST_int_eq(tmp, 0)
2379             || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp,
2380                                             ciphertext + dec_offset,
2381                                             ctlen - dec_offset))
2382             || !TEST_int_eq(ptlen += tmp, sizeof(msg))
2383             || !TEST_true(EVP_DecryptFinal(ctx, plaintext + ptlen, &tmp))
2384             || !TEST_int_eq(tmp, 0)
2385             || !TEST_mem_eq(msg, sizeof(msg), plaintext, ptlen))
2386         goto err;
2387
2388     ret = 1;
2389  err:
2390     EVP_CIPHER_CTX_free(ctx);
2391     EVP_CIPHER_free(cipher);
2392     return ret;
2393 }
2394 #endif /* !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) */
2395
2396 #ifndef OPENSSL_NO_DH
2397 /*
2398  * Test combinations of private, public, missing and private + public key
2399  * params to ensure they are all accepted
2400  */
2401 static int test_DH_priv_pub(void)
2402 {
2403     return test_EVP_PKEY_ffc_priv_pub("DH");
2404 }
2405
2406 # ifndef OPENSSL_NO_DEPRECATED_3_0
2407 static int test_EVP_PKEY_set1_DH(void)
2408 {
2409     DH *x942dh = NULL, *noqdh = NULL;
2410     EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
2411     int ret = 0;
2412     BIGNUM *p, *g = NULL;
2413
2414     if (!TEST_ptr(p = BN_new())
2415             || !TEST_ptr(g = BN_new())
2416             || !BN_set_word(p, 9999)
2417             || !BN_set_word(g, 2)
2418             || !TEST_ptr(noqdh = DH_new())
2419             || !DH_set0_pqg(noqdh, p, NULL, g))
2420         goto err;
2421     p = g = NULL;
2422
2423     x942dh = DH_get_2048_256();
2424     pkey1 = EVP_PKEY_new();
2425     pkey2 = EVP_PKEY_new();
2426     if (!TEST_ptr(x942dh)
2427             || !TEST_ptr(noqdh)
2428             || !TEST_ptr(pkey1)
2429             || !TEST_ptr(pkey2))
2430         goto err;
2431
2432     if(!TEST_true(EVP_PKEY_set1_DH(pkey1, x942dh))
2433             || !TEST_int_eq(EVP_PKEY_get_id(pkey1), EVP_PKEY_DHX))
2434         goto err;
2435
2436     if(!TEST_true(EVP_PKEY_set1_DH(pkey2, noqdh))
2437             || !TEST_int_eq(EVP_PKEY_get_id(pkey2), EVP_PKEY_DH))
2438         goto err;
2439
2440     ret = 1;
2441  err:
2442     BN_free(p);
2443     BN_free(g);
2444     EVP_PKEY_free(pkey1);
2445     EVP_PKEY_free(pkey2);
2446     DH_free(x942dh);
2447     DH_free(noqdh);
2448
2449     return ret;
2450 }
2451 # endif /* !OPENSSL_NO_DEPRECATED_3_0 */
2452 #endif /* !OPENSSL_NO_DH */
2453
2454 /*
2455  * We test what happens with an empty template.  For the sake of this test,
2456  * the template must be ignored, and we know that's the case for RSA keys
2457  * (this might arguably be a misfeature, but that's what we currently do,
2458  * even in provider code, since that's how the legacy RSA implementation
2459  * does things)
2460  */
2461 static int test_keygen_with_empty_template(int n)
2462 {
2463     EVP_PKEY_CTX *ctx = NULL;
2464     EVP_PKEY *pkey = NULL;
2465     EVP_PKEY *tkey = NULL;
2466     int ret = 0;
2467
2468     if (nullprov != NULL)
2469         return TEST_skip("Test does not support a non-default library context");
2470
2471     switch (n) {
2472     case 0:
2473         /* We do test with no template at all as well */
2474         if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
2475             goto err;
2476         break;
2477     case 1:
2478         /* Here we create an empty RSA key that serves as our template */
2479         if (!TEST_ptr(tkey = EVP_PKEY_new())
2480             || !TEST_true(EVP_PKEY_set_type(tkey, EVP_PKEY_RSA))
2481             || !TEST_ptr(ctx = EVP_PKEY_CTX_new(tkey, NULL)))
2482             goto err;
2483         break;
2484     }
2485
2486     if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
2487         || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0))
2488         goto err;
2489
2490     ret = 1;
2491  err:
2492     EVP_PKEY_CTX_free(ctx);
2493     EVP_PKEY_free(pkey);
2494     EVP_PKEY_free(tkey);
2495     return ret;
2496 }
2497
2498 /*
2499  * Test that we fail if we attempt to use an algorithm that is not available
2500  * in the current library context (unless we are using an algorithm that
2501  * should be made available via legacy codepaths).
2502  *
2503  * 0:   RSA
2504  * 1:   SM2
2505  */
2506 static int test_pkey_ctx_fail_without_provider(int tst)
2507 {
2508     OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
2509     OSSL_PROVIDER *tmpnullprov = NULL;
2510     EVP_PKEY_CTX *pctx = NULL;
2511     const char *keytype = NULL;
2512     int expect_null = 0;
2513     int ret = 0;
2514
2515     if (!TEST_ptr(tmpctx))
2516         goto err;
2517
2518     tmpnullprov = OSSL_PROVIDER_load(tmpctx, "null");
2519     if (!TEST_ptr(tmpnullprov))
2520         goto err;
2521
2522     /*
2523      * We check for certain algos in the null provider.
2524      * If an algo is expected to have a provider keymgmt, contructing an
2525      * EVP_PKEY_CTX is expected to fail (return NULL).
2526      * Otherwise, if it's expected to have legacy support, contructing an
2527      * EVP_PKEY_CTX is expected to succeed (return non-NULL).
2528      */
2529     switch (tst) {
2530     case 0:
2531         keytype = "RSA";
2532         expect_null = 1;
2533         break;
2534     case 1:
2535         keytype = "SM2";
2536         expect_null = 1;
2537 #ifdef OPENSSL_NO_EC
2538         TEST_info("EC disable, skipping SM2 check...");
2539         goto end;
2540 #endif
2541 #ifdef OPENSSL_NO_SM2
2542         TEST_info("SM2 disable, skipping SM2 check...");
2543         goto end;
2544 #endif
2545         break;
2546     default:
2547         TEST_error("No test for case %d", tst);
2548         goto err;
2549     }
2550
2551     pctx = EVP_PKEY_CTX_new_from_name(tmpctx, keytype, "");
2552     if (expect_null ? !TEST_ptr_null(pctx) : !TEST_ptr(pctx))
2553         goto err;
2554
2555 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_SM2)
2556  end:
2557 #endif
2558     ret = 1;
2559
2560  err:
2561     EVP_PKEY_CTX_free(pctx);
2562     OSSL_PROVIDER_unload(tmpnullprov);
2563     OSSL_LIB_CTX_free(tmpctx);
2564     return ret;
2565 }
2566
2567 static int test_rand_agglomeration(void)
2568 {
2569     EVP_RAND *rand;
2570     EVP_RAND_CTX *ctx;
2571     OSSL_PARAM params[3], *p = params;
2572     int res;
2573     unsigned int step = 7;
2574     static unsigned char seed[] = "It does not matter how slowly you go "
2575                                   "as long as you do not stop.";
2576     unsigned char out[sizeof(seed)];
2577
2578     if (!TEST_int_ne(sizeof(seed) % step, 0)
2579             || !TEST_ptr(rand = EVP_RAND_fetch(testctx, "TEST-RAND", testpropq)))
2580         return 0;
2581     ctx = EVP_RAND_CTX_new(rand, NULL);
2582     EVP_RAND_free(rand);
2583     if (!TEST_ptr(ctx))
2584         return 0;
2585
2586     memset(out, 0, sizeof(out));
2587     *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
2588                                              seed, sizeof(seed));
2589     *p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
2590     *p = OSSL_PARAM_construct_end();
2591     res = TEST_true(EVP_RAND_CTX_set_params(ctx, params))
2592           && TEST_true(EVP_RAND_generate(ctx, out, sizeof(out), 0, 1, NULL, 0))
2593           && TEST_mem_eq(seed, sizeof(seed), out, sizeof(out));
2594     EVP_RAND_CTX_free(ctx);
2595     return res;
2596 }
2597
2598 /*
2599  * Test that we correctly return the original or "running" IV after
2600  * an encryption operation.
2601  * Run multiple times for some different relevant algorithms/modes.
2602  */
2603 static int test_evp_iv_aes(int idx)
2604 {
2605     int ret = 0;
2606     EVP_CIPHER_CTX *ctx = NULL;
2607     unsigned char key[16] = {0x4c, 0x43, 0xdb, 0xdd, 0x42, 0x73, 0x47, 0xd1,
2608                              0xe5, 0x62, 0x7d, 0xcd, 0x4d, 0x76, 0x4d, 0x57};
2609     unsigned char init_iv[EVP_MAX_IV_LENGTH] =
2610         {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98, 0x82,
2611          0x5a, 0x55, 0x91, 0x81, 0x42, 0xa8, 0x89, 0x34};
2612     static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
2613                                          9, 10, 11, 12, 13, 14, 15, 16 };
2614     unsigned char ciphertext[32], oiv[16], iv[16];
2615     unsigned char *ref_iv;
2616     unsigned char cbc_state[16] = {0x10, 0x2f, 0x05, 0xcc, 0xc2, 0x55, 0x72, 0xb9,
2617                                    0x88, 0xe6, 0x4a, 0x17, 0x10, 0x74, 0x22, 0x5e};
2618
2619     unsigned char ofb_state[16] = {0x76, 0xe6, 0x66, 0x61, 0xd0, 0x8a, 0xe4, 0x64,
2620                                    0xdd, 0x66, 0xbf, 0x00, 0xf0, 0xe3, 0x6f, 0xfd};
2621     unsigned char cfb_state[16] = {0x77, 0xe4, 0x65, 0x65, 0xd5, 0x8c, 0xe3, 0x6c,
2622                                    0xd4, 0x6c, 0xb4, 0x0c, 0xfd, 0xed, 0x60, 0xed};
2623     unsigned char gcm_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
2624                                    0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
2625     unsigned char ccm_state[7] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98};
2626 #ifndef OPENSSL_NO_OCB
2627     unsigned char ocb_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
2628                                    0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
2629 #endif
2630     int len = sizeof(ciphertext);
2631     size_t ivlen, ref_len;
2632     const EVP_CIPHER *type = NULL;
2633     int iv_reset = 0;
2634
2635     if (nullprov != NULL && idx < 6)
2636         return TEST_skip("Test does not support a non-default library context");
2637
2638     switch(idx) {
2639     case 0:
2640         type = EVP_aes_128_cbc();
2641         /* FALLTHROUGH */
2642     case 6:
2643         type = (type != NULL) ? type :
2644                                 EVP_CIPHER_fetch(testctx, "aes-128-cbc", testpropq);
2645         ref_iv = cbc_state;
2646         ref_len = sizeof(cbc_state);
2647         iv_reset = 1;
2648         break;
2649     case 1:
2650         type = EVP_aes_128_ofb();
2651         /* FALLTHROUGH */
2652     case 7:
2653         type = (type != NULL) ? type :
2654                                 EVP_CIPHER_fetch(testctx, "aes-128-ofb", testpropq);
2655         ref_iv = ofb_state;
2656         ref_len = sizeof(ofb_state);
2657         iv_reset = 1;
2658         break;
2659     case 2:
2660         type = EVP_aes_128_cfb();
2661         /* FALLTHROUGH */
2662     case 8:
2663         type = (type != NULL) ? type :
2664                                 EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq);
2665         ref_iv = cfb_state;
2666         ref_len = sizeof(cfb_state);
2667         iv_reset = 1;
2668         break;
2669     case 3:
2670         type = EVP_aes_128_gcm();
2671         /* FALLTHROUGH */
2672     case 9:
2673         type = (type != NULL) ? type :
2674                                 EVP_CIPHER_fetch(testctx, "aes-128-gcm", testpropq);
2675         ref_iv = gcm_state;
2676         ref_len = sizeof(gcm_state);
2677         break;
2678     case 4:
2679         type = EVP_aes_128_ccm();
2680         /* FALLTHROUGH */
2681     case 10:
2682         type = (type != NULL) ? type :
2683                                 EVP_CIPHER_fetch(testctx, "aes-128-ccm", testpropq);
2684         ref_iv = ccm_state;
2685         ref_len = sizeof(ccm_state);
2686         break;
2687 #ifdef OPENSSL_NO_OCB
2688     case 5:
2689     case 11:
2690         return 1;
2691 #else
2692     case 5:
2693         type = EVP_aes_128_ocb();
2694         /* FALLTHROUGH */
2695     case 11:
2696         type = (type != NULL) ? type :
2697                                 EVP_CIPHER_fetch(testctx, "aes-128-ocb", testpropq);
2698         ref_iv = ocb_state;
2699         ref_len = sizeof(ocb_state);
2700         break;
2701 #endif
2702     default:
2703         return 0;
2704     }
2705
2706     if (!TEST_ptr(type)
2707             || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
2708             || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
2709             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
2710                           (int)sizeof(msg)))
2711             || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
2712             || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
2713             || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
2714         goto err;
2715     ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
2716     if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
2717             || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
2718         goto err;
2719
2720     /* CBC, OFB, and CFB modes: the updated iv must be reset after reinit */
2721     if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
2722         || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
2723         goto err;
2724     if (iv_reset) {
2725         if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
2726             goto err;
2727     } else {
2728         if (!TEST_mem_eq(ref_iv, ivlen, iv, ivlen))
2729             goto err;
2730     }
2731
2732     ret = 1;
2733 err:
2734     EVP_CIPHER_CTX_free(ctx);
2735     if (idx >= 6)
2736         EVP_CIPHER_free((EVP_CIPHER *)type);
2737     return ret;
2738 }
2739
2740 #ifndef OPENSSL_NO_DES
2741 static int test_evp_iv_des(int idx)
2742 {
2743     int ret = 0;
2744     EVP_CIPHER_CTX *ctx = NULL;
2745     static const unsigned char key[24] = {
2746         0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2747         0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
2748         0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
2749     };
2750     static const unsigned char init_iv[8] = {
2751         0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
2752     };
2753     static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
2754                                          9, 10, 11, 12, 13, 14, 15, 16 };
2755     unsigned char ciphertext[32], oiv[8], iv[8];
2756     unsigned const char *ref_iv;
2757     static const unsigned char cbc_state_des[8] = {
2758         0x4f, 0xa3, 0x85, 0xcd, 0x8b, 0xf3, 0x06, 0x2a
2759     };
2760     static const unsigned char cbc_state_3des[8] = {
2761         0x35, 0x27, 0x7d, 0x65, 0x6c, 0xfb, 0x50, 0xd9
2762     };
2763     static const unsigned char ofb_state_des[8] = {
2764         0xa7, 0x0d, 0x1d, 0x45, 0xf9, 0x96, 0x3f, 0x2c
2765     };
2766     static const unsigned char ofb_state_3des[8] = {
2767         0xab, 0x16, 0x24, 0xbb, 0x5b, 0xac, 0xed, 0x5e
2768     };
2769     static const unsigned char cfb_state_des[8] = {
2770         0x91, 0xeb, 0x6d, 0x29, 0x4b, 0x08, 0xbd, 0x73
2771     };
2772     static const unsigned char cfb_state_3des[8] = {
2773         0x34, 0xdd, 0xfb, 0x47, 0x33, 0x1c, 0x61, 0xf7
2774     };
2775     int len = sizeof(ciphertext);
2776     size_t ivlen, ref_len;
2777     EVP_CIPHER *type = NULL;
2778
2779     if (lgcyprov == NULL && idx < 3)
2780         return TEST_skip("Test requires legacy provider to be loaded");
2781
2782     switch(idx) {
2783     case 0:
2784         type = EVP_CIPHER_fetch(testctx, "des-cbc", testpropq);
2785         ref_iv = cbc_state_des;
2786         ref_len = sizeof(cbc_state_des);
2787         break;
2788     case 1:
2789         type = EVP_CIPHER_fetch(testctx, "des-ofb", testpropq);
2790         ref_iv = ofb_state_des;
2791         ref_len = sizeof(ofb_state_des);
2792         break;
2793     case 2:
2794         type = EVP_CIPHER_fetch(testctx, "des-cfb", testpropq);
2795         ref_iv = cfb_state_des;
2796         ref_len = sizeof(cfb_state_des);
2797         break;
2798     case 3:
2799         type = EVP_CIPHER_fetch(testctx, "des-ede3-cbc", testpropq);
2800         ref_iv = cbc_state_3des;
2801         ref_len = sizeof(cbc_state_3des);
2802         break;
2803     case 4:
2804         type = EVP_CIPHER_fetch(testctx, "des-ede3-ofb", testpropq);
2805         ref_iv = ofb_state_3des;
2806         ref_len = sizeof(ofb_state_3des);
2807         break;
2808     case 5:
2809         type = EVP_CIPHER_fetch(testctx, "des-ede3-cfb", testpropq);
2810         ref_iv = cfb_state_3des;
2811         ref_len = sizeof(cfb_state_3des);
2812         break;
2813     default:
2814         return 0;
2815     }
2816
2817     if (!TEST_ptr(type)
2818             || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
2819             || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
2820             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
2821                           (int)sizeof(msg)))
2822             || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
2823             || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
2824             || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
2825         goto err;
2826     ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
2827     if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
2828             || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
2829         goto err;
2830
2831     if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
2832         || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
2833         goto err;
2834     if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
2835         goto err;
2836
2837     ret = 1;
2838 err:
2839     EVP_CIPHER_CTX_free(ctx);
2840     EVP_CIPHER_free(type);
2841     return ret;
2842 }
2843 #endif
2844
2845 #ifndef OPENSSL_NO_EC
2846 static int ecpub_nids[] = {
2847     NID_brainpoolP256r1, NID_X9_62_prime256v1,
2848     NID_secp384r1, NID_secp521r1,
2849 # ifndef OPENSSL_NO_EC2M
2850     NID_sect233k1, NID_sect233r1, NID_sect283r1,
2851     NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1,
2852 # endif
2853     NID_brainpoolP384r1, NID_brainpoolP512r1
2854 };
2855
2856 static int test_ecpub(int idx)
2857 {
2858     int ret = 0, len, savelen;
2859     int nid;
2860     unsigned char buf[1024];
2861     unsigned char *p;
2862     EVP_PKEY *pkey = NULL;
2863     EVP_PKEY_CTX *ctx = NULL;
2864 # ifndef OPENSSL_NO_DEPRECATED_3_0
2865     const unsigned char *q;
2866     EVP_PKEY *pkey2 = NULL;
2867     EC_KEY *ec = NULL;
2868 # endif
2869
2870     if (nullprov != NULL)
2871         return TEST_skip("Test does not support a non-default library context");
2872
2873     nid = ecpub_nids[idx];
2874
2875     ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
2876     if (!TEST_ptr(ctx)
2877         || !TEST_true(EVP_PKEY_keygen_init(ctx))
2878         || !TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid))
2879         || !TEST_true(EVP_PKEY_keygen(ctx, &pkey)))
2880         goto done;
2881     len = i2d_PublicKey(pkey, NULL);
2882     savelen = len;
2883     if (!TEST_int_ge(len, 1)
2884         || !TEST_int_lt(len, 1024))
2885         goto done;
2886     p = buf;
2887     len = i2d_PublicKey(pkey, &p);
2888     if (!TEST_int_ge(len, 1)
2889             || !TEST_int_eq(len, savelen))
2890         goto done;
2891
2892 # ifndef OPENSSL_NO_DEPRECATED_3_0
2893     /* Now try to decode the just-created DER. */
2894     q = buf;
2895     if (!TEST_ptr((pkey2 = EVP_PKEY_new()))
2896             || !TEST_ptr((ec = EC_KEY_new_by_curve_name(nid)))
2897             || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey2, ec)))
2898         goto done;
2899     /* EC_KEY ownership transferred */
2900     ec = NULL;
2901     if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_EC, &pkey2, &q, savelen)))
2902         goto done;
2903     /* The keys should match. */
2904     if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
2905         goto done;
2906 # endif
2907
2908     ret = 1;
2909
2910  done:
2911     EVP_PKEY_CTX_free(ctx);
2912     EVP_PKEY_free(pkey);
2913 # ifndef OPENSSL_NO_DEPRECATED_3_0
2914     EVP_PKEY_free(pkey2);
2915     EC_KEY_free(ec);
2916 # endif
2917     return ret;
2918 }
2919 #endif
2920
2921 static int test_EVP_rsa_pss_with_keygen_bits(void)
2922 {
2923     int ret = 0;
2924     EVP_PKEY_CTX *ctx = NULL;
2925     EVP_PKEY *pkey = NULL;
2926     EVP_MD *md;
2927
2928     md = EVP_MD_fetch(testctx, "sha256", testpropq);
2929     ret = TEST_ptr(md)
2930         && TEST_ptr((ctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", testpropq)))
2931         && TEST_true(EVP_PKEY_keygen_init(ctx))
2932         && TEST_int_gt(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 512), 0)
2933         && TEST_true(EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md))
2934         && TEST_true(EVP_PKEY_keygen(ctx, &pkey));
2935
2936     EVP_MD_free(md);
2937     EVP_PKEY_free(pkey);
2938     EVP_PKEY_CTX_free(ctx);
2939     return ret;
2940 }
2941
2942 static int success = 1;
2943 static void md_names(const char *name, void *vctx)
2944 {
2945     OSSL_LIB_CTX *ctx = (OSSL_LIB_CTX *)vctx;
2946     /* Force a namemap update */
2947     EVP_CIPHER *aes128 = EVP_CIPHER_fetch(ctx, "AES-128-CBC", NULL);
2948
2949     if (!TEST_ptr(aes128))
2950         success = 0;
2951
2952     EVP_CIPHER_free(aes128);
2953 }
2954
2955 /*
2956  * Test that changing the namemap in a user callback works in a names_do_all
2957  * function.
2958  */
2959 static int test_names_do_all(void)
2960 {
2961     /* We use a custom libctx so that we know the state of the namemap */
2962     OSSL_LIB_CTX *ctx = OSSL_LIB_CTX_new();
2963     EVP_MD *sha256 = NULL;
2964     int testresult = 0;
2965
2966     if (!TEST_ptr(ctx))
2967         goto err;
2968
2969     sha256 = EVP_MD_fetch(ctx, "SHA2-256", NULL);
2970     if (!TEST_ptr(sha256))
2971         goto err;
2972
2973     /*
2974      * We loop through all the names for a given digest. This should still work
2975      * even if the namemap changes part way through.
2976      */
2977     if (!TEST_true(EVP_MD_names_do_all(sha256, md_names, ctx)))
2978         goto err;
2979
2980     if (!TEST_true(success))
2981         goto err;
2982
2983     testresult = 1;
2984  err:
2985     EVP_MD_free(sha256);
2986     OSSL_LIB_CTX_free(ctx);
2987     return testresult;
2988 }
2989
2990 typedef struct {
2991     const char *cipher;
2992     const unsigned char *key;
2993     const unsigned char *iv;
2994     const unsigned char *input;
2995     const unsigned char *expected;
2996     const unsigned char *tag;
2997     size_t ivlen; /* 0 if we do not need to set a specific IV len */
2998     size_t inlen;
2999     size_t expectedlen;
3000     size_t taglen;
3001     int keyfirst;
3002     int initenc;
3003     int finalenc;
3004 } EVP_INIT_TEST_st;
3005
3006 static const EVP_INIT_TEST_st evp_init_tests[] = {
3007     {
3008         "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbPlaintext,
3009         cfbCiphertext, NULL, 0, sizeof(cfbPlaintext), sizeof(cfbCiphertext),
3010         0, 1, 0, 1
3011     },
3012     {
3013         "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultPlaintext,
3014         gcmDefaultCiphertext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3015         sizeof(gcmDefaultPlaintext), sizeof(gcmDefaultCiphertext),
3016         sizeof(gcmDefaultTag), 1, 0, 1
3017     },
3018     {
3019         "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbPlaintext,
3020         cfbCiphertext, NULL, 0, sizeof(cfbPlaintext), sizeof(cfbCiphertext),
3021         0, 0, 0, 1
3022     },
3023     {
3024         "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultPlaintext,
3025         gcmDefaultCiphertext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3026         sizeof(gcmDefaultPlaintext), sizeof(gcmDefaultCiphertext),
3027         sizeof(gcmDefaultTag), 0, 0, 1
3028     },
3029     {
3030         "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbCiphertext,
3031         cfbPlaintext, NULL, 0, sizeof(cfbCiphertext), sizeof(cfbPlaintext),
3032         0, 1, 1, 0
3033     },
3034     {
3035         "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultCiphertext,
3036         gcmDefaultPlaintext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3037         sizeof(gcmDefaultCiphertext), sizeof(gcmDefaultPlaintext),
3038         sizeof(gcmDefaultTag), 1, 1, 0
3039     },
3040     {
3041         "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbCiphertext,
3042         cfbPlaintext, NULL, 0, sizeof(cfbCiphertext), sizeof(cfbPlaintext),
3043         0, 0, 1, 0
3044     },
3045     {
3046         "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultCiphertext,
3047         gcmDefaultPlaintext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3048         sizeof(gcmDefaultCiphertext), sizeof(gcmDefaultPlaintext),
3049         sizeof(gcmDefaultTag), 0, 1, 0
3050     }
3051 };
3052
3053 static int evp_init_seq_set_iv(EVP_CIPHER_CTX *ctx, const EVP_INIT_TEST_st *t)
3054 {
3055     int res = 0;
3056     
3057     if (t->ivlen != 0) {
3058         if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen, NULL)))
3059             goto err;
3060     }
3061     if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, t->iv, -1)))
3062         goto err;
3063     res = 1;
3064  err:
3065     return res;
3066 }
3067
3068 /*
3069  * Test step-wise cipher initialization via EVP_CipherInit_ex where the
3070  * arguments are given one at a time and a final adjustment to the enc
3071  * parameter sets the correct operation.
3072  */
3073 static int test_evp_init_seq(int idx)
3074 {
3075     int outlen1, outlen2;
3076     int testresult = 0;
3077     unsigned char outbuf[1024];
3078     unsigned char tag[16];
3079     const EVP_INIT_TEST_st *t = &evp_init_tests[idx];
3080     EVP_CIPHER_CTX *ctx = NULL;
3081     EVP_CIPHER *type = NULL;
3082     size_t taglen = sizeof(tag);
3083     char *errmsg = NULL;
3084
3085     ctx = EVP_CIPHER_CTX_new();
3086     if (ctx == NULL) {
3087         errmsg = "CTX_ALLOC";
3088         goto err;
3089     }
3090     if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, t->cipher, testpropq))) {
3091         errmsg = "CIPHER_FETCH";
3092         goto err;
3093     }
3094     if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, NULL, NULL, t->initenc))) {
3095         errmsg = "EMPTY_ENC_INIT";
3096         goto err;
3097     }
3098     if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3099         errmsg = "PADDING";
3100         goto err;
3101     }
3102     if (t->keyfirst && !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, t->key, NULL, -1))) {
3103         errmsg = "KEY_INIT (before iv)";
3104         goto err;
3105     }
3106     if (!evp_init_seq_set_iv(ctx, t)) {
3107         errmsg = "IV_INIT";
3108         goto err;
3109     }
3110     if (t->keyfirst == 0 &&  !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, t->key, NULL, -1))) {
3111         errmsg = "KEY_INIT (after iv)";
3112         goto err;
3113     }
3114     if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, t->finalenc))) {
3115         errmsg = "FINAL_ENC_INIT";
3116         goto err;
3117     }
3118     if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3119         errmsg = "CIPHER_UPDATE";
3120         goto err;
3121     }
3122     if (t->finalenc == 0 && t->tag != NULL) {
3123         /* Set expected tag */
3124         if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
3125                                            t->taglen, (void *)t->tag))) {
3126             errmsg = "SET_TAG";
3127             goto err;
3128         }
3129     }
3130     if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3131         errmsg = "CIPHER_FINAL";
3132         goto err;
3133     }
3134     if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3135         errmsg = "WRONG_RESULT";
3136         goto err;
3137     }
3138     if (t->finalenc != 0 && t->tag != NULL) {
3139         if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag))) {
3140             errmsg = "GET_TAG";
3141             goto err;
3142         }
3143         if (!TEST_mem_eq(t->tag, t->taglen, tag, taglen)) {
3144             errmsg = "TAG_ERROR";
3145             goto err;
3146         }
3147     }
3148     testresult = 1;
3149  err:
3150     if (errmsg != NULL)
3151         TEST_info("evp_init_test %d: %s", idx, errmsg);
3152     EVP_CIPHER_CTX_free(ctx);
3153     EVP_CIPHER_free(type);
3154     return testresult;
3155 }
3156
3157 typedef struct {
3158     const unsigned char *input;
3159     const unsigned char *expected;
3160     size_t inlen;
3161     size_t expectedlen;
3162     int enc;
3163 } EVP_RESET_TEST_st;
3164
3165 static const EVP_RESET_TEST_st evp_reset_tests[] = {
3166     {
3167         cfbPlaintext, cfbCiphertext,
3168         sizeof(cfbPlaintext), sizeof(cfbCiphertext), 1
3169     },
3170     {
3171         cfbCiphertext, cfbPlaintext,
3172         sizeof(cfbCiphertext), sizeof(cfbPlaintext), 0
3173     }
3174 };
3175
3176 /*
3177  * Test a reset of a cipher via EVP_CipherInit_ex after the cipher has already
3178  * been used.
3179  */
3180 static int test_evp_reset(int idx)
3181 {
3182     const EVP_RESET_TEST_st *t = &evp_reset_tests[idx];
3183     int outlen1, outlen2;
3184     int testresult = 0;
3185     unsigned char outbuf[1024];
3186     EVP_CIPHER_CTX *ctx = NULL;
3187     EVP_CIPHER *type = NULL;
3188     char *errmsg = NULL;
3189
3190     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3191         errmsg = "CTX_ALLOC";
3192         goto err;
3193     }
3194     if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq))) {
3195         errmsg = "CIPHER_FETCH";
3196         goto err;
3197     }
3198     if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, kCFBDefaultKey, iCFBIV, t->enc))) {
3199         errmsg = "CIPHER_INIT";
3200         goto err;
3201     }
3202     if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3203         errmsg = "PADDING";
3204         goto err;
3205     }
3206     if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3207         errmsg = "CIPHER_UPDATE";
3208         goto err;
3209     }
3210     if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3211         errmsg = "CIPHER_FINAL";
3212         goto err;
3213     }
3214     if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3215         errmsg = "WRONG_RESULT";
3216         goto err;
3217     }
3218     if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, -1))) {
3219         errmsg = "CIPHER_REINIT";
3220         goto err;
3221     }
3222     if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3223         errmsg = "CIPHER_UPDATE (reinit)";
3224         goto err;
3225     }
3226     if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3227         errmsg = "CIPHER_FINAL (reinit)";
3228         goto err;
3229     }
3230     if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3231         errmsg = "WRONG_RESULT (reinit)";
3232         goto err;
3233     }
3234     testresult = 1;
3235  err:
3236     if (errmsg != NULL)
3237         TEST_info("test_evp_reset %d: %s", idx, errmsg);
3238     EVP_CIPHER_CTX_free(ctx);
3239     EVP_CIPHER_free(type);
3240     return testresult;    
3241 }
3242
3243 typedef struct {
3244     const unsigned char *iv1;
3245     const unsigned char *iv2;
3246     const unsigned char *expected1;
3247     const unsigned char *expected2;
3248     const unsigned char *tag1;
3249     const unsigned char *tag2;
3250     size_t ivlen1;
3251     size_t ivlen2;
3252     size_t expectedlen1;
3253     size_t expectedlen2;
3254 } TEST_GCM_IV_REINIT_st;
3255
3256 static const TEST_GCM_IV_REINIT_st gcm_reinit_tests[] = {
3257     {
3258         iGCMResetIV1, iGCMResetIV2, gcmResetCiphertext1, gcmResetCiphertext2,
3259         gcmResetTag1, gcmResetTag2, sizeof(iGCMResetIV1), sizeof(iGCMResetIV2),
3260         sizeof(gcmResetCiphertext1), sizeof(gcmResetCiphertext2)
3261     },
3262     {
3263         iGCMResetIV2, iGCMResetIV1, gcmResetCiphertext2, gcmResetCiphertext1,
3264         gcmResetTag2, gcmResetTag1, sizeof(iGCMResetIV2), sizeof(iGCMResetIV1),
3265         sizeof(gcmResetCiphertext2), sizeof(gcmResetCiphertext1)
3266     }
3267 };
3268
3269 static int test_gcm_reinit(int idx)
3270 {
3271     int outlen1, outlen2, outlen3;
3272     int testresult = 0;
3273     unsigned char outbuf[1024];
3274     unsigned char tag[16];
3275     const TEST_GCM_IV_REINIT_st *t = &gcm_reinit_tests[idx];
3276     EVP_CIPHER_CTX *ctx = NULL;
3277     EVP_CIPHER *type = NULL;
3278     size_t taglen = sizeof(tag);
3279     char *errmsg = NULL;
3280
3281     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3282         errmsg = "CTX_ALLOC";
3283         goto err;
3284     }
3285     if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "aes-256-gcm", testpropq))) {
3286         errmsg = "CIPHER_FETCH";
3287         goto err;
3288     }
3289     if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, NULL, NULL, 1))) {
3290         errmsg = "ENC_INIT";
3291         goto err;
3292     }
3293     if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen1, NULL))) {
3294         errmsg = "SET_IVLEN1";
3295         goto err;
3296     }
3297     if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, kGCMResetKey, t->iv1, 1))) {
3298         errmsg = "SET_IV1";
3299         goto err;
3300     }
3301     if (!TEST_true(EVP_CipherUpdate(ctx, NULL, &outlen3, gcmAAD, sizeof(gcmAAD)))) {
3302         errmsg = "AAD1";
3303         goto err;
3304     }
3305     EVP_CIPHER_CTX_set_padding(ctx, 0);
3306     if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, gcmResetPlaintext,
3307                                     sizeof(gcmResetPlaintext)))) {
3308         errmsg = "CIPHER_UPDATE1";
3309         goto err;
3310     }
3311     if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3312         errmsg = "CIPHER_FINAL1";
3313         goto err;
3314     }
3315     if (!TEST_mem_eq(t->expected1, t->expectedlen1, outbuf, outlen1 + outlen2)) {
3316         errmsg = "WRONG_RESULT1";
3317         goto err;
3318     }
3319     if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag))) {
3320         errmsg = "GET_TAG1";
3321         goto err;
3322     }
3323     if (!TEST_mem_eq(t->tag1, taglen, tag, taglen)) {
3324         errmsg = "TAG_ERROR1";
3325         goto err;
3326     }
3327     /* Now reinit */
3328     if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen2, NULL))) {
3329         errmsg = "SET_IVLEN2";
3330         goto err;
3331     }
3332     if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, t->iv2, -1))) {
3333         errmsg = "SET_IV2";
3334         goto err;
3335     }
3336     if (!TEST_true(EVP_CipherUpdate(ctx, NULL, &outlen3, gcmAAD, sizeof(gcmAAD)))) {
3337         errmsg = "AAD2";
3338         goto err;
3339     }
3340     if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, gcmResetPlaintext,
3341                                     sizeof(gcmResetPlaintext)))) {
3342         errmsg = "CIPHER_UPDATE2";
3343         goto err;
3344     }
3345     if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3346         errmsg = "CIPHER_FINAL2";
3347         goto err;
3348     }
3349     if (!TEST_mem_eq(t->expected2, t->expectedlen2, outbuf, outlen1 + outlen2)) {
3350         errmsg = "WRONG_RESULT2";
3351         goto err;
3352     }
3353     if (!TEST_true(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag))) {
3354         errmsg = "GET_TAG2";
3355         goto err;
3356     }
3357     if (!TEST_mem_eq(t->tag2, taglen, tag, taglen)) {
3358         errmsg = "TAG_ERROR2";
3359         goto err;
3360     }
3361     testresult = 1;
3362  err:
3363     if (errmsg != NULL)
3364         TEST_info("evp_init_test %d: %s", idx, errmsg);
3365     EVP_CIPHER_CTX_free(ctx);
3366     EVP_CIPHER_free(type);
3367     return testresult;
3368 }
3369
3370
3371 typedef enum OPTION_choice {
3372     OPT_ERR = -1,
3373     OPT_EOF = 0,
3374     OPT_CONTEXT,
3375     OPT_TEST_ENUM
3376 } OPTION_CHOICE;
3377
3378 const OPTIONS *test_get_options(void)
3379 {
3380     static const OPTIONS options[] = {
3381         OPT_TEST_OPTIONS_DEFAULT_USAGE,
3382         { "context", OPT_CONTEXT, '-', "Explicitly use a non-default library context" },
3383         { NULL }
3384     };
3385     return options;
3386 }
3387
3388 int setup_tests(void)
3389 {
3390     OPTION_CHOICE o;
3391
3392     while ((o = opt_next()) != OPT_EOF) {
3393         switch (o) {
3394         case OPT_CONTEXT:
3395             /* Set up an alternate library context */
3396             testctx = OSSL_LIB_CTX_new();
3397             if (!TEST_ptr(testctx))
3398                 return 0;
3399             /* Swap the libctx to test non-default context only */
3400             nullprov = OSSL_PROVIDER_load(NULL, "null");
3401             deflprov = OSSL_PROVIDER_load(testctx, "default");
3402             lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
3403             break;
3404         case OPT_TEST_CASES:
3405             break;
3406         default:
3407             return 0;
3408         }
3409     }
3410
3411     ADD_TEST(test_EVP_set_default_properties);
3412     ADD_ALL_TESTS(test_EVP_DigestSignInit, 9);
3413     ADD_TEST(test_EVP_DigestVerifyInit);
3414     ADD_TEST(test_EVP_Digest);
3415     ADD_ALL_TESTS(test_EVP_Enveloped, 2);
3416     ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
3417     ADD_TEST(test_privatekey_to_pkcs8);
3418     ADD_TEST(test_EVP_PKCS82PKEY_wrong_tag);
3419 #ifndef OPENSSL_NO_EC
3420     ADD_TEST(test_EVP_PKCS82PKEY);
3421 #endif
3422 #ifndef OPENSSL_NO_EC
3423     ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings));
3424 #endif
3425 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
3426     ADD_TEST(test_EVP_SM2);
3427     ADD_TEST(test_EVP_SM2_verify);
3428 #endif
3429     ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
3430 #ifndef OPENSSL_NO_DEPRECATED_3_0
3431     custom_pmeth = EVP_PKEY_meth_new(0xdefaced, 0);
3432     if (!TEST_ptr(custom_pmeth))
3433         return 0;
3434     EVP_PKEY_meth_set_check(custom_pmeth, pkey_custom_check);
3435     EVP_PKEY_meth_set_public_check(custom_pmeth, pkey_custom_pub_check);
3436     EVP_PKEY_meth_set_param_check(custom_pmeth, pkey_custom_param_check);
3437     if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
3438         return 0;
3439 #endif
3440     ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
3441 #ifndef OPENSSL_NO_CMAC
3442     ADD_TEST(test_CMAC_keygen);
3443 #endif
3444     ADD_TEST(test_HKDF);
3445     ADD_TEST(test_emptyikm_HKDF);
3446 #ifndef OPENSSL_NO_EC
3447     ADD_TEST(test_X509_PUBKEY_inplace);
3448     ADD_TEST(test_X509_PUBKEY_dup);
3449     ADD_ALL_TESTS(test_invalide_ec_char2_pub_range_decode,
3450                   OSSL_NELEM(ec_der_pub_keys));
3451 #endif
3452 #ifndef OPENSSL_NO_DSA
3453     ADD_TEST(test_DSA_get_set_params);
3454     ADD_TEST(test_DSA_priv_pub);
3455 #endif
3456     ADD_TEST(test_RSA_get_set_params);
3457 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
3458     ADD_TEST(test_decrypt_null_chunks);
3459 #endif
3460 #ifndef OPENSSL_NO_DH
3461     ADD_TEST(test_DH_priv_pub);
3462 # ifndef OPENSSL_NO_DEPRECATED_3_0
3463     ADD_TEST(test_EVP_PKEY_set1_DH);
3464 # endif
3465 #endif
3466 #ifndef OPENSSL_NO_EC
3467     ADD_TEST(test_EC_priv_pub);
3468 # ifndef OPENSSL_NO_DEPRECATED_3_0
3469     ADD_TEST(test_EC_priv_only_legacy);
3470 # endif
3471 #endif
3472     ADD_ALL_TESTS(test_keygen_with_empty_template, 2);
3473     ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
3474
3475     ADD_TEST(test_rand_agglomeration);
3476     ADD_ALL_TESTS(test_evp_iv_aes, 12);
3477 #ifndef OPENSSL_NO_DES
3478     ADD_ALL_TESTS(test_evp_iv_des, 6);
3479 #endif
3480     ADD_TEST(test_EVP_rsa_pss_with_keygen_bits);
3481 #ifndef OPENSSL_NO_EC
3482     ADD_ALL_TESTS(test_ecpub, OSSL_NELEM(ecpub_nids));
3483 #endif
3484
3485     ADD_TEST(test_names_do_all);
3486
3487     ADD_ALL_TESTS(test_evp_init_seq, OSSL_NELEM(evp_init_tests));
3488     ADD_ALL_TESTS(test_evp_reset, OSSL_NELEM(evp_reset_tests));
3489     ADD_ALL_TESTS(test_gcm_reinit, OSSL_NELEM(gcm_reinit_tests));
3490
3491     return 1;
3492 }
3493
3494 void cleanup_tests(void)
3495 {
3496     OSSL_PROVIDER_unload(nullprov);
3497     OSSL_PROVIDER_unload(deflprov);
3498     OSSL_PROVIDER_unload(lgcyprov);
3499     OSSL_LIB_CTX_free(testctx);
3500 }