1 /*
2  * Copyright 2015-2024 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 /*
14  * Really these tests should be in evp_extra_test - but that doesn't
15  * yet support testing with a non-default libctx. Once it does we should move
16  * everything into one file. Consequently some things are duplicated between
17  * the two files.
18  */
19 
20 #include <openssl/evp.h>
21 #include <openssl/pem.h>
22 #include <openssl/provider.h>
23 #include <openssl/rsa.h>
24 #include <openssl/dh.h>
25 #include <openssl/core_names.h>
26 #include <openssl/ui.h>
27 
28 #include "testutil.h"
29 #include "internal/nelem.h"
30 
31 static OSSL_LIB_CTX *mainctx = NULL;
32 static OSSL_PROVIDER *nullprov = NULL;
33 
34 /*
35  * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
36  * should never use this key anywhere but in an example.
37  */
38 static const unsigned char kExampleRSAKeyDER[] = {
39     0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8,
40     0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59,
41     0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37,
42     0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71,
43     0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a,
44     0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4,
45     0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec,
46     0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76,
47     0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8,
48     0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7,
49     0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c,
50     0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01,
51     0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7,
52     0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85,
53     0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee,
54     0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85,
55     0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a,
56     0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15,
57     0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83,
58     0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b,
59     0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73,
60     0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99,
61     0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02,
62     0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41,
63     0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59,
64     0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9,
65     0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef,
66     0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87,
67     0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf,
68     0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5,
69     0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5,
70     0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62,
71     0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64,
72     0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8,
73     0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba,
74     0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe,
75     0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7,
76     0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe,
77     0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb,
78     0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34,
79     0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27,
80     0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0,
81     0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba,
82     0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06,
83     0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c,
84     0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e,
85     0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf,
86     0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a,
87     0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17,
88     0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1,
89     0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
90 };
91 
92 /*
93  * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8
94  * PrivateKeyInfo.
95  */
96 static const unsigned char kExampleRSAKeyPKCS8[] = {
97     0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
98     0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
99     0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
100     0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5,
101     0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e,
102     0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34,
103     0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde,
104     0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8,
105     0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b,
106     0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83,
107     0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48,
108     0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a,
109     0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2,
110     0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01,
111     0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a,
112     0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5,
113     0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6,
114     0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8,
115     0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6,
116     0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f,
117     0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c,
118     0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78,
119     0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71,
120     0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60,
121     0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d,
122     0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3,
123     0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d,
124     0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18,
125     0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d,
126     0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32,
127     0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc,
128     0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63,
129     0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05,
130     0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16,
131     0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3,
132     0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85,
133     0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97,
134     0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7,
135     0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99,
136     0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4,
137     0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d,
138     0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40,
139     0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26,
140     0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1,
141     0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c,
142     0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30,
143     0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea,
144     0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b,
145     0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e,
146     0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9,
147     0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae,
148     0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d,
149     0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
150 };
151 
152 #ifndef OPENSSL_NO_DH
153 static const unsigned char kExampleDHPrivateKeyDER[] = {
154     0x30, 0x82, 0x02, 0x26, 0x02, 0x01, 0x00, 0x30, 0x82, 0x01, 0x17, 0x06,
155     0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x03, 0x01, 0x30, 0x82,
156     0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xD8, 0x4B, 0x0F, 0x0E, 0x6B,
157     0x79, 0xE9, 0x23, 0x4E, 0xE4, 0xBE, 0x9A, 0x8F, 0x7A, 0x5C, 0xA3, 0x20,
158     0xD0, 0x86, 0x6B, 0x95, 0x78, 0x39, 0x59, 0x7A, 0x11, 0x2A, 0x5B, 0x87,
159     0xA4, 0xFB, 0x2F, 0x99, 0xD0, 0x57, 0xF5, 0xE1, 0xA3, 0xAF, 0x41, 0xD1,
160     0xCD, 0xA3, 0x94, 0xBB, 0xE5, 0x5A, 0x68, 0xE2, 0xEE, 0x69, 0x56, 0x51,
161     0xB2, 0xEE, 0xF2, 0xFE, 0x10, 0xC9, 0x55, 0xE3, 0x82, 0x3C, 0x50, 0x0D,
162     0xF5, 0x82, 0x73, 0xE4, 0xD6, 0x3E, 0x45, 0xB4, 0x89, 0x80, 0xE4, 0xF0,
163     0x99, 0x85, 0x2B, 0x4B, 0xF9, 0xB8, 0xFD, 0x2C, 0x3C, 0x49, 0x2E, 0xB3,
164     0x56, 0x7E, 0x99, 0x07, 0xD3, 0xF7, 0xD9, 0xE4, 0x0C, 0x64, 0xC5, 0x7D,
165     0x03, 0x8E, 0x05, 0x3C, 0x0A, 0x40, 0x17, 0xAD, 0xA8, 0x0F, 0x9B, 0xF4,
166     0x8B, 0xA7, 0xDB, 0x16, 0x4F, 0x4A, 0x57, 0x0B, 0x89, 0x80, 0x0B, 0x9F,
167     0x26, 0x56, 0x3F, 0x1D, 0xFA, 0x52, 0x2D, 0x1A, 0x9E, 0xDC, 0x42, 0xA3,
168     0x2E, 0xA9, 0x87, 0xE3, 0x8B, 0x45, 0x5E, 0xEE, 0x99, 0xB8, 0x30, 0x15,
169     0x58, 0xA3, 0x5F, 0xB5, 0x69, 0xD8, 0x0C, 0xE8, 0x6B, 0x36, 0xD8, 0xAB,
170     0xD8, 0xE4, 0x77, 0x46, 0x13, 0xA2, 0x15, 0xB3, 0x9C, 0xAD, 0x99, 0x91,
171     0xE5, 0xA3, 0x30, 0x7D, 0x40, 0x70, 0xB3, 0x32, 0x5E, 0xAF, 0x96, 0x8D,
172     0xE6, 0x3F, 0x47, 0xA3, 0x18, 0xDA, 0xE1, 0x9A, 0x20, 0x11, 0xE1, 0x49,
173     0x51, 0x45, 0xE3, 0x8C, 0xA5, 0x56, 0x39, 0x67, 0xCB, 0x9D, 0xCF, 0xBA,
174     0xF4, 0x46, 0x4E, 0x0A, 0xB6, 0x0B, 0xA9, 0xB4, 0xF6, 0xF1, 0x6A, 0xC8,
175     0x63, 0xE2, 0xB4, 0xB2, 0x9F, 0x44, 0xAA, 0x0A, 0xDA, 0x53, 0xF7, 0x52,
176     0x14, 0x57, 0xEE, 0x2C, 0x5D, 0x31, 0x9C, 0x27, 0x03, 0x64, 0x9E, 0xC0,
177     0x1E, 0x4B, 0x1B, 0x4F, 0xEE, 0xA6, 0x3F, 0xC1, 0x3E, 0x61, 0x93, 0x02,
178     0x01, 0x02, 0x04, 0x82, 0x01, 0x04, 0x02, 0x82, 0x01, 0x00, 0x7E, 0xC2,
179     0x04, 0xF9, 0x95, 0xC7, 0xEF, 0x96, 0xBE, 0xA0, 0x9D, 0x2D, 0xC3, 0x0C,
180     0x3A, 0x67, 0x02, 0x7C, 0x7D, 0x3B, 0xC9, 0xB1, 0xDE, 0x13, 0x97, 0x64,
181     0xEF, 0x87, 0x80, 0x4F, 0xBF, 0xA2, 0xAC, 0x18, 0x6B, 0xD5, 0xB2, 0x42,
182     0x0F, 0xDA, 0x28, 0x40, 0x93, 0x40, 0xB2, 0x1E, 0x80, 0xB0, 0x6C, 0xDE,
183     0x9C, 0x54, 0xA4, 0xB4, 0x68, 0x29, 0xE0, 0x13, 0x57, 0x1D, 0xC9, 0x87,
184     0xC0, 0xDE, 0x2F, 0x1D, 0x72, 0xF0, 0xC0, 0xE4, 0x4E, 0x04, 0x48, 0xF5,
185     0x2D, 0x8D, 0x9A, 0x1B, 0xE5, 0xEB, 0x06, 0xAB, 0x7C, 0x74, 0x10, 0x3C,
186     0xA8, 0x2D, 0x39, 0xBC, 0xE3, 0x15, 0x3E, 0x63, 0x37, 0x8C, 0x1B, 0xF1,
187     0xB3, 0x99, 0xB6, 0xAE, 0x5A, 0xEB, 0xB3, 0x3D, 0x30, 0x39, 0x69, 0xDB,
188     0xF2, 0x4F, 0x94, 0xB7, 0x71, 0xAF, 0xBA, 0x5C, 0x1F, 0xF8, 0x6B, 0xE5,
189     0xD1, 0xB1, 0x00, 0x81, 0xE2, 0x6D, 0xEC, 0x65, 0xF7, 0x7E, 0xCE, 0x03,
190     0x84, 0x68, 0x42, 0x6A, 0x8B, 0x47, 0x8E, 0x4A, 0x88, 0xDE, 0x82, 0xDD,
191     0xAF, 0xA9, 0x6F, 0x18, 0xF7, 0xC6, 0xE2, 0xB9, 0x97, 0xCE, 0x47, 0x8F,
192     0x85, 0x19, 0x61, 0x42, 0x67, 0x21, 0x7D, 0x13, 0x6E, 0xB5, 0x5A, 0x62,
193     0xF3, 0x08, 0xE2, 0x70, 0x3B, 0x0E, 0x85, 0x3C, 0xA1, 0xD3, 0xED, 0x7A,
194     0x43, 0xD6, 0xDE, 0x30, 0x5C, 0x48, 0xB2, 0x99, 0xAB, 0x3E, 0x65, 0xA6,
195     0x66, 0x80, 0x22, 0xFF, 0x92, 0xC1, 0x42, 0x1C, 0x30, 0x87, 0x74, 0x1E,
196     0x53, 0x57, 0x7C, 0xF8, 0x77, 0x51, 0xF1, 0x74, 0x16, 0xF4, 0x45, 0x26,
197     0x77, 0x0A, 0x05, 0x96, 0x13, 0x12, 0x06, 0x86, 0x2B, 0xB8, 0x49, 0x82,
198     0x69, 0x43, 0x0A, 0x57, 0xA7, 0x30, 0x19, 0x4C, 0xB8, 0x47, 0x82, 0x6E,
199     0x64, 0x7A, 0x06, 0x13, 0x5A, 0x82, 0x98, 0xD6, 0x7A, 0x09, 0xEC, 0x03,
200     0x8D, 0x03
201 };
202 #endif /* OPENSSL_NO_DH */
203 
204 #ifndef OPENSSL_NO_EC
205 /*
206  * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
207  * structure.
208  */
209 static const unsigned char kExampleECKeyDER[] = {
210     0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a,
211     0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08,
212     0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a,
213     0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
214     0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69,
215     0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c,
216     0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9,
217     0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18,
218     0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16,
219     0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22,
220     0xc1,
221 };
222 
223 /* P-384 sample EC private key in PKCS8 format (no public key) */
224 static const unsigned char kExampleECKey2DER[] = {
225     0x30, 0x4E, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x07, 0x2A, 0x86, 0x48,
226     0xCE, 0x3D, 0x02, 0x01, 0x06, 0x05, 0x2B, 0x81, 0x04, 0x00, 0x22, 0x04,
227     0x37, 0x30, 0x35, 0x02, 0x01, 0x01, 0x04, 0x30, 0x73, 0xE3, 0x3A, 0x05,
228     0xF2, 0xB6, 0x99, 0x6D, 0x0C, 0x33, 0x7F, 0x15, 0x9E, 0x10, 0xA9, 0x17,
229     0x4C, 0x0A, 0x82, 0x57, 0x71, 0x13, 0x7A, 0xAC, 0x46, 0xA2, 0x5E, 0x1C,
230     0xE0, 0xC7, 0xB2, 0xF8, 0x20, 0x40, 0xC2, 0x27, 0xC8, 0xBE, 0x02, 0x7E,
231     0x96, 0x69, 0xE0, 0x04, 0xCB, 0x89, 0x0B, 0x42
232 };
233 
234 static const unsigned char kExampleECXKey2DER[] = {
235     0x30, 0x2E, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e,
236     0x04, 0x22, 0x04, 0x20, 0xc8, 0xa9, 0xd5, 0xa9, 0x10, 0x91, 0xad, 0x85,
237     0x1c, 0x66, 0x8b, 0x07, 0x36, 0xc1, 0xc9, 0xa0, 0x29, 0x36, 0xc0, 0xd3,
238     0xad, 0x62, 0x67, 0x08, 0x58, 0x08, 0x80, 0x47, 0xba, 0x05, 0x74, 0x75
239 };
240 #endif
241 
242 typedef struct APK_DATA_st {
243     const unsigned char *kder;
244     size_t size;
245     int evptype;
246 } APK_DATA;
247 
248 static APK_DATA keydata[] = {
249     {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), EVP_PKEY_RSA},
250     {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), EVP_PKEY_RSA},
251 #ifndef OPENSSL_NO_EC
252     {kExampleECXKey2DER, sizeof(kExampleECXKey2DER), EVP_PKEY_X25519},
253     {kExampleECKeyDER, sizeof(kExampleECKeyDER), EVP_PKEY_EC},
254     {kExampleECKey2DER, sizeof(kExampleECKey2DER), EVP_PKEY_EC},
255 #endif
256 #ifndef OPENSSL_NO_DH
257     {kExampleDHPrivateKeyDER, sizeof(kExampleDHPrivateKeyDER), EVP_PKEY_DH},
258 #endif
259 };
260 
261 static int pkey_has_private(EVP_PKEY *key, const char *privtag,
262                             int use_octstring)
263 {
264     int ret = 0;
265 
266     if (use_octstring) {
267         unsigned char buf[64];
268 
269         ret = EVP_PKEY_get_octet_string_param(key, privtag, buf, sizeof(buf),
270                                               NULL);
271     } else {
272         BIGNUM *bn = NULL;
273 
274         ret = EVP_PKEY_get_bn_param(key, privtag, &bn);
275         BN_free(bn);
276     }
277     return ret;
278 }
279 
280 static int do_pkey_tofrom_data_select(EVP_PKEY *key, const char *keytype)
281 {
282     int ret = 0;
283     OSSL_PARAM *pub_params = NULL, *keypair_params = NULL;
284     EVP_PKEY *fromkey = NULL, *fromkeypair = NULL;
285     EVP_PKEY_CTX *fromctx = NULL;
286     const char *privtag = strcmp(keytype, "RSA") == 0 ? "d" : "priv";
287     const int use_octstring = strcmp(keytype, "X25519") == 0;
288 
289     /*
290      * Select only the public key component when using EVP_PKEY_todata() and
291      * check that the resulting param array does not contain a private key.
292      */
293     if (!TEST_int_eq(EVP_PKEY_todata(key, EVP_PKEY_PUBLIC_KEY, &pub_params), 1)
294         || !TEST_ptr_null(OSSL_PARAM_locate(pub_params, privtag)))
295         goto end;
296     /*
297      * Select the keypair when using EVP_PKEY_todata() and check that
298      * the param array contains a private key.
299      */
300     if (!TEST_int_eq(EVP_PKEY_todata(key, EVP_PKEY_KEYPAIR, &keypair_params), 1)
301         || !TEST_ptr(OSSL_PARAM_locate(keypair_params, privtag)))
302         goto end;
303 
304     /*
305      * Select only the public key when using EVP_PKEY_fromdata() and check that
306      * the resulting key does not contain a private key.
307      */
308     if (!TEST_ptr(fromctx = EVP_PKEY_CTX_new_from_name(mainctx, keytype, NULL))
309         || !TEST_int_eq(EVP_PKEY_fromdata_init(fromctx), 1)
310         || !TEST_int_eq(EVP_PKEY_fromdata(fromctx, &fromkey, EVP_PKEY_PUBLIC_KEY,
311                                           keypair_params), 1)
312         || !TEST_false(pkey_has_private(fromkey, privtag, use_octstring)))
313         goto end;
314     /*
315      * Select the keypair when using EVP_PKEY_fromdata() and check that
316      * the resulting key contains a private key.
317      */
318     if (!TEST_int_eq(EVP_PKEY_fromdata(fromctx, &fromkeypair,
319                                        EVP_PKEY_KEYPAIR, keypair_params), 1)
320         || !TEST_true(pkey_has_private(fromkeypair, privtag, use_octstring)))
321         goto end;
322     ret = 1;
323 end:
324     EVP_PKEY_free(fromkeypair);
325     EVP_PKEY_free(fromkey);
326     EVP_PKEY_CTX_free(fromctx);
327     OSSL_PARAM_free(keypair_params);
328     OSSL_PARAM_free(pub_params);
329     return ret;
330 }
331 
332 #ifndef OPENSSL_NO_DH
333 static int test_dh_tofrom_data_select(void)
334 {
335     int ret;
336     OSSL_PARAM params[2];
337     EVP_PKEY *key = NULL;
338     EVP_PKEY_CTX *gctx = NULL;
339 # ifndef OPENSSL_NO_DEPRECATED_3_0
340     const DH *dhkey;
341     const BIGNUM *privkey;
342 # endif
343 
344     params[0] = OSSL_PARAM_construct_utf8_string("group", "ffdhe2048", 0);
345     params[1] = OSSL_PARAM_construct_end();
346     ret = TEST_ptr(gctx = EVP_PKEY_CTX_new_from_name(mainctx, "DHX", NULL))
347           && TEST_int_gt(EVP_PKEY_keygen_init(gctx), 0)
348           && TEST_true(EVP_PKEY_CTX_set_params(gctx, params))
349           && TEST_int_gt(EVP_PKEY_generate(gctx, &key), 0)
350           && TEST_true(do_pkey_tofrom_data_select(key, "DHX"));
351 # ifndef OPENSSL_NO_DEPRECATED_3_0
352     ret = ret && TEST_ptr(dhkey = EVP_PKEY_get0_DH(key))
353               && TEST_ptr(privkey = DH_get0_priv_key(dhkey))
354               && TEST_int_le(BN_num_bits(privkey), 225);
355 # endif
356     EVP_PKEY_free(key);
357     EVP_PKEY_CTX_free(gctx);
358     return ret;
359 }
360 
361 static int test_dh_paramgen(void)
362 {
363     int ret;
364     OSSL_PARAM params[3];
365     EVP_PKEY *pkey = NULL;
366     EVP_PKEY_CTX *gctx = NULL;
367     unsigned int pbits = 512; /* minimum allowed for speed */
368 
369     params[0] = OSSL_PARAM_construct_uint(OSSL_PKEY_PARAM_FFC_PBITS, &pbits);
370     params[1] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE,
371                                                  "generator", 0);
372     params[2] = OSSL_PARAM_construct_end();
373 
374     ret = TEST_ptr(gctx = EVP_PKEY_CTX_new_from_name(mainctx, "DH", NULL))
375           && TEST_int_gt(EVP_PKEY_paramgen_init(gctx), 0)
376           && TEST_true(EVP_PKEY_CTX_set_params(gctx, params))
377           && TEST_true(EVP_PKEY_paramgen(gctx, &pkey))
378           && TEST_ptr(pkey);
379 
380     EVP_PKEY_CTX_free(gctx);
381     gctx = NULL;
382 
383     ret = ret && TEST_ptr(gctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, NULL))
384               && TEST_int_eq(EVP_PKEY_param_check(gctx), 1)
385               && TEST_int_eq(EVP_PKEY_param_check_quick(gctx), 1);
386 
387     EVP_PKEY_CTX_free(gctx);
388     EVP_PKEY_free(pkey);
389     return ret;
390 }
391 
392 #endif
393 
394 #ifndef OPENSSL_NO_EC
395 static int test_ec_tofrom_data_select(void)
396 {
397     int ret;
398     EVP_PKEY *key = NULL;
399 
400     ret = TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "EC", "P-256"))
401           && TEST_true(do_pkey_tofrom_data_select(key, "EC"));
402     EVP_PKEY_free(key);
403     return ret;
404 }
405 
406 static int test_ecx_tofrom_data_select(void)
407 {
408     int ret;
409     EVP_PKEY *key = NULL;
410 
411     ret = TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "X25519"))
412           && TEST_true(do_pkey_tofrom_data_select(key, "X25519"));
413     EVP_PKEY_free(key);
414     return ret;
415 }
416 #endif
417 
418 #ifndef OPENSSL_NO_SM2
419 static int test_sm2_tofrom_data_select(void)
420 {
421     int ret;
422     EVP_PKEY *key = NULL;
423 
424     ret = TEST_ptr(key = EVP_PKEY_Q_keygen(mainctx, NULL, "SM2"))
425           && TEST_true(do_pkey_tofrom_data_select(key, "SM2"));
426     EVP_PKEY_free(key);
427     return ret;
428 }
429 #endif
430 
431 static int test_rsa_tofrom_data_select(void)
432 {
433     int ret;
434     EVP_PKEY *key = NULL;
435     const unsigned char *pdata = kExampleRSAKeyDER;
436     int pdata_len = sizeof(kExampleRSAKeyDER);
437 
438     ret = TEST_ptr(key = d2i_AutoPrivateKey_ex(NULL, &pdata, pdata_len,
439                                                mainctx, NULL))
440           && TEST_true(do_pkey_tofrom_data_select(key, "RSA"));
441     EVP_PKEY_free(key);
442     return ret;
443 }
444 
445 /* This is the equivalent of test_d2i_AutoPrivateKey in evp_extra_test */
446 static int test_d2i_AutoPrivateKey_ex(int i)
447 {
448     int ret = 0;
449     const unsigned char *p;
450     EVP_PKEY *pkey = NULL;
451     const APK_DATA *ak = &keydata[i];
452     const unsigned char *input = ak->kder;
453     size_t input_len = ak->size;
454     int expected_id = ak->evptype;
455     BIGNUM *p_bn = NULL;
456     BIGNUM *g_bn = NULL;
457     BIGNUM *priv_bn = NULL;
458 
459     p = input;
460     if (!TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &p, input_len, mainctx,
461                                                NULL))
462             || !TEST_ptr_eq(p, input + input_len)
463             || !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
464         goto done;
465 
466     if (ak->evptype == EVP_PKEY_RSA) {
467         if (!TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_RSA_D,
468                                              &priv_bn)))
469             goto done;
470     } else if (ak->evptype == EVP_PKEY_X25519) {
471         unsigned char buffer[32];
472         size_t len;
473 
474         if (!TEST_true(EVP_PKEY_get_octet_string_param(pkey,
475                                                        OSSL_PKEY_PARAM_PRIV_KEY,
476                                                        buffer, sizeof(buffer),
477                                                        &len)))
478             goto done;
479     } else {
480         if (!TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_PRIV_KEY,
481                                              &priv_bn)))
482             goto done;
483     }
484 
485     if (ak->evptype == EVP_PKEY_DH) {
486         if (!TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_FFC_P, &p_bn))
487             || !TEST_true(EVP_PKEY_get_bn_param(pkey, OSSL_PKEY_PARAM_FFC_G,
488                                                 &g_bn)))
489             goto done;
490     }
491 
492     ret = 1;
493 done:
494     BN_free(p_bn);
495     BN_free(g_bn);
496     BN_free(priv_bn);
497     EVP_PKEY_free(pkey);
498     return ret;
499 }
500 
501 #ifndef OPENSSL_NO_DES
502 static int test_pkcs8key_nid_bio(void)
503 {
504     int ret;
505     const int nid = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
506     static const char pwd[] = "PASSWORD";
507     EVP_PKEY *pkey = NULL, *pkey_dec = NULL;
508     BIO *in = NULL, *enc_bio = NULL;
509     char *enc_data = NULL;
510     long enc_datalen = 0;
511     OSSL_PROVIDER *provider = NULL;
512 
513     ret = TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default"))
514           && TEST_ptr(enc_bio = BIO_new(BIO_s_mem()))
515           && TEST_ptr(in = BIO_new_mem_buf(kExampleRSAKeyPKCS8,
516                                            sizeof(kExampleRSAKeyPKCS8)))
517           && TEST_ptr(pkey = d2i_PrivateKey_ex_bio(in, NULL, NULL, NULL))
518           && TEST_int_eq(i2d_PKCS8PrivateKey_nid_bio(enc_bio, pkey, nid,
519                                                      pwd, sizeof(pwd) - 1,
520                                                      NULL, NULL), 1)
521           && TEST_int_gt(enc_datalen = BIO_get_mem_data(enc_bio, &enc_data), 0)
522           && TEST_ptr(pkey_dec = d2i_PKCS8PrivateKey_bio(enc_bio, NULL, NULL,
523                                                          (void *)pwd))
524           && TEST_true(EVP_PKEY_eq(pkey, pkey_dec));
525 
526     EVP_PKEY_free(pkey_dec);
527     EVP_PKEY_free(pkey);
528     BIO_free(in);
529     BIO_free(enc_bio);
530     OSSL_PROVIDER_unload(provider);
531     return ret;
532 }
533 #endif /* OPENSSL_NO_DES */
534 
535 static int test_alternative_default(void)
536 {
537     OSSL_LIB_CTX *oldctx;
538     EVP_MD *sha256;
539     int ok = 0;
540 
541     /*
542      * setup_tests() loaded the "null" provider in the current default, so
543      * we know this fetch should fail.
544      */
545     if (!TEST_ptr_null(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL)))
546         goto err;
547 
548     /*
549      * Now we switch to our main library context, and try again.  Since no
550      * providers are loaded in this one, it should fall back to the default.
551      */
552     if (!TEST_ptr(oldctx = OSSL_LIB_CTX_set0_default(mainctx))
553         || !TEST_ptr(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL)))
554         goto err;
555     EVP_MD_free(sha256);
556     sha256 = NULL;
557 
558     /*
559      * Switching back should give us our main library context back, and
560      * fetching SHA2-256 should fail again.
561      */
562     if (!TEST_ptr_eq(OSSL_LIB_CTX_set0_default(oldctx), mainctx)
563         || !TEST_ptr_null(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL)))
564         goto err;
565 
566     ok = 1;
567  err:
568     EVP_MD_free(sha256);
569     return ok;
570 }
571 
572 static int test_provider_unload_effective(int testid)
573 {
574     EVP_MD *sha256 = NULL;
575     OSSL_PROVIDER *provider = NULL;
576     int ok = 0;
577 
578     if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default"))
579         || !TEST_ptr(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL)))
580         goto err;
581 
582     if (testid > 0) {
583         OSSL_PROVIDER_unload(provider);
584         provider = NULL;
585         EVP_MD_free(sha256);
586         sha256 = NULL;
587     } else {
588         EVP_MD_free(sha256);
589         sha256 = NULL;
590         OSSL_PROVIDER_unload(provider);
591         provider = NULL;
592     }
593 
594     /*
595      * setup_tests() loaded the "null" provider in the current default, and
596      * we unloaded it above after the load so we know this fetch should fail.
597      */
598     if (!TEST_ptr_null(sha256 = EVP_MD_fetch(NULL, "SHA2-256", NULL)))
599         goto err;
600 
601     ok = 1;
602  err:
603     EVP_MD_free(sha256);
604     OSSL_PROVIDER_unload(provider);
605     return ok;
606 }
607 
608 static int test_d2i_PrivateKey_ex(int testid)
609 {
610     int ok = 0;
611     OSSL_PROVIDER *provider = NULL;
612     BIO *key_bio = NULL;
613     EVP_PKEY *pkey = NULL;
614     int id = (testid == 0) ? 0 : 2;
615 
616     if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default")))
617         goto err;
618     if (!TEST_ptr(key_bio = BIO_new_mem_buf(keydata[id].kder, keydata[id].size)))
619         goto err;
620     if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL)))
621         goto err;
622 
623     ERR_clear_error();
624     if (!TEST_int_ge(BIO_seek(key_bio, 0), 0))
625         goto err;
626     ok = TEST_ptr(pkey = d2i_PrivateKey_bio(key_bio, NULL));
627     TEST_int_eq(ERR_peek_error(), 0);
628     test_openssl_errors();
629 
630  err:
631     EVP_PKEY_free(pkey);
632     BIO_free(key_bio);
633     OSSL_PROVIDER_unload(provider);
634 
635     return ok;
636 }
637 
638 static int test_PEM_read_bio_negative(int testid)
639 {
640     int ok = 0;
641     OSSL_PROVIDER *provider = NULL;
642     BIO *key_bio = NULL;
643     EVP_PKEY *pkey = NULL;
644 
645     if (!TEST_ptr(key_bio = BIO_new_mem_buf(keydata[testid].kder, keydata[testid].size)))
646         goto err;
647     ERR_clear_error();
648     if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL)))
649         goto err;
650     if (!TEST_int_ne(ERR_peek_error(), 0))
651         goto err;
652     if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default")))
653         goto err;
654     if (!TEST_int_ge(BIO_seek(key_bio, 0), 0))
655         goto err;
656     ERR_clear_error();
657     if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL)))
658         goto err;
659     if (!TEST_int_ne(ERR_peek_error(), 0))
660         goto err;
661 
662     ok = 1;
663 
664  err:
665     test_openssl_errors();
666     EVP_PKEY_free(pkey);
667     BIO_free(key_bio);
668     OSSL_PROVIDER_unload(provider);
669 
670     return ok;
671 }
672 
673 static int test_PEM_read_bio_negative_wrong_password(int testid)
674 {
675     int ok = 0;
676     OSSL_PROVIDER *provider = OSSL_PROVIDER_load(NULL, "default");
677     EVP_PKEY *read_pkey = NULL;
678     EVP_PKEY *write_pkey = EVP_RSA_gen(1024);
679     BIO *key_bio = BIO_new(BIO_s_mem());
680     const UI_METHOD *undo_ui_method = NULL;
681     const UI_METHOD *ui_method = NULL;
682     if (testid > 0)
683         ui_method = UI_null();
684 
685     if (!TEST_ptr(provider))
686         goto err;
687     if (!TEST_ptr(key_bio))
688         goto err;
689     if (!TEST_ptr(write_pkey))
690         goto err;
691     undo_ui_method = UI_get_default_method();
692     UI_set_default_method(ui_method);
693 
694     if (/* Output Encrypted private key in PEM form */
695         !TEST_true(PEM_write_bio_PrivateKey(key_bio, write_pkey, EVP_aes_256_cbc(),
696                                            NULL, 0, NULL, "pass")))
697         goto err;
698 
699     ERR_clear_error();
700     read_pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL);
701     if (!TEST_ptr_null(read_pkey))
702         goto err;
703 
704     if (!TEST_int_eq(ERR_GET_REASON(ERR_get_error()), PEM_R_PROBLEMS_GETTING_PASSWORD))
705         goto err;
706     ok = 1;
707 
708  err:
709     test_openssl_errors();
710     EVP_PKEY_free(read_pkey);
711     EVP_PKEY_free(write_pkey);
712     BIO_free(key_bio);
713     OSSL_PROVIDER_unload(provider);
714     UI_set_default_method(undo_ui_method);
715 
716     return ok;
717 }
718 
719 static int do_fromdata_key_is_equal(const OSSL_PARAM params[],
720                                     const EVP_PKEY *expected, const char *type)
721 {
722     EVP_PKEY_CTX *ctx = NULL;
723     EVP_PKEY *pkey = NULL;
724     int ret;
725 
726     ret = TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(mainctx, type, NULL))
727           && TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
728           && TEST_int_eq(EVP_PKEY_fromdata(ctx, &pkey,
729                                            EVP_PKEY_KEYPAIR,
730                                            (OSSL_PARAM *)params), 1)
731           && TEST_true(EVP_PKEY_eq(pkey, expected));
732     EVP_PKEY_CTX_free(ctx);
733     EVP_PKEY_free(pkey);
734     return ret;
735 }
736 
737 #ifndef OPENSSL_NO_DSA
738 /*
739  * This data was generated using:
740  * > openssl genpkey \
741  *   -genparam -algorithm DSA -pkeyopt type:fips186_4 -text \
742  *   -pkeyopt gindex:5 -out dsa_param.pem
743  * > openssl genpkey \
744  *   -paramfile dsa_param.pem -pkeyopt type:fips186_4 -out dsa_priv.pem
745  */
746 static const unsigned char dsa_key[] = {
747     0x30, 0x82, 0x03, 0x4e, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
748     0xda, 0xb3, 0x46, 0x4d, 0x54, 0x57, 0xc7, 0xb4, 0x61, 0xa0, 0x6f, 0x66,
749     0x17, 0xda, 0xeb, 0x90, 0xf0, 0xa3, 0xd1, 0x29, 0xc9, 0x5f, 0xf2, 0x21,
750     0x3d, 0x85, 0xa3, 0x4a, 0xf0, 0xf8, 0x36, 0x39, 0x1b, 0xe3, 0xee, 0x37,
751     0x70, 0x06, 0x9b, 0xe8, 0xe3, 0x0a, 0xd2, 0xf1, 0xf6, 0xc4, 0x42, 0x23,
752     0x1f, 0x74, 0x78, 0xc2, 0x16, 0xf5, 0xce, 0xd6, 0xab, 0xa0, 0xc6, 0xe8,
753     0x99, 0x3d, 0xf8, 0x8b, 0xfb, 0x47, 0xf8, 0x5e, 0x05, 0x68, 0x6d, 0x8b,
754     0xa8, 0xad, 0xa1, 0xc2, 0x3a, 0x4e, 0xe0, 0xad, 0xec, 0x38, 0x75, 0x21,
755     0x55, 0x22, 0xce, 0xa2, 0xe9, 0xe5, 0x3b, 0xd7, 0x44, 0xeb, 0x5a, 0x03,
756     0x59, 0xa0, 0xc5, 0x7a, 0x92, 0x59, 0x7d, 0x7a, 0x07, 0x80, 0xfc, 0x4e,
757     0xf8, 0x56, 0x7e, 0xf1, 0x06, 0xe0, 0xba, 0xb2, 0xe7, 0x5b, 0x22, 0x55,
758     0xee, 0x4b, 0x42, 0x61, 0x67, 0x2c, 0x43, 0x9a, 0x38, 0x2b, 0x17, 0xc2,
759     0x62, 0x12, 0x8b, 0x0b, 0x22, 0x8c, 0x0c, 0x1c, 0x1c, 0x92, 0xb1, 0xec,
760     0x70, 0xce, 0x0f, 0x8c, 0xff, 0x8d, 0x21, 0xf9, 0x19, 0x68, 0x4d, 0x32,
761     0x59, 0x78, 0x42, 0x1d, 0x0c, 0xc5, 0x1a, 0xcb, 0x28, 0xe2, 0xc1, 0x1a,
762     0x35, 0xf1, 0x42, 0x0a, 0x19, 0x39, 0xfa, 0x83, 0xd1, 0xb4, 0xaa, 0x69,
763     0x0f, 0xc2, 0x8e, 0xf9, 0x59, 0x2c, 0xee, 0x11, 0xfc, 0x3e, 0x4b, 0x44,
764     0xfb, 0x9a, 0x32, 0xc8, 0x78, 0x23, 0x56, 0x85, 0x49, 0x21, 0x43, 0x12,
765     0x79, 0xbd, 0xa0, 0x70, 0x47, 0x2f, 0xae, 0xb6, 0xd7, 0x6c, 0xc6, 0x07,
766     0x76, 0xa9, 0x8a, 0xa2, 0x16, 0x02, 0x89, 0x1f, 0x1a, 0xd1, 0xa2, 0x96,
767     0x56, 0xd1, 0x1f, 0x10, 0xe1, 0xe5, 0x9f, 0x3f, 0xdd, 0x09, 0x0c, 0x40,
768     0x90, 0x71, 0xef, 0x14, 0x41, 0x02, 0x82, 0x3a, 0x6b, 0xe1, 0xf8, 0x2c,
769     0x5d, 0xbe, 0xfd, 0x1b, 0x02, 0x1d, 0x00, 0xe0, 0x20, 0xe0, 0x7c, 0x02,
770     0x16, 0xa7, 0x6c, 0x6a, 0x19, 0xba, 0xd5, 0x83, 0x73, 0xf3, 0x7d, 0x31,
771     0xef, 0xa7, 0xe1, 0x5d, 0x5b, 0x7f, 0xf3, 0xfc, 0xda, 0x84, 0x31, 0x02,
772     0x82, 0x01, 0x01, 0x00, 0x83, 0xdb, 0xa1, 0xbc, 0x3e, 0xc7, 0x29, 0xa5,
773     0x6a, 0x5c, 0x2c, 0xe8, 0x7a, 0x8c, 0x7e, 0xe8, 0xb8, 0x3e, 0x13, 0x47,
774     0xcd, 0x36, 0x7e, 0x79, 0x30, 0x7a, 0x28, 0x03, 0xd3, 0xd4, 0xd2, 0xe3,
775     0xee, 0x3b, 0x46, 0xda, 0xe0, 0x71, 0xe6, 0xcf, 0x46, 0x86, 0x0a, 0x37,
776     0x57, 0xb6, 0xe9, 0xcf, 0xa1, 0x78, 0x19, 0xb8, 0x72, 0x9f, 0x30, 0x8c,
777     0x2a, 0x04, 0x7c, 0x2f, 0x0c, 0x27, 0xa7, 0xb3, 0x23, 0xe0, 0x46, 0xf2,
778     0x75, 0x0c, 0x03, 0x4c, 0xad, 0xfb, 0xc1, 0xcb, 0x28, 0xcd, 0xa0, 0x63,
779     0xdb, 0x44, 0x88, 0xe0, 0xda, 0x6c, 0x5b, 0x89, 0xb2, 0x5b, 0x40, 0x6d,
780     0xeb, 0x78, 0x7a, 0xd5, 0xaf, 0x40, 0x52, 0x46, 0x63, 0x92, 0x13, 0x0d,
781     0xee, 0xee, 0xf9, 0x53, 0xca, 0x2d, 0x4e, 0x3b, 0x13, 0xd8, 0x0f, 0x50,
782     0xd0, 0x44, 0x57, 0x67, 0x0f, 0x45, 0x8f, 0x21, 0x30, 0x97, 0x9e, 0x80,
783     0xd9, 0xd0, 0x91, 0xb7, 0xc9, 0x5a, 0x69, 0xda, 0xeb, 0xd5, 0xea, 0x37,
784     0xf6, 0xb3, 0xbe, 0x1f, 0x24, 0xf1, 0x55, 0x14, 0x28, 0x05, 0xb5, 0xd8,
785     0x84, 0x0f, 0x62, 0x85, 0xaa, 0xec, 0x77, 0x64, 0xfd, 0x80, 0x7c, 0x41,
786     0x00, 0x88, 0xa3, 0x79, 0x7d, 0x4f, 0x6f, 0xe3, 0x76, 0xf4, 0xb5, 0x97,
787     0xb7, 0xeb, 0x67, 0x28, 0xba, 0x07, 0x1a, 0x59, 0x32, 0xc1, 0x53, 0xd9,
788     0x05, 0x6b, 0x63, 0x93, 0xce, 0xa1, 0xd9, 0x7a, 0xb2, 0xff, 0x1c, 0x12,
789     0x0a, 0x9a, 0xe5, 0x51, 0x1e, 0xba, 0xfc, 0x95, 0x2e, 0x28, 0xa9, 0xfc,
790     0x4c, 0xed, 0x7b, 0x05, 0xca, 0x67, 0xe0, 0x2d, 0xd7, 0x54, 0xb3, 0x05,
791     0x1c, 0x23, 0x2b, 0x35, 0x2e, 0x19, 0x48, 0x59, 0x0e, 0x58, 0xa8, 0x01,
792     0x56, 0xfb, 0x78, 0x90, 0xba, 0x08, 0x77, 0x94, 0x45, 0x05, 0x13, 0xc7,
793     0x6b, 0x96, 0xd2, 0xa3, 0xa6, 0x01, 0x9f, 0x34, 0x02, 0x82, 0x01, 0x00,
794     0x16, 0x1a, 0xb4, 0x6d, 0x9f, 0x16, 0x6c, 0xcc, 0x91, 0x66, 0xfe, 0x30,
795     0xeb, 0x8e, 0x44, 0xba, 0x2b, 0x7a, 0xc9, 0xa8, 0x95, 0xf2, 0xa6, 0x38,
796     0xd8, 0xaf, 0x3e, 0x91, 0x68, 0xe8, 0x52, 0xf3, 0x97, 0x37, 0x70, 0xf2,
797     0x47, 0xa3, 0xf4, 0x62, 0x26, 0xf5, 0x3b, 0x71, 0x52, 0x50, 0x15, 0x9c,
798     0x6d, 0xa6, 0x6d, 0x92, 0x4c, 0x48, 0x76, 0x31, 0x54, 0x48, 0xa5, 0x99,
799     0x7a, 0xd4, 0x61, 0xf7, 0x21, 0x44, 0xe7, 0xd8, 0x82, 0xc3, 0x50, 0xd3,
800     0xd9, 0xd4, 0x66, 0x20, 0xab, 0x70, 0x4c, 0x97, 0x9b, 0x8d, 0xac, 0x1f,
801     0x78, 0x27, 0x1e, 0x47, 0xf8, 0x3b, 0xd1, 0x55, 0x73, 0xf3, 0xb4, 0x8e,
802     0x6d, 0x45, 0x40, 0x54, 0xc6, 0xd8, 0x95, 0x15, 0x27, 0xb7, 0x5f, 0x65,
803     0xaa, 0xcb, 0x24, 0xc9, 0x49, 0x87, 0x32, 0xad, 0xcb, 0xf8, 0x35, 0x63,
804     0x56, 0x72, 0x7c, 0x4e, 0x6c, 0xad, 0x5f, 0x26, 0x8c, 0xd2, 0x80, 0x41,
805     0xaf, 0x88, 0x23, 0x20, 0x03, 0xa4, 0xd5, 0x3c, 0x53, 0x54, 0xb0, 0x3d,
806     0xed, 0x0e, 0x9e, 0x53, 0x0a, 0x63, 0x5f, 0xfd, 0x28, 0x57, 0x09, 0x07,
807     0x73, 0xf4, 0x0c, 0xd4, 0x71, 0x5d, 0x6b, 0xa0, 0xd7, 0x86, 0x99, 0x29,
808     0x9b, 0xca, 0xfb, 0xcc, 0xd6, 0x2f, 0xfe, 0xbe, 0x94, 0xef, 0x1a, 0x0e,
809     0x55, 0x84, 0xa7, 0xaf, 0x7b, 0xfa, 0xed, 0x77, 0x61, 0x28, 0x22, 0xee,
810     0x6b, 0x11, 0xdd, 0xb0, 0x17, 0x1e, 0x06, 0xe4, 0x29, 0x4c, 0xc2, 0x3f,
811     0xd6, 0x75, 0xb6, 0x08, 0x04, 0x55, 0x13, 0x48, 0x4f, 0x44, 0xea, 0x8d,
812     0xaf, 0xcb, 0xac, 0x22, 0xc4, 0x6a, 0xb3, 0x86, 0xe5, 0x47, 0xa9, 0xb5,
813     0x72, 0x17, 0x23, 0x11, 0x81, 0x7f, 0x00, 0x00, 0x67, 0x5c, 0xf4, 0x58,
814     0xcc, 0xe2, 0x46, 0xce, 0xf5, 0x6d, 0xd8, 0x18, 0x91, 0xc4, 0x20, 0xbf,
815     0x07, 0x48, 0x45, 0xfd, 0x02, 0x1c, 0x2f, 0x68, 0x44, 0xcb, 0xfb, 0x6b,
816     0xcb, 0x8d, 0x02, 0x49, 0x7c, 0xee, 0xd2, 0xa6, 0xd3, 0x43, 0xb8, 0xa4,
817     0x09, 0xb7, 0xc1, 0xd4, 0x4b, 0xc3, 0x66, 0xa7, 0xe0, 0x21,
818 };
819 static const unsigned char dsa_p[] = {
820     0x00, 0xda, 0xb3, 0x46, 0x4d, 0x54, 0x57, 0xc7, 0xb4, 0x61, 0xa0, 0x6f, 0x66, 0x17, 0xda,
821     0xeb, 0x90, 0xf0, 0xa3, 0xd1, 0x29, 0xc9, 0x5f, 0xf2, 0x21, 0x3d, 0x85, 0xa3, 0x4a, 0xf0,
822     0xf8, 0x36, 0x39, 0x1b, 0xe3, 0xee, 0x37, 0x70, 0x06, 0x9b, 0xe8, 0xe3, 0x0a, 0xd2, 0xf1,
823     0xf6, 0xc4, 0x42, 0x23, 0x1f, 0x74, 0x78, 0xc2, 0x16, 0xf5, 0xce, 0xd6, 0xab, 0xa0, 0xc6,
824     0xe8, 0x99, 0x3d, 0xf8, 0x8b, 0xfb, 0x47, 0xf8, 0x5e, 0x05, 0x68, 0x6d, 0x8b, 0xa8, 0xad,
825     0xa1, 0xc2, 0x3a, 0x4e, 0xe0, 0xad, 0xec, 0x38, 0x75, 0x21, 0x55, 0x22, 0xce, 0xa2, 0xe9,
826     0xe5, 0x3b, 0xd7, 0x44, 0xeb, 0x5a, 0x03, 0x59, 0xa0, 0xc5, 0x7a, 0x92, 0x59, 0x7d, 0x7a,
827     0x07, 0x80, 0xfc, 0x4e, 0xf8, 0x56, 0x7e, 0xf1, 0x06, 0xe0, 0xba, 0xb2, 0xe7, 0x5b, 0x22,
828     0x55, 0xee, 0x4b, 0x42, 0x61, 0x67, 0x2c, 0x43, 0x9a, 0x38, 0x2b, 0x17, 0xc2, 0x62, 0x12,
829     0x8b, 0x0b, 0x22, 0x8c, 0x0c, 0x1c, 0x1c, 0x92, 0xb1, 0xec, 0x70, 0xce, 0x0f, 0x8c, 0xff,
830     0x8d, 0x21, 0xf9, 0x19, 0x68, 0x4d, 0x32, 0x59, 0x78, 0x42, 0x1d, 0x0c, 0xc5, 0x1a, 0xcb,
831     0x28, 0xe2, 0xc1, 0x1a, 0x35, 0xf1, 0x42, 0x0a, 0x19, 0x39, 0xfa, 0x83, 0xd1, 0xb4, 0xaa,
832     0x69, 0x0f, 0xc2, 0x8e, 0xf9, 0x59, 0x2c, 0xee, 0x11, 0xfc, 0x3e, 0x4b, 0x44, 0xfb, 0x9a,
833     0x32, 0xc8, 0x78, 0x23, 0x56, 0x85, 0x49, 0x21, 0x43, 0x12, 0x79, 0xbd, 0xa0, 0x70, 0x47,
834     0x2f, 0xae, 0xb6, 0xd7, 0x6c, 0xc6, 0x07, 0x76, 0xa9, 0x8a, 0xa2, 0x16, 0x02, 0x89, 0x1f,
835     0x1a, 0xd1, 0xa2, 0x96, 0x56, 0xd1, 0x1f, 0x10, 0xe1, 0xe5, 0x9f, 0x3f, 0xdd, 0x09, 0x0c,
836     0x40, 0x90, 0x71, 0xef, 0x14, 0x41, 0x02, 0x82, 0x3a, 0x6b, 0xe1, 0xf8, 0x2c, 0x5d, 0xbe,
837     0xfd, 0x1b
838 };
839 static const unsigned char dsa_q[] = {
840     0x00, 0xe0, 0x20, 0xe0, 0x7c, 0x02, 0x16, 0xa7, 0x6c, 0x6a, 0x19, 0xba, 0xd5, 0x83, 0x73,
841     0xf3, 0x7d, 0x31, 0xef, 0xa7, 0xe1, 0x5d, 0x5b, 0x7f, 0xf3, 0xfc, 0xda, 0x84, 0x31
842 };
843 static const unsigned char dsa_g[] = {
844     0x00, 0x83, 0xdb, 0xa1, 0xbc, 0x3e, 0xc7, 0x29, 0xa5, 0x6a, 0x5c, 0x2c, 0xe8, 0x7a, 0x8c,
845     0x7e, 0xe8, 0xb8, 0x3e, 0x13, 0x47, 0xcd, 0x36, 0x7e, 0x79, 0x30, 0x7a, 0x28, 0x03, 0xd3,
846     0xd4, 0xd2, 0xe3, 0xee, 0x3b, 0x46, 0xda, 0xe0, 0x71, 0xe6, 0xcf, 0x46, 0x86, 0x0a, 0x37,
847     0x57, 0xb6, 0xe9, 0xcf, 0xa1, 0x78, 0x19, 0xb8, 0x72, 0x9f, 0x30, 0x8c, 0x2a, 0x04, 0x7c,
848     0x2f, 0x0c, 0x27, 0xa7, 0xb3, 0x23, 0xe0, 0x46, 0xf2, 0x75, 0x0c, 0x03, 0x4c, 0xad, 0xfb,
849     0xc1, 0xcb, 0x28, 0xcd, 0xa0, 0x63, 0xdb, 0x44, 0x88, 0xe0, 0xda, 0x6c, 0x5b, 0x89, 0xb2,
850     0x5b, 0x40, 0x6d, 0xeb, 0x78, 0x7a, 0xd5, 0xaf, 0x40, 0x52, 0x46, 0x63, 0x92, 0x13, 0x0d,
851     0xee, 0xee, 0xf9, 0x53, 0xca, 0x2d, 0x4e, 0x3b, 0x13, 0xd8, 0x0f, 0x50, 0xd0, 0x44, 0x57,
852     0x67, 0x0f, 0x45, 0x8f, 0x21, 0x30, 0x97, 0x9e, 0x80, 0xd9, 0xd0, 0x91, 0xb7, 0xc9, 0x5a,
853     0x69, 0xda, 0xeb, 0xd5, 0xea, 0x37, 0xf6, 0xb3, 0xbe, 0x1f, 0x24, 0xf1, 0x55, 0x14, 0x28,
854     0x05, 0xb5, 0xd8, 0x84, 0x0f, 0x62, 0x85, 0xaa, 0xec, 0x77, 0x64, 0xfd, 0x80, 0x7c, 0x41,
855     0x00, 0x88, 0xa3, 0x79, 0x7d, 0x4f, 0x6f, 0xe3, 0x76, 0xf4, 0xb5, 0x97, 0xb7, 0xeb, 0x67,
856     0x28, 0xba, 0x07, 0x1a, 0x59, 0x32, 0xc1, 0x53, 0xd9, 0x05, 0x6b, 0x63, 0x93, 0xce, 0xa1,
857     0xd9, 0x7a, 0xb2, 0xff, 0x1c, 0x12, 0x0a, 0x9a, 0xe5, 0x51, 0x1e, 0xba, 0xfc, 0x95, 0x2e,
858     0x28, 0xa9, 0xfc, 0x4c, 0xed, 0x7b, 0x05, 0xca, 0x67, 0xe0, 0x2d, 0xd7, 0x54, 0xb3, 0x05,
859     0x1c, 0x23, 0x2b, 0x35, 0x2e, 0x19, 0x48, 0x59, 0x0e, 0x58, 0xa8, 0x01, 0x56, 0xfb, 0x78,
860     0x90, 0xba, 0x08, 0x77, 0x94, 0x45, 0x05, 0x13, 0xc7, 0x6b, 0x96, 0xd2, 0xa3, 0xa6, 0x01,
861     0x9f, 0x34
862 };
863 static const unsigned char dsa_priv[] = {
864     0x2f, 0x68, 0x44, 0xcb, 0xfb, 0x6b, 0xcb, 0x8d, 0x02, 0x49, 0x7c, 0xee, 0xd2, 0xa6, 0xd3,
865     0x43, 0xb8, 0xa4, 0x09, 0xb7, 0xc1, 0xd4, 0x4b, 0xc3, 0x66, 0xa7, 0xe0, 0x21
866 };
867 static const unsigned char dsa_pub[] = {
868     0x16, 0x1a, 0xb4, 0x6d, 0x9f, 0x16, 0x6c, 0xcc, 0x91, 0x66, 0xfe, 0x30, 0xeb, 0x8e, 0x44,
869     0xba, 0x2b, 0x7a, 0xc9, 0xa8, 0x95, 0xf2, 0xa6, 0x38, 0xd8, 0xaf, 0x3e, 0x91, 0x68, 0xe8,
870     0x52, 0xf3, 0x97, 0x37, 0x70, 0xf2, 0x47, 0xa3, 0xf4, 0x62, 0x26, 0xf5, 0x3b, 0x71, 0x52,
871     0x50, 0x15, 0x9c, 0x6d, 0xa6, 0x6d, 0x92, 0x4c, 0x48, 0x76, 0x31, 0x54, 0x48, 0xa5, 0x99,
872     0x7a, 0xd4, 0x61, 0xf7, 0x21, 0x44, 0xe7, 0xd8, 0x82, 0xc3, 0x50, 0xd3, 0xd9, 0xd4, 0x66,
873     0x20, 0xab, 0x70, 0x4c, 0x97, 0x9b, 0x8d, 0xac, 0x1f, 0x78, 0x27, 0x1e, 0x47, 0xf8, 0x3b,
874     0xd1, 0x55, 0x73, 0xf3, 0xb4, 0x8e, 0x6d, 0x45, 0x40, 0x54, 0xc6, 0xd8, 0x95, 0x15, 0x27,
875     0xb7, 0x5f, 0x65, 0xaa, 0xcb, 0x24, 0xc9, 0x49, 0x87, 0x32, 0xad, 0xcb, 0xf8, 0x35, 0x63,
876     0x56, 0x72, 0x7c, 0x4e, 0x6c, 0xad, 0x5f, 0x26, 0x8c, 0xd2, 0x80, 0x41, 0xaf, 0x88, 0x23,
877     0x20, 0x03, 0xa4, 0xd5, 0x3c, 0x53, 0x54, 0xb0, 0x3d, 0xed, 0x0e, 0x9e, 0x53, 0x0a, 0x63,
878     0x5f, 0xfd, 0x28, 0x57, 0x09, 0x07, 0x73, 0xf4, 0x0c, 0xd4, 0x71, 0x5d, 0x6b, 0xa0, 0xd7,
879     0x86, 0x99, 0x29, 0x9b, 0xca, 0xfb, 0xcc, 0xd6, 0x2f, 0xfe, 0xbe, 0x94, 0xef, 0x1a, 0x0e,
880     0x55, 0x84, 0xa7, 0xaf, 0x7b, 0xfa, 0xed, 0x77, 0x61, 0x28, 0x22, 0xee, 0x6b, 0x11, 0xdd,
881     0xb0, 0x17, 0x1e, 0x06, 0xe4, 0x29, 0x4c, 0xc2, 0x3f, 0xd6, 0x75, 0xb6, 0x08, 0x04, 0x55,
882     0x13, 0x48, 0x4f, 0x44, 0xea, 0x8d, 0xaf, 0xcb, 0xac, 0x22, 0xc4, 0x6a, 0xb3, 0x86, 0xe5,
883     0x47, 0xa9, 0xb5, 0x72, 0x17, 0x23, 0x11, 0x81, 0x7f, 0x00, 0x00, 0x67, 0x5c, 0xf4, 0x58,
884     0xcc, 0xe2, 0x46, 0xce, 0xf5, 0x6d, 0xd8, 0x18, 0x91, 0xc4, 0x20, 0xbf, 0x07, 0x48, 0x45,
885     0xfd
886 };
887 
888 static int do_check_params(OSSL_PARAM key_params[], int expected)
889 {
890     EVP_PKEY_CTX *gen_ctx = NULL, *check_ctx = NULL;
891     EVP_PKEY *pkey = NULL;
892     int ret;
893 
894     ret = TEST_ptr(gen_ctx = EVP_PKEY_CTX_new_from_name(mainctx, "DSA", NULL))
895           && TEST_int_eq(EVP_PKEY_fromdata_init(gen_ctx), 1)
896           && TEST_int_eq(EVP_PKEY_fromdata(gen_ctx, &pkey,
897                                            EVP_PKEY_KEYPAIR, key_params), 1)
898           && TEST_ptr(check_ctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey,
899                                                         NULL))
900           && TEST_int_eq(EVP_PKEY_param_check(check_ctx), expected);
901     EVP_PKEY_CTX_free(check_ctx);
902     EVP_PKEY_CTX_free(gen_ctx);
903     EVP_PKEY_free(pkey);
904     return ret;
905 }
906 
907 static int do_check_bn(OSSL_PARAM params[], const char *key,
908                        const unsigned char *expected, size_t expected_len)
909 {
910     OSSL_PARAM *p;
911     BIGNUM *bn = NULL;
912     unsigned char buffer[256 + 1];
913     int ret, len;
914 
915     ret = TEST_ptr(p = OSSL_PARAM_locate(params, key))
916           && TEST_true(OSSL_PARAM_get_BN(p, &bn))
917           && TEST_int_gt(len = BN_bn2binpad(bn, buffer, expected_len), 0)
918           && TEST_mem_eq(expected, expected_len, buffer, len);
919     BN_free(bn);
920     return ret;
921 }
922 
923 static int do_check_int(OSSL_PARAM params[], const char *key, int expected)
924 {
925     OSSL_PARAM *p;
926     int val = 0;
927 
928     return TEST_ptr(p = OSSL_PARAM_locate(params, key))
929            && TEST_true(OSSL_PARAM_get_int(p, &val))
930            && TEST_int_eq(val, expected);
931 }
932 
933 static int test_dsa_tofrom_data_select(void)
934 {
935     int ret;
936     EVP_PKEY *key = NULL;
937     const unsigned char *pkeydata = dsa_key;
938 
939     ret = TEST_ptr(key = d2i_AutoPrivateKey_ex(NULL, &pkeydata, sizeof(dsa_key),
940                                                mainctx, NULL))
941           && TEST_true(do_pkey_tofrom_data_select(key, "DSA"));
942 
943     EVP_PKEY_free(key);
944     return ret;
945 }
946 
947 static int test_dsa_todata(void)
948 {
949     EVP_PKEY *pkey = NULL;
950     OSSL_PARAM *to_params = NULL, *all_params = NULL;
951     OSSL_PARAM gen_params[4];
952     int ret = 0;
953     const unsigned char *pkeydata = dsa_key;
954 
955     unsigned char dsa_seed[] = {
956         0xbc, 0x8a, 0x81, 0x64, 0x9e, 0x9d, 0x63, 0xa7, 0xa3, 0x5d, 0x87, 0xdd,
957         0x32, 0xf3, 0xc1, 0x9f, 0x18, 0x22, 0xeb, 0x73, 0x63, 0xad, 0x5e, 0x7b,
958         0x90, 0xc1, 0xe3, 0xe0
959     };
960     int dsa_pcounter = 319;
961     int dsa_gindex = 5;
962 
963     gen_params[0] = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_FFC_SEED,
964                                                       (void*)dsa_seed,
965                                                       sizeof(dsa_seed));
966     gen_params[1] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX,
967                                              &dsa_gindex);
968     gen_params[2] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_PCOUNTER,
969                                              &dsa_pcounter);
970     gen_params[3] = OSSL_PARAM_construct_end();
971 
972     if (!TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pkeydata, sizeof(dsa_key),
973                                                mainctx, NULL))
974         || !TEST_int_eq(EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &to_params), 1)
975         || !do_check_bn(to_params, OSSL_PKEY_PARAM_FFC_P, dsa_p, sizeof(dsa_p))
976         || !do_check_bn(to_params, OSSL_PKEY_PARAM_FFC_Q, dsa_q, sizeof(dsa_q))
977         || !do_check_bn(to_params, OSSL_PKEY_PARAM_FFC_G, dsa_g, sizeof(dsa_g))
978         || !do_check_bn(to_params, OSSL_PKEY_PARAM_PUB_KEY, dsa_pub,
979                         sizeof(dsa_pub))
980         || !do_check_bn(to_params, OSSL_PKEY_PARAM_PRIV_KEY, dsa_priv,
981                         sizeof(dsa_priv))
982         || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_GINDEX, -1)
983         || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_PCOUNTER, -1)
984         || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_H, 0)
985         || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_VALIDATE_PQ, 1)
986         || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_VALIDATE_G, 1)
987         || !do_check_int(to_params, OSSL_PKEY_PARAM_FFC_VALIDATE_LEGACY, 0)
988         || !TEST_ptr_null(OSSL_PARAM_locate(to_params, OSSL_PKEY_PARAM_FFC_SEED)))
989         goto err;
990 
991     if (!do_fromdata_key_is_equal(to_params, pkey, "DSA"))
992         goto err;
993 
994     if (!TEST_ptr(all_params = OSSL_PARAM_merge(to_params, gen_params))
995         || !do_check_params(all_params, 1))
996         goto err;
997     gen_params[1] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX,
998                                              &dsa_gindex);
999     gen_params[2] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_PCOUNTER,
1000                                              &dsa_pcounter);
1001     /*
1002      * Check that modifying the shallow copy values used in OSSL_PARAM_merge()
1003      * results in an invalid key. This also verifies that the fips186-4
1004      * validation code is running.
1005      */
1006     dsa_gindex++;
1007     if (!do_check_params(all_params, 0))
1008         goto err;
1009     dsa_gindex--;
1010     dsa_pcounter++;
1011     if (!do_check_params(all_params, 0))
1012         goto err;
1013     dsa_pcounter--;
1014     dsa_seed[0] = 0xb0;
1015     if (!do_check_params(all_params, 0))
1016         goto err;
1017 
1018     ret = 1;
1019 err:
1020     EVP_PKEY_free(pkey);
1021     OSSL_PARAM_free(all_params);
1022     OSSL_PARAM_free(to_params);
1023     return ret;
1024 }
1025 
1026 /*
1027  * Test that OSSL_PKEY_PARAM_FFC_DIGEST_PROPS is set properly when using fromdata
1028  * This test:
1029  *   checks for failure when the property query is bad (tstid == 0)
1030  *   checks for success when the property query is valid (tstid == 1)
1031  */
1032 static int test_dsa_fromdata_digest_prop(int tstid)
1033 {
1034     EVP_PKEY_CTX *ctx = NULL, *gctx = NULL;
1035     EVP_PKEY *pkey = NULL,  *pkey2 = NULL;
1036     OSSL_PARAM params[4], *p = params;
1037     int ret = 0;
1038     int expected = (tstid == 0 ? 0 : 1);
1039     unsigned int pbits = 512; /* minimum allowed for speed */
1040 
1041     *p++ = OSSL_PARAM_construct_uint(OSSL_PKEY_PARAM_FFC_PBITS, &pbits);
1042     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST, "SHA512", 0);
1043     /* Setting a bad prop query here should fail during paramgen - when it tries to do a fetch */
1044     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST_PROPS,
1045                                             tstid == 0 ? "provider=unknown" : "provider=default", 0);
1046     *p++ = OSSL_PARAM_construct_end();
1047 
1048     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(mainctx, "DSA", NULL))
1049         || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
1050         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEY_PARAMETERS, params), 1))
1051         goto err;
1052 
1053     if (!TEST_ptr(gctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, NULL))
1054         || !TEST_int_eq(EVP_PKEY_paramgen_init(gctx), 1)
1055         || !TEST_int_eq(EVP_PKEY_paramgen(gctx, &pkey2), expected))
1056         goto err;
1057 
1058     ret = 1;
1059 err:
1060     EVP_PKEY_free(pkey2);
1061     EVP_PKEY_free(pkey);
1062     EVP_PKEY_CTX_free(ctx);
1063     EVP_PKEY_CTX_free(gctx);
1064     return ret;
1065 }
1066 #endif /* OPENSSL_NO_DSA */
1067 
1068 static int test_pkey_todata_null(void)
1069 {
1070     OSSL_PARAM *params = NULL;
1071     EVP_PKEY *pkey = NULL;
1072     int ret = 0;
1073     const unsigned char *pdata = keydata[0].kder;
1074 
1075     ret = TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, keydata[0].size,
1076                                                 mainctx, NULL))
1077           && TEST_int_eq(EVP_PKEY_todata(NULL, EVP_PKEY_KEYPAIR, &params), 0)
1078           && TEST_int_eq(EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, NULL), 0);
1079     EVP_PKEY_free(pkey);
1080     return ret;
1081 }
1082 
1083 static OSSL_CALLBACK test_pkey_export_cb;
1084 
1085 static int test_pkey_export_cb(const OSSL_PARAM params[], void *arg)
1086 {
1087     if (arg == NULL)
1088         return 0;
1089     return do_fromdata_key_is_equal(params, (EVP_PKEY *)arg, "RSA");
1090 }
1091 
1092 static int test_pkey_export_null(void)
1093 {
1094     EVP_PKEY *pkey = NULL;
1095     int ret = 0;
1096     const unsigned char *pdata = keydata[0].kder;
1097 
1098     ret = TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, keydata[0].size,
1099                                                 mainctx, NULL))
1100           && TEST_int_eq(EVP_PKEY_export(NULL, EVP_PKEY_KEYPAIR,
1101                                          test_pkey_export_cb, NULL), 0)
1102           && TEST_int_eq(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR, NULL, NULL), 0);
1103     EVP_PKEY_free(pkey);
1104     return ret;
1105 }
1106 
1107 static int test_pkey_export(void)
1108 {
1109     EVP_PKEY *pkey = NULL;
1110 #ifndef OPENSSL_NO_DEPRECATED_3_0
1111     RSA *rsa = NULL;
1112 #endif
1113     int ret = 1;
1114     const unsigned char *pdata = keydata[0].kder;
1115     int pdata_len = keydata[0].size;
1116 
1117     if (!TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, pdata_len,
1118                                                mainctx, NULL))
1119         || !TEST_true(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR,
1120                                        test_pkey_export_cb, pkey))
1121         || !TEST_false(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR,
1122                                        test_pkey_export_cb, NULL)))
1123         ret = 0;
1124     EVP_PKEY_free(pkey);
1125 
1126 #ifndef OPENSSL_NO_DEPRECATED_3_0
1127     /* Now, try with a legacy key */
1128     pdata = keydata[0].kder;
1129     pdata_len = keydata[0].size;
1130     if (!TEST_ptr(rsa = d2i_RSAPrivateKey(NULL, &pdata, pdata_len))
1131         || !TEST_ptr(pkey = EVP_PKEY_new())
1132         || !TEST_true(EVP_PKEY_assign_RSA(pkey, rsa))
1133         || !TEST_true(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR,
1134                                       test_pkey_export_cb, pkey))
1135         || !TEST_false(EVP_PKEY_export(pkey, EVP_PKEY_KEYPAIR,
1136                                        test_pkey_export_cb, NULL)))
1137         ret = 0;
1138     EVP_PKEY_free(pkey);
1139 #endif
1140     return ret;
1141 }
1142 
1143 static int test_rsa_pss_sign(void)
1144 {
1145     EVP_PKEY *pkey = NULL;
1146     EVP_PKEY_CTX *pctx = NULL;
1147     int ret = 0;
1148     const unsigned char *pdata = keydata[0].kder;
1149     const char *mdname = "SHA2-256";
1150     OSSL_PARAM sig_params[3];
1151     unsigned char mdbuf[256 / 8] = { 0 };
1152     int padding = RSA_PKCS1_PSS_PADDING;
1153     unsigned char *sig = NULL;
1154     size_t sig_len = 0;
1155 
1156     sig_params[0] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_PAD_MODE,
1157                                              &padding);
1158     sig_params[1] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1159                                                      (char *)mdname, 0);
1160     sig_params[2] = OSSL_PARAM_construct_end();
1161 
1162     ret = TEST_ptr(pkey = d2i_AutoPrivateKey_ex(NULL, &pdata, keydata[0].size,
1163                                                 mainctx, NULL))
1164           && TEST_ptr(pctx = EVP_PKEY_CTX_new_from_pkey(mainctx, pkey, NULL))
1165           && TEST_int_gt(EVP_PKEY_sign_init_ex(pctx, sig_params), 0)
1166           && TEST_int_gt(EVP_PKEY_sign(pctx, NULL, &sig_len, mdbuf,
1167                                        sizeof(mdbuf)), 0)
1168           && TEST_int_gt(sig_len, 0)
1169           && TEST_ptr(sig = OPENSSL_malloc(sig_len))
1170           && TEST_int_gt(EVP_PKEY_sign(pctx, sig, &sig_len, mdbuf,
1171                                        sizeof(mdbuf)), 0);
1172 
1173     EVP_PKEY_CTX_free(pctx);
1174     OPENSSL_free(sig);
1175     EVP_PKEY_free(pkey);
1176 
1177     return ret;
1178 }
1179 
1180 static int test_evp_md_ctx_copy(void)
1181 {
1182     EVP_MD_CTX *mdctx = NULL;
1183     EVP_MD_CTX *copyctx = NULL;
1184     int ret;
1185 
1186     /* test copying freshly initialized context */
1187     ret = TEST_ptr(mdctx = EVP_MD_CTX_new())
1188           && TEST_ptr(copyctx = EVP_MD_CTX_new())
1189           && TEST_true(EVP_MD_CTX_copy_ex(copyctx, mdctx));
1190 
1191     EVP_MD_CTX_free(mdctx);
1192     EVP_MD_CTX_free(copyctx);
1193     return ret;
1194 }
1195 
1196 #if !defined OPENSSL_NO_DES && !defined OPENSSL_NO_MD5
1197 static int test_evp_pbe_alg_add(void)
1198 {
1199     int ret = 0;
1200     int cipher_nid = 0, md_nid = 0;
1201     EVP_PBE_KEYGEN_EX *keygen_ex = NULL;
1202     EVP_PBE_KEYGEN *keygen = NULL;
1203 
1204     if (!TEST_true(EVP_PBE_alg_add(NID_pbeWithMD5AndDES_CBC, EVP_des_cbc(), EVP_md5(),
1205                                    PKCS5_PBE_keyivgen)))
1206         goto err;
1207 
1208     if (!TEST_true(EVP_PBE_find_ex(EVP_PBE_TYPE_OUTER, NID_pbeWithMD5AndDES_CBC,
1209                                    &cipher_nid, &md_nid, &keygen, &keygen_ex)))
1210         goto err;
1211 
1212     if (!TEST_true(keygen != NULL))
1213         goto err;
1214     if (!TEST_true(keygen_ex == NULL))
1215         goto err;
1216 
1217     ret = 1;
1218 
1219 err:
1220     return ret;
1221 }
1222 #endif
1223 
1224 /*
1225  * Currently, EVP_<OBJ>_fetch doesn't support
1226  * colon separated alternative names for lookup
1227  * so add a test here to ensure that when one is provided
1228  * libcrypto returns an error
1229  */
1230 static int evp_test_name_parsing(void)
1231 {
1232     EVP_MD *md;
1233 
1234     if (!TEST_ptr_null(md = EVP_MD_fetch(mainctx, "SHA256:BogusName", NULL))) {
1235         EVP_MD_free(md);
1236         return 0;
1237     }
1238 
1239     return 1;
1240 }
1241 
1242 int setup_tests(void)
1243 {
1244     if (!test_get_libctx(&mainctx, &nullprov, NULL, NULL, NULL)) {
1245         OSSL_LIB_CTX_free(mainctx);
1246         mainctx = NULL;
1247         return 0;
1248     }
1249 
1250     ADD_TEST(evp_test_name_parsing);
1251     ADD_TEST(test_alternative_default);
1252     ADD_ALL_TESTS(test_d2i_AutoPrivateKey_ex, OSSL_NELEM(keydata));
1253 #ifndef OPENSSL_NO_EC
1254     ADD_ALL_TESTS(test_d2i_PrivateKey_ex, 2);
1255     ADD_TEST(test_ec_tofrom_data_select);
1256     ADD_TEST(test_ecx_tofrom_data_select);
1257 #else
1258     ADD_ALL_TESTS(test_d2i_PrivateKey_ex, 1);
1259 #endif
1260 #ifndef OPENSSL_NO_SM2
1261     ADD_TEST(test_sm2_tofrom_data_select);
1262 #endif
1263 #ifndef OPENSSL_NO_DSA
1264     ADD_TEST(test_dsa_todata);
1265     ADD_TEST(test_dsa_tofrom_data_select);
1266     ADD_ALL_TESTS(test_dsa_fromdata_digest_prop, 2);
1267 #endif
1268 #ifndef OPENSSL_NO_DH
1269     ADD_TEST(test_dh_tofrom_data_select);
1270     ADD_TEST(test_dh_paramgen);
1271 #endif
1272     ADD_TEST(test_rsa_tofrom_data_select);
1273 
1274     ADD_TEST(test_pkey_todata_null);
1275     ADD_TEST(test_pkey_export_null);
1276     ADD_TEST(test_pkey_export);
1277 #ifndef OPENSSL_NO_DES
1278     ADD_TEST(test_pkcs8key_nid_bio);
1279 #endif
1280     ADD_ALL_TESTS(test_PEM_read_bio_negative, OSSL_NELEM(keydata));
1281     ADD_ALL_TESTS(test_PEM_read_bio_negative_wrong_password, 2);
1282     ADD_TEST(test_rsa_pss_sign);
1283     ADD_TEST(test_evp_md_ctx_copy);
1284     ADD_ALL_TESTS(test_provider_unload_effective, 2);
1285 #if !defined OPENSSL_NO_DES && !defined OPENSSL_NO_MD5
1286     ADD_TEST(test_evp_pbe_alg_add);
1287 #endif
1288     return 1;
1289 }
1290 
1291 void cleanup_tests(void)
1292 {
1293     OSSL_LIB_CTX_free(mainctx);
1294     OSSL_PROVIDER_unload(nullprov);
1295 }
1296