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