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