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