OSSL_HTTP_parse_url(): Handle any userinfo, query, and fragment components
[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
41 /*
42  * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
43  * should never use this key anywhere but in an example.
44  */
45 static const unsigned char kExampleRSAKeyDER[] = {
46     0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8,
47     0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59,
48     0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37,
49     0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71,
50     0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a,
51     0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4,
52     0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec,
53     0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76,
54     0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8,
55     0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7,
56     0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c,
57     0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01,
58     0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7,
59     0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85,
60     0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee,
61     0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85,
62     0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a,
63     0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15,
64     0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83,
65     0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b,
66     0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73,
67     0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99,
68     0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02,
69     0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41,
70     0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59,
71     0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9,
72     0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef,
73     0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87,
74     0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf,
75     0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5,
76     0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5,
77     0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62,
78     0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64,
79     0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8,
80     0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba,
81     0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe,
82     0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7,
83     0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe,
84     0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb,
85     0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34,
86     0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27,
87     0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0,
88     0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba,
89     0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06,
90     0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c,
91     0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e,
92     0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf,
93     0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a,
94     0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17,
95     0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1,
96     0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
97 };
98
99 /*
100 * kExampleDSAKeyDER is a DSA private key in ASN.1, DER format. Of course, you
101  * should never use this key anywhere but in an example.
102  */
103 #ifndef OPENSSL_NO_DSA
104 static const unsigned char kExampleDSAKeyDER[] = {
105     0x30, 0x82, 0x01, 0xba, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9a,
106     0x05, 0x6d, 0x33, 0xcd, 0x5d, 0x78, 0xa1, 0xbb, 0xcb, 0x7d, 0x5b, 0x8d,
107     0xb4, 0xcc, 0xbf, 0x03, 0x99, 0x64, 0xde, 0x38, 0x78, 0x06, 0x15, 0x2f,
108     0x86, 0x26, 0x77, 0xf3, 0xb1, 0x85, 0x00, 0xed, 0xfc, 0x28, 0x3a, 0x42,
109     0x4d, 0xab, 0xab, 0xdf, 0xbc, 0x9c, 0x16, 0xd0, 0x22, 0x50, 0xd1, 0x38,
110     0xdd, 0x3f, 0x64, 0x05, 0x9e, 0x68, 0x7a, 0x1e, 0xf1, 0x56, 0xbf, 0x1e,
111     0x2c, 0xc5, 0x97, 0x2a, 0xfe, 0x7a, 0x22, 0xdc, 0x6c, 0x68, 0xb8, 0x2e,
112     0x06, 0xdb, 0x41, 0xca, 0x98, 0xd8, 0x54, 0xc7, 0x64, 0x48, 0x24, 0x04,
113     0x20, 0xbc, 0x59, 0xe3, 0x6b, 0xea, 0x7e, 0xfc, 0x7e, 0xc5, 0x4e, 0xd4,
114     0xd8, 0x3a, 0xed, 0xcd, 0x5d, 0x99, 0xb8, 0x5c, 0xa2, 0x8b, 0xbb, 0x0b,
115     0xac, 0xe6, 0x8e, 0x25, 0x56, 0x22, 0x3a, 0x2d, 0x3a, 0x56, 0x41, 0x14,
116     0x1f, 0x1c, 0x8f, 0x53, 0x46, 0x13, 0x85, 0x02, 0x15, 0x00, 0x98, 0x7e,
117     0x92, 0x81, 0x88, 0xc7, 0x3f, 0x70, 0x49, 0x54, 0xf6, 0x76, 0xb4, 0xa3,
118     0x9e, 0x1d, 0x45, 0x98, 0x32, 0x7f, 0x02, 0x81, 0x80, 0x69, 0x4d, 0xef,
119     0x55, 0xff, 0x4d, 0x59, 0x2c, 0x01, 0xfa, 0x6a, 0x38, 0xe0, 0x70, 0x9f,
120     0x9e, 0x66, 0x8e, 0x3e, 0x8c, 0x52, 0x22, 0x9d, 0x15, 0x7e, 0x3c, 0xef,
121     0x4c, 0x7a, 0x61, 0x26, 0xe0, 0x2b, 0x81, 0x3f, 0xeb, 0xaf, 0x35, 0x38,
122     0x8d, 0xfe, 0xed, 0x46, 0xff, 0x5f, 0x03, 0x9b, 0x81, 0x92, 0xe7, 0x6f,
123     0x76, 0x4f, 0x1d, 0xd9, 0xbb, 0x89, 0xc9, 0x3e, 0xd9, 0x0b, 0xf9, 0xf4,
124     0x78, 0x11, 0x59, 0xc0, 0x1d, 0xcd, 0x0e, 0xa1, 0x6f, 0x15, 0xf1, 0x4d,
125     0xc1, 0xc9, 0x22, 0xed, 0x8d, 0xad, 0x67, 0xc5, 0x4b, 0x95, 0x93, 0x86,
126     0xa6, 0xaf, 0x8a, 0xee, 0x06, 0x89, 0x2f, 0x37, 0x7e, 0x64, 0xaa, 0xf6,
127     0xe7, 0xb1, 0x5a, 0x0a, 0x93, 0x95, 0x5d, 0x3e, 0x53, 0x9a, 0xde, 0x8a,
128     0xc2, 0x95, 0x45, 0x81, 0xbe, 0x5c, 0x2f, 0xc2, 0xb2, 0x92, 0x58, 0x19,
129     0x72, 0x80, 0xe9, 0x79, 0xa1, 0x02, 0x81, 0x80, 0x07, 0xd7, 0x62, 0xff,
130     0xdf, 0x1a, 0x3f, 0xed, 0x32, 0xd4, 0xd4, 0x88, 0x7b, 0x2c, 0x63, 0x7f,
131     0x97, 0xdc, 0x44, 0xd4, 0x84, 0xa2, 0xdd, 0x17, 0x16, 0x85, 0x13, 0xe0,
132     0xac, 0x51, 0x8d, 0x29, 0x1b, 0x75, 0x9a, 0xe4, 0xe3, 0x8a, 0x92, 0x69,
133     0x09, 0x03, 0xc5, 0x68, 0xae, 0x5e, 0x94, 0xfe, 0xc9, 0x92, 0x6c, 0x07,
134     0xb4, 0x1e, 0x64, 0x62, 0x87, 0xc6, 0xa4, 0xfd, 0x0d, 0x5f, 0xe5, 0xf9,
135     0x1b, 0x4f, 0x85, 0x5f, 0xae, 0xf3, 0x11, 0xe5, 0x18, 0xd4, 0x4d, 0x79,
136     0x9f, 0xc4, 0x79, 0x26, 0x04, 0x27, 0xf0, 0x0b, 0xee, 0x2b, 0x86, 0x9f,
137     0x86, 0x61, 0xe6, 0x51, 0xce, 0x04, 0x9b, 0x5d, 0x6b, 0x34, 0x43, 0x8c,
138     0x85, 0x3c, 0xf1, 0x51, 0x9b, 0x08, 0x23, 0x1b, 0xf5, 0x7e, 0x33, 0x12,
139     0xea, 0xab, 0x1f, 0xb7, 0x2d, 0xe2, 0x5f, 0xe6, 0x97, 0x99, 0xb5, 0x45,
140     0x16, 0x5b, 0xc3, 0x41, 0x02, 0x14, 0x61, 0xbf, 0x51, 0x60, 0xcf, 0xc8,
141     0xf1, 0x8c, 0x82, 0x97, 0xf2, 0xf4, 0x19, 0xba, 0x2b, 0xf3, 0x16, 0xbe,
142     0x40, 0x48
143 };
144 #endif
145
146 /*
147  * kExampleBadRSAKeyDER is an RSA private key in ASN.1, DER format. The private
148  * components are not correct.
149  */
150 static const unsigned char kExampleBadRSAKeyDER[] = {
151     0x30, 0x82, 0x04, 0x27, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
152     0xa6, 0x1a, 0x1e, 0x6e, 0x7b, 0xee, 0xc6, 0x89, 0x66, 0xe7, 0x93, 0xef,
153     0x54, 0x12, 0x68, 0xea, 0xbf, 0x86, 0x2f, 0xdd, 0xd2, 0x79, 0xb8, 0xa9,
154     0x6e, 0x03, 0xc2, 0xa3, 0xb9, 0xa3, 0xe1, 0x4b, 0x2a, 0xb3, 0xf8, 0xb4,
155     0xcd, 0xea, 0xbe, 0x24, 0xa6, 0x57, 0x5b, 0x83, 0x1f, 0x0f, 0xf2, 0xd3,
156     0xb7, 0xac, 0x7e, 0xd6, 0x8e, 0x6e, 0x1e, 0xbf, 0xb8, 0x73, 0x8c, 0x05,
157     0x56, 0xe6, 0x35, 0x1f, 0xe9, 0x04, 0x0b, 0x09, 0x86, 0x7d, 0xf1, 0x26,
158     0x08, 0x99, 0xad, 0x7b, 0xc8, 0x4d, 0x94, 0xb0, 0x0b, 0x8b, 0x38, 0xa0,
159     0x5c, 0x62, 0xa0, 0xab, 0xd3, 0x8f, 0xd4, 0x09, 0x60, 0x72, 0x1e, 0x33,
160     0x50, 0x80, 0x6e, 0x22, 0xa6, 0x77, 0x57, 0x6b, 0x9a, 0x33, 0x21, 0x66,
161     0x87, 0x6e, 0x21, 0x7b, 0xc7, 0x24, 0x0e, 0xd8, 0x13, 0xdf, 0x83, 0xde,
162     0xcd, 0x40, 0x58, 0x1d, 0x84, 0x86, 0xeb, 0xb8, 0x12, 0x4e, 0xd2, 0xfa,
163     0x80, 0x1f, 0xe4, 0xe7, 0x96, 0x29, 0xb8, 0xcc, 0xce, 0x66, 0x6d, 0x53,
164     0xca, 0xb9, 0x5a, 0xd7, 0xf6, 0x84, 0x6c, 0x2d, 0x9a, 0x1a, 0x14, 0x1c,
165     0x4e, 0x93, 0x39, 0xba, 0x74, 0xed, 0xed, 0x87, 0x87, 0x5e, 0x48, 0x75,
166     0x36, 0xf0, 0xbc, 0x34, 0xfb, 0x29, 0xf9, 0x9f, 0x96, 0x5b, 0x0b, 0xa7,
167     0x54, 0x30, 0x51, 0x29, 0x18, 0x5b, 0x7d, 0xac, 0x0f, 0xd6, 0x5f, 0x7c,
168     0xf8, 0x98, 0x8c, 0xd8, 0x86, 0x62, 0xb3, 0xdc, 0xff, 0x0f, 0xff, 0x7a,
169     0xaf, 0x5c, 0x4c, 0x61, 0x49, 0x2e, 0xc8, 0x95, 0x86, 0xc4, 0x0e, 0x87,
170     0xfc, 0x1d, 0xcf, 0x8b, 0x7c, 0x61, 0xf6, 0xd8, 0xd0, 0x69, 0xf6, 0xcd,
171     0x8a, 0x8c, 0xf6, 0x62, 0xa2, 0x56, 0xa9, 0xe3, 0xd1, 0xcf, 0x4d, 0xa0,
172     0xf6, 0x2d, 0x20, 0x0a, 0x04, 0xb7, 0xa2, 0xf7, 0xb5, 0x99, 0x47, 0x18,
173     0x56, 0x85, 0x87, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
174     0x01, 0x00, 0x99, 0x41, 0x38, 0x1a, 0xd0, 0x96, 0x7a, 0xf0, 0x83, 0xd5,
175     0xdf, 0x94, 0xce, 0x89, 0x3d, 0xec, 0x7a, 0x52, 0x21, 0x10, 0x16, 0x06,
176     0xe0, 0xee, 0xd2, 0xe6, 0xfd, 0x4b, 0x7b, 0x19, 0x4d, 0xe1, 0xc0, 0xc0,
177     0xd5, 0x14, 0x5d, 0x79, 0xdd, 0x7e, 0x8b, 0x4b, 0xc6, 0xcf, 0xb0, 0x75,
178     0x52, 0xa3, 0x2d, 0xb1, 0x26, 0x46, 0x68, 0x9c, 0x0a, 0x1a, 0xf2, 0xe1,
179     0x09, 0xac, 0x53, 0x85, 0x8c, 0x36, 0xa9, 0x14, 0x65, 0xea, 0xa0, 0x00,
180     0xcb, 0xe3, 0x3f, 0xc4, 0x2b, 0x61, 0x2e, 0x6b, 0x06, 0x69, 0x77, 0xfd,
181     0x38, 0x7e, 0x1d, 0x3f, 0x92, 0xe7, 0x77, 0x08, 0x19, 0xa7, 0x9d, 0x29,
182     0x2d, 0xdc, 0x42, 0xc6, 0x7c, 0xd7, 0xd3, 0xa8, 0x01, 0x2c, 0xf2, 0xd5,
183     0x82, 0x57, 0xcb, 0x55, 0x3d, 0xe7, 0xaa, 0xd2, 0x06, 0x30, 0x30, 0x05,
184     0xe6, 0xf2, 0x47, 0x86, 0xba, 0xc6, 0x61, 0x64, 0xeb, 0x4f, 0x2a, 0x5e,
185     0x07, 0x29, 0xe0, 0x96, 0xb2, 0x43, 0xff, 0x5f, 0x1a, 0x54, 0x16, 0xcf,
186     0xb5, 0x56, 0x5c, 0xa0, 0x9b, 0x0c, 0xfd, 0xb3, 0xd2, 0xe3, 0x79, 0x1d,
187     0x21, 0xe2, 0xd6, 0x13, 0xc4, 0x74, 0xa6, 0xf5, 0x8e, 0x8e, 0x81, 0xbb,
188     0xb4, 0xad, 0x8a, 0xf0, 0x93, 0x0a, 0xd8, 0x0a, 0x42, 0x36, 0xbc, 0xe5,
189     0x26, 0x2a, 0x0d, 0x5d, 0x57, 0x13, 0xc5, 0x4e, 0x2f, 0x12, 0x0e, 0xef,
190     0xa7, 0x81, 0x1e, 0xc3, 0xa5, 0xdb, 0xc9, 0x24, 0xeb, 0x1a, 0xa1, 0xf9,
191     0xf6, 0xa1, 0x78, 0x98, 0x93, 0x77, 0x42, 0x45, 0x03, 0xe2, 0xc9, 0xa2,
192     0xfe, 0x2d, 0x77, 0xc8, 0xc6, 0xac, 0x9b, 0x98, 0x89, 0x6d, 0x9a, 0xe7,
193     0x61, 0x63, 0xb7, 0xf2, 0xec, 0xd6, 0xb1, 0xa1, 0x6e, 0x0a, 0x1a, 0xff,
194     0xfd, 0x43, 0x28, 0xc3, 0x0c, 0xdc, 0xf2, 0x47, 0x4f, 0x27, 0xaa, 0x99,
195     0x04, 0x8e, 0xac, 0xe8, 0x7c, 0x01, 0x02, 0x04, 0x12, 0x34, 0x56, 0x78,
196     0x02, 0x81, 0x81, 0x00, 0xca, 0x69, 0xe5, 0xbb, 0x3a, 0x90, 0x82, 0xcb,
197     0x82, 0x50, 0x2f, 0x29, 0xe2, 0x76, 0x6a, 0x57, 0x55, 0x45, 0x4e, 0x35,
198     0x18, 0x61, 0xe0, 0x12, 0x70, 0xc0, 0xab, 0xc7, 0x80, 0xa2, 0xd4, 0x46,
199     0x34, 0x03, 0xa0, 0x19, 0x26, 0x23, 0x9e, 0xef, 0x1a, 0xcb, 0x75, 0xd6,
200     0xba, 0x81, 0xf4, 0x7e, 0x52, 0xe5, 0x2a, 0xe8, 0xf1, 0x49, 0x6c, 0x0f,
201     0x1a, 0xa0, 0xf9, 0xc6, 0xe7, 0xec, 0x60, 0xe4, 0xcb, 0x2a, 0xb5, 0x56,
202     0xe9, 0x9c, 0xcd, 0x19, 0x75, 0x92, 0xb1, 0x66, 0xce, 0xc3, 0xd9, 0x3d,
203     0x11, 0xcb, 0xc4, 0x09, 0xce, 0x1e, 0x30, 0xba, 0x2f, 0x60, 0x60, 0x55,
204     0x8d, 0x02, 0xdc, 0x5d, 0xaf, 0xf7, 0x52, 0x31, 0x17, 0x07, 0x53, 0x20,
205     0x33, 0xad, 0x8c, 0xd5, 0x2f, 0x5a, 0xd0, 0x57, 0xd7, 0xd1, 0x80, 0xd6,
206     0x3a, 0x9b, 0x04, 0x4f, 0x35, 0xbf, 0xe7, 0xd5, 0xbc, 0x8f, 0xd4, 0x81,
207     0x02, 0x81, 0x81, 0x00, 0xc0, 0x9f, 0xf8, 0xcd, 0xf7, 0x3f, 0x26, 0x8a,
208     0x3d, 0x4d, 0x2b, 0x0c, 0x01, 0xd0, 0xa2, 0xb4, 0x18, 0xfe, 0xf7, 0x5e,
209     0x2f, 0x06, 0x13, 0xcd, 0x63, 0xaa, 0x12, 0xa9, 0x24, 0x86, 0xe3, 0xf3,
210     0x7b, 0xda, 0x1a, 0x3c, 0xb1, 0x38, 0x80, 0x80, 0xef, 0x64, 0x64, 0xa1,
211     0x9b, 0xfe, 0x76, 0x63, 0x8e, 0x83, 0xd2, 0xd9, 0xb9, 0x86, 0xb0, 0xe6,
212     0xa6, 0x0c, 0x7e, 0xa8, 0x84, 0x90, 0x98, 0x0c, 0x1e, 0xf3, 0x14, 0x77,
213     0xe0, 0x5f, 0x81, 0x08, 0x11, 0x8f, 0xa6, 0x23, 0xc4, 0xba, 0xc0, 0x8a,
214     0xe4, 0xc6, 0xe3, 0x5c, 0xbe, 0xc5, 0xec, 0x2c, 0xb9, 0xd8, 0x8c, 0x4d,
215     0x1a, 0x9d, 0xe7, 0x7c, 0x85, 0x4c, 0x0d, 0x71, 0x4e, 0x72, 0x33, 0x1b,
216     0xfe, 0xa9, 0x17, 0x72, 0x76, 0x56, 0x9d, 0x74, 0x7e, 0x52, 0x67, 0x9a,
217     0x87, 0x9a, 0xdb, 0x30, 0xde, 0xe4, 0x49, 0x28, 0x3b, 0xd2, 0x67, 0xaf,
218     0x02, 0x81, 0x81, 0x00, 0x89, 0x74, 0x9a, 0x8e, 0xa7, 0xb9, 0xa5, 0x28,
219     0xc0, 0x68, 0xe5, 0x6e, 0x63, 0x1c, 0x99, 0x20, 0x8f, 0x86, 0x8e, 0x12,
220     0x9e, 0x69, 0x30, 0xfa, 0x34, 0xd9, 0x92, 0x8d, 0xdb, 0x7c, 0x37, 0xfd,
221     0x28, 0xab, 0x61, 0x98, 0x52, 0x7f, 0x14, 0x1a, 0x39, 0xae, 0xfb, 0x6a,
222     0x03, 0xa3, 0xe6, 0xbd, 0xb6, 0x5b, 0x6b, 0xe5, 0x5e, 0x9d, 0xc6, 0xa5,
223     0x07, 0x27, 0x54, 0x17, 0xd0, 0x3d, 0x84, 0x9b, 0x3a, 0xa0, 0xd9, 0x1e,
224     0x99, 0x6c, 0x63, 0x17, 0xab, 0xf1, 0x1f, 0x49, 0xba, 0x95, 0xe3, 0x3b,
225     0x86, 0x8f, 0x42, 0xa4, 0x89, 0xf5, 0x94, 0x8f, 0x8b, 0x46, 0xbe, 0x84,
226     0xba, 0x4a, 0xbc, 0x0d, 0x5f, 0x46, 0xeb, 0xe8, 0xec, 0x43, 0x8c, 0x1e,
227     0xad, 0x19, 0x69, 0x2f, 0x08, 0x86, 0x7a, 0x3f, 0x7d, 0x0f, 0x07, 0x97,
228     0xf3, 0x9a, 0x7b, 0xb5, 0xb2, 0xc1, 0x8c, 0x95, 0x68, 0x04, 0xa0, 0x81,
229     0x02, 0x81, 0x80, 0x4e, 0xbf, 0x7e, 0x1b, 0xcb, 0x13, 0x61, 0x75, 0x3b,
230     0xdb, 0x59, 0x5f, 0xb1, 0xd4, 0xb8, 0xeb, 0x9e, 0x73, 0xb5, 0xe7, 0xf6,
231     0x89, 0x3d, 0x1c, 0xda, 0xf0, 0x36, 0xff, 0x35, 0xbd, 0x1e, 0x0b, 0x74,
232     0xe3, 0x9e, 0xf0, 0xf2, 0xf7, 0xd7, 0x82, 0xb7, 0x7b, 0x6a, 0x1b, 0x0e,
233     0x30, 0x4a, 0x98, 0x0e, 0xb4, 0xf9, 0x81, 0x07, 0xe4, 0x75, 0x39, 0xe9,
234     0x53, 0xca, 0xbb, 0x5c, 0xaa, 0x93, 0x07, 0x0e, 0xa8, 0x2f, 0xba, 0x98,
235     0x49, 0x30, 0xa7, 0xcc, 0x1a, 0x3c, 0x68, 0x0c, 0xe1, 0xa4, 0xb1, 0x05,
236     0xe6, 0xe0, 0x25, 0x78, 0x58, 0x14, 0x37, 0xf5, 0x1f, 0xe3, 0x22, 0xef,
237     0xa8, 0x0e, 0x22, 0xa0, 0x94, 0x3a, 0xf6, 0xc9, 0x13, 0xe6, 0x06, 0xbf,
238     0x7f, 0x99, 0xc6, 0xcc, 0xd8, 0xc6, 0xbe, 0xd9, 0x2e, 0x24, 0xc7, 0x69,
239     0x8c, 0x95, 0xba, 0xf6, 0x04, 0xb3, 0x0a, 0xf4, 0xcb, 0xf0, 0xce,
240 };
241
242 static const unsigned char kMsg[] = { 1, 2, 3, 4 };
243
244 static const unsigned char kSignature[] = {
245     0xa5, 0xf0, 0x8a, 0x47, 0x5d, 0x3c, 0xb3, 0xcc, 0xa9, 0x79, 0xaf, 0x4d,
246     0x8c, 0xae, 0x4c, 0x14, 0xef, 0xc2, 0x0b, 0x34, 0x36, 0xde, 0xf4, 0x3e,
247     0x3d, 0xbb, 0x4a, 0x60, 0x5c, 0xc8, 0x91, 0x28, 0xda, 0xfb, 0x7e, 0x04,
248     0x96, 0x7e, 0x63, 0x13, 0x90, 0xce, 0xb9, 0xb4, 0x62, 0x7a, 0xfd, 0x09,
249     0x3d, 0xc7, 0x67, 0x78, 0x54, 0x04, 0xeb, 0x52, 0x62, 0x6e, 0x24, 0x67,
250     0xb4, 0x40, 0xfc, 0x57, 0x62, 0xc6, 0xf1, 0x67, 0xc1, 0x97, 0x8f, 0x6a,
251     0xa8, 0xae, 0x44, 0x46, 0x5e, 0xab, 0x67, 0x17, 0x53, 0x19, 0x3a, 0xda,
252     0x5a, 0xc8, 0x16, 0x3e, 0x86, 0xd5, 0xc5, 0x71, 0x2f, 0xfc, 0x23, 0x48,
253     0xd9, 0x0b, 0x13, 0xdd, 0x7b, 0x5a, 0x25, 0x79, 0xef, 0xa5, 0x7b, 0x04,
254     0xed, 0x44, 0xf6, 0x18, 0x55, 0xe4, 0x0a, 0xe9, 0x57, 0x79, 0x5d, 0xd7,
255     0x55, 0xa7, 0xab, 0x45, 0x02, 0x97, 0x60, 0x42,
256 };
257
258 /*
259  * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8
260  * PrivateKeyInfo.
261  */
262 static const unsigned char kExampleRSAKeyPKCS8[] = {
263     0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
264     0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
265     0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
266     0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5,
267     0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e,
268     0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34,
269     0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde,
270     0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8,
271     0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b,
272     0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83,
273     0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48,
274     0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a,
275     0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2,
276     0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01,
277     0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a,
278     0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5,
279     0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6,
280     0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8,
281     0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6,
282     0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f,
283     0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c,
284     0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78,
285     0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71,
286     0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60,
287     0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d,
288     0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3,
289     0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d,
290     0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18,
291     0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d,
292     0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32,
293     0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc,
294     0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63,
295     0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05,
296     0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16,
297     0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3,
298     0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85,
299     0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97,
300     0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7,
301     0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99,
302     0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4,
303     0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d,
304     0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40,
305     0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26,
306     0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1,
307     0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c,
308     0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30,
309     0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea,
310     0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b,
311     0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e,
312     0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9,
313     0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae,
314     0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d,
315     0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
316 };
317
318 #ifndef OPENSSL_NO_EC
319 /*
320  * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
321  * structure.
322  */
323 static const unsigned char kExampleECKeyDER[] = {
324     0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a,
325     0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08,
326     0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a,
327     0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
328     0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69,
329     0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c,
330     0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9,
331     0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18,
332     0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16,
333     0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22,
334     0xc1,
335 };
336
337 /*
338  * kExampleBadECKeyDER is a sample EC private key encoded as an ECPrivateKey
339  * structure. The private key is equal to the order and will fail to import
340  */
341 static const unsigned char kExampleBadECKeyDER[] = {
342     0x30, 0x66, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48,
343     0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03,
344     0x01, 0x07, 0x04, 0x4C, 0x30, 0x4A, 0x02, 0x01, 0x01, 0x04, 0x20, 0xFF,
345     0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
346     0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, 0xF3,
347     0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51, 0xA1, 0x23, 0x03, 0x21, 0x00,
348     0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
349     0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
350     0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
351 };
352
353 /* prime256v1 */
354 static const unsigned char kExampleECPubKeyDER[] = {
355     0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
356     0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
357     0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
358     0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
359     0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
360     0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
361     0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
362     0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
363 };
364
365 /*
366  * kExampleBadECPubKeyDER is a sample EC public key with a wrong OID
367  * 1.2.840.10045.2.2 instead of 1.2.840.10045.2.1 - EC Public Key
368  */
369 static const unsigned char kExampleBadECPubKeyDER[] = {
370     0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
371     0x02, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
372     0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
373     0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
374     0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
375     0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
376     0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
377     0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
378 };
379
380 static const unsigned char pExampleECParamDER[] = {
381     0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
382 };
383 #endif
384
385 typedef struct APK_DATA_st {
386     const unsigned char *kder;
387     size_t size;
388     const char *keytype;
389     int evptype;
390     int check;
391     int pub_check;
392     int param_check;
393     int type; /* 0 for private, 1 for public, 2 for params */
394 } APK_DATA;
395
396 static APK_DATA keydata[] = {
397     {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA},
398     {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), "RSA", EVP_PKEY_RSA},
399 #ifndef OPENSSL_NO_EC
400     {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC}
401 #endif
402 };
403
404 static APK_DATA keycheckdata[] = {
405     {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA, 1, 1, 1, 0},
406     {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), "RSA", EVP_PKEY_RSA,
407      0, 1, 1, 0},
408 #ifndef OPENSSL_NO_EC
409     {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC, 1, 1, 1, 0},
410     /* group is also associated in our pub key */
411     {kExampleECPubKeyDER, sizeof(kExampleECPubKeyDER), "EC", EVP_PKEY_EC, 0, 1, 1, 1},
412     {pExampleECParamDER, sizeof(pExampleECParamDER), "EC", EVP_PKEY_EC, 0, 0, 1, 2}
413 #endif
414 };
415
416 static EVP_PKEY *load_example_key(const char *keytype,
417                                   const unsigned char *data, size_t data_len)
418 {
419     const unsigned char **pdata = &data;
420     EVP_PKEY *pkey = NULL;
421     OSSL_DECODER_CTX *dctx =
422         OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", NULL, keytype, 0,
423                                       testctx, NULL);
424
425     /* |pkey| will be NULL on error */
426     (void)OSSL_DECODER_from_data(dctx, pdata, &data_len);
427     OSSL_DECODER_CTX_free(dctx);
428     return pkey;
429 }
430
431 static EVP_PKEY *load_example_rsa_key(void)
432 {
433     return load_example_key("RSA", kExampleRSAKeyDER,
434                             sizeof(kExampleRSAKeyDER));
435 }
436
437 #ifndef OPENSSL_NO_DSA
438 static EVP_PKEY *load_example_dsa_key(void)
439 {
440     return load_example_key("DSA", kExampleDSAKeyDER,
441                             sizeof(kExampleDSAKeyDER));
442 }
443 #endif
444
445 static EVP_PKEY *load_example_hmac_key(void)
446 {
447     EVP_PKEY *pkey = NULL;
448     unsigned char key[] = {
449         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
450         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
451         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
452     };
453
454     pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, key, sizeof(key));
455     if (!TEST_ptr(pkey))
456         return NULL;
457
458     return pkey;
459 }
460
461 static int test_EVP_set_default_properties(void)
462 {
463     OSSL_LIB_CTX *ctx;
464     EVP_MD *md = NULL;
465     int res = 0;
466
467     if (!TEST_ptr(ctx = OSSL_LIB_CTX_new())
468             || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
469         goto err;
470     EVP_MD_free(md);
471     md = NULL;
472
473     if (!TEST_true(EVP_set_default_properties(ctx, "provider=fizzbang"))
474             || !TEST_ptr_null(md = EVP_MD_fetch(ctx, "sha256", NULL))
475             || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", "-provider")))
476         goto err;
477     EVP_MD_free(md);
478     md = NULL;
479
480     if (!TEST_true(EVP_set_default_properties(ctx, NULL))
481             || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
482         goto err;
483     res = 1;
484 err:
485     EVP_MD_free(md);
486     OSSL_LIB_CTX_free(ctx);
487     return res;
488 }
489
490 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
491 static int test_fromdata(char *keytype, OSSL_PARAM *params)
492 {
493     EVP_PKEY_CTX *pctx = NULL;
494     EVP_PKEY *pkey = NULL;
495     int testresult = 0;
496
497     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, keytype, NULL)))
498         goto err;
499     if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
500         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
501                                           params), 0))
502         goto err;
503
504     if (!TEST_ptr(pkey))
505         goto err;
506
507     testresult = 1;
508  err:
509     EVP_PKEY_free(pkey);
510     EVP_PKEY_CTX_free(pctx);
511
512     return testresult;
513 }
514 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA || !OPENSSL_NO_EC */
515
516 /*
517  * Test combinations of private, public, missing and private + public key
518  * params to ensure they are all accepted
519  */
520 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA)
521 static int test_EVP_PKEY_ffc_priv_pub(char *keytype)
522 {
523     OSSL_PARAM_BLD *bld = NULL;
524     OSSL_PARAM *params = NULL;
525     BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
526     int ret = 0;
527
528     /*
529      * Setup the parameters for our pkey object. For our purposes they don't
530      * have to actually be *valid* parameters. We just need to set something.
531      */
532     if (!TEST_ptr(p = BN_new())
533         || !TEST_ptr(q = BN_new())
534         || !TEST_ptr(g = BN_new())
535         || !TEST_ptr(pub = BN_new())
536         || !TEST_ptr(priv = BN_new()))
537         goto err;
538
539     /* Test !priv and !pub */
540     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
541         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
542         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
543         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)))
544         goto err;
545     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
546         goto err;
547
548     if (!test_fromdata(keytype, params))
549         goto err;
550     OSSL_PARAM_BLD_free_params(params);
551     OSSL_PARAM_BLD_free(bld);
552
553     /* Test priv and !pub */
554     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
555         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
556         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
557         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
558         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
559                                              priv)))
560         goto err;
561     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
562         goto err;
563
564     if (!test_fromdata(keytype, params))
565         goto err;
566     OSSL_PARAM_BLD_free_params(params);
567     OSSL_PARAM_BLD_free(bld);
568
569     /* Test !priv and pub */
570     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
571         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
572         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
573         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
574         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
575                                              pub)))
576         goto err;
577     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
578         goto err;
579
580     if (!test_fromdata(keytype, params))
581         goto err;
582     OSSL_PARAM_BLD_free_params(params);
583     OSSL_PARAM_BLD_free(bld);
584
585     /* Test priv and pub */
586     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
587         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
588         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
589         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
590         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
591                                              pub))
592         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
593                                              priv)))
594         goto err;
595     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
596         goto err;
597
598     if (!test_fromdata(keytype, params))
599         goto err;
600
601     ret = 1;
602  err:
603     OSSL_PARAM_BLD_free_params(params);
604     OSSL_PARAM_BLD_free(bld);
605     BN_free(p);
606     BN_free(q);
607     BN_free(g);
608     BN_free(pub);
609     BN_free(priv);
610
611     return ret;
612 }
613 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA */
614
615 /*
616  * Test combinations of private, public, missing and private + public key
617  * params to ensure they are all accepted for EC keys
618  */
619 #ifndef OPENSSL_NO_EC
620 static unsigned char ec_priv[] = {
621     0xe9, 0x25, 0xf7, 0x66, 0x58, 0xa4, 0xdd, 0x99, 0x61, 0xe7, 0xe8, 0x23,
622     0x85, 0xc2, 0xe8, 0x33, 0x27, 0xc5, 0x5c, 0xeb, 0xdb, 0x43, 0x9f, 0xd5,
623     0xf2, 0x5a, 0x75, 0x55, 0xd0, 0x2e, 0x6d, 0x16
624 };
625 static unsigned char ec_pub[] = {
626     0x04, 0xad, 0x11, 0x90, 0x77, 0x4b, 0x46, 0xee, 0x72, 0x51, 0x15, 0x97,
627     0x4a, 0x6a, 0xa7, 0xaf, 0x59, 0xfa, 0x4b, 0xf2, 0x41, 0xc8, 0x3a, 0x81,
628     0x23, 0xb6, 0x90, 0x04, 0x6c, 0x67, 0x66, 0xd0, 0xdc, 0xf2, 0x15, 0x1d,
629     0x41, 0x61, 0xb7, 0x95, 0x85, 0x38, 0x5a, 0x84, 0x56, 0xe8, 0xb3, 0x0e,
630     0xf5, 0xc6, 0x5d, 0xa4, 0x54, 0x26, 0xb0, 0xf7, 0xa5, 0x4a, 0x33, 0xf1,
631     0x08, 0x09, 0xb8, 0xdb, 0x03
632 };
633
634 static int test_EC_priv_pub(void)
635 {
636     OSSL_PARAM_BLD *bld = NULL;
637     OSSL_PARAM *params = NULL;
638     BIGNUM *priv = NULL;
639     int ret = 0;
640
641     /*
642      * Setup the parameters for our pkey object. For our purposes they don't
643      * have to actually be *valid* parameters. We just need to set something.
644      */
645     if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
646         goto err;
647
648     /* Test !priv and !pub */
649     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
650         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
651                                                       OSSL_PKEY_PARAM_GROUP_NAME,
652                                                       "P-256", 0)))
653         goto err;
654     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
655         goto err;
656
657     if (!test_fromdata("EC", params))
658         goto err;
659     OSSL_PARAM_BLD_free_params(params);
660     OSSL_PARAM_BLD_free(bld);
661
662     /* Test priv and !pub */
663     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
664         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
665                                                       OSSL_PKEY_PARAM_GROUP_NAME,
666                                                       "P-256", 0))
667         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
668                                              priv)))
669         goto err;
670     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
671         goto err;
672
673     if (!test_fromdata("EC", params))
674         goto err;
675     OSSL_PARAM_BLD_free_params(params);
676     OSSL_PARAM_BLD_free(bld);
677
678     /* Test !priv and pub */
679     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
680         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
681                                                       OSSL_PKEY_PARAM_GROUP_NAME,
682                                                       "P-256", 0))
683         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
684                                                        OSSL_PKEY_PARAM_PUB_KEY,
685                                                        ec_pub, sizeof(ec_pub))))
686         goto err;
687     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
688         goto err;
689
690     if (!test_fromdata("EC", params))
691         goto err;
692     OSSL_PARAM_BLD_free_params(params);
693     OSSL_PARAM_BLD_free(bld);
694
695     /* Test priv and pub */
696     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
697         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
698                                                       OSSL_PKEY_PARAM_GROUP_NAME,
699                                                       "P-256", 0))
700         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
701                                                        OSSL_PKEY_PARAM_PUB_KEY,
702                                                        ec_pub, sizeof(ec_pub)))
703         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
704                                                        OSSL_PKEY_PARAM_PUB_KEY,
705                                                        ec_pub, sizeof(ec_pub))))
706         goto err;
707     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
708         goto err;
709
710     if (!test_fromdata("EC", params))
711         goto err;
712
713     ret = 1;
714  err:
715     OSSL_PARAM_BLD_free_params(params);
716     OSSL_PARAM_BLD_free(bld);
717     BN_free(priv);
718
719     return ret;
720 }
721
722 /* Test that using a legacy EC key with only a private key in it works */
723 # ifndef OPENSSL_NO_DEPRECATED_3_0
724 static int test_EC_priv_only_legacy(void)
725 {
726     BIGNUM *priv = NULL;
727     int ret = 0;
728     EC_KEY *eckey = NULL;
729     EVP_PKEY *pkey = NULL;
730     EVP_MD_CTX *ctx = NULL;
731
732     /* Create the low level EC_KEY */
733     if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
734         goto err;
735
736     eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
737     if (!TEST_ptr(eckey))
738         goto err;
739
740     if (!TEST_true(EC_KEY_set_private_key(eckey, priv)))
741         goto err;
742
743     pkey = EVP_PKEY_new();
744     if (!TEST_ptr(pkey))
745         goto err;
746
747     if (!TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
748         goto err;
749     eckey = NULL;
750
751     ctx = EVP_MD_CTX_new();
752     if (!TEST_ptr(ctx))
753         goto err;
754
755     /*
756      * The EVP_DigestSignInit function should create the key on the provider
757      * side which is sufficient for this test.
758      */
759     if (!TEST_true(EVP_DigestSignInit(ctx, NULL, NULL, NULL, pkey)))
760         goto err;
761
762     ret = 1;
763
764  err:
765     EVP_MD_CTX_free(ctx);
766     EVP_PKEY_free(pkey);
767     EC_KEY_free(eckey);
768     BN_free(priv);
769
770     return ret;
771 }
772 # endif /* OPENSSL_NO_DEPRECATED_3_0 */
773 #endif /* OPENSSL_NO_EC */
774
775 static int test_EVP_Enveloped(void)
776 {
777     int ret = 0;
778     EVP_CIPHER_CTX *ctx = NULL;
779     EVP_PKEY *keypair = NULL;
780     unsigned char *kek = NULL;
781     unsigned char iv[EVP_MAX_IV_LENGTH];
782     static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
783     int len, kek_len, ciphertext_len, plaintext_len;
784     unsigned char ciphertext[32], plaintext[16];
785     const EVP_CIPHER *type = EVP_aes_256_cbc();
786
787     if (!TEST_ptr(keypair = load_example_rsa_key())
788             || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_size(keypair)))
789             || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
790             || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
791                                        &keypair, 1))
792             || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
793                                          msg, sizeof(msg)))
794             || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
795                                         &len)))
796         goto err;
797
798     ciphertext_len += len;
799
800     if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
801             || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
802                                          ciphertext, ciphertext_len))
803             || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
804         goto err;
805
806     plaintext_len += len;
807     if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
808         goto err;
809
810     ret = 1;
811 err:
812     OPENSSL_free(kek);
813     EVP_PKEY_free(keypair);
814     EVP_CIPHER_CTX_free(ctx);
815     return ret;
816 }
817
818 /*
819  * Test 0: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, RSA)
820  * Test 1: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, DSA)
821  * Test 2: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, HMAC)
822  * Test 3: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, RSA)
823  * Test 4: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, DSA)
824  * Test 5: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch diegst, HMAC)
825  * Test 6: Use an MD BIO to do the Update calls instead (RSA)
826  * Test 7: Use an MD BIO to do the Update calls instead (DSA)
827  * Test 8: Use an MD BIO to do the Update calls instead (HMAC)
828  */
829 static int test_EVP_DigestSignInit(int tst)
830 {
831     int ret = 0;
832     EVP_PKEY *pkey = NULL;
833     unsigned char *sig = NULL;
834     size_t sig_len = 0;
835     EVP_MD_CTX *md_ctx = NULL, *md_ctx_verify = NULL;
836     EVP_MD_CTX *a_md_ctx = NULL, *a_md_ctx_verify = NULL;
837     BIO *mdbio = NULL, *membio = NULL;
838     size_t written;
839     const EVP_MD *md;
840     EVP_MD *mdexp = NULL;
841
842     if (tst >= 6) {
843         membio = BIO_new(BIO_s_mem());
844         mdbio = BIO_new(BIO_f_md());
845         if (!TEST_ptr(membio) || !TEST_ptr(mdbio))
846             goto out;
847         BIO_push(mdbio, membio);
848         if (!TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx), 0))
849             goto out;
850     } else {
851         if (!TEST_ptr(a_md_ctx = md_ctx = EVP_MD_CTX_new())
852                 || !TEST_ptr(a_md_ctx_verify = md_ctx_verify = EVP_MD_CTX_new()))
853             goto out;
854     }
855
856     if (tst == 0 || tst == 3 || tst == 6) {
857         if (!TEST_ptr(pkey = load_example_rsa_key()))
858                 goto out;
859     } else if (tst == 1 || tst == 4 || tst == 7) {
860 #ifndef OPENSSL_NO_DSA
861         if (!TEST_ptr(pkey = load_example_dsa_key()))
862                 goto out;
863 #else
864         ret = 1;
865         goto out;
866 #endif
867     } else {
868         if (!TEST_ptr(pkey = load_example_hmac_key()))
869                 goto out;
870     }
871
872     if (tst >= 3 && tst <= 5)
873         md = mdexp = EVP_MD_fetch(NULL, "SHA256", NULL);
874     else
875         md = EVP_sha256();
876
877     if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, md, NULL, pkey)))
878         goto out;
879
880     if (tst >= 6) {
881         if (!BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written))
882             goto out;
883     } else {
884         if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
885             goto out;
886     }
887
888     /* Determine the size of the signature. */
889     if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
890             || !TEST_ptr(sig = OPENSSL_malloc(sig_len))
891             || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
892         goto out;
893
894     if (tst >= 6) {
895         if (!TEST_int_gt(BIO_reset(mdbio), 0)
896                 || !TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx_verify), 0))
897             goto out;
898     }
899
900     /*
901      * Ensure that the signature round-trips (Verification isn't supported for
902      * HMAC via EVP_DigestVerify*)
903      */
904     if (tst != 2 && tst != 5 && tst != 8) {
905         if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, md,
906                                             NULL, pkey)))
907             goto out;
908
909         if (tst >= 6) {
910             if (!TEST_true(BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written)))
911                 goto out;
912         } else {
913             if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg,
914                                                   sizeof(kMsg))))
915                 goto out;
916         }
917         if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
918             goto out;
919     }
920
921     ret = 1;
922
923  out:
924     BIO_free(membio);
925     BIO_free(mdbio);
926     EVP_MD_CTX_free(a_md_ctx);
927     EVP_MD_CTX_free(a_md_ctx_verify);
928     EVP_PKEY_free(pkey);
929     OPENSSL_free(sig);
930     EVP_MD_free(mdexp);
931
932     return ret;
933 }
934
935 static int test_EVP_DigestVerifyInit(void)
936 {
937     int ret = 0;
938     EVP_PKEY *pkey = NULL;
939     EVP_MD_CTX *md_ctx = NULL;
940
941     if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
942             || !TEST_ptr(pkey = load_example_rsa_key()))
943         goto out;
944
945     if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
946             || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
947             || !TEST_true(EVP_DigestVerifyFinal(md_ctx, kSignature,
948                                                  sizeof(kSignature))))
949         goto out;
950     ret = 1;
951
952  out:
953     EVP_MD_CTX_free(md_ctx);
954     EVP_PKEY_free(pkey);
955     return ret;
956 }
957
958 /*
959  * Test corner cases of EVP_DigestInit/Update/Final API call behavior.
960  */
961 static int test_EVP_Digest(void)
962 {
963     int ret = 0;
964     EVP_MD_CTX *md_ctx = NULL;
965     unsigned char md[EVP_MAX_MD_SIZE];
966
967     if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
968         goto out;
969
970     if (!TEST_true(EVP_DigestInit_ex(md_ctx, EVP_sha256(), NULL))
971             || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
972             || !TEST_true(EVP_DigestFinal(md_ctx, md, NULL))
973             /* EVP_DigestFinal resets the EVP_MD_CTX. */
974             || !TEST_ptr_eq(EVP_MD_CTX_md(md_ctx), NULL))
975         goto out;
976
977     if (!TEST_true(EVP_DigestInit_ex(md_ctx, EVP_sha256(), NULL))
978             || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
979             || !TEST_true(EVP_DigestFinal_ex(md_ctx, md, NULL))
980             /* EVP_DigestFinal_ex does not reset the EVP_MD_CTX. */
981             || !TEST_ptr(EVP_MD_CTX_md(md_ctx))
982             /*
983              * EVP_DigestInit_ex with NULL type should work on
984              * pre-initialized context.
985              */
986             || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
987         goto out;
988
989     if (!TEST_true(EVP_DigestInit_ex(md_ctx, EVP_shake256(), NULL))
990             || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
991             || !TEST_true(EVP_DigestFinalXOF(md_ctx, md, sizeof(md)))
992             /* EVP_DigestFinalXOF does not reset the EVP_MD_CTX. */
993             || !TEST_ptr(EVP_MD_CTX_md(md_ctx))
994             || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
995         goto out;
996     ret = 1;
997
998  out:
999     EVP_MD_CTX_free(md_ctx);
1000     return ret;
1001 }
1002
1003 static int test_d2i_AutoPrivateKey(int i)
1004 {
1005     int ret = 0;
1006     const unsigned char *p;
1007     EVP_PKEY *pkey = NULL;
1008     const APK_DATA *ak = &keydata[i];
1009     const unsigned char *input = ak->kder;
1010     size_t input_len = ak->size;
1011     int expected_id = ak->evptype;
1012
1013     p = input;
1014     if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
1015             || !TEST_ptr_eq(p, input + input_len)
1016             || !TEST_int_eq(EVP_PKEY_id(pkey), expected_id))
1017         goto done;
1018
1019     ret = 1;
1020
1021  done:
1022     EVP_PKEY_free(pkey);
1023     return ret;
1024 }
1025
1026 #ifndef OPENSSL_NO_EC
1027
1028 static const unsigned char ec_public_sect163k1_validxy[] = {
1029     0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1030     0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1031     0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1032     0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x02, 0xd1, 0x7b,
1033     0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1034     0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1035 };
1036
1037 static const unsigned char ec_public_sect163k1_badx[] = {
1038     0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1039     0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1040     0x0a, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1041     0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0xb0, 0x02, 0xd1, 0x7b,
1042     0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1043     0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1044 };
1045
1046 static const unsigned char ec_public_sect163k1_bady[] = {
1047     0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1048     0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1049     0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1050     0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x0a, 0xd1, 0x7b,
1051     0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1052     0x6a, 0xd8, 0x17, 0x65, 0x41, 0xe6
1053 };
1054
1055 static struct ec_der_pub_keys_st {
1056     const unsigned char *der;
1057     size_t len;
1058     int valid;
1059 } ec_der_pub_keys[] = {
1060     { ec_public_sect163k1_validxy, sizeof(ec_public_sect163k1_validxy), 1 },
1061     { ec_public_sect163k1_badx, sizeof(ec_public_sect163k1_badx), 0 },
1062     { ec_public_sect163k1_bady, sizeof(ec_public_sect163k1_bady), 0 },
1063 };
1064
1065 /*
1066  * Tests the range of the decoded EC char2 public point.
1067  * See ec_GF2m_simple_oct2point().
1068  */
1069 static int test_invalide_ec_char2_pub_range_decode(int id)
1070 {
1071     int ret = 0;
1072     EVP_PKEY *pkey;
1073
1074     pkey = load_example_key("EC", ec_der_pub_keys[id].der,
1075                             ec_der_pub_keys[id].len);
1076
1077     ret = (ec_der_pub_keys[id].valid && TEST_ptr(pkey))
1078           || TEST_ptr_null(pkey);
1079     EVP_PKEY_free(pkey);
1080     return ret;
1081 }
1082
1083 /* Tests loading a bad key in PKCS8 format */
1084 static int test_EVP_PKCS82PKEY(void)
1085 {
1086     int ret = 0;
1087     const unsigned char *derp = kExampleBadECKeyDER;
1088     PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1089     EVP_PKEY *pkey = NULL;
1090
1091     if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
1092                                               sizeof(kExampleBadECKeyDER))))
1093         goto done;
1094
1095     if (!TEST_ptr_eq(derp,
1096                      kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
1097         goto done;
1098
1099     if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
1100         goto done;
1101
1102     ret = 1;
1103
1104  done:
1105     PKCS8_PRIV_KEY_INFO_free(p8inf);
1106     EVP_PKEY_free(pkey);
1107
1108     return ret;
1109 }
1110 #endif
1111
1112 /* This uses kExampleRSAKeyDER and kExampleRSAKeyPKCS8 to verify encoding */
1113 static int test_privatekey_to_pkcs8(void)
1114 {
1115     EVP_PKEY *pkey = NULL;
1116     BIO *membio = NULL;
1117     char *membuf = NULL;
1118     long membuf_len = 0;
1119     int ok = 0;
1120
1121     if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1122         || !TEST_ptr(pkey = load_example_rsa_key())
1123         || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1124                                                 NULL, 0, NULL, NULL),
1125                         0)
1126         || !TEST_int_gt(membuf_len = BIO_get_mem_data(membio, &membuf), 0)
1127         || !TEST_ptr(membuf)
1128         || !TEST_mem_eq(membuf, (size_t)membuf_len,
1129                         kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8))
1130         /*
1131          * We try to write PEM as well, just to see that it doesn't err, but
1132          * assume that the result is correct.
1133          */
1134         || !TEST_int_gt(PEM_write_bio_PKCS8PrivateKey(membio, pkey, NULL,
1135                                                       NULL, 0, NULL, NULL),
1136                         0))
1137         goto done;
1138
1139     ok = 1;
1140  done:
1141     EVP_PKEY_free(pkey);
1142     BIO_free_all(membio);
1143     return ok;
1144 }
1145
1146 #ifndef OPENSSL_NO_EC
1147 static const struct {
1148     int encoding;
1149     const char *encoding_name;
1150 } ec_encodings[] = {
1151     { OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT },
1152     { OPENSSL_EC_NAMED_CURVE,    OSSL_PKEY_EC_ENCODING_GROUP }
1153 };
1154
1155 static int ec_export_get_encoding_cb(const OSSL_PARAM params[], void *arg)
1156 {
1157     const OSSL_PARAM *p;
1158     const char *enc_name = NULL;
1159     int *enc = arg;
1160     size_t i;
1161
1162     *enc = -1;
1163
1164     if (!TEST_ptr(p = OSSL_PARAM_locate_const(params,
1165                                               OSSL_PKEY_PARAM_EC_ENCODING))
1166         || !TEST_true(OSSL_PARAM_get_utf8_string_ptr(p, &enc_name)))
1167         return 0;
1168
1169     for (i = 0; i < OSSL_NELEM(ec_encodings); i++) {
1170         if (strcasecmp(enc_name, ec_encodings[i].encoding_name) == 0) {
1171             *enc = ec_encodings[i].encoding;
1172             break;
1173         }
1174     }
1175
1176     return (*enc != -1);
1177 }
1178
1179 static int test_EC_keygen_with_enc(int idx)
1180 {
1181     EVP_PKEY *params = NULL, *key = NULL;
1182     EVP_PKEY_CTX *pctx = NULL, *kctx = NULL;
1183     int enc;
1184     int ret = 0;
1185
1186     enc = ec_encodings[idx].encoding;
1187
1188     /* Create key parameters */
1189     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "EC", NULL))
1190         || !TEST_true(EVP_PKEY_paramgen_init(pctx))
1191         || !TEST_true(EVP_PKEY_CTX_set_group_name(pctx, "P-256"))
1192         || !TEST_true(EVP_PKEY_CTX_set_ec_param_enc(pctx, enc))
1193         || !TEST_true(EVP_PKEY_paramgen(pctx, &params))
1194         || !TEST_ptr(params))
1195         goto done;
1196
1197     /* Create key */
1198     if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx, params, NULL))
1199         || !TEST_true(EVP_PKEY_keygen_init(kctx))
1200         || !TEST_true(EVP_PKEY_keygen(kctx, &key))
1201         || !TEST_ptr(key))
1202         goto done;
1203
1204     /* Check that the encoding got all the way into the key */
1205     if (!TEST_true(evp_keymgmt_util_export(key, OSSL_KEYMGMT_SELECT_ALL,
1206                                            ec_export_get_encoding_cb, &enc))
1207         || !TEST_int_eq(enc, ec_encodings[idx].encoding))
1208         goto done;
1209
1210     ret = 1;
1211  done:
1212     EVP_PKEY_free(key);
1213     EVP_PKEY_free(params);
1214     EVP_PKEY_CTX_free(kctx);
1215     EVP_PKEY_CTX_free(pctx);
1216     return ret;
1217 }
1218 #endif
1219
1220 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
1221
1222 static int test_EVP_SM2_verify(void)
1223 {
1224     const char *pubkey =
1225         "-----BEGIN PUBLIC KEY-----\n"
1226         "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEp1KLWq1ZE2jmoAnnBJE1LBGxVr18\n"
1227         "YvvqECWCpXfAQ9qUJ+UmthnUPf0iM3SaXKHe6PlLIDyNlWMWb9RUh/yU3g==\n"
1228         "-----END PUBLIC KEY-----\n";
1229
1230     const char *msg = "message digest";
1231     const char *id = "ALICE123@YAHOO.COM";
1232
1233     const uint8_t signature[] = {
1234         0x30, 0x44, 0x02, 0x20, 0x5b, 0xdb, 0xab, 0x81, 0x4f, 0xbb,
1235         0x8b, 0x69, 0xb1, 0x05, 0x9c, 0x99, 0x3b, 0xb2, 0x45, 0x06,
1236         0x4a, 0x30, 0x15, 0x59, 0x84, 0xcd, 0xee, 0x30, 0x60, 0x36,
1237         0x57, 0x87, 0xef, 0x5c, 0xd0, 0xbe, 0x02, 0x20, 0x43, 0x8d,
1238         0x1f, 0xc7, 0x77, 0x72, 0x39, 0xbb, 0x72, 0xe1, 0xfd, 0x07,
1239         0x58, 0xd5, 0x82, 0xc8, 0x2d, 0xba, 0x3b, 0x2c, 0x46, 0x24,
1240         0xe3, 0x50, 0xff, 0x04, 0xc7, 0xa0, 0x71, 0x9f, 0xa4, 0x70
1241     };
1242
1243     int rc = 0;
1244     BIO *bio = NULL;
1245     EVP_PKEY *pkey = NULL;
1246     EVP_MD_CTX *mctx = NULL;
1247     EVP_PKEY_CTX *pctx = NULL;
1248
1249     bio = BIO_new_mem_buf(pubkey, strlen(pubkey));
1250     if (!TEST_true(bio != NULL))
1251         goto done;
1252
1253     pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
1254     if (!TEST_true(pkey != NULL))
1255         goto done;
1256
1257     if (!TEST_true(EVP_PKEY_is_a(pkey, "SM2")))
1258         goto done;
1259
1260     if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
1261         goto done;
1262
1263     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new(pkey, NULL)))
1264         goto done;
1265
1266     EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
1267
1268     if (!TEST_true(EVP_DigestVerifyInit(mctx, NULL, EVP_sm3(), NULL, pkey)))
1269         goto done;
1270
1271     if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, id, strlen(id)), 0))
1272         goto done;
1273
1274     if (!TEST_true(EVP_DigestVerifyUpdate(mctx, msg, strlen(msg))))
1275         goto done;
1276
1277     if (!TEST_true(EVP_DigestVerifyFinal(mctx, signature, sizeof(signature))))
1278         goto done;
1279     rc = 1;
1280
1281  done:
1282     BIO_free(bio);
1283     EVP_PKEY_free(pkey);
1284     EVP_PKEY_CTX_free(pctx);
1285     EVP_MD_CTX_free(mctx);
1286     return rc;
1287 }
1288
1289 static int test_EVP_SM2(void)
1290 {
1291     int ret = 0;
1292     EVP_PKEY *pkey = NULL;
1293     EVP_PKEY *pkeyparams = NULL;
1294     EVP_PKEY_CTX *pctx = NULL;
1295     EVP_PKEY_CTX *kctx = NULL;
1296     EVP_PKEY_CTX *sctx = NULL;
1297     size_t sig_len = 0;
1298     unsigned char *sig = NULL;
1299     EVP_MD_CTX *md_ctx = NULL;
1300     EVP_MD_CTX *md_ctx_verify = NULL;
1301     EVP_PKEY_CTX *cctx = NULL;
1302
1303     uint8_t ciphertext[128];
1304     size_t ctext_len = sizeof(ciphertext);
1305
1306     uint8_t plaintext[8];
1307     size_t ptext_len = sizeof(plaintext);
1308
1309     uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
1310
1311     OSSL_PARAM sparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1312     OSSL_PARAM gparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1313     int i;
1314     char mdname[20];
1315
1316     pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SM2, NULL);
1317     if (!TEST_ptr(pctx))
1318         goto done;
1319
1320     if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
1321         goto done;
1322
1323     /* TODO is this even needed? */
1324     if (!TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2)))
1325         goto done;
1326
1327     if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
1328         goto done;
1329
1330     kctx = EVP_PKEY_CTX_new(pkeyparams, NULL);
1331     if (!TEST_ptr(kctx))
1332         goto done;
1333
1334     if (!TEST_true(EVP_PKEY_keygen_init(kctx)))
1335         goto done;
1336
1337     if (!TEST_true(EVP_PKEY_keygen(kctx, &pkey)))
1338         goto done;
1339
1340     if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1341         goto done;
1342
1343     if (!TEST_ptr(md_ctx_verify = EVP_MD_CTX_new()))
1344         goto done;
1345
1346     if (!TEST_ptr(sctx = EVP_PKEY_CTX_new(pkey, NULL)))
1347         goto done;
1348
1349     EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
1350     EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
1351
1352     if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, EVP_sm3(), NULL, pkey)))
1353         goto done;
1354
1355     if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1356         goto done;
1357
1358     if(!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1359         goto done;
1360
1361     /* Determine the size of the signature. */
1362     if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len)))
1363         goto done;
1364
1365     if (!TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1366         goto done;
1367
1368     if (!TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1369         goto done;
1370
1371     /* Ensure that the signature round-trips. */
1372
1373     if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, EVP_sm3(), NULL, pkey)))
1374         goto done;
1375
1376     if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1377         goto done;
1378
1379     if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1380         goto done;
1381
1382     if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
1383         goto done;
1384
1385     /* now check encryption/decryption */
1386
1387     gparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1388                                                   mdname, sizeof(mdname));
1389     for (i = 0; i < 2; i++) {
1390         EVP_PKEY_CTX_free(cctx);
1391
1392         sparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1393                                                       i == 0 ? "SM3" : "SHA2-256",
1394                                                       0);
1395
1396         if (!TEST_ptr(cctx = EVP_PKEY_CTX_new(pkey, NULL)))
1397             goto done;
1398
1399         if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
1400             goto done;
1401
1402         if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1403             goto done;
1404
1405         if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg,
1406                                         sizeof(kMsg))))
1407             goto done;
1408
1409         if (!TEST_true(EVP_PKEY_decrypt_init(cctx)))
1410             goto done;
1411
1412         if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1413             goto done;
1414
1415         if (!TEST_true(EVP_PKEY_decrypt(cctx, plaintext, &ptext_len, ciphertext,
1416                                         ctext_len)))
1417             goto done;
1418
1419         if (!TEST_true(EVP_PKEY_CTX_get_params(cctx, gparams)))
1420             goto done;
1421
1422         /* Test we're still using the digest we think we are */
1423         if (i == 0 && !TEST_int_eq(strcmp(mdname, "SM3"), 0))
1424             goto done;
1425         if (i == 1 && !TEST_int_eq(strcmp(mdname, "SHA2-256"), 0))
1426             goto done;
1427
1428         if (!TEST_true(ptext_len == sizeof(kMsg)))
1429             goto done;
1430
1431         if (!TEST_true(memcmp(plaintext, kMsg, sizeof(kMsg)) == 0))
1432             goto done;
1433     }
1434
1435     ret = 1;
1436 done:
1437     EVP_PKEY_CTX_free(pctx);
1438     EVP_PKEY_CTX_free(kctx);
1439     EVP_PKEY_CTX_free(sctx);
1440     EVP_PKEY_CTX_free(cctx);
1441     EVP_PKEY_free(pkey);
1442     EVP_PKEY_free(pkeyparams);
1443     EVP_MD_CTX_free(md_ctx);
1444     EVP_MD_CTX_free(md_ctx_verify);
1445     OPENSSL_free(sig);
1446     return ret;
1447 }
1448
1449 #endif
1450
1451 static struct keys_st {
1452     int type;
1453     char *priv;
1454     char *pub;
1455 } keys[] = {
1456     {
1457         EVP_PKEY_HMAC, "0123456789", NULL
1458     }, {
1459         EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
1460     }, {
1461         EVP_PKEY_SIPHASH, "0123456789012345", NULL
1462     },
1463 #ifndef OPENSSL_NO_EC
1464     {
1465         EVP_PKEY_X25519, "01234567890123456789012345678901",
1466         "abcdefghijklmnopqrstuvwxyzabcdef"
1467     }, {
1468         EVP_PKEY_ED25519, "01234567890123456789012345678901",
1469         "abcdefghijklmnopqrstuvwxyzabcdef"
1470     }, {
1471         EVP_PKEY_X448,
1472         "01234567890123456789012345678901234567890123456789012345",
1473         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
1474     }, {
1475         EVP_PKEY_ED448,
1476         "012345678901234567890123456789012345678901234567890123456",
1477         "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde"
1478     }
1479 #endif
1480 };
1481
1482 static int test_set_get_raw_keys_int(int tst, int pub, int uselibctx)
1483 {
1484     int ret = 0;
1485     unsigned char buf[80];
1486     unsigned char *in;
1487     size_t inlen, len = 0;
1488     EVP_PKEY *pkey;
1489
1490     /* Check if this algorithm supports public keys */
1491     if (keys[tst].pub == NULL)
1492         return 1;
1493
1494     memset(buf, 0, sizeof(buf));
1495
1496     if (pub) {
1497         inlen = strlen(keys[tst].pub);
1498         in = (unsigned char *)keys[tst].pub;
1499         if (uselibctx) {
1500             pkey = EVP_PKEY_new_raw_public_key_ex(
1501                         testctx,
1502                         OBJ_nid2sn(keys[tst].type),
1503                         NULL,
1504                         in,
1505                         inlen);
1506         } else {
1507             pkey = EVP_PKEY_new_raw_public_key(keys[tst].type,
1508                                                NULL,
1509                                                in,
1510                                                inlen);
1511         }
1512     } else {
1513         inlen = strlen(keys[tst].priv);
1514         in = (unsigned char *)keys[tst].priv;
1515         if (uselibctx) {
1516             pkey = EVP_PKEY_new_raw_private_key_ex(
1517                         testctx, OBJ_nid2sn(keys[tst].type),
1518                         NULL,
1519                         in,
1520                         inlen);
1521         } else {
1522             pkey = EVP_PKEY_new_raw_private_key(keys[tst].type,
1523                                                 NULL,
1524                                                 in,
1525                                                 inlen);
1526         }
1527     }
1528
1529     if (!TEST_ptr(pkey)
1530             || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
1531             || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
1532             || !TEST_true(len == inlen)
1533             || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, buf, &len)))
1534             || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, buf, &len)))
1535             || !TEST_mem_eq(in, inlen, buf, len))
1536         goto done;
1537
1538     ret = 1;
1539  done:
1540     EVP_PKEY_free(pkey);
1541     return ret;
1542 }
1543
1544 static int test_set_get_raw_keys(int tst)
1545 {
1546     return test_set_get_raw_keys_int(tst, 0, 0)
1547            && test_set_get_raw_keys_int(tst, 0, 1)
1548            && test_set_get_raw_keys_int(tst, 1, 0)
1549            && test_set_get_raw_keys_int(tst, 1, 1);
1550 }
1551
1552 #ifndef OPENSSL_NO_DEPRECATED_3_0
1553 static int pkey_custom_check(EVP_PKEY *pkey)
1554 {
1555     return 0xbeef;
1556 }
1557
1558 static int pkey_custom_pub_check(EVP_PKEY *pkey)
1559 {
1560     return 0xbeef;
1561 }
1562
1563 static int pkey_custom_param_check(EVP_PKEY *pkey)
1564 {
1565     return 0xbeef;
1566 }
1567
1568 static EVP_PKEY_METHOD *custom_pmeth;
1569 #endif
1570
1571 static int test_EVP_PKEY_check(int i)
1572 {
1573     int ret = 0;
1574     EVP_PKEY *pkey = NULL;
1575     EVP_PKEY_CTX *ctx = NULL;
1576 #ifndef OPENSSL_NO_DEPRECATED_3_0
1577     EVP_PKEY_CTX *ctx2 = NULL;
1578 #endif
1579     const APK_DATA *ak = &keycheckdata[i];
1580     const unsigned char *input = ak->kder;
1581     size_t input_len = ak->size;
1582     int expected_id = ak->evptype;
1583     int expected_check = ak->check;
1584     int expected_pub_check = ak->pub_check;
1585     int expected_param_check = ak->param_check;
1586     int type = ak->type;
1587
1588     if (!TEST_ptr(pkey = load_example_key(ak->keytype, input, input_len)))
1589         goto done;
1590     if (type == 0
1591         && !TEST_int_eq(EVP_PKEY_id(pkey), expected_id))
1592         goto done;
1593
1594     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new(pkey, NULL)))
1595         goto done;
1596
1597     if (!TEST_int_eq(EVP_PKEY_check(ctx), expected_check))
1598         goto done;
1599
1600     if (!TEST_int_eq(EVP_PKEY_public_check(ctx), expected_pub_check))
1601         goto done;
1602
1603     if (!TEST_int_eq(EVP_PKEY_param_check(ctx), expected_param_check))
1604         goto done;
1605
1606 #ifndef OPENSSL_NO_DEPRECATED_3_0
1607     ctx2 = EVP_PKEY_CTX_new_id(0xdefaced, NULL);
1608     /* assign the pkey directly, as an internal test */
1609     EVP_PKEY_up_ref(pkey);
1610     ctx2->pkey = pkey;
1611
1612     if (!TEST_int_eq(EVP_PKEY_check(ctx2), 0xbeef))
1613         goto done;
1614
1615     if (!TEST_int_eq(EVP_PKEY_public_check(ctx2), 0xbeef))
1616         goto done;
1617
1618     if (!TEST_int_eq(EVP_PKEY_param_check(ctx2), 0xbeef))
1619         goto done;
1620 #endif
1621
1622     ret = 1;
1623
1624  done:
1625     EVP_PKEY_CTX_free(ctx);
1626 #ifndef OPENSSL_NO_DEPRECATED_3_0
1627     EVP_PKEY_CTX_free(ctx2);
1628 #endif
1629     EVP_PKEY_free(pkey);
1630     return ret;
1631 }
1632
1633 #ifndef OPENSSL_NO_CMAC
1634 static int get_cmac_val(EVP_PKEY *pkey, unsigned char *mac)
1635 {
1636     EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
1637     const char msg[] = "Hello World";
1638     size_t maclen;
1639     int ret = 1;
1640
1641     if (!TEST_ptr(mdctx)
1642             || !TEST_true(EVP_DigestSignInit(mdctx, NULL, NULL, NULL, pkey))
1643             || !TEST_true(EVP_DigestSignUpdate(mdctx, msg, sizeof(msg)))
1644             || !TEST_true(EVP_DigestSignFinal(mdctx, mac, &maclen))
1645             || !TEST_size_t_eq(maclen, AES_BLOCK_SIZE))
1646         ret = 0;
1647
1648     EVP_MD_CTX_free(mdctx);
1649
1650     return ret;
1651 }
1652 static int test_CMAC_keygen(void)
1653 {
1654     static unsigned char key[] = {
1655         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1656         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1657         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
1658     };
1659     /*
1660      * This is a legacy method for CMACs, but should still work.
1661      * This verifies that it works without an ENGINE.
1662      */
1663     EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_CMAC, NULL);
1664     int ret = 0;
1665     EVP_PKEY *pkey = NULL;
1666     unsigned char mac[AES_BLOCK_SIZE];
1667 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
1668     unsigned char mac2[AES_BLOCK_SIZE];
1669 # endif
1670
1671     /* Test a CMAC key created using the "generated" method */
1672     if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
1673             || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
1674                                             EVP_PKEY_CTRL_CIPHER,
1675                                             0, (void *)EVP_aes_256_ecb()), 0)
1676             || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
1677                                             EVP_PKEY_CTRL_SET_MAC_KEY,
1678                                             sizeof(key), (void *)key), 0)
1679             || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0)
1680             || !TEST_ptr(pkey)
1681             || !TEST_true(get_cmac_val(pkey, mac)))
1682         goto done;
1683
1684 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
1685     EVP_PKEY_free(pkey);
1686
1687     /*
1688      * Test a CMAC key using the direct method, and compare with the mac
1689      * created above.
1690      */
1691     pkey = EVP_PKEY_new_CMAC_key(NULL, key, sizeof(key), EVP_aes_256_ecb());
1692     if (!TEST_ptr(pkey)
1693             || !TEST_true(get_cmac_val(pkey, mac2))
1694             || !TEST_mem_eq(mac, sizeof(mac), mac2, sizeof(mac2)))
1695         goto done;
1696 # endif
1697
1698     ret = 1;
1699
1700  done:
1701     EVP_PKEY_free(pkey);
1702     EVP_PKEY_CTX_free(kctx);
1703     return ret;
1704 }
1705 #endif
1706
1707 static int test_HKDF(void)
1708 {
1709     EVP_PKEY_CTX *pctx;
1710     unsigned char out[20];
1711     size_t outlen;
1712     int i, ret = 0;
1713     unsigned char salt[] = "0123456789";
1714     unsigned char key[] = "012345678901234567890123456789";
1715     unsigned char info[] = "infostring";
1716     const unsigned char expected[] = {
1717         0xe5, 0x07, 0x70, 0x7f, 0xc6, 0x78, 0xd6, 0x54, 0x32, 0x5f, 0x7e, 0xc5,
1718         0x7b, 0x59, 0x3e, 0xd8, 0x03, 0x6b, 0xed, 0xca
1719     };
1720     size_t expectedlen = sizeof(expected);
1721
1722     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)))
1723         goto done;
1724
1725     /* We do this twice to test reuse of the EVP_PKEY_CTX */
1726     for (i = 0; i < 2; i++) {
1727         outlen = sizeof(out);
1728         memset(out, 0, outlen);
1729
1730         if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
1731                 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
1732                 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
1733                                                             sizeof(salt) - 1), 0)
1734                 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
1735                                                            sizeof(key) - 1), 0)
1736                 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
1737                                                             sizeof(info) - 1), 0)
1738                 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
1739                 || !TEST_mem_eq(out, outlen, expected, expectedlen))
1740             goto done;
1741     }
1742
1743     ret = 1;
1744
1745  done:
1746     EVP_PKEY_CTX_free(pctx);
1747
1748     return ret;
1749 }
1750
1751 static int test_emptyikm_HKDF(void)
1752 {
1753     EVP_PKEY_CTX *pctx;
1754     unsigned char out[20];
1755     size_t outlen;
1756     int ret = 0;
1757     unsigned char salt[] = "9876543210";
1758     unsigned char key[] = "";
1759     unsigned char info[] = "stringinfo";
1760     const unsigned char expected[] = {
1761         0x68, 0x81, 0xa5, 0x3e, 0x5b, 0x9c, 0x7b, 0x6f, 0x2e, 0xec, 0xc8, 0x47,
1762         0x7c, 0xfa, 0x47, 0x35, 0x66, 0x82, 0x15, 0x30
1763     };
1764     size_t expectedlen = sizeof(expected);
1765
1766     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)))
1767         goto done;
1768
1769     outlen = sizeof(out);
1770     memset(out, 0, outlen);
1771
1772     if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
1773             || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
1774             || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
1775                                                         sizeof(salt) - 1), 0)
1776             || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
1777                                                        sizeof(key) - 1), 0)
1778             || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
1779                                                         sizeof(info) - 1), 0)
1780             || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
1781             || !TEST_mem_eq(out, outlen, expected, expectedlen))
1782         goto done;
1783
1784     ret = 1;
1785
1786  done:
1787     EVP_PKEY_CTX_free(pctx);
1788
1789     return ret;
1790 }
1791
1792 #ifndef OPENSSL_NO_EC
1793 static int test_X509_PUBKEY_inplace(void)
1794 {
1795   int ret = 0;
1796   X509_PUBKEY *xp = NULL;
1797   const unsigned char *p = kExampleECPubKeyDER;
1798   size_t input_len = sizeof(kExampleECPubKeyDER);
1799
1800   if (!TEST_ptr(xp = d2i_X509_PUBKEY(NULL, &p, input_len)))
1801     goto done;
1802
1803   if (!TEST_ptr(X509_PUBKEY_get0(xp)))
1804     goto done;
1805
1806   p = kExampleBadECPubKeyDER;
1807   input_len = sizeof(kExampleBadECPubKeyDER);
1808
1809   if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len)))
1810     goto done;
1811
1812   if (!TEST_true(X509_PUBKEY_get0(xp) == NULL))
1813     goto done;
1814
1815   ret = 1;
1816
1817 done:
1818   X509_PUBKEY_free(xp);
1819   return ret;
1820 }
1821 #endif /* OPENSSL_NO_EC */
1822
1823 /* Test getting and setting parameters on an EVP_PKEY_CTX */
1824 static int test_EVP_PKEY_CTX_get_set_params(EVP_PKEY *pkey)
1825 {
1826     EVP_MD_CTX *mdctx = NULL;
1827     EVP_PKEY_CTX *ctx = NULL;
1828     const OSSL_PARAM *params;
1829     OSSL_PARAM ourparams[2], *param = ourparams, *param_md;
1830     int ret = 0;
1831     const EVP_MD *md;
1832     char mdname[OSSL_MAX_NAME_SIZE];
1833     char ssl3ms[48];
1834
1835     /* Initialise a sign operation */
1836     ctx = EVP_PKEY_CTX_new(pkey, NULL);
1837     if (!TEST_ptr(ctx)
1838             || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0))
1839         goto err;
1840
1841     /*
1842      * We should be able to query the parameters now.
1843      */
1844     params = EVP_PKEY_CTX_settable_params(ctx);
1845     if (!TEST_ptr(params)
1846         || !TEST_ptr(OSSL_PARAM_locate_const(params,
1847                                              OSSL_SIGNATURE_PARAM_DIGEST)))
1848         goto err;
1849
1850     params = EVP_PKEY_CTX_gettable_params(ctx);
1851     if (!TEST_ptr(params)
1852         || !TEST_ptr(OSSL_PARAM_locate_const(params,
1853                                              OSSL_SIGNATURE_PARAM_ALGORITHM_ID))
1854         || !TEST_ptr(OSSL_PARAM_locate_const(params,
1855                                              OSSL_SIGNATURE_PARAM_DIGEST)))
1856         goto err;
1857
1858     /*
1859      * Test getting and setting params via EVP_PKEY_CTX_set_params() and
1860      * EVP_PKEY_CTX_get_params()
1861      */
1862     strcpy(mdname, "SHA512");
1863     param_md = param;
1864     *param++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1865                                                 mdname, 0);
1866     *param++ = OSSL_PARAM_construct_end();
1867
1868     if (!TEST_true(EVP_PKEY_CTX_set_params(ctx, ourparams)))
1869         goto err;
1870
1871     mdname[0] = '\0';
1872     *param_md = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1873                                                  mdname, sizeof(mdname));
1874     if (!TEST_true(EVP_PKEY_CTX_get_params(ctx, ourparams))
1875             || !TEST_str_eq(mdname, "SHA512"))
1876         goto err;
1877
1878     /*
1879      * Test the TEST_PKEY_CTX_set_signature_md() and
1880      * TEST_PKEY_CTX_get_signature_md() functions
1881      */
1882     if (!TEST_int_gt(EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()), 0)
1883             || !TEST_int_gt(EVP_PKEY_CTX_get_signature_md(ctx, &md), 0)
1884             || !TEST_ptr_eq(md, EVP_sha256()))
1885         goto err;
1886
1887     /*
1888      * Test getting MD parameters via an associated EVP_PKEY_CTX
1889      */
1890     mdctx = EVP_MD_CTX_new();
1891     if (!TEST_ptr(mdctx)
1892         || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, "SHA1", NULL, NULL,
1893                                             pkey)))
1894         goto err;
1895
1896     /*
1897      * We now have an EVP_MD_CTX with an EVP_PKEY_CTX inside it. We should be
1898      * able to obtain the digest's settable parameters from the provider.
1899      */
1900     params = EVP_MD_CTX_settable_params(mdctx);
1901     if (!TEST_ptr(params)
1902             || !TEST_int_eq(strcmp(params[0].key, OSSL_DIGEST_PARAM_SSL3_MS), 0)
1903                /* The final key should be NULL */
1904             || !TEST_ptr_null(params[1].key))
1905         goto err;
1906
1907     param = ourparams;
1908     memset(ssl3ms, 0, sizeof(ssl3ms));
1909     *param++ = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
1910                                                  ssl3ms, sizeof(ssl3ms));
1911     *param++ = OSSL_PARAM_construct_end();
1912
1913     if (!TEST_true(EVP_MD_CTX_set_params(mdctx, ourparams)))
1914         goto err;
1915
1916     ret = 1;
1917
1918  err:
1919     EVP_MD_CTX_free(mdctx);
1920     EVP_PKEY_CTX_free(ctx);
1921
1922     return ret;
1923 }
1924
1925 #ifndef OPENSSL_NO_DSA
1926 static int test_DSA_get_set_params(void)
1927 {
1928     OSSL_PARAM_BLD *bld = NULL;
1929     OSSL_PARAM *params = NULL;
1930     BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
1931     EVP_PKEY_CTX *pctx = NULL;
1932     EVP_PKEY *pkey = NULL;
1933     int ret = 0;
1934
1935     /*
1936      * Setup the parameters for our DSA object. For our purposes they don't
1937      * have to actually be *valid* parameters. We just need to set something.
1938      */
1939     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "DSA", NULL))
1940         || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
1941         || !TEST_ptr(p = BN_new())
1942         || !TEST_ptr(q = BN_new())
1943         || !TEST_ptr(g = BN_new())
1944         || !TEST_ptr(pub = BN_new())
1945         || !TEST_ptr(priv = BN_new()))
1946         goto err;
1947     if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
1948         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
1949         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
1950         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
1951                                              pub))
1952         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
1953                                              priv)))
1954         goto err;
1955     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
1956         goto err;
1957
1958     if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
1959         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
1960                                           params), 0))
1961         goto err;
1962
1963     if (!TEST_ptr(pkey))
1964         goto err;
1965
1966     ret = test_EVP_PKEY_CTX_get_set_params(pkey);
1967
1968  err:
1969     EVP_PKEY_free(pkey);
1970     EVP_PKEY_CTX_free(pctx);
1971     OSSL_PARAM_BLD_free_params(params);
1972     OSSL_PARAM_BLD_free(bld);
1973     BN_free(p);
1974     BN_free(q);
1975     BN_free(g);
1976     BN_free(pub);
1977     BN_free(priv);
1978
1979     return ret;
1980 }
1981
1982 /*
1983  * Test combinations of private, public, missing and private + public key
1984  * params to ensure they are all accepted
1985  */
1986 static int test_DSA_priv_pub(void)
1987 {
1988     return test_EVP_PKEY_ffc_priv_pub("DSA");
1989 }
1990
1991 #endif /* !OPENSSL_NO_DSA */
1992
1993 static int test_RSA_get_set_params(void)
1994 {
1995     OSSL_PARAM_BLD *bld = NULL;
1996     OSSL_PARAM *params = NULL;
1997     BIGNUM *n = NULL, *e = NULL, *d = NULL;
1998     EVP_PKEY_CTX *pctx = NULL;
1999     EVP_PKEY *pkey = NULL;
2000     int ret = 0;
2001
2002     /*
2003      * Setup the parameters for our RSA object. For our purposes they don't
2004      * have to actually be *valid* parameters. We just need to set something.
2005      */
2006     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", NULL))
2007         || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2008         || !TEST_ptr(n = BN_new())
2009         || !TEST_ptr(e = BN_new())
2010         || !TEST_ptr(d = BN_new()))
2011         goto err;
2012     if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
2013         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
2014         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d)))
2015         goto err;
2016     if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2017         goto err;
2018
2019     if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2020         || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2021                                           params), 0))
2022         goto err;
2023
2024     if (!TEST_ptr(pkey))
2025         goto err;
2026
2027     ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2028
2029  err:
2030     EVP_PKEY_free(pkey);
2031     EVP_PKEY_CTX_free(pctx);
2032     OSSL_PARAM_BLD_free_params(params);
2033     OSSL_PARAM_BLD_free(bld);
2034     BN_free(n);
2035     BN_free(e);
2036     BN_free(d);
2037
2038     return ret;
2039 }
2040
2041 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2042 static int test_decrypt_null_chunks(void)
2043 {
2044     EVP_CIPHER_CTX* ctx = NULL;
2045     const unsigned char key[32] = {
2046         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2047         0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2048         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1
2049     };
2050     unsigned char iv[12] = {
2051         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
2052     };
2053     unsigned char msg[] = "It was the best of times, it was the worst of times";
2054     unsigned char ciphertext[80];
2055     unsigned char plaintext[80];
2056     /* We initialise tmp to a non zero value on purpose */
2057     int ctlen, ptlen, tmp = 99;
2058     int ret = 0;
2059     const int enc_offset = 10, dec_offset = 20;
2060
2061     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
2062             || !TEST_true(EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL,
2063                                              key, iv))
2064             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &ctlen, msg,
2065                                             enc_offset))
2066             /* Deliberate add a zero length update */
2067             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp, NULL,
2068                                             0))
2069             || !TEST_int_eq(tmp, 0)
2070             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp,
2071                                             msg + enc_offset,
2072                                             sizeof(msg) - enc_offset))
2073             || !TEST_int_eq(ctlen += tmp, sizeof(msg))
2074             || !TEST_true(EVP_EncryptFinal(ctx, ciphertext + ctlen, &tmp))
2075             || !TEST_int_eq(tmp, 0))
2076         goto err;
2077
2078     /* Deliberately initialise tmp to a non zero value */
2079     tmp = 99;
2080     if (!TEST_true(EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, key,
2081                                       iv))
2082             || !TEST_true(EVP_DecryptUpdate(ctx, plaintext, &ptlen, ciphertext,
2083                                             dec_offset))
2084             /*
2085              * Deliberately add a zero length update. We also deliberately do
2086              * this at a different offset than for encryption.
2087              */
2088             || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp, NULL,
2089                                             0))
2090             || !TEST_int_eq(tmp, 0)
2091             || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp,
2092                                             ciphertext + dec_offset,
2093                                             ctlen - dec_offset))
2094             || !TEST_int_eq(ptlen += tmp, sizeof(msg))
2095             || !TEST_true(EVP_DecryptFinal(ctx, plaintext + ptlen, &tmp))
2096             || !TEST_int_eq(tmp, 0)
2097             || !TEST_mem_eq(msg, sizeof(msg), plaintext, ptlen))
2098         goto err;
2099
2100     ret = 1;
2101  err:
2102     EVP_CIPHER_CTX_free(ctx);
2103     return ret;
2104 }
2105 #endif /* !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) */
2106
2107 #ifndef OPENSSL_NO_DH
2108 /*
2109  * Test combinations of private, public, missing and private + public key
2110  * params to ensure they are all accepted
2111  */
2112 static int test_DH_priv_pub(void)
2113 {
2114     return test_EVP_PKEY_ffc_priv_pub("DH");
2115 }
2116
2117 # ifndef OPENSSL_NO_DEPRECATED_3_0
2118 static int test_EVP_PKEY_set1_DH(void)
2119 {
2120     DH *x942dh = NULL, *noqdh = NULL;
2121     EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
2122     int ret = 0;
2123     BIGNUM *p, *g = NULL;
2124
2125     if (!TEST_ptr(p = BN_new())
2126             || !TEST_ptr(g = BN_new())
2127             || !BN_set_word(p, 9999)
2128             || !BN_set_word(g, 2)
2129             || !TEST_ptr(noqdh = DH_new())
2130             || !DH_set0_pqg(noqdh, p, NULL, g))
2131         goto err;
2132     p = g = NULL;
2133
2134     x942dh = DH_get_2048_256();
2135     pkey1 = EVP_PKEY_new();
2136     pkey2 = EVP_PKEY_new();
2137     if (!TEST_ptr(x942dh)
2138             || !TEST_ptr(noqdh)
2139             || !TEST_ptr(pkey1)
2140             || !TEST_ptr(pkey2))
2141         goto err;
2142
2143     if(!TEST_true(EVP_PKEY_set1_DH(pkey1, x942dh))
2144             || !TEST_int_eq(EVP_PKEY_id(pkey1), EVP_PKEY_DHX))
2145         goto err;
2146
2147     if(!TEST_true(EVP_PKEY_set1_DH(pkey2, noqdh))
2148             || !TEST_int_eq(EVP_PKEY_id(pkey2), EVP_PKEY_DH))
2149         goto err;
2150
2151     ret = 1;
2152  err:
2153     BN_free(p);
2154     BN_free(g);
2155     EVP_PKEY_free(pkey1);
2156     EVP_PKEY_free(pkey2);
2157     DH_free(x942dh);
2158     DH_free(noqdh);
2159
2160     return ret;
2161 }
2162 # endif /* !OPENSSL_NO_DEPRECATED_3_0 */
2163 #endif /* !OPENSSL_NO_DH */
2164
2165 /*
2166  * We test what happens with an empty template.  For the sake of this test,
2167  * the template must be ignored, and we know that's the case for RSA keys
2168  * (this might arguably be a misfeature, but that's what we currently do,
2169  * even in provider code, since that's how the legacy RSA implementation
2170  * does things)
2171  */
2172 static int test_keygen_with_empty_template(int n)
2173 {
2174     EVP_PKEY_CTX *ctx = NULL;
2175     EVP_PKEY *pkey = NULL;
2176     EVP_PKEY *tkey = NULL;
2177     int ret = 0;
2178
2179     switch (n) {
2180     case 0:
2181         /* We do test with no template at all as well */
2182         if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
2183             goto err;
2184         break;
2185     case 1:
2186         /* Here we create an empty RSA key that serves as our template */
2187         if (!TEST_ptr(tkey = EVP_PKEY_new())
2188             || !TEST_true(EVP_PKEY_set_type(tkey, EVP_PKEY_RSA))
2189             || !TEST_ptr(ctx = EVP_PKEY_CTX_new(tkey, NULL)))
2190             goto err;
2191         break;
2192     }
2193
2194     if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
2195         || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0))
2196         goto err;
2197
2198     ret = 1;
2199  err:
2200     EVP_PKEY_CTX_free(ctx);
2201     EVP_PKEY_free(pkey);
2202     EVP_PKEY_free(tkey);
2203     return ret;
2204 }
2205
2206 /*
2207  * Test that we fail if we attempt to use an algorithm that is not available
2208  * in the current library context (unless we are using an algorithm that
2209  * should be made available via legacy codepaths).
2210  *
2211  * 0:   RSA
2212  * 1:   SM2
2213  */
2214 static int test_pkey_ctx_fail_without_provider(int tst)
2215 {
2216     OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
2217     OSSL_PROVIDER *nullprov = NULL;
2218     EVP_PKEY_CTX *pctx = NULL;
2219     const char *keytype = NULL;
2220     int expect_null = 0;
2221     int ret = 0;
2222
2223     if (!TEST_ptr(tmpctx))
2224         goto err;
2225
2226     nullprov = OSSL_PROVIDER_load(tmpctx, "null");
2227     if (!TEST_ptr(nullprov))
2228         goto err;
2229
2230     /*
2231      * We check for certain algos in the null provider.
2232      * If an algo is expected to have a provider keymgmt, contructing an
2233      * EVP_PKEY_CTX is expected to fail (return NULL).
2234      * Otherwise, if it's expected to have legacy support, contructing an
2235      * EVP_PKEY_CTX is expected to succeed (return non-NULL).
2236      */
2237     switch (tst) {
2238     case 0:
2239         keytype = "RSA";
2240         expect_null = 1;
2241         break;
2242     case 1:
2243         keytype = "SM2";
2244         expect_null = 1;
2245 #ifdef OPENSSL_NO_EC
2246         TEST_info("EC disable, skipping SM2 check...");
2247         goto end;
2248 #endif
2249 #ifdef OPENSSL_NO_SM2
2250         TEST_info("SM2 disable, skipping SM2 check...");
2251         goto end;
2252 #endif
2253         break;
2254     default:
2255         TEST_error("No test for case %d", tst);
2256         goto err;
2257     }
2258
2259     pctx = EVP_PKEY_CTX_new_from_name(tmpctx, keytype, "");
2260     if (expect_null ? !TEST_ptr_null(pctx) : !TEST_ptr(pctx))
2261         goto err;
2262
2263 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_SM2)
2264  end:
2265 #endif
2266     ret = 1;
2267
2268  err:
2269     EVP_PKEY_CTX_free(pctx);
2270     OSSL_PROVIDER_unload(nullprov);
2271     OSSL_LIB_CTX_free(tmpctx);
2272     return ret;
2273 }
2274
2275 static int test_rand_agglomeration(void)
2276 {
2277     EVP_RAND *rand;
2278     EVP_RAND_CTX *ctx;
2279     OSSL_PARAM params[3], *p = params;
2280     int res;
2281     unsigned int step = 7;
2282     static unsigned char seed[] = "It does not matter how slowly you go "
2283                                   "as long as you do not stop.";
2284     unsigned char out[sizeof(seed)];
2285
2286     if (!TEST_int_ne(sizeof(seed) % step, 0)
2287             || !TEST_ptr(rand = EVP_RAND_fetch(NULL, "TEST-RAND", NULL)))
2288         return 0;
2289     ctx = EVP_RAND_CTX_new(rand, NULL);
2290     EVP_RAND_free(rand);
2291     if (!TEST_ptr(ctx))
2292         return 0;
2293
2294     memset(out, 0, sizeof(out));
2295     *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
2296                                              seed, sizeof(seed));
2297     *p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
2298     *p = OSSL_PARAM_construct_end();
2299     res = TEST_true(EVP_RAND_set_ctx_params(ctx, params))
2300           && TEST_true(EVP_RAND_generate(ctx, out, sizeof(out), 0, 1, NULL, 0))
2301           && TEST_mem_eq(seed, sizeof(seed), out, sizeof(out));
2302     EVP_RAND_CTX_free(ctx);
2303     return res;
2304 }
2305
2306 /*
2307  * Test that we correctly return the original or "running" IV after
2308  * an encryption operation.
2309  * Run multiple times for some different relevant algorithms/modes.
2310  */
2311 static int test_evp_iv(int idx)
2312 {
2313     int ret = 0;
2314     EVP_CIPHER_CTX *ctx = NULL;
2315     unsigned char key[16] = {0x4c, 0x43, 0xdb, 0xdd, 0x42, 0x73, 0x47, 0xd1,
2316                              0xe5, 0x62, 0x7d, 0xcd, 0x4d, 0x76, 0x4d, 0x57};
2317     unsigned char init_iv[EVP_MAX_IV_LENGTH] =
2318         {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98, 0x82,
2319          0x5a, 0x55, 0x91, 0x81, 0x42, 0xa8, 0x89, 0x34};
2320     static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
2321                                          9, 10, 11, 12, 13, 14, 15, 16 };
2322     unsigned char ciphertext[32], oiv[16], iv[16];
2323     unsigned char *ref_iv;
2324     unsigned char cbc_state[16] = {0x10, 0x2f, 0x05, 0xcc, 0xc2, 0x55, 0x72, 0xb9,
2325                                    0x88, 0xe6, 0x4a, 0x17, 0x10, 0x74, 0x22, 0x5e};
2326
2327     unsigned char ofb_state[16] = {0x76, 0xe6, 0x66, 0x61, 0xd0, 0x8a, 0xe4, 0x64,
2328                                    0xdd, 0x66, 0xbf, 0x00, 0xf0, 0xe3, 0x6f, 0xfd};
2329     unsigned char gcm_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
2330                                    0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
2331     unsigned char ccm_state[7] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98};
2332 #ifndef OPENSSL_NO_OCB
2333     unsigned char ocb_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
2334                                    0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
2335 #endif
2336     int len = sizeof(ciphertext);
2337     size_t ivlen, ref_len;
2338     const EVP_CIPHER *type = NULL;
2339
2340     switch(idx) {
2341     case 0:
2342         type = EVP_aes_128_cbc();
2343         /* FALLTHROUGH */
2344     case 5:
2345         type = (type != NULL) ? type :
2346                                 EVP_CIPHER_fetch(testctx, "aes-128-cbc", NULL);
2347         ref_iv = cbc_state;
2348         ref_len = sizeof(cbc_state);
2349         break;
2350     case 1:
2351         type = EVP_aes_128_ofb();
2352         /* FALLTHROUGH */
2353     case 6:
2354         type = (type != NULL) ? type :
2355                                 EVP_CIPHER_fetch(testctx, "aes-128-ofb", NULL);
2356         ref_iv = ofb_state;
2357         ref_len = sizeof(ofb_state);
2358         break;
2359     case 2:
2360         type = EVP_aes_128_gcm();
2361         /* FALLTHROUGH */
2362     case 7:
2363         type = (type != NULL) ? type :
2364                                 EVP_CIPHER_fetch(testctx, "aes-128-gcm", NULL);
2365         ref_iv = gcm_state;
2366         ref_len = sizeof(gcm_state);
2367         break;
2368     case 3:
2369         type = EVP_aes_128_ccm();
2370         /* FALLTHROUGH */
2371     case 8:
2372         type = (type != NULL) ? type :
2373                                 EVP_CIPHER_fetch(testctx, "aes-128-ccm", NULL);
2374         ref_iv = ccm_state;
2375         ref_len = sizeof(ccm_state);
2376         break;
2377 #ifdef OPENSSL_NO_OCB
2378     case 4:
2379     case 9:
2380         return 1;
2381 #else
2382     case 4:
2383         type = EVP_aes_128_ocb();
2384         /* FALLTHROUGH */
2385     case 9:
2386         type = (type != NULL) ? type :
2387                                 EVP_CIPHER_fetch(testctx, "aes-128-ocb", NULL);
2388         ref_iv = ocb_state;
2389         ref_len = sizeof(ocb_state);
2390         break;
2391 #endif
2392     default:
2393         return 0;
2394     }
2395
2396     if (!TEST_ptr(type)
2397             || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
2398             || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
2399             || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
2400                           (int)sizeof(msg)))
2401             || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
2402             || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
2403             || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
2404         goto err;
2405     ivlen = EVP_CIPHER_CTX_iv_length(ctx);
2406     if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
2407             || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
2408         goto err;
2409
2410     ret = 1;
2411 err:
2412     EVP_CIPHER_CTX_free(ctx);
2413     if (idx >= 5)
2414         EVP_CIPHER_free((EVP_CIPHER *)type);
2415     return ret;
2416 }
2417
2418 #ifndef OPENSSL_NO_EC
2419 static int ecpub_nids[] = { NID_brainpoolP256r1, NID_X9_62_prime256v1,
2420     NID_secp384r1, NID_secp521r1, NID_sect233k1, NID_sect233r1, NID_sect283r1,
2421     NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1,
2422     NID_brainpoolP384r1, NID_brainpoolP512r1};
2423
2424 static int test_ecpub(int idx)
2425 {
2426     int ret = 0, len, savelen;
2427     int nid;
2428     unsigned char buf[1024];
2429     unsigned char *p;
2430     EVP_PKEY *pkey = NULL;
2431     EVP_PKEY_CTX *ctx = NULL;
2432 # ifndef OPENSSL_NO_DEPRECATED_3_0
2433     const unsigned char *q;
2434     EVP_PKEY *pkey2 = NULL;
2435     EC_KEY *ec = NULL;
2436 # endif
2437
2438     nid = ecpub_nids[idx];
2439
2440     ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
2441     if (!TEST_ptr(ctx)
2442         || !TEST_true(EVP_PKEY_keygen_init(ctx))
2443         || !TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid))
2444         || !TEST_true(EVP_PKEY_keygen(ctx, &pkey)))
2445         goto done;
2446     len = i2d_PublicKey(pkey, NULL);
2447     savelen = len;
2448     if (!TEST_int_ge(len, 1)
2449         || !TEST_int_lt(len, 1024))
2450         goto done;
2451     p = buf;
2452     len = i2d_PublicKey(pkey, &p);
2453     if (!TEST_int_ge(len, 1)
2454             || !TEST_int_eq(len, savelen))
2455         goto done;
2456
2457 # ifndef OPENSSL_NO_DEPRECATED_3_0
2458     /* Now try to decode the just-created DER. */
2459     q = buf;
2460     if (!TEST_ptr((pkey2 = EVP_PKEY_new()))
2461             || !TEST_ptr((ec = EC_KEY_new_by_curve_name(nid)))
2462             || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey2, ec)))
2463         goto done;
2464     /* EC_KEY ownership transferred */
2465     ec = NULL;
2466     if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_EC, &pkey2, &q, savelen)))
2467         goto done;
2468     /* The keys should match. */
2469     if (!TEST_int_eq(EVP_PKEY_cmp(pkey, pkey2), 1))
2470         goto done;
2471 # endif
2472
2473     ret = 1;
2474
2475  done:
2476     EVP_PKEY_CTX_free(ctx);
2477     EVP_PKEY_free(pkey);
2478 # ifndef OPENSSL_NO_DEPRECATED_3_0
2479     EVP_PKEY_free(pkey2);
2480     EC_KEY_free(ec);
2481 # endif
2482     return ret;
2483 }
2484 #endif
2485
2486 static int test_EVP_rsa_pss_with_keygen_bits(void)
2487 {
2488     int ret;
2489     EVP_PKEY_CTX *ctx;
2490     EVP_PKEY *pkey;
2491     const EVP_MD *md;
2492     pkey = NULL;
2493     ret = 0;
2494
2495     md = EVP_get_digestbyname("sha256");
2496     ret = TEST_ptr((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA_PSS, NULL)))
2497         && TEST_true(EVP_PKEY_keygen_init(ctx))
2498         && TEST_int_gt(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 512), 0)
2499         && TEST_true(EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md))
2500         && TEST_true(EVP_PKEY_keygen(ctx, &pkey));
2501
2502     EVP_PKEY_free(pkey);
2503     EVP_PKEY_CTX_free(ctx);
2504     return ret;
2505 }
2506
2507 static int success = 1;
2508 static void md_names(const char *name, void *vctx)
2509 {
2510     OSSL_LIB_CTX *ctx = (OSSL_LIB_CTX *)vctx;
2511     /* Force a namemap update */
2512     EVP_CIPHER *aes128 = EVP_CIPHER_fetch(ctx, "AES-128-CBC", NULL);
2513
2514     if (!TEST_ptr(aes128))
2515         success = 0;
2516
2517     EVP_CIPHER_free(aes128);
2518 }
2519
2520 /*
2521  * Test that changing the namemap in a user callback works in a names_do_all
2522  * function.
2523  */
2524 static int test_names_do_all(void)
2525 {
2526     /* We use a custom libctx so that we know the state of the namemap */
2527     OSSL_LIB_CTX *ctx = OSSL_LIB_CTX_new();
2528     EVP_MD *sha256 = NULL;
2529     int testresult = 0;
2530
2531     if (!TEST_ptr(ctx))
2532         goto err;
2533
2534     sha256 = EVP_MD_fetch(ctx, "SHA2-256", NULL);
2535     if (!TEST_ptr(sha256))
2536         goto err;
2537
2538     /*
2539      * We loop through all the names for a given digest. This should still work
2540      * even if the namemap changes part way through.
2541      */
2542     if (!TEST_true(EVP_MD_names_do_all(sha256, md_names, ctx)))
2543         goto err;
2544
2545     if (!TEST_true(success))
2546         goto err;
2547
2548     testresult = 1;
2549  err:
2550     EVP_MD_free(sha256);
2551     OSSL_LIB_CTX_free(ctx);
2552     return testresult;
2553 }
2554
2555 int setup_tests(void)
2556 {
2557     testctx = OSSL_LIB_CTX_new();
2558
2559     if (!TEST_ptr(testctx))
2560         return 0;
2561
2562     ADD_TEST(test_EVP_set_default_properties);
2563     ADD_ALL_TESTS(test_EVP_DigestSignInit, 9);
2564     ADD_TEST(test_EVP_DigestVerifyInit);
2565     ADD_TEST(test_EVP_Digest);
2566     ADD_TEST(test_EVP_Enveloped);
2567     ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
2568     ADD_TEST(test_privatekey_to_pkcs8);
2569 #ifndef OPENSSL_NO_EC
2570     ADD_TEST(test_EVP_PKCS82PKEY);
2571 #endif
2572 #ifndef OPENSSL_NO_EC
2573     ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings));
2574 #endif
2575 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
2576     ADD_TEST(test_EVP_SM2);
2577     ADD_TEST(test_EVP_SM2_verify);
2578 #endif
2579     ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
2580 #ifndef OPENSSL_NO_DEPRECATED_3_0
2581     custom_pmeth = EVP_PKEY_meth_new(0xdefaced, 0);
2582     if (!TEST_ptr(custom_pmeth))
2583         return 0;
2584     EVP_PKEY_meth_set_check(custom_pmeth, pkey_custom_check);
2585     EVP_PKEY_meth_set_public_check(custom_pmeth, pkey_custom_pub_check);
2586     EVP_PKEY_meth_set_param_check(custom_pmeth, pkey_custom_param_check);
2587     if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
2588         return 0;
2589 #endif
2590     ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
2591 #ifndef OPENSSL_NO_CMAC
2592     ADD_TEST(test_CMAC_keygen);
2593 #endif
2594     ADD_TEST(test_HKDF);
2595     ADD_TEST(test_emptyikm_HKDF);
2596 #ifndef OPENSSL_NO_EC
2597     ADD_TEST(test_X509_PUBKEY_inplace);
2598     ADD_ALL_TESTS(test_invalide_ec_char2_pub_range_decode,
2599                   OSSL_NELEM(ec_der_pub_keys));
2600 #endif
2601 #ifndef OPENSSL_NO_DSA
2602     ADD_TEST(test_DSA_get_set_params);
2603     ADD_TEST(test_DSA_priv_pub);
2604 #endif
2605     ADD_TEST(test_RSA_get_set_params);
2606 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2607     ADD_TEST(test_decrypt_null_chunks);
2608 #endif
2609 #ifndef OPENSSL_NO_DH
2610     ADD_TEST(test_DH_priv_pub);
2611 # ifndef OPENSSL_NO_DEPRECATED_3_0
2612     ADD_TEST(test_EVP_PKEY_set1_DH);
2613 # endif
2614 #endif
2615 #ifndef OPENSSL_NO_EC
2616     ADD_TEST(test_EC_priv_pub);
2617 # ifndef OPENSSL_NO_DEPRECATED_3_0
2618     ADD_TEST(test_EC_priv_only_legacy);
2619 # endif
2620 #endif
2621     ADD_ALL_TESTS(test_keygen_with_empty_template, 2);
2622     ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
2623
2624     ADD_TEST(test_rand_agglomeration);
2625     ADD_ALL_TESTS(test_evp_iv, 10);
2626     ADD_TEST(test_EVP_rsa_pss_with_keygen_bits);
2627 #ifndef OPENSSL_NO_EC
2628     ADD_ALL_TESTS(test_ecpub, OSSL_NELEM(ecpub_nids));
2629 #endif
2630
2631     ADD_TEST(test_names_do_all);
2632
2633     return 1;
2634 }
2635
2636 void cleanup_tests(void)
2637 {
2638     OSSL_LIB_CTX_free(testctx);
2639 }