]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/evp_extra_test.c
Add a test for an all 0 RSA key
[thirdparty/openssl.git] / test / evp_extra_test.c
1 /*
2 * Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /* We need to use some deprecated APIs */
11 #define OPENSSL_SUPPRESS_DEPRECATED
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <openssl/bio.h>
17 #include <openssl/conf.h>
18 #include <openssl/crypto.h>
19 #include <openssl/err.h>
20 #include <openssl/evp.h>
21 #include <openssl/x509.h>
22 #include <openssl/pem.h>
23 #include <openssl/kdf.h>
24 #include <openssl/provider.h>
25 #include <openssl/core_names.h>
26 #include <openssl/params.h>
27 #include <openssl/param_build.h>
28 #include <openssl/dsa.h>
29 #include <openssl/dh.h>
30 #include <openssl/aes.h>
31 #include <openssl/decoder.h>
32 #include <openssl/rsa.h>
33 #include <openssl/engine.h>
34 #include "testutil.h"
35 #include "internal/nelem.h"
36 #include "internal/sizes.h"
37 #include "crypto/evp.h"
38
39 static OSSL_LIB_CTX *testctx = NULL;
40 static char *testpropq = NULL;
41
42 static OSSL_PROVIDER *nullprov = NULL;
43 static OSSL_PROVIDER *deflprov = NULL;
44 static OSSL_PROVIDER *lgcyprov = NULL;
45
46 /*
47 * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
48 * should never use this key anywhere but in an example.
49 */
50 static const unsigned char kExampleRSAKeyDER[] = {
51 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8,
52 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59,
53 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37,
54 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71,
55 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a,
56 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4,
57 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec,
58 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76,
59 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8,
60 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7,
61 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c,
62 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01,
63 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7,
64 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85,
65 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee,
66 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85,
67 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a,
68 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15,
69 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83,
70 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b,
71 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73,
72 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99,
73 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02,
74 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41,
75 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59,
76 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9,
77 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef,
78 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87,
79 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf,
80 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5,
81 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5,
82 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62,
83 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64,
84 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8,
85 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba,
86 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe,
87 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7,
88 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe,
89 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb,
90 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34,
91 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27,
92 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0,
93 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba,
94 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06,
95 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c,
96 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e,
97 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf,
98 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a,
99 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17,
100 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1,
101 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
102 };
103
104 /*
105 * kExampleDSAKeyDER is a DSA private key in ASN.1, DER format. Of course, you
106 * should never use this key anywhere but in an example.
107 */
108 #ifndef OPENSSL_NO_DSA
109 static const unsigned char kExampleDSAKeyDER[] = {
110 0x30, 0x82, 0x01, 0xba, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0x9a,
111 0x05, 0x6d, 0x33, 0xcd, 0x5d, 0x78, 0xa1, 0xbb, 0xcb, 0x7d, 0x5b, 0x8d,
112 0xb4, 0xcc, 0xbf, 0x03, 0x99, 0x64, 0xde, 0x38, 0x78, 0x06, 0x15, 0x2f,
113 0x86, 0x26, 0x77, 0xf3, 0xb1, 0x85, 0x00, 0xed, 0xfc, 0x28, 0x3a, 0x42,
114 0x4d, 0xab, 0xab, 0xdf, 0xbc, 0x9c, 0x16, 0xd0, 0x22, 0x50, 0xd1, 0x38,
115 0xdd, 0x3f, 0x64, 0x05, 0x9e, 0x68, 0x7a, 0x1e, 0xf1, 0x56, 0xbf, 0x1e,
116 0x2c, 0xc5, 0x97, 0x2a, 0xfe, 0x7a, 0x22, 0xdc, 0x6c, 0x68, 0xb8, 0x2e,
117 0x06, 0xdb, 0x41, 0xca, 0x98, 0xd8, 0x54, 0xc7, 0x64, 0x48, 0x24, 0x04,
118 0x20, 0xbc, 0x59, 0xe3, 0x6b, 0xea, 0x7e, 0xfc, 0x7e, 0xc5, 0x4e, 0xd4,
119 0xd8, 0x3a, 0xed, 0xcd, 0x5d, 0x99, 0xb8, 0x5c, 0xa2, 0x8b, 0xbb, 0x0b,
120 0xac, 0xe6, 0x8e, 0x25, 0x56, 0x22, 0x3a, 0x2d, 0x3a, 0x56, 0x41, 0x14,
121 0x1f, 0x1c, 0x8f, 0x53, 0x46, 0x13, 0x85, 0x02, 0x15, 0x00, 0x98, 0x7e,
122 0x92, 0x81, 0x88, 0xc7, 0x3f, 0x70, 0x49, 0x54, 0xf6, 0x76, 0xb4, 0xa3,
123 0x9e, 0x1d, 0x45, 0x98, 0x32, 0x7f, 0x02, 0x81, 0x80, 0x69, 0x4d, 0xef,
124 0x55, 0xff, 0x4d, 0x59, 0x2c, 0x01, 0xfa, 0x6a, 0x38, 0xe0, 0x70, 0x9f,
125 0x9e, 0x66, 0x8e, 0x3e, 0x8c, 0x52, 0x22, 0x9d, 0x15, 0x7e, 0x3c, 0xef,
126 0x4c, 0x7a, 0x61, 0x26, 0xe0, 0x2b, 0x81, 0x3f, 0xeb, 0xaf, 0x35, 0x38,
127 0x8d, 0xfe, 0xed, 0x46, 0xff, 0x5f, 0x03, 0x9b, 0x81, 0x92, 0xe7, 0x6f,
128 0x76, 0x4f, 0x1d, 0xd9, 0xbb, 0x89, 0xc9, 0x3e, 0xd9, 0x0b, 0xf9, 0xf4,
129 0x78, 0x11, 0x59, 0xc0, 0x1d, 0xcd, 0x0e, 0xa1, 0x6f, 0x15, 0xf1, 0x4d,
130 0xc1, 0xc9, 0x22, 0xed, 0x8d, 0xad, 0x67, 0xc5, 0x4b, 0x95, 0x93, 0x86,
131 0xa6, 0xaf, 0x8a, 0xee, 0x06, 0x89, 0x2f, 0x37, 0x7e, 0x64, 0xaa, 0xf6,
132 0xe7, 0xb1, 0x5a, 0x0a, 0x93, 0x95, 0x5d, 0x3e, 0x53, 0x9a, 0xde, 0x8a,
133 0xc2, 0x95, 0x45, 0x81, 0xbe, 0x5c, 0x2f, 0xc2, 0xb2, 0x92, 0x58, 0x19,
134 0x72, 0x80, 0xe9, 0x79, 0xa1, 0x02, 0x81, 0x80, 0x07, 0xd7, 0x62, 0xff,
135 0xdf, 0x1a, 0x3f, 0xed, 0x32, 0xd4, 0xd4, 0x88, 0x7b, 0x2c, 0x63, 0x7f,
136 0x97, 0xdc, 0x44, 0xd4, 0x84, 0xa2, 0xdd, 0x17, 0x16, 0x85, 0x13, 0xe0,
137 0xac, 0x51, 0x8d, 0x29, 0x1b, 0x75, 0x9a, 0xe4, 0xe3, 0x8a, 0x92, 0x69,
138 0x09, 0x03, 0xc5, 0x68, 0xae, 0x5e, 0x94, 0xfe, 0xc9, 0x92, 0x6c, 0x07,
139 0xb4, 0x1e, 0x64, 0x62, 0x87, 0xc6, 0xa4, 0xfd, 0x0d, 0x5f, 0xe5, 0xf9,
140 0x1b, 0x4f, 0x85, 0x5f, 0xae, 0xf3, 0x11, 0xe5, 0x18, 0xd4, 0x4d, 0x79,
141 0x9f, 0xc4, 0x79, 0x26, 0x04, 0x27, 0xf0, 0x0b, 0xee, 0x2b, 0x86, 0x9f,
142 0x86, 0x61, 0xe6, 0x51, 0xce, 0x04, 0x9b, 0x5d, 0x6b, 0x34, 0x43, 0x8c,
143 0x85, 0x3c, 0xf1, 0x51, 0x9b, 0x08, 0x23, 0x1b, 0xf5, 0x7e, 0x33, 0x12,
144 0xea, 0xab, 0x1f, 0xb7, 0x2d, 0xe2, 0x5f, 0xe6, 0x97, 0x99, 0xb5, 0x45,
145 0x16, 0x5b, 0xc3, 0x41, 0x02, 0x14, 0x61, 0xbf, 0x51, 0x60, 0xcf, 0xc8,
146 0xf1, 0x8c, 0x82, 0x97, 0xf2, 0xf4, 0x19, 0xba, 0x2b, 0xf3, 0x16, 0xbe,
147 0x40, 0x48
148 };
149 #endif
150
151 /*
152 * kExampleBadRSAKeyDER is an RSA private key in ASN.1, DER format. The private
153 * components are not correct.
154 */
155 static const unsigned char kExampleBadRSAKeyDER[] = {
156 0x30, 0x82, 0x04, 0x27, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
157 0xa6, 0x1a, 0x1e, 0x6e, 0x7b, 0xee, 0xc6, 0x89, 0x66, 0xe7, 0x93, 0xef,
158 0x54, 0x12, 0x68, 0xea, 0xbf, 0x86, 0x2f, 0xdd, 0xd2, 0x79, 0xb8, 0xa9,
159 0x6e, 0x03, 0xc2, 0xa3, 0xb9, 0xa3, 0xe1, 0x4b, 0x2a, 0xb3, 0xf8, 0xb4,
160 0xcd, 0xea, 0xbe, 0x24, 0xa6, 0x57, 0x5b, 0x83, 0x1f, 0x0f, 0xf2, 0xd3,
161 0xb7, 0xac, 0x7e, 0xd6, 0x8e, 0x6e, 0x1e, 0xbf, 0xb8, 0x73, 0x8c, 0x05,
162 0x56, 0xe6, 0x35, 0x1f, 0xe9, 0x04, 0x0b, 0x09, 0x86, 0x7d, 0xf1, 0x26,
163 0x08, 0x99, 0xad, 0x7b, 0xc8, 0x4d, 0x94, 0xb0, 0x0b, 0x8b, 0x38, 0xa0,
164 0x5c, 0x62, 0xa0, 0xab, 0xd3, 0x8f, 0xd4, 0x09, 0x60, 0x72, 0x1e, 0x33,
165 0x50, 0x80, 0x6e, 0x22, 0xa6, 0x77, 0x57, 0x6b, 0x9a, 0x33, 0x21, 0x66,
166 0x87, 0x6e, 0x21, 0x7b, 0xc7, 0x24, 0x0e, 0xd8, 0x13, 0xdf, 0x83, 0xde,
167 0xcd, 0x40, 0x58, 0x1d, 0x84, 0x86, 0xeb, 0xb8, 0x12, 0x4e, 0xd2, 0xfa,
168 0x80, 0x1f, 0xe4, 0xe7, 0x96, 0x29, 0xb8, 0xcc, 0xce, 0x66, 0x6d, 0x53,
169 0xca, 0xb9, 0x5a, 0xd7, 0xf6, 0x84, 0x6c, 0x2d, 0x9a, 0x1a, 0x14, 0x1c,
170 0x4e, 0x93, 0x39, 0xba, 0x74, 0xed, 0xed, 0x87, 0x87, 0x5e, 0x48, 0x75,
171 0x36, 0xf0, 0xbc, 0x34, 0xfb, 0x29, 0xf9, 0x9f, 0x96, 0x5b, 0x0b, 0xa7,
172 0x54, 0x30, 0x51, 0x29, 0x18, 0x5b, 0x7d, 0xac, 0x0f, 0xd6, 0x5f, 0x7c,
173 0xf8, 0x98, 0x8c, 0xd8, 0x86, 0x62, 0xb3, 0xdc, 0xff, 0x0f, 0xff, 0x7a,
174 0xaf, 0x5c, 0x4c, 0x61, 0x49, 0x2e, 0xc8, 0x95, 0x86, 0xc4, 0x0e, 0x87,
175 0xfc, 0x1d, 0xcf, 0x8b, 0x7c, 0x61, 0xf6, 0xd8, 0xd0, 0x69, 0xf6, 0xcd,
176 0x8a, 0x8c, 0xf6, 0x62, 0xa2, 0x56, 0xa9, 0xe3, 0xd1, 0xcf, 0x4d, 0xa0,
177 0xf6, 0x2d, 0x20, 0x0a, 0x04, 0xb7, 0xa2, 0xf7, 0xb5, 0x99, 0x47, 0x18,
178 0x56, 0x85, 0x87, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
179 0x01, 0x00, 0x99, 0x41, 0x38, 0x1a, 0xd0, 0x96, 0x7a, 0xf0, 0x83, 0xd5,
180 0xdf, 0x94, 0xce, 0x89, 0x3d, 0xec, 0x7a, 0x52, 0x21, 0x10, 0x16, 0x06,
181 0xe0, 0xee, 0xd2, 0xe6, 0xfd, 0x4b, 0x7b, 0x19, 0x4d, 0xe1, 0xc0, 0xc0,
182 0xd5, 0x14, 0x5d, 0x79, 0xdd, 0x7e, 0x8b, 0x4b, 0xc6, 0xcf, 0xb0, 0x75,
183 0x52, 0xa3, 0x2d, 0xb1, 0x26, 0x46, 0x68, 0x9c, 0x0a, 0x1a, 0xf2, 0xe1,
184 0x09, 0xac, 0x53, 0x85, 0x8c, 0x36, 0xa9, 0x14, 0x65, 0xea, 0xa0, 0x00,
185 0xcb, 0xe3, 0x3f, 0xc4, 0x2b, 0x61, 0x2e, 0x6b, 0x06, 0x69, 0x77, 0xfd,
186 0x38, 0x7e, 0x1d, 0x3f, 0x92, 0xe7, 0x77, 0x08, 0x19, 0xa7, 0x9d, 0x29,
187 0x2d, 0xdc, 0x42, 0xc6, 0x7c, 0xd7, 0xd3, 0xa8, 0x01, 0x2c, 0xf2, 0xd5,
188 0x82, 0x57, 0xcb, 0x55, 0x3d, 0xe7, 0xaa, 0xd2, 0x06, 0x30, 0x30, 0x05,
189 0xe6, 0xf2, 0x47, 0x86, 0xba, 0xc6, 0x61, 0x64, 0xeb, 0x4f, 0x2a, 0x5e,
190 0x07, 0x29, 0xe0, 0x96, 0xb2, 0x43, 0xff, 0x5f, 0x1a, 0x54, 0x16, 0xcf,
191 0xb5, 0x56, 0x5c, 0xa0, 0x9b, 0x0c, 0xfd, 0xb3, 0xd2, 0xe3, 0x79, 0x1d,
192 0x21, 0xe2, 0xd6, 0x13, 0xc4, 0x74, 0xa6, 0xf5, 0x8e, 0x8e, 0x81, 0xbb,
193 0xb4, 0xad, 0x8a, 0xf0, 0x93, 0x0a, 0xd8, 0x0a, 0x42, 0x36, 0xbc, 0xe5,
194 0x26, 0x2a, 0x0d, 0x5d, 0x57, 0x13, 0xc5, 0x4e, 0x2f, 0x12, 0x0e, 0xef,
195 0xa7, 0x81, 0x1e, 0xc3, 0xa5, 0xdb, 0xc9, 0x24, 0xeb, 0x1a, 0xa1, 0xf9,
196 0xf6, 0xa1, 0x78, 0x98, 0x93, 0x77, 0x42, 0x45, 0x03, 0xe2, 0xc9, 0xa2,
197 0xfe, 0x2d, 0x77, 0xc8, 0xc6, 0xac, 0x9b, 0x98, 0x89, 0x6d, 0x9a, 0xe7,
198 0x61, 0x63, 0xb7, 0xf2, 0xec, 0xd6, 0xb1, 0xa1, 0x6e, 0x0a, 0x1a, 0xff,
199 0xfd, 0x43, 0x28, 0xc3, 0x0c, 0xdc, 0xf2, 0x47, 0x4f, 0x27, 0xaa, 0x99,
200 0x04, 0x8e, 0xac, 0xe8, 0x7c, 0x01, 0x02, 0x04, 0x12, 0x34, 0x56, 0x78,
201 0x02, 0x81, 0x81, 0x00, 0xca, 0x69, 0xe5, 0xbb, 0x3a, 0x90, 0x82, 0xcb,
202 0x82, 0x50, 0x2f, 0x29, 0xe2, 0x76, 0x6a, 0x57, 0x55, 0x45, 0x4e, 0x35,
203 0x18, 0x61, 0xe0, 0x12, 0x70, 0xc0, 0xab, 0xc7, 0x80, 0xa2, 0xd4, 0x46,
204 0x34, 0x03, 0xa0, 0x19, 0x26, 0x23, 0x9e, 0xef, 0x1a, 0xcb, 0x75, 0xd6,
205 0xba, 0x81, 0xf4, 0x7e, 0x52, 0xe5, 0x2a, 0xe8, 0xf1, 0x49, 0x6c, 0x0f,
206 0x1a, 0xa0, 0xf9, 0xc6, 0xe7, 0xec, 0x60, 0xe4, 0xcb, 0x2a, 0xb5, 0x56,
207 0xe9, 0x9c, 0xcd, 0x19, 0x75, 0x92, 0xb1, 0x66, 0xce, 0xc3, 0xd9, 0x3d,
208 0x11, 0xcb, 0xc4, 0x09, 0xce, 0x1e, 0x30, 0xba, 0x2f, 0x60, 0x60, 0x55,
209 0x8d, 0x02, 0xdc, 0x5d, 0xaf, 0xf7, 0x52, 0x31, 0x17, 0x07, 0x53, 0x20,
210 0x33, 0xad, 0x8c, 0xd5, 0x2f, 0x5a, 0xd0, 0x57, 0xd7, 0xd1, 0x80, 0xd6,
211 0x3a, 0x9b, 0x04, 0x4f, 0x35, 0xbf, 0xe7, 0xd5, 0xbc, 0x8f, 0xd4, 0x81,
212 0x02, 0x81, 0x81, 0x00, 0xc0, 0x9f, 0xf8, 0xcd, 0xf7, 0x3f, 0x26, 0x8a,
213 0x3d, 0x4d, 0x2b, 0x0c, 0x01, 0xd0, 0xa2, 0xb4, 0x18, 0xfe, 0xf7, 0x5e,
214 0x2f, 0x06, 0x13, 0xcd, 0x63, 0xaa, 0x12, 0xa9, 0x24, 0x86, 0xe3, 0xf3,
215 0x7b, 0xda, 0x1a, 0x3c, 0xb1, 0x38, 0x80, 0x80, 0xef, 0x64, 0x64, 0xa1,
216 0x9b, 0xfe, 0x76, 0x63, 0x8e, 0x83, 0xd2, 0xd9, 0xb9, 0x86, 0xb0, 0xe6,
217 0xa6, 0x0c, 0x7e, 0xa8, 0x84, 0x90, 0x98, 0x0c, 0x1e, 0xf3, 0x14, 0x77,
218 0xe0, 0x5f, 0x81, 0x08, 0x11, 0x8f, 0xa6, 0x23, 0xc4, 0xba, 0xc0, 0x8a,
219 0xe4, 0xc6, 0xe3, 0x5c, 0xbe, 0xc5, 0xec, 0x2c, 0xb9, 0xd8, 0x8c, 0x4d,
220 0x1a, 0x9d, 0xe7, 0x7c, 0x85, 0x4c, 0x0d, 0x71, 0x4e, 0x72, 0x33, 0x1b,
221 0xfe, 0xa9, 0x17, 0x72, 0x76, 0x56, 0x9d, 0x74, 0x7e, 0x52, 0x67, 0x9a,
222 0x87, 0x9a, 0xdb, 0x30, 0xde, 0xe4, 0x49, 0x28, 0x3b, 0xd2, 0x67, 0xaf,
223 0x02, 0x81, 0x81, 0x00, 0x89, 0x74, 0x9a, 0x8e, 0xa7, 0xb9, 0xa5, 0x28,
224 0xc0, 0x68, 0xe5, 0x6e, 0x63, 0x1c, 0x99, 0x20, 0x8f, 0x86, 0x8e, 0x12,
225 0x9e, 0x69, 0x30, 0xfa, 0x34, 0xd9, 0x92, 0x8d, 0xdb, 0x7c, 0x37, 0xfd,
226 0x28, 0xab, 0x61, 0x98, 0x52, 0x7f, 0x14, 0x1a, 0x39, 0xae, 0xfb, 0x6a,
227 0x03, 0xa3, 0xe6, 0xbd, 0xb6, 0x5b, 0x6b, 0xe5, 0x5e, 0x9d, 0xc6, 0xa5,
228 0x07, 0x27, 0x54, 0x17, 0xd0, 0x3d, 0x84, 0x9b, 0x3a, 0xa0, 0xd9, 0x1e,
229 0x99, 0x6c, 0x63, 0x17, 0xab, 0xf1, 0x1f, 0x49, 0xba, 0x95, 0xe3, 0x3b,
230 0x86, 0x8f, 0x42, 0xa4, 0x89, 0xf5, 0x94, 0x8f, 0x8b, 0x46, 0xbe, 0x84,
231 0xba, 0x4a, 0xbc, 0x0d, 0x5f, 0x46, 0xeb, 0xe8, 0xec, 0x43, 0x8c, 0x1e,
232 0xad, 0x19, 0x69, 0x2f, 0x08, 0x86, 0x7a, 0x3f, 0x7d, 0x0f, 0x07, 0x97,
233 0xf3, 0x9a, 0x7b, 0xb5, 0xb2, 0xc1, 0x8c, 0x95, 0x68, 0x04, 0xa0, 0x81,
234 0x02, 0x81, 0x80, 0x4e, 0xbf, 0x7e, 0x1b, 0xcb, 0x13, 0x61, 0x75, 0x3b,
235 0xdb, 0x59, 0x5f, 0xb1, 0xd4, 0xb8, 0xeb, 0x9e, 0x73, 0xb5, 0xe7, 0xf6,
236 0x89, 0x3d, 0x1c, 0xda, 0xf0, 0x36, 0xff, 0x35, 0xbd, 0x1e, 0x0b, 0x74,
237 0xe3, 0x9e, 0xf0, 0xf2, 0xf7, 0xd7, 0x82, 0xb7, 0x7b, 0x6a, 0x1b, 0x0e,
238 0x30, 0x4a, 0x98, 0x0e, 0xb4, 0xf9, 0x81, 0x07, 0xe4, 0x75, 0x39, 0xe9,
239 0x53, 0xca, 0xbb, 0x5c, 0xaa, 0x93, 0x07, 0x0e, 0xa8, 0x2f, 0xba, 0x98,
240 0x49, 0x30, 0xa7, 0xcc, 0x1a, 0x3c, 0x68, 0x0c, 0xe1, 0xa4, 0xb1, 0x05,
241 0xe6, 0xe0, 0x25, 0x78, 0x58, 0x14, 0x37, 0xf5, 0x1f, 0xe3, 0x22, 0xef,
242 0xa8, 0x0e, 0x22, 0xa0, 0x94, 0x3a, 0xf6, 0xc9, 0x13, 0xe6, 0x06, 0xbf,
243 0x7f, 0x99, 0xc6, 0xcc, 0xd8, 0xc6, 0xbe, 0xd9, 0x2e, 0x24, 0xc7, 0x69,
244 0x8c, 0x95, 0xba, 0xf6, 0x04, 0xb3, 0x0a, 0xf4, 0xcb, 0xf0, 0xce,
245 };
246
247 /*
248 * kExampleBad2RSAKeyDER is an RSA private key in ASN.1, DER format. All
249 * values are 0.
250 */
251 static const unsigned char kExampleBad2RSAKeyDER[] = {
252 0x30, 0x1b, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02,
253 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02,
254 0x01, 0x00, 0x02, 0x01, 0x00
255 };
256
257 static const unsigned char kMsg[] = { 1, 2, 3, 4 };
258
259 static const unsigned char kSignature[] = {
260 0xa5, 0xf0, 0x8a, 0x47, 0x5d, 0x3c, 0xb3, 0xcc, 0xa9, 0x79, 0xaf, 0x4d,
261 0x8c, 0xae, 0x4c, 0x14, 0xef, 0xc2, 0x0b, 0x34, 0x36, 0xde, 0xf4, 0x3e,
262 0x3d, 0xbb, 0x4a, 0x60, 0x5c, 0xc8, 0x91, 0x28, 0xda, 0xfb, 0x7e, 0x04,
263 0x96, 0x7e, 0x63, 0x13, 0x90, 0xce, 0xb9, 0xb4, 0x62, 0x7a, 0xfd, 0x09,
264 0x3d, 0xc7, 0x67, 0x78, 0x54, 0x04, 0xeb, 0x52, 0x62, 0x6e, 0x24, 0x67,
265 0xb4, 0x40, 0xfc, 0x57, 0x62, 0xc6, 0xf1, 0x67, 0xc1, 0x97, 0x8f, 0x6a,
266 0xa8, 0xae, 0x44, 0x46, 0x5e, 0xab, 0x67, 0x17, 0x53, 0x19, 0x3a, 0xda,
267 0x5a, 0xc8, 0x16, 0x3e, 0x86, 0xd5, 0xc5, 0x71, 0x2f, 0xfc, 0x23, 0x48,
268 0xd9, 0x0b, 0x13, 0xdd, 0x7b, 0x5a, 0x25, 0x79, 0xef, 0xa5, 0x7b, 0x04,
269 0xed, 0x44, 0xf6, 0x18, 0x55, 0xe4, 0x0a, 0xe9, 0x57, 0x79, 0x5d, 0xd7,
270 0x55, 0xa7, 0xab, 0x45, 0x02, 0x97, 0x60, 0x42,
271 };
272
273 /*
274 * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8
275 * PrivateKeyInfo.
276 */
277 static const unsigned char kExampleRSAKeyPKCS8[] = {
278 0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
279 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
280 0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
281 0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5,
282 0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e,
283 0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34,
284 0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde,
285 0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8,
286 0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b,
287 0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83,
288 0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48,
289 0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a,
290 0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2,
291 0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01,
292 0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a,
293 0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5,
294 0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6,
295 0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8,
296 0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6,
297 0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f,
298 0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c,
299 0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78,
300 0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71,
301 0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60,
302 0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d,
303 0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3,
304 0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d,
305 0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18,
306 0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d,
307 0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32,
308 0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc,
309 0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63,
310 0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05,
311 0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16,
312 0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3,
313 0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85,
314 0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97,
315 0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7,
316 0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99,
317 0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4,
318 0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d,
319 0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40,
320 0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26,
321 0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1,
322 0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c,
323 0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30,
324 0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea,
325 0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b,
326 0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e,
327 0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9,
328 0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae,
329 0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d,
330 0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
331 };
332
333 #ifndef OPENSSL_NO_EC
334 /*
335 * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
336 * structure.
337 */
338 static const unsigned char kExampleECKeyDER[] = {
339 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a,
340 0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08,
341 0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a,
342 0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
343 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69,
344 0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c,
345 0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9,
346 0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18,
347 0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16,
348 0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22,
349 0xc1,
350 };
351
352 /*
353 * kExampleBadECKeyDER is a sample EC private key encoded as an ECPrivateKey
354 * structure. The private key is equal to the order and will fail to import
355 */
356 static const unsigned char kExampleBadECKeyDER[] = {
357 0x30, 0x66, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48,
358 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03,
359 0x01, 0x07, 0x04, 0x4C, 0x30, 0x4A, 0x02, 0x01, 0x01, 0x04, 0x20, 0xFF,
360 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
361 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, 0xF3,
362 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51, 0xA1, 0x23, 0x03, 0x21, 0x00,
363 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
364 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
365 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
366 };
367
368 /* prime256v1 */
369 static const unsigned char kExampleECPubKeyDER[] = {
370 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
371 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
372 0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
373 0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
374 0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
375 0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
376 0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
377 0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
378 };
379
380 /*
381 * kExampleBadECPubKeyDER is a sample EC public key with a wrong OID
382 * 1.2.840.10045.2.2 instead of 1.2.840.10045.2.1 - EC Public Key
383 */
384 static const unsigned char kExampleBadECPubKeyDER[] = {
385 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
386 0x02, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
387 0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
388 0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
389 0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
390 0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
391 0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
392 0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
393 };
394
395 static const unsigned char pExampleECParamDER[] = {
396 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
397 };
398
399 static const unsigned char kExampleED25519KeyDER[] = {
400 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
401 0x04, 0x22, 0x04, 0x20, 0xba, 0x7b, 0xba, 0x20, 0x1b, 0x02, 0x75, 0x3a,
402 0xe8, 0x88, 0xfe, 0x00, 0xcd, 0x8b, 0xc6, 0xf4, 0x5c, 0x47, 0x09, 0x46,
403 0x66, 0xe4, 0x72, 0x85, 0x25, 0x26, 0x5e, 0x12, 0x33, 0x48, 0xf6, 0x50
404 };
405
406 static const unsigned char kExampleED25519PubKeyDER[] = {
407 0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00,
408 0xf5, 0xc5, 0xeb, 0x52, 0x3e, 0x7d, 0x07, 0x86, 0xb2, 0x55, 0x07, 0x45,
409 0xef, 0x5b, 0x7c, 0x20, 0xe8, 0x66, 0x28, 0x30, 0x3c, 0x8a, 0x82, 0x40,
410 0x97, 0xa3, 0x08, 0xdc, 0x65, 0x80, 0x39, 0x29
411 };
412
413 # ifndef OPENSSL_NO_DEPRECATED_3_0
414 static const unsigned char kExampleX25519KeyDER[] = {
415 0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x6e,
416 0x04, 0x22, 0x04, 0x20, 0xa0, 0x24, 0x3a, 0x31, 0x24, 0xc3, 0x3f, 0xf6,
417 0x7b, 0x96, 0x0b, 0xd4, 0x8f, 0xd1, 0xee, 0x67, 0xf2, 0x9b, 0x88, 0xac,
418 0x50, 0xce, 0x97, 0x36, 0xdd, 0xaf, 0x25, 0xf6, 0x10, 0x34, 0x96, 0x6e
419 };
420 # endif
421 #endif
422
423 /* kExampleDHKeyDER is a DH private key in ASN.1, DER format. */
424 #ifndef OPENSSL_NO_DEPRECATED_3_0
425 # ifndef OPENSSL_NO_DH
426 static const unsigned char kExampleDHKeyDER[] = {
427 0x30, 0x82, 0x01, 0x21, 0x02, 0x01, 0x00, 0x30, 0x81, 0x95, 0x06, 0x09,
428 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x03, 0x01, 0x30, 0x81, 0x87,
429 0x02, 0x81, 0x81, 0x00, 0xf7, 0x52, 0xc2, 0x68, 0xcc, 0x66, 0xc4, 0x8d,
430 0x03, 0x3f, 0xfa, 0x9c, 0x52, 0xd0, 0xd8, 0x33, 0xf2, 0xe1, 0xc9, 0x9e,
431 0xb7, 0xe7, 0x6e, 0x90, 0x97, 0xeb, 0x92, 0x91, 0x6a, 0x9a, 0x85, 0x63,
432 0x92, 0x79, 0xab, 0xb6, 0x3d, 0x23, 0x58, 0x5a, 0xe8, 0x45, 0x06, 0x81,
433 0x97, 0x77, 0xe1, 0xcc, 0x34, 0x4e, 0xae, 0x36, 0x80, 0xf2, 0xc4, 0x7f,
434 0x8a, 0x52, 0xb8, 0xdb, 0x58, 0xc8, 0x4b, 0x12, 0x4c, 0xf1, 0x4c, 0x53,
435 0xc1, 0x89, 0x39, 0x8d, 0xb6, 0x06, 0xd8, 0xea, 0x7f, 0x2d, 0x36, 0x53,
436 0x96, 0x29, 0xbe, 0xb6, 0x75, 0xfc, 0xe7, 0xf3, 0x36, 0xd6, 0xf4, 0x8f,
437 0x16, 0xa6, 0xc7, 0xec, 0x7b, 0xce, 0x42, 0x8d, 0x48, 0x2e, 0xb7, 0x74,
438 0x00, 0x11, 0x52, 0x61, 0xb4, 0x19, 0x35, 0xec, 0x5c, 0xe4, 0xbe, 0x34,
439 0xc6, 0x59, 0x64, 0x5e, 0x42, 0x61, 0x70, 0x54, 0xf4, 0xe9, 0x6b, 0x53,
440 0x02, 0x01, 0x02, 0x04, 0x81, 0x83, 0x02, 0x81, 0x80, 0x64, 0xc2, 0xe3,
441 0x09, 0x69, 0x37, 0x3c, 0xd2, 0x4a, 0xba, 0xc3, 0x78, 0x6a, 0x9b, 0x8a,
442 0x2a, 0xdb, 0xe7, 0xe6, 0xc0, 0xfa, 0x3a, 0xbe, 0x39, 0x67, 0xc0, 0xa9,
443 0x2a, 0xf0, 0x0a, 0xc1, 0x53, 0x1c, 0xdb, 0xfa, 0x1a, 0x26, 0x98, 0xb0,
444 0x8c, 0xc6, 0x06, 0x4a, 0xa2, 0x48, 0xd3, 0xa4, 0x3b, 0xbd, 0x05, 0x48,
445 0xea, 0x59, 0xdb, 0x18, 0xa4, 0xca, 0x66, 0xd9, 0x5d, 0xb8, 0x95, 0xd1,
446 0xeb, 0x97, 0x3d, 0x66, 0x97, 0x5c, 0x86, 0x8f, 0x7e, 0x90, 0xd3, 0x43,
447 0xd1, 0xa2, 0x0d, 0xcb, 0xe7, 0xeb, 0x90, 0xea, 0x09, 0x40, 0xb1, 0x6f,
448 0xf7, 0x4c, 0xf2, 0x41, 0x83, 0x1d, 0xd0, 0x76, 0xef, 0xaf, 0x55, 0x6f,
449 0x5d, 0xa9, 0xa3, 0x55, 0x81, 0x2a, 0xd1, 0x5d, 0x9d, 0x22, 0x77, 0x97,
450 0x83, 0xde, 0xad, 0xb6, 0x5d, 0x19, 0xc1, 0x53, 0xec, 0xfb, 0xaf, 0x06,
451 0x2e, 0x87, 0x2a, 0x0b, 0x7a
452 };
453 # endif
454 #endif
455
456 static const unsigned char kCFBDefaultKey[] = {
457 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88,
458 0x09, 0xCF, 0x4F, 0x3C
459 };
460
461 static const unsigned char kGCMDefaultKey[32] = { 0 };
462
463 static const unsigned char kGCMResetKey[] = {
464 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94,
465 0x67, 0x30, 0x83, 0x08, 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
466 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
467 };
468
469 static const unsigned char iCFBIV[] = {
470 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
471 0x0C, 0x0D, 0x0E, 0x0F
472 };
473
474 static const unsigned char iGCMDefaultIV[12] = { 0 };
475
476 static const unsigned char iGCMResetIV1[] = {
477 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad
478 };
479
480 static const unsigned char iGCMResetIV2[] = {
481 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88
482 };
483
484 static const unsigned char cfbPlaintext[] = {
485 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11,
486 0x73, 0x93, 0x17, 0x2A
487 };
488
489 static const unsigned char gcmDefaultPlaintext[16] = { 0 };
490
491 static const unsigned char gcmResetPlaintext[] = {
492 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5,
493 0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
494 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95,
495 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
496 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39
497 };
498
499 static const unsigned char cfbCiphertext[] = {
500 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8,
501 0xE8, 0x3C, 0xFB, 0x4A
502 };
503
504 static const unsigned char gcmDefaultCiphertext[] = {
505 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3,
506 0xba, 0xf3, 0x9d, 0x18
507 };
508
509 static const unsigned char gcmResetCiphertext1[] = {
510 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, 0xae, 0x47, 0xc1, 0x3b,
511 0xf1, 0x98, 0x44, 0xcb, 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
512 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, 0xfe, 0xb5, 0x82, 0xd3,
513 0x39, 0x34, 0xa4, 0xf0, 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
514 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, 0xf4, 0x7c, 0x9b, 0x1f
515 };
516
517 static const unsigned char gcmResetCiphertext2[] = {
518 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3,
519 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
520 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48,
521 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
522 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62
523 };
524
525 static const unsigned char gcmAAD[] = {
526 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce,
527 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2
528 };
529
530 static const unsigned char gcmDefaultTag[] = {
531 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, 0x26, 0x5b, 0x98, 0xb5,
532 0xd4, 0x8a, 0xb9, 0x19
533 };
534
535 static const unsigned char gcmResetTag1[] = {
536 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, 0x5e, 0x45, 0x49, 0x13,
537 0xfe, 0x2e, 0xa8, 0xf2
538 };
539
540 static const unsigned char gcmResetTag2[] = {
541 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, 0xcd, 0xdf, 0x88, 0x53,
542 0xbb, 0x2d, 0x55, 0x1b
543 };
544
545 typedef struct APK_DATA_st {
546 const unsigned char *kder;
547 size_t size;
548 const char *keytype;
549 int evptype;
550 int check;
551 int pub_check;
552 int param_check;
553 int type; /* 0 for private, 1 for public, 2 for params */
554 } APK_DATA;
555
556 static APK_DATA keydata[] = {
557 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA},
558 {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), "RSA", EVP_PKEY_RSA},
559 #ifndef OPENSSL_NO_EC
560 {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC}
561 #endif
562 };
563
564 static APK_DATA keycheckdata[] = {
565 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), "RSA", EVP_PKEY_RSA, 1, 1, 1,
566 0},
567 {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), "RSA", EVP_PKEY_RSA,
568 0, 1, 1, 0},
569 {kExampleBad2RSAKeyDER, sizeof(kExampleBad2RSAKeyDER), "RSA", EVP_PKEY_RSA,
570 0, 0, 1 /* Since there are no "params" in an RSA key this passes */, 0},
571 #ifndef OPENSSL_NO_EC
572 {kExampleECKeyDER, sizeof(kExampleECKeyDER), "EC", EVP_PKEY_EC, 1, 1, 1, 0},
573 /* group is also associated in our pub key */
574 {kExampleECPubKeyDER, sizeof(kExampleECPubKeyDER), "EC", EVP_PKEY_EC, 0, 1,
575 1, 1},
576 {pExampleECParamDER, sizeof(pExampleECParamDER), "EC", EVP_PKEY_EC, 0, 0, 1,
577 2},
578 {kExampleED25519KeyDER, sizeof(kExampleED25519KeyDER), "ED25519",
579 EVP_PKEY_ED25519, 1, 1, 1, 0},
580 {kExampleED25519PubKeyDER, sizeof(kExampleED25519PubKeyDER), "ED25519",
581 EVP_PKEY_ED25519, 0, 1, 1, 1},
582 #endif
583 };
584
585 static EVP_PKEY *load_example_key(const char *keytype,
586 const unsigned char *data, size_t data_len)
587 {
588 const unsigned char **pdata = &data;
589 EVP_PKEY *pkey = NULL;
590 OSSL_DECODER_CTX *dctx =
591 OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", NULL, keytype, 0,
592 testctx, testpropq);
593
594 /* |pkey| will be NULL on error */
595 (void)OSSL_DECODER_from_data(dctx, pdata, &data_len);
596 OSSL_DECODER_CTX_free(dctx);
597 return pkey;
598 }
599
600 static EVP_PKEY *load_example_rsa_key(void)
601 {
602 return load_example_key("RSA", kExampleRSAKeyDER,
603 sizeof(kExampleRSAKeyDER));
604 }
605
606 #ifndef OPENSSL_NO_DSA
607 static EVP_PKEY *load_example_dsa_key(void)
608 {
609 return load_example_key("DSA", kExampleDSAKeyDER,
610 sizeof(kExampleDSAKeyDER));
611 }
612 #endif
613
614 #ifndef OPENSSL_NO_EC
615 static EVP_PKEY *load_example_ec_key(void)
616 {
617 return load_example_key("EC", kExampleECKeyDER,
618 sizeof(kExampleECKeyDER));
619 }
620 #endif
621
622 #ifndef OPENSSL_NO_DEPRECATED_3_0
623 # ifndef OPENSSL_NO_DH
624 static EVP_PKEY *load_example_dh_key(void)
625 {
626 return load_example_key("DH", kExampleDHKeyDER,
627 sizeof(kExampleDHKeyDER));
628 }
629 # endif
630
631 # ifndef OPENSSL_NO_EC
632 static EVP_PKEY *load_example_ed25519_key(void)
633 {
634 return load_example_key("ED25519", kExampleED25519KeyDER,
635 sizeof(kExampleED25519KeyDER));
636 }
637
638 static EVP_PKEY *load_example_x25519_key(void)
639 {
640 return load_example_key("X25519", kExampleX25519KeyDER,
641 sizeof(kExampleX25519KeyDER));
642 }
643 # endif
644 #endif /* OPENSSL_NO_DEPRECATED_3_0 */
645
646 static EVP_PKEY *load_example_hmac_key(void)
647 {
648 EVP_PKEY *pkey = NULL;
649 unsigned char key[] = {
650 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
651 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
652 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
653 };
654
655 pkey = EVP_PKEY_new_raw_private_key_ex(testctx, "HMAC",
656 NULL, key, sizeof(key));
657 if (!TEST_ptr(pkey))
658 return NULL;
659
660 return pkey;
661 }
662
663 static int test_EVP_set_default_properties(void)
664 {
665 OSSL_LIB_CTX *ctx;
666 EVP_MD *md = NULL;
667 int res = 0;
668
669 if (!TEST_ptr(ctx = OSSL_LIB_CTX_new())
670 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
671 goto err;
672 EVP_MD_free(md);
673 md = NULL;
674
675 if (!TEST_true(EVP_set_default_properties(ctx, "provider=fizzbang"))
676 || !TEST_ptr_null(md = EVP_MD_fetch(ctx, "sha256", NULL))
677 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", "-provider")))
678 goto err;
679 EVP_MD_free(md);
680 md = NULL;
681
682 if (!TEST_true(EVP_set_default_properties(ctx, NULL))
683 || !TEST_ptr(md = EVP_MD_fetch(ctx, "sha256", NULL)))
684 goto err;
685 res = 1;
686 err:
687 EVP_MD_free(md);
688 OSSL_LIB_CTX_free(ctx);
689 return res;
690 }
691
692 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC)
693 static EVP_PKEY *make_key_fromdata(char *keytype, OSSL_PARAM *params)
694 {
695 EVP_PKEY_CTX *pctx = NULL;
696 EVP_PKEY *tmp_pkey = NULL, *pkey = NULL;
697
698 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, keytype, testpropq)))
699 goto err;
700 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
701 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &tmp_pkey, EVP_PKEY_KEYPAIR,
702 params), 0))
703 goto err;
704
705 if (!TEST_ptr(tmp_pkey))
706 goto err;
707
708 pkey = tmp_pkey;
709 tmp_pkey = NULL;
710 err:
711 EVP_PKEY_free(tmp_pkey);
712 EVP_PKEY_CTX_free(pctx);
713 return pkey;
714 }
715
716 static int test_selection(EVP_PKEY *pkey, int selection)
717 {
718 int testresult = 0;
719 int ret;
720 BIO *bio = BIO_new(BIO_s_mem());
721
722 ret = PEM_write_bio_PUBKEY(bio, pkey);
723 if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
724 if (!TEST_true(ret))
725 goto err;
726 } else {
727 if (!TEST_false(ret))
728 goto err;
729 }
730 ret = PEM_write_bio_PrivateKey_ex(bio, pkey, NULL, NULL, 0, NULL, NULL,
731 testctx, NULL);
732 if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
733 if (!TEST_true(ret))
734 goto err;
735 } else {
736 if (!TEST_false(ret))
737 goto err;
738 }
739
740 testresult = 1;
741 err:
742 BIO_free(bio);
743
744 return testresult;
745 }
746 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA || !OPENSSL_NO_EC */
747
748 /*
749 * Test combinations of private, public, missing and private + public key
750 * params to ensure they are all accepted
751 */
752 #if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA)
753 static int test_EVP_PKEY_ffc_priv_pub(char *keytype)
754 {
755 OSSL_PARAM_BLD *bld = NULL;
756 OSSL_PARAM *params = NULL;
757 EVP_PKEY *just_params = NULL;
758 EVP_PKEY *params_and_priv = NULL;
759 EVP_PKEY *params_and_pub = NULL;
760 EVP_PKEY *params_and_keypair = NULL;
761 BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
762 int ret = 0;
763
764 /*
765 * Setup the parameters for our pkey object. For our purposes they don't
766 * have to actually be *valid* parameters. We just need to set something.
767 */
768 if (!TEST_ptr(p = BN_new())
769 || !TEST_ptr(q = BN_new())
770 || !TEST_ptr(g = BN_new())
771 || !TEST_ptr(pub = BN_new())
772 || !TEST_ptr(priv = BN_new()))
773 goto err;
774
775 /* Test !priv and !pub */
776 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
777 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
778 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
779 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g)))
780 goto err;
781 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
782 || !TEST_ptr(just_params = make_key_fromdata(keytype, params)))
783 goto err;
784
785 OSSL_PARAM_free(params);
786 OSSL_PARAM_BLD_free(bld);
787 params = NULL;
788 bld = NULL;
789
790 if (!test_selection(just_params, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
791 || test_selection(just_params, OSSL_KEYMGMT_SELECT_KEYPAIR))
792 goto err;
793
794 /* Test priv and !pub */
795 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
796 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
797 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
798 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
799 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
800 priv)))
801 goto err;
802 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
803 || !TEST_ptr(params_and_priv = make_key_fromdata(keytype, params)))
804 goto err;
805
806 OSSL_PARAM_free(params);
807 OSSL_PARAM_BLD_free(bld);
808 params = NULL;
809 bld = NULL;
810
811 if (!test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
812 || test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PUBLIC_KEY))
813 goto err;
814
815 /* Test !priv and pub */
816 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
817 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
818 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
819 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
820 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
821 pub)))
822 goto err;
823 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
824 || !TEST_ptr(params_and_pub = make_key_fromdata(keytype, params)))
825 goto err;
826
827 OSSL_PARAM_free(params);
828 OSSL_PARAM_BLD_free(bld);
829 params = NULL;
830 bld = NULL;
831
832 if (!test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
833 || test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PRIVATE_KEY))
834 goto err;
835
836 /* Test priv and pub */
837 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
838 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
839 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
840 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
841 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
842 pub))
843 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
844 priv)))
845 goto err;
846 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
847 || !TEST_ptr(params_and_keypair = make_key_fromdata(keytype, params)))
848 goto err;
849
850 if (!test_selection(params_and_keypair, EVP_PKEY_KEYPAIR))
851 goto err;
852
853 ret = 1;
854 err:
855 OSSL_PARAM_free(params);
856 OSSL_PARAM_BLD_free(bld);
857 EVP_PKEY_free(just_params);
858 EVP_PKEY_free(params_and_priv);
859 EVP_PKEY_free(params_and_pub);
860 EVP_PKEY_free(params_and_keypair);
861 BN_free(p);
862 BN_free(q);
863 BN_free(g);
864 BN_free(pub);
865 BN_free(priv);
866
867 return ret;
868 }
869 #endif /* !OPENSSL_NO_DH || !OPENSSL_NO_DSA */
870
871 /*
872 * Test combinations of private, public, missing and private + public key
873 * params to ensure they are all accepted for EC keys
874 */
875 #ifndef OPENSSL_NO_EC
876 static unsigned char ec_priv[] = {
877 0xe9, 0x25, 0xf7, 0x66, 0x58, 0xa4, 0xdd, 0x99, 0x61, 0xe7, 0xe8, 0x23,
878 0x85, 0xc2, 0xe8, 0x33, 0x27, 0xc5, 0x5c, 0xeb, 0xdb, 0x43, 0x9f, 0xd5,
879 0xf2, 0x5a, 0x75, 0x55, 0xd0, 0x2e, 0x6d, 0x16
880 };
881 static unsigned char ec_pub[] = {
882 0x04, 0xad, 0x11, 0x90, 0x77, 0x4b, 0x46, 0xee, 0x72, 0x51, 0x15, 0x97,
883 0x4a, 0x6a, 0xa7, 0xaf, 0x59, 0xfa, 0x4b, 0xf2, 0x41, 0xc8, 0x3a, 0x81,
884 0x23, 0xb6, 0x90, 0x04, 0x6c, 0x67, 0x66, 0xd0, 0xdc, 0xf2, 0x15, 0x1d,
885 0x41, 0x61, 0xb7, 0x95, 0x85, 0x38, 0x5a, 0x84, 0x56, 0xe8, 0xb3, 0x0e,
886 0xf5, 0xc6, 0x5d, 0xa4, 0x54, 0x26, 0xb0, 0xf7, 0xa5, 0x4a, 0x33, 0xf1,
887 0x08, 0x09, 0xb8, 0xdb, 0x03
888 };
889
890 static int test_EC_priv_pub(void)
891 {
892 OSSL_PARAM_BLD *bld = NULL;
893 OSSL_PARAM *params = NULL;
894 EVP_PKEY *just_params = NULL;
895 EVP_PKEY *params_and_priv = NULL;
896 EVP_PKEY *params_and_pub = NULL;
897 EVP_PKEY *params_and_keypair = NULL;
898 BIGNUM *priv = NULL;
899 int ret = 0;
900
901 /*
902 * Setup the parameters for our pkey object. For our purposes they don't
903 * have to actually be *valid* parameters. We just need to set something.
904 */
905 if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
906 goto err;
907
908 /* Test !priv and !pub */
909 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
910 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
911 OSSL_PKEY_PARAM_GROUP_NAME,
912 "P-256", 0)))
913 goto err;
914 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
915 || !TEST_ptr(just_params = make_key_fromdata("EC", params)))
916 goto err;
917
918 OSSL_PARAM_free(params);
919 OSSL_PARAM_BLD_free(bld);
920 params = NULL;
921 bld = NULL;
922
923 if (!test_selection(just_params, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
924 || test_selection(just_params, OSSL_KEYMGMT_SELECT_KEYPAIR))
925 goto err;
926
927 /* Test priv and !pub */
928 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
929 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
930 OSSL_PKEY_PARAM_GROUP_NAME,
931 "P-256", 0))
932 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
933 priv)))
934 goto err;
935 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
936 || !TEST_ptr(params_and_priv = make_key_fromdata("EC", params)))
937 goto err;
938
939 OSSL_PARAM_free(params);
940 OSSL_PARAM_BLD_free(bld);
941 params = NULL;
942 bld = NULL;
943
944 /*
945 * We indicate only parameters here, in spite of having built a key that
946 * has a private part, because the PEM_write_bio_PrivateKey_ex call is
947 * expected to fail because it does not support exporting a private EC
948 * key without a corresponding public key
949 */
950 if (!test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_ALL_PARAMETERS)
951 || test_selection(params_and_priv, OSSL_KEYMGMT_SELECT_PUBLIC_KEY))
952 goto err;
953
954 /* Test !priv and pub */
955 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
956 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
957 OSSL_PKEY_PARAM_GROUP_NAME,
958 "P-256", 0))
959 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
960 OSSL_PKEY_PARAM_PUB_KEY,
961 ec_pub, sizeof(ec_pub))))
962 goto err;
963 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
964 || !TEST_ptr(params_and_pub = make_key_fromdata("EC", params)))
965 goto err;
966
967 OSSL_PARAM_free(params);
968 OSSL_PARAM_BLD_free(bld);
969 params = NULL;
970 bld = NULL;
971
972 if (!test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
973 || test_selection(params_and_pub, OSSL_KEYMGMT_SELECT_PRIVATE_KEY))
974 goto err;
975
976 /* Test priv and pub */
977 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
978 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
979 OSSL_PKEY_PARAM_GROUP_NAME,
980 "P-256", 0))
981 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
982 OSSL_PKEY_PARAM_PUB_KEY,
983 ec_pub, sizeof(ec_pub)))
984 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
985 priv)))
986 goto err;
987 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
988 || !TEST_ptr(params_and_keypair = make_key_fromdata("EC", params)))
989 goto err;
990
991 if (!test_selection(params_and_keypair, EVP_PKEY_KEYPAIR))
992 goto err;
993
994 /* Try key equality */
995 if (!TEST_int_gt(EVP_PKEY_parameters_eq(just_params, just_params), 0)
996 || !TEST_int_gt(EVP_PKEY_parameters_eq(just_params, params_and_pub),
997 0)
998 || !TEST_int_gt(EVP_PKEY_parameters_eq(just_params, params_and_priv),
999 0)
1000 || !TEST_int_gt(EVP_PKEY_parameters_eq(just_params, params_and_keypair),
1001 0)
1002 || !TEST_int_gt(EVP_PKEY_eq(params_and_pub, params_and_pub), 0)
1003 || !TEST_int_gt(EVP_PKEY_eq(params_and_priv, params_and_priv), 0)
1004 || !TEST_int_gt(EVP_PKEY_eq(params_and_keypair, params_and_pub), 0)
1005 || !TEST_int_gt(EVP_PKEY_eq(params_and_keypair, params_and_priv), 0))
1006 goto err;
1007
1008 ret = 1;
1009 err:
1010 OSSL_PARAM_free(params);
1011 OSSL_PARAM_BLD_free(bld);
1012 EVP_PKEY_free(just_params);
1013 EVP_PKEY_free(params_and_priv);
1014 EVP_PKEY_free(params_and_pub);
1015 EVP_PKEY_free(params_and_keypair);
1016 BN_free(priv);
1017
1018 return ret;
1019 }
1020
1021 /* Test that using a legacy EC key with only a private key in it works */
1022 # ifndef OPENSSL_NO_DEPRECATED_3_0
1023 static int test_EC_priv_only_legacy(void)
1024 {
1025 BIGNUM *priv = NULL;
1026 int ret = 0;
1027 EC_KEY *eckey = NULL;
1028 EVP_PKEY *pkey = NULL, *dup_pk = NULL;
1029 EVP_MD_CTX *ctx = NULL;
1030
1031 /* Create the low level EC_KEY */
1032 if (!TEST_ptr(priv = BN_bin2bn(ec_priv, sizeof(ec_priv), NULL)))
1033 goto err;
1034
1035 eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1036 if (!TEST_ptr(eckey))
1037 goto err;
1038
1039 if (!TEST_true(EC_KEY_set_private_key(eckey, priv)))
1040 goto err;
1041
1042 pkey = EVP_PKEY_new();
1043 if (!TEST_ptr(pkey))
1044 goto err;
1045
1046 if (!TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
1047 goto err;
1048 eckey = NULL;
1049
1050 while (dup_pk == NULL) {
1051 ret = 0;
1052 ctx = EVP_MD_CTX_new();
1053 if (!TEST_ptr(ctx))
1054 goto err;
1055
1056 /*
1057 * The EVP_DigestSignInit function should create the key on the
1058 * provider side which is sufficient for this test.
1059 */
1060 if (!TEST_true(EVP_DigestSignInit_ex(ctx, NULL, NULL, testctx,
1061 testpropq, pkey, NULL)))
1062 goto err;
1063 EVP_MD_CTX_free(ctx);
1064 ctx = NULL;
1065
1066 if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pkey)))
1067 goto err;
1068 /* EVP_PKEY_eq() returns -2 with missing public keys */
1069 ret = TEST_int_eq(EVP_PKEY_eq(pkey, dup_pk), -2);
1070 EVP_PKEY_free(pkey);
1071 pkey = dup_pk;
1072 if (!ret)
1073 goto err;
1074 }
1075
1076 err:
1077 EVP_MD_CTX_free(ctx);
1078 EVP_PKEY_free(pkey);
1079 EC_KEY_free(eckey);
1080 BN_free(priv);
1081
1082 return ret;
1083 }
1084 # endif /* OPENSSL_NO_DEPRECATED_3_0 */
1085 #endif /* OPENSSL_NO_EC */
1086
1087 static int test_EVP_PKEY_sign(int tst)
1088 {
1089 int ret = 0;
1090 EVP_PKEY *pkey = NULL;
1091 unsigned char *sig = NULL;
1092 size_t sig_len = 0, shortsig_len = 1;
1093 EVP_PKEY_CTX *ctx = NULL;
1094 unsigned char tbs[] = {
1095 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
1096 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13
1097 };
1098
1099 if (tst == 0) {
1100 if (!TEST_ptr(pkey = load_example_rsa_key()))
1101 goto out;
1102 } else if (tst == 1) {
1103 #ifndef OPENSSL_NO_DSA
1104 if (!TEST_ptr(pkey = load_example_dsa_key()))
1105 goto out;
1106 #else
1107 ret = 1;
1108 goto out;
1109 #endif
1110 } else {
1111 #ifndef OPENSSL_NO_EC
1112 if (!TEST_ptr(pkey = load_example_ec_key()))
1113 goto out;
1114 #else
1115 ret = 1;
1116 goto out;
1117 #endif
1118 }
1119
1120 ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, NULL);
1121 if (!TEST_ptr(ctx)
1122 || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0)
1123 || !TEST_int_gt(EVP_PKEY_sign(ctx, NULL, &sig_len, tbs,
1124 sizeof(tbs)), 0))
1125 goto out;
1126 sig = OPENSSL_malloc(sig_len);
1127 if (!TEST_ptr(sig)
1128 /* Test sending a signature buffer that is too short is rejected */
1129 || !TEST_int_le(EVP_PKEY_sign(ctx, sig, &shortsig_len, tbs,
1130 sizeof(tbs)), 0)
1131 || !TEST_int_gt(EVP_PKEY_sign(ctx, sig, &sig_len, tbs, sizeof(tbs)),
1132 0)
1133 /* Test the signature round-trips */
1134 || !TEST_int_gt(EVP_PKEY_verify_init(ctx), 0)
1135 || !TEST_int_gt(EVP_PKEY_verify(ctx, sig, sig_len, tbs, sizeof(tbs)),
1136 0))
1137 goto out;
1138
1139 ret = 1;
1140 out:
1141 EVP_PKEY_CTX_free(ctx);
1142 OPENSSL_free(sig);
1143 EVP_PKEY_free(pkey);
1144 return ret;
1145 }
1146
1147 /*
1148 * n = 0 => test using legacy cipher
1149 * n = 1 => test using fetched cipher
1150 */
1151 static int test_EVP_Enveloped(int n)
1152 {
1153 int ret = 0;
1154 EVP_CIPHER_CTX *ctx = NULL;
1155 EVP_PKEY *keypair = NULL;
1156 unsigned char *kek = NULL;
1157 unsigned char iv[EVP_MAX_IV_LENGTH];
1158 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
1159 int len, kek_len, ciphertext_len, plaintext_len;
1160 unsigned char ciphertext[32], plaintext[16];
1161 EVP_CIPHER *type = NULL;
1162
1163 if (nullprov != NULL)
1164 return TEST_skip("Test does not support a non-default library context");
1165
1166 if (n == 0)
1167 type = (EVP_CIPHER *)EVP_aes_256_cbc();
1168 else if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "AES-256-CBC",
1169 testpropq)))
1170 goto err;
1171
1172 if (!TEST_ptr(keypair = load_example_rsa_key())
1173 || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_get_size(keypair)))
1174 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
1175 || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
1176 &keypair, 1))
1177 || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
1178 msg, sizeof(msg)))
1179 || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
1180 &len)))
1181 goto err;
1182
1183 ciphertext_len += len;
1184
1185 if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
1186 || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
1187 ciphertext, ciphertext_len))
1188 || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
1189 goto err;
1190
1191 plaintext_len += len;
1192 if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
1193 goto err;
1194
1195 ret = 1;
1196 err:
1197 if (n != 0)
1198 EVP_CIPHER_free(type);
1199 OPENSSL_free(kek);
1200 EVP_PKEY_free(keypair);
1201 EVP_CIPHER_CTX_free(ctx);
1202 return ret;
1203 }
1204
1205 /*
1206 * Test 0: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, RSA)
1207 * Test 1: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, DSA)
1208 * Test 2: Standard calls to EVP_DigestSignInit/Update/Final (Implicit fetch digest, HMAC)
1209 * Test 3: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, RSA)
1210 * Test 4: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch digest, DSA)
1211 * Test 5: Standard calls to EVP_DigestSignInit/Update/Final (Explicit fetch diegst, HMAC)
1212 * Test 6: Use an MD BIO to do the Update calls instead (RSA)
1213 * Test 7: Use an MD BIO to do the Update calls instead (DSA)
1214 * Test 8: Use an MD BIO to do the Update calls instead (HMAC)
1215 * Test 9: Use EVP_DigestSign (Implicit fetch digest, RSA, short sig)
1216 * Test 10: Use EVP_DigestSign (Implicit fetch digest, DSA, short sig)
1217 * Test 11: Use EVP_DigestSign (Implicit fetch digest, HMAC, short sig)
1218 * Test 12: Use EVP_DigestSign (Implicit fetch digest, RSA)
1219 * Test 13: Use EVP_DigestSign (Implicit fetch digest, DSA)
1220 * Test 14: Use EVP_DigestSign (Implicit fetch digest, HMAC)
1221 * Test 15-29: Same as above with reinitialization
1222 */
1223 static int test_EVP_DigestSignInit(int tst)
1224 {
1225 int ret = 0;
1226 EVP_PKEY *pkey = NULL;
1227 unsigned char *sig = NULL, *sig2 = NULL;
1228 size_t sig_len = 0, sig2_len = 0, shortsig_len = 1;
1229 EVP_MD_CTX *md_ctx = NULL, *md_ctx_verify = NULL;
1230 EVP_MD_CTX *a_md_ctx = NULL, *a_md_ctx_verify = NULL;
1231 BIO *mdbio = NULL, *membio = NULL;
1232 size_t written;
1233 const EVP_MD *md;
1234 EVP_MD *mdexp = NULL;
1235 int reinit = 0;
1236
1237 if (nullprov != NULL)
1238 return TEST_skip("Test does not support a non-default library context");
1239
1240 if (tst >= 15) {
1241 reinit = 1;
1242 tst -= 15;
1243 }
1244
1245 if (tst >= 6 && tst <= 8) {
1246 membio = BIO_new(BIO_s_mem());
1247 mdbio = BIO_new(BIO_f_md());
1248 if (!TEST_ptr(membio) || !TEST_ptr(mdbio))
1249 goto out;
1250 BIO_push(mdbio, membio);
1251 if (!TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx), 0))
1252 goto out;
1253 } else {
1254 if (!TEST_ptr(a_md_ctx = md_ctx = EVP_MD_CTX_new())
1255 || !TEST_ptr(a_md_ctx_verify = md_ctx_verify = EVP_MD_CTX_new()))
1256 goto out;
1257 }
1258
1259 if (tst % 3 == 0) {
1260 if (!TEST_ptr(pkey = load_example_rsa_key()))
1261 goto out;
1262 } else if (tst % 3 == 1) {
1263 #ifndef OPENSSL_NO_DSA
1264 if (!TEST_ptr(pkey = load_example_dsa_key()))
1265 goto out;
1266 #else
1267 ret = 1;
1268 goto out;
1269 #endif
1270 } else {
1271 if (!TEST_ptr(pkey = load_example_hmac_key()))
1272 goto out;
1273 }
1274
1275 if (tst >= 3 && tst <= 5)
1276 md = mdexp = EVP_MD_fetch(NULL, "SHA256", NULL);
1277 else
1278 md = EVP_sha256();
1279
1280 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, md, NULL, pkey)))
1281 goto out;
1282
1283 if (reinit && !TEST_true(EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, NULL)))
1284 goto out;
1285
1286 if (tst >= 6 && tst <= 8) {
1287 if (!BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written))
1288 goto out;
1289 } else if (tst < 6) {
1290 if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1291 goto out;
1292 }
1293
1294 if (tst >= 9) {
1295 /* Determine the size of the signature. */
1296 if (!TEST_true(EVP_DigestSign(md_ctx, NULL, &sig_len, kMsg,
1297 sizeof(kMsg)))
1298 || !TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1299 goto out;
1300 if (tst <= 11) {
1301 /* Test that supply a short sig buffer fails */
1302 if (!TEST_false(EVP_DigestSign(md_ctx, sig, &shortsig_len, kMsg,
1303 sizeof(kMsg))))
1304 goto out;
1305 /*
1306 * We end here because once EVP_DigestSign() has failed you should
1307 * not call it again without re-initing the ctx
1308 */
1309 ret = 1;
1310 goto out;
1311 }
1312 if (!TEST_true(EVP_DigestSign(md_ctx, sig, &sig_len, kMsg,
1313 sizeof(kMsg))))
1314 goto out;
1315 } else {
1316 /* Determine the size of the signature. */
1317 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
1318 || !TEST_ptr(sig = OPENSSL_malloc(sig_len))
1319 /*
1320 * Trying to create a signature with a deliberately short
1321 * buffer should fail.
1322 */
1323 || !TEST_false(EVP_DigestSignFinal(md_ctx, sig, &shortsig_len))
1324 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1325 goto out;
1326 }
1327
1328 /*
1329 * Ensure that the signature round-trips (Verification isn't supported for
1330 * HMAC via EVP_DigestVerify*)
1331 */
1332 if (tst % 3 != 2) {
1333 if (tst >= 6 && tst <= 8) {
1334 if (!TEST_int_gt(BIO_reset(mdbio), 0)
1335 || !TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx_verify), 0))
1336 goto out;
1337 }
1338
1339 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, md,
1340 NULL, pkey)))
1341 goto out;
1342
1343 if (tst >= 6 && tst <= 8) {
1344 if (!TEST_true(BIO_write_ex(mdbio, kMsg, sizeof(kMsg), &written)))
1345 goto out;
1346 } else {
1347 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg,
1348 sizeof(kMsg))))
1349 goto out;
1350 }
1351 if (!TEST_int_gt(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1352 goto out;
1353
1354 /* Multiple calls to EVP_DigestVerifyFinal should work */
1355 if (!TEST_int_gt(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1356 goto out;
1357 } else {
1358 /*
1359 * For HMAC a doubled call to DigestSignFinal should produce the same
1360 * value as finalization should not happen.
1361 */
1362 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig2_len))
1363 || !TEST_ptr(sig2 = OPENSSL_malloc(sig2_len))
1364 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig2, &sig2_len)))
1365 goto out;
1366
1367 if (!TEST_mem_eq(sig, sig_len, sig2, sig2_len))
1368 goto out;
1369 }
1370
1371 ret = 1;
1372
1373 out:
1374 BIO_free(membio);
1375 BIO_free(mdbio);
1376 EVP_MD_CTX_free(a_md_ctx);
1377 EVP_MD_CTX_free(a_md_ctx_verify);
1378 EVP_PKEY_free(pkey);
1379 OPENSSL_free(sig);
1380 OPENSSL_free(sig2);
1381 EVP_MD_free(mdexp);
1382
1383 return ret;
1384 }
1385
1386 static int test_EVP_DigestVerifyInit(void)
1387 {
1388 int ret = 0;
1389 EVP_PKEY *pkey = NULL;
1390 EVP_MD_CTX *md_ctx = NULL;
1391
1392 if (nullprov != NULL)
1393 return TEST_skip("Test does not support a non-default library context");
1394
1395 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
1396 || !TEST_ptr(pkey = load_example_rsa_key()))
1397 goto out;
1398
1399 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
1400 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
1401 || !TEST_int_gt(EVP_DigestVerifyFinal(md_ctx, kSignature,
1402 sizeof(kSignature)), 0))
1403 goto out;
1404
1405 /* test with reinitialization */
1406 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, NULL, NULL, NULL))
1407 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
1408 || !TEST_int_gt(EVP_DigestVerifyFinal(md_ctx, kSignature,
1409 sizeof(kSignature)), 0))
1410 goto out;
1411 ret = 1;
1412
1413 out:
1414 EVP_MD_CTX_free(md_ctx);
1415 EVP_PKEY_free(pkey);
1416 return ret;
1417 }
1418
1419 #ifndef OPENSSL_NO_SIPHASH
1420 /* test SIPHASH MAC via EVP_PKEY with non-default parameters and reinit */
1421 static int test_siphash_digestsign(void)
1422 {
1423 unsigned char key[16];
1424 unsigned char buf[8], digest[8];
1425 unsigned char expected[8] = {
1426 0x6d, 0x3e, 0x54, 0xc2, 0x2f, 0xf1, 0xfe, 0xe2
1427 };
1428 EVP_PKEY *pkey = NULL;
1429 EVP_MD_CTX *mdctx = NULL;
1430 EVP_PKEY_CTX *ctx = NULL;
1431 int ret = 0;
1432 size_t len = 8;
1433
1434 if (nullprov != NULL)
1435 return TEST_skip("Test does not support a non-default library context");
1436
1437 memset(buf, 0, 8);
1438 memset(key, 1, 16);
1439 if (!TEST_ptr(pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_SIPHASH, NULL,
1440 key, 16)))
1441 goto out;
1442
1443 if (!TEST_ptr(mdctx = EVP_MD_CTX_create()))
1444 goto out;
1445
1446 if (!TEST_true(EVP_DigestSignInit(mdctx, &ctx, NULL, NULL, pkey)))
1447 goto out;
1448 if (!TEST_int_eq(EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_SIGNCTX,
1449 EVP_PKEY_CTRL_SET_DIGEST_SIZE,
1450 8, NULL), 1))
1451 goto out;
1452 /* reinitialize */
1453 if (!TEST_true(EVP_DigestSignInit(mdctx, NULL, NULL, NULL, NULL)))
1454 goto out;
1455 if (!TEST_true(EVP_DigestSignUpdate(mdctx, buf, 8)))
1456 goto out;
1457 if (!TEST_true(EVP_DigestSignFinal(mdctx, digest, &len)))
1458 goto out;
1459 if (!TEST_mem_eq(digest, len, expected, sizeof(expected)))
1460 goto out;
1461
1462 ret = 1;
1463 out:
1464 EVP_PKEY_free(pkey);
1465 EVP_MD_CTX_free(mdctx);
1466 return ret;
1467 }
1468 #endif
1469
1470 /*
1471 * Test corner cases of EVP_DigestInit/Update/Final API call behavior.
1472 */
1473 static int test_EVP_Digest(void)
1474 {
1475 int ret = 0;
1476 EVP_MD_CTX *md_ctx = NULL;
1477 unsigned char md[EVP_MAX_MD_SIZE];
1478 EVP_MD *sha256 = NULL;
1479 EVP_MD *shake256 = NULL;
1480
1481 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1482 goto out;
1483
1484 if (!TEST_ptr(sha256 = EVP_MD_fetch(testctx, "sha256", testpropq))
1485 || !TEST_ptr(shake256 = EVP_MD_fetch(testctx, "shake256", testpropq)))
1486 goto out;
1487
1488 if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
1489 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1490 || !TEST_true(EVP_DigestFinal(md_ctx, md, NULL))
1491 /* EVP_DigestFinal resets the EVP_MD_CTX. */
1492 || !TEST_ptr_eq(EVP_MD_CTX_get0_md(md_ctx), NULL))
1493 goto out;
1494
1495 if (!TEST_true(EVP_DigestInit_ex(md_ctx, sha256, NULL))
1496 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1497 || !TEST_true(EVP_DigestFinal_ex(md_ctx, md, NULL))
1498 /* EVP_DigestFinal_ex does not reset the EVP_MD_CTX. */
1499 || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
1500 /*
1501 * EVP_DigestInit_ex with NULL type should work on
1502 * pre-initialized context.
1503 */
1504 || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1505 goto out;
1506
1507 if (!TEST_true(EVP_DigestInit_ex(md_ctx, shake256, NULL))
1508 || !TEST_true(EVP_DigestUpdate(md_ctx, kMsg, sizeof(kMsg)))
1509 || !TEST_true(EVP_DigestFinalXOF(md_ctx, md, sizeof(md)))
1510 /* EVP_DigestFinalXOF does not reset the EVP_MD_CTX. */
1511 || !TEST_ptr(EVP_MD_CTX_get0_md(md_ctx))
1512 || !TEST_true(EVP_DigestInit_ex(md_ctx, NULL, NULL)))
1513 goto out;
1514 ret = 1;
1515
1516 out:
1517 EVP_MD_CTX_free(md_ctx);
1518 EVP_MD_free(sha256);
1519 EVP_MD_free(shake256);
1520 return ret;
1521 }
1522
1523 static int test_EVP_md_null(void)
1524 {
1525 int ret = 0;
1526 EVP_MD_CTX *md_ctx = NULL;
1527 const EVP_MD *md_null = EVP_md_null();
1528 unsigned char md_value[EVP_MAX_MD_SIZE];
1529 unsigned int md_len = sizeof(md_value);
1530
1531 if (nullprov != NULL)
1532 return TEST_skip("Test does not support a non-default library context");
1533
1534 if (!TEST_ptr(md_null)
1535 || !TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1536 goto out;
1537
1538 if (!TEST_true(EVP_DigestInit_ex(md_ctx, md_null, NULL))
1539 || !TEST_true(EVP_DigestUpdate(md_ctx, "test", 4))
1540 || !TEST_true(EVP_DigestFinal_ex(md_ctx, md_value, &md_len)))
1541 goto out;
1542
1543 if (!TEST_uint_eq(md_len, 0))
1544 goto out;
1545
1546 ret = 1;
1547 out:
1548 EVP_MD_CTX_free(md_ctx);
1549 return ret;
1550 }
1551
1552 static int test_d2i_AutoPrivateKey(int i)
1553 {
1554 int ret = 0;
1555 const unsigned char *p;
1556 EVP_PKEY *pkey = NULL;
1557 const APK_DATA *ak = &keydata[i];
1558 const unsigned char *input = ak->kder;
1559 size_t input_len = ak->size;
1560 int expected_id = ak->evptype;
1561
1562 p = input;
1563 if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
1564 || !TEST_ptr_eq(p, input + input_len)
1565 || !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
1566 goto done;
1567
1568 ret = 1;
1569
1570 done:
1571 EVP_PKEY_free(pkey);
1572 return ret;
1573 }
1574
1575 #ifndef OPENSSL_NO_EC
1576
1577 static const unsigned char ec_public_sect163k1_validxy[] = {
1578 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1579 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1580 0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1581 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x02, 0xd1, 0x7b,
1582 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1583 0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1584 };
1585
1586 static const unsigned char ec_public_sect163k1_badx[] = {
1587 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1588 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1589 0x0a, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1590 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0xb0, 0x02, 0xd1, 0x7b,
1591 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1592 0x6a, 0xd8, 0x17, 0x65, 0x41, 0x2f
1593 };
1594
1595 static const unsigned char ec_public_sect163k1_bady[] = {
1596 0x30, 0x40, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
1597 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x01, 0x03, 0x2c, 0x00, 0x04,
1598 0x02, 0x84, 0x58, 0xa6, 0xd4, 0xa0, 0x35, 0x2b, 0xae, 0xf0, 0xc0, 0x69,
1599 0x05, 0xcf, 0x2a, 0x50, 0x33, 0xf9, 0xe3, 0x92, 0x79, 0x0a, 0xd1, 0x7b,
1600 0x9f, 0x22, 0x00, 0xf0, 0x3b, 0x0e, 0x5d, 0x2e, 0xb7, 0x23, 0x24, 0xf3,
1601 0x6a, 0xd8, 0x17, 0x65, 0x41, 0xe6
1602 };
1603
1604 static struct ec_der_pub_keys_st {
1605 const unsigned char *der;
1606 size_t len;
1607 int valid;
1608 } ec_der_pub_keys[] = {
1609 { ec_public_sect163k1_validxy, sizeof(ec_public_sect163k1_validxy), 1 },
1610 { ec_public_sect163k1_badx, sizeof(ec_public_sect163k1_badx), 0 },
1611 { ec_public_sect163k1_bady, sizeof(ec_public_sect163k1_bady), 0 },
1612 };
1613
1614 /*
1615 * Tests the range of the decoded EC char2 public point.
1616 * See ec_GF2m_simple_oct2point().
1617 */
1618 static int test_invalide_ec_char2_pub_range_decode(int id)
1619 {
1620 int ret = 0;
1621 EVP_PKEY *pkey;
1622
1623 pkey = load_example_key("EC", ec_der_pub_keys[id].der,
1624 ec_der_pub_keys[id].len);
1625
1626 ret = (ec_der_pub_keys[id].valid && TEST_ptr(pkey))
1627 || TEST_ptr_null(pkey);
1628 EVP_PKEY_free(pkey);
1629 return ret;
1630 }
1631
1632 /* Tests loading a bad key in PKCS8 format */
1633 static int test_EVP_PKCS82PKEY(void)
1634 {
1635 int ret = 0;
1636 const unsigned char *derp = kExampleBadECKeyDER;
1637 PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1638 EVP_PKEY *pkey = NULL;
1639
1640 if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
1641 sizeof(kExampleBadECKeyDER))))
1642 goto done;
1643
1644 if (!TEST_ptr_eq(derp,
1645 kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
1646 goto done;
1647
1648 if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
1649 goto done;
1650
1651 ret = 1;
1652
1653 done:
1654 PKCS8_PRIV_KEY_INFO_free(p8inf);
1655 EVP_PKEY_free(pkey);
1656
1657 return ret;
1658 }
1659
1660 #endif
1661 static int test_EVP_PKCS82PKEY_wrong_tag(void)
1662 {
1663 EVP_PKEY *pkey = NULL;
1664 EVP_PKEY *pkey2 = NULL;
1665 BIO *membio = NULL;
1666 char *membuf = NULL;
1667 PKCS8_PRIV_KEY_INFO *p8inf = NULL;
1668 int ok = 0;
1669
1670 if (testctx != NULL)
1671 /* test not supported with non-default context */
1672 return 1;
1673
1674 if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1675 || !TEST_ptr(pkey = load_example_rsa_key())
1676 || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1677 NULL, 0, NULL, NULL),
1678 0)
1679 || !TEST_int_gt(BIO_get_mem_data(membio, &membuf), 0)
1680 || !TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(membio, NULL))
1681 || !TEST_ptr(pkey2 = EVP_PKCS82PKEY(p8inf))
1682 || !TEST_int_eq(ERR_peek_last_error(), 0)) {
1683 goto done;
1684 }
1685
1686 ok = 1;
1687 done:
1688 EVP_PKEY_free(pkey);
1689 EVP_PKEY_free(pkey2);
1690 PKCS8_PRIV_KEY_INFO_free(p8inf);
1691 BIO_free_all(membio);
1692 return ok;
1693 }
1694
1695 /* This uses kExampleRSAKeyDER and kExampleRSAKeyPKCS8 to verify encoding */
1696 static int test_privatekey_to_pkcs8(void)
1697 {
1698 EVP_PKEY *pkey = NULL;
1699 BIO *membio = NULL;
1700 char *membuf = NULL;
1701 long membuf_len = 0;
1702 int ok = 0;
1703
1704 if (!TEST_ptr(membio = BIO_new(BIO_s_mem()))
1705 || !TEST_ptr(pkey = load_example_rsa_key())
1706 || !TEST_int_gt(i2d_PKCS8PrivateKey_bio(membio, pkey, NULL,
1707 NULL, 0, NULL, NULL),
1708 0)
1709 || !TEST_int_gt(membuf_len = BIO_get_mem_data(membio, &membuf), 0)
1710 || !TEST_ptr(membuf)
1711 || !TEST_mem_eq(membuf, (size_t)membuf_len,
1712 kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8))
1713 /*
1714 * We try to write PEM as well, just to see that it doesn't err, but
1715 * assume that the result is correct.
1716 */
1717 || !TEST_int_gt(PEM_write_bio_PKCS8PrivateKey(membio, pkey, NULL,
1718 NULL, 0, NULL, NULL),
1719 0))
1720 goto done;
1721
1722 ok = 1;
1723 done:
1724 EVP_PKEY_free(pkey);
1725 BIO_free_all(membio);
1726 return ok;
1727 }
1728
1729 #ifndef OPENSSL_NO_EC
1730 static const struct {
1731 int encoding;
1732 const char *encoding_name;
1733 } ec_encodings[] = {
1734 { OPENSSL_EC_EXPLICIT_CURVE, OSSL_PKEY_EC_ENCODING_EXPLICIT },
1735 { OPENSSL_EC_NAMED_CURVE, OSSL_PKEY_EC_ENCODING_GROUP }
1736 };
1737
1738 static int ec_export_get_encoding_cb(const OSSL_PARAM params[], void *arg)
1739 {
1740 const OSSL_PARAM *p;
1741 const char *enc_name = NULL;
1742 int *enc = arg;
1743 size_t i;
1744
1745 *enc = -1;
1746
1747 if (!TEST_ptr(p = OSSL_PARAM_locate_const(params,
1748 OSSL_PKEY_PARAM_EC_ENCODING))
1749 || !TEST_true(OSSL_PARAM_get_utf8_string_ptr(p, &enc_name)))
1750 return 0;
1751
1752 for (i = 0; i < OSSL_NELEM(ec_encodings); i++) {
1753 if (OPENSSL_strcasecmp(enc_name, ec_encodings[i].encoding_name) == 0) {
1754 *enc = ec_encodings[i].encoding;
1755 break;
1756 }
1757 }
1758
1759 return (*enc != -1);
1760 }
1761
1762 static int test_EC_keygen_with_enc(int idx)
1763 {
1764 EVP_PKEY *params = NULL, *key = NULL;
1765 EVP_PKEY_CTX *pctx = NULL, *kctx = NULL;
1766 int enc;
1767 int ret = 0;
1768
1769 enc = ec_encodings[idx].encoding;
1770
1771 /* Create key parameters */
1772 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "EC", NULL))
1773 || !TEST_int_gt(EVP_PKEY_paramgen_init(pctx), 0)
1774 || !TEST_int_gt(EVP_PKEY_CTX_set_group_name(pctx, "P-256"), 0)
1775 || !TEST_int_gt(EVP_PKEY_CTX_set_ec_param_enc(pctx, enc), 0)
1776 || !TEST_true(EVP_PKEY_paramgen(pctx, &params))
1777 || !TEST_ptr(params))
1778 goto done;
1779
1780 /* Create key */
1781 if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx, params, NULL))
1782 || !TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
1783 || !TEST_true(EVP_PKEY_keygen(kctx, &key))
1784 || !TEST_ptr(key))
1785 goto done;
1786
1787 /* Check that the encoding got all the way into the key */
1788 if (!TEST_true(evp_keymgmt_util_export(key, OSSL_KEYMGMT_SELECT_ALL,
1789 ec_export_get_encoding_cb, &enc))
1790 || !TEST_int_eq(enc, ec_encodings[idx].encoding))
1791 goto done;
1792
1793 ret = 1;
1794 done:
1795 EVP_PKEY_free(key);
1796 EVP_PKEY_free(params);
1797 EVP_PKEY_CTX_free(kctx);
1798 EVP_PKEY_CTX_free(pctx);
1799 return ret;
1800 }
1801 #endif
1802
1803 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
1804
1805 static int test_EVP_SM2_verify(void)
1806 {
1807 const char *pubkey =
1808 "-----BEGIN PUBLIC KEY-----\n"
1809 "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEp1KLWq1ZE2jmoAnnBJE1LBGxVr18\n"
1810 "YvvqECWCpXfAQ9qUJ+UmthnUPf0iM3SaXKHe6PlLIDyNlWMWb9RUh/yU3g==\n"
1811 "-----END PUBLIC KEY-----\n";
1812
1813 const char *msg = "message digest";
1814 const char *id = "ALICE123@YAHOO.COM";
1815
1816 const uint8_t signature[] = {
1817 0x30, 0x44, 0x02, 0x20, 0x5b, 0xdb, 0xab, 0x81, 0x4f, 0xbb,
1818 0x8b, 0x69, 0xb1, 0x05, 0x9c, 0x99, 0x3b, 0xb2, 0x45, 0x06,
1819 0x4a, 0x30, 0x15, 0x59, 0x84, 0xcd, 0xee, 0x30, 0x60, 0x36,
1820 0x57, 0x87, 0xef, 0x5c, 0xd0, 0xbe, 0x02, 0x20, 0x43, 0x8d,
1821 0x1f, 0xc7, 0x77, 0x72, 0x39, 0xbb, 0x72, 0xe1, 0xfd, 0x07,
1822 0x58, 0xd5, 0x82, 0xc8, 0x2d, 0xba, 0x3b, 0x2c, 0x46, 0x24,
1823 0xe3, 0x50, 0xff, 0x04, 0xc7, 0xa0, 0x71, 0x9f, 0xa4, 0x70
1824 };
1825
1826 int rc = 0;
1827 BIO *bio = NULL;
1828 EVP_PKEY *pkey = NULL;
1829 EVP_MD_CTX *mctx = NULL;
1830 EVP_PKEY_CTX *pctx = NULL;
1831 EVP_MD *sm3 = NULL;
1832
1833 bio = BIO_new_mem_buf(pubkey, strlen(pubkey));
1834 if (!TEST_true(bio != NULL))
1835 goto done;
1836
1837 pkey = PEM_read_bio_PUBKEY_ex(bio, NULL, NULL, NULL, testctx, testpropq);
1838 if (!TEST_true(pkey != NULL))
1839 goto done;
1840
1841 if (!TEST_true(EVP_PKEY_is_a(pkey, "SM2")))
1842 goto done;
1843
1844 if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
1845 goto done;
1846
1847 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1848 goto done;
1849
1850 EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
1851
1852 if (!TEST_ptr(sm3 = EVP_MD_fetch(testctx, "sm3", testpropq)))
1853 goto done;
1854
1855 if (!TEST_true(EVP_DigestVerifyInit(mctx, NULL, sm3, NULL, pkey)))
1856 goto done;
1857
1858 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, id, strlen(id)), 0))
1859 goto done;
1860
1861 if (!TEST_true(EVP_DigestVerifyUpdate(mctx, msg, strlen(msg))))
1862 goto done;
1863
1864 if (!TEST_int_gt(EVP_DigestVerifyFinal(mctx, signature, sizeof(signature)), 0))
1865 goto done;
1866 rc = 1;
1867
1868 done:
1869 BIO_free(bio);
1870 EVP_PKEY_free(pkey);
1871 EVP_PKEY_CTX_free(pctx);
1872 EVP_MD_CTX_free(mctx);
1873 EVP_MD_free(sm3);
1874 return rc;
1875 }
1876
1877 static int test_EVP_SM2(void)
1878 {
1879 int ret = 0;
1880 EVP_PKEY *pkey = NULL;
1881 EVP_PKEY *pkeyparams = NULL;
1882 EVP_PKEY_CTX *pctx = NULL;
1883 EVP_PKEY_CTX *kctx = NULL;
1884 EVP_PKEY_CTX *sctx = NULL;
1885 size_t sig_len = 0;
1886 unsigned char *sig = NULL;
1887 EVP_MD_CTX *md_ctx = NULL;
1888 EVP_MD_CTX *md_ctx_verify = NULL;
1889 EVP_PKEY_CTX *cctx = NULL;
1890 EVP_MD *check_md = NULL;
1891
1892 uint8_t ciphertext[128];
1893 size_t ctext_len = sizeof(ciphertext);
1894
1895 uint8_t plaintext[8];
1896 size_t ptext_len = sizeof(plaintext);
1897
1898 uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
1899
1900 OSSL_PARAM sparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1901 OSSL_PARAM gparams[2] = {OSSL_PARAM_END, OSSL_PARAM_END};
1902 int i;
1903 char mdname[OSSL_MAX_NAME_SIZE];
1904
1905 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx,
1906 "SM2", testpropq)))
1907 goto done;
1908
1909 if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
1910 goto done;
1911
1912 if (!TEST_int_gt(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2), 0))
1913 goto done;
1914
1915 if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
1916 goto done;
1917
1918 if (!TEST_ptr(kctx = EVP_PKEY_CTX_new_from_pkey(testctx,
1919 pkeyparams, testpropq)))
1920 goto done;
1921
1922 if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0))
1923 goto done;
1924
1925 if (!TEST_true(EVP_PKEY_keygen(kctx, &pkey)))
1926 goto done;
1927
1928 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
1929 goto done;
1930
1931 if (!TEST_ptr(md_ctx_verify = EVP_MD_CTX_new()))
1932 goto done;
1933
1934 if (!TEST_ptr(sctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
1935 goto done;
1936
1937 EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
1938 EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
1939
1940 if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, "sm3", testpropq)))
1941 goto done;
1942
1943 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, check_md, NULL, pkey)))
1944 goto done;
1945
1946 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1947 goto done;
1948
1949 if (!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
1950 goto done;
1951
1952 /* Determine the size of the signature. */
1953 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len)))
1954 goto done;
1955
1956 if (!TEST_ptr(sig = OPENSSL_malloc(sig_len)))
1957 goto done;
1958
1959 if (!TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
1960 goto done;
1961
1962 /* Ensure that the signature round-trips. */
1963
1964 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
1965 pkey)))
1966 goto done;
1967
1968 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1969 goto done;
1970
1971 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1972 goto done;
1973
1974 if (!TEST_int_gt(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1975 goto done;
1976
1977 /*
1978 * Try verify again with non-matching 0 length id but ensure that it can
1979 * be set on the context and overrides the previous value.
1980 */
1981
1982 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, check_md, NULL,
1983 pkey)))
1984 goto done;
1985
1986 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, NULL, 0), 0))
1987 goto done;
1988
1989 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
1990 goto done;
1991
1992 if (!TEST_int_eq(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len), 0))
1993 goto done;
1994
1995 /* now check encryption/decryption */
1996
1997 gparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1998 mdname, sizeof(mdname));
1999 for (i = 0; i < 2; i++) {
2000 const char *mdnames[] = {
2001 #ifndef OPENSSL_NO_SM3
2002 "SM3",
2003 #else
2004 NULL,
2005 #endif
2006 "SHA2-256" };
2007 EVP_PKEY_CTX_free(cctx);
2008
2009 if (mdnames[i] == NULL)
2010 continue;
2011
2012 sparams[0] =
2013 OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
2014 (char *)mdnames[i], 0);
2015
2016 if (!TEST_ptr(cctx = EVP_PKEY_CTX_new_from_pkey(testctx,
2017 pkey, testpropq)))
2018 goto done;
2019
2020 if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
2021 goto done;
2022
2023 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
2024 goto done;
2025
2026 if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg,
2027 sizeof(kMsg))))
2028 goto done;
2029
2030 if (!TEST_true(EVP_PKEY_decrypt_init(cctx)))
2031 goto done;
2032
2033 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
2034 goto done;
2035
2036 if (!TEST_int_gt(EVP_PKEY_decrypt(cctx, plaintext, &ptext_len, ciphertext,
2037 ctext_len), 0))
2038 goto done;
2039
2040 if (!TEST_true(EVP_PKEY_CTX_get_params(cctx, gparams)))
2041 goto done;
2042
2043 /*
2044 * Test we're still using the digest we think we are.
2045 * Because of aliases, the easiest is to fetch the digest and
2046 * check the name with EVP_MD_is_a().
2047 */
2048 EVP_MD_free(check_md);
2049 if (!TEST_ptr(check_md = EVP_MD_fetch(testctx, mdname, testpropq)))
2050 goto done;
2051 if (!TEST_true(EVP_MD_is_a(check_md, mdnames[i]))) {
2052 TEST_info("Fetched md %s isn't %s", mdname, mdnames[i]);
2053 goto done;
2054 }
2055
2056 if (!TEST_true(ptext_len == sizeof(kMsg)))
2057 goto done;
2058
2059 if (!TEST_true(memcmp(plaintext, kMsg, sizeof(kMsg)) == 0))
2060 goto done;
2061 }
2062
2063 ret = 1;
2064 done:
2065 EVP_PKEY_CTX_free(pctx);
2066 EVP_PKEY_CTX_free(kctx);
2067 EVP_PKEY_CTX_free(sctx);
2068 EVP_PKEY_CTX_free(cctx);
2069 EVP_PKEY_free(pkey);
2070 EVP_PKEY_free(pkeyparams);
2071 EVP_MD_CTX_free(md_ctx);
2072 EVP_MD_CTX_free(md_ctx_verify);
2073 EVP_MD_free(check_md);
2074 OPENSSL_free(sig);
2075 return ret;
2076 }
2077
2078 #endif
2079
2080 static struct keys_st {
2081 int type;
2082 char *priv;
2083 char *pub;
2084 } keys[] = {
2085 {
2086 EVP_PKEY_HMAC, "0123456789", NULL
2087 },
2088 {
2089 EVP_PKEY_HMAC, "", NULL
2090 #ifndef OPENSSL_NO_POLY1305
2091 }, {
2092 EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
2093 #endif
2094 #ifndef OPENSSL_NO_SIPHASH
2095 }, {
2096 EVP_PKEY_SIPHASH, "0123456789012345", NULL
2097 #endif
2098 },
2099 #ifndef OPENSSL_NO_EC
2100 {
2101 EVP_PKEY_X25519, "01234567890123456789012345678901",
2102 "abcdefghijklmnopqrstuvwxyzabcdef"
2103 }, {
2104 EVP_PKEY_ED25519, "01234567890123456789012345678901",
2105 "abcdefghijklmnopqrstuvwxyzabcdef"
2106 }, {
2107 EVP_PKEY_X448,
2108 "01234567890123456789012345678901234567890123456789012345",
2109 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
2110 }, {
2111 EVP_PKEY_ED448,
2112 "012345678901234567890123456789012345678901234567890123456",
2113 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde"
2114 }
2115 #endif
2116 };
2117
2118 static int test_set_get_raw_keys_int(int tst, int pub, int uselibctx)
2119 {
2120 int ret = 0;
2121 unsigned char buf[80];
2122 unsigned char *in;
2123 size_t inlen, len = 0, shortlen = 1;
2124 EVP_PKEY *pkey;
2125
2126 /* Check if this algorithm supports public keys */
2127 if (pub && keys[tst].pub == NULL)
2128 return 1;
2129
2130 memset(buf, 0, sizeof(buf));
2131
2132 if (pub) {
2133 #ifndef OPENSSL_NO_EC
2134 inlen = strlen(keys[tst].pub);
2135 in = (unsigned char *)keys[tst].pub;
2136 if (uselibctx) {
2137 pkey = EVP_PKEY_new_raw_public_key_ex(
2138 testctx,
2139 OBJ_nid2sn(keys[tst].type),
2140 NULL,
2141 in,
2142 inlen);
2143 } else {
2144 pkey = EVP_PKEY_new_raw_public_key(keys[tst].type,
2145 NULL,
2146 in,
2147 inlen);
2148 }
2149 #else
2150 return 1;
2151 #endif
2152 } else {
2153 inlen = strlen(keys[tst].priv);
2154 in = (unsigned char *)keys[tst].priv;
2155 if (uselibctx) {
2156 pkey = EVP_PKEY_new_raw_private_key_ex(
2157 testctx, OBJ_nid2sn(keys[tst].type),
2158 NULL,
2159 in,
2160 inlen);
2161 } else {
2162 pkey = EVP_PKEY_new_raw_private_key(keys[tst].type,
2163 NULL,
2164 in,
2165 inlen);
2166 }
2167 }
2168
2169 if (!TEST_ptr(pkey)
2170 || !TEST_int_eq(EVP_PKEY_eq(pkey, pkey), 1)
2171 || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
2172 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
2173 || !TEST_true(len == inlen))
2174 goto done;
2175 if (tst != 1) {
2176 /*
2177 * Test that supplying a buffer that is too small fails. Doesn't apply
2178 * to HMAC with a zero length key
2179 */
2180 if ((!pub && !TEST_false(EVP_PKEY_get_raw_private_key(pkey, buf,
2181 &shortlen)))
2182 || (pub && !TEST_false(EVP_PKEY_get_raw_public_key(pkey, buf,
2183 &shortlen))))
2184 goto done;
2185 }
2186 if ((!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, buf, &len)))
2187 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, buf, &len)))
2188 || !TEST_mem_eq(in, inlen, buf, len))
2189 goto done;
2190
2191 ret = 1;
2192 done:
2193 EVP_PKEY_free(pkey);
2194 return ret;
2195 }
2196
2197 static int test_set_get_raw_keys(int tst)
2198 {
2199 return (nullprov != NULL || test_set_get_raw_keys_int(tst, 0, 0))
2200 && test_set_get_raw_keys_int(tst, 0, 1)
2201 && (nullprov != NULL || test_set_get_raw_keys_int(tst, 1, 0))
2202 && test_set_get_raw_keys_int(tst, 1, 1);
2203 }
2204
2205 #ifndef OPENSSL_NO_DEPRECATED_3_0
2206 static int pkey_custom_check(EVP_PKEY *pkey)
2207 {
2208 return 0xbeef;
2209 }
2210
2211 static int pkey_custom_pub_check(EVP_PKEY *pkey)
2212 {
2213 return 0xbeef;
2214 }
2215
2216 static int pkey_custom_param_check(EVP_PKEY *pkey)
2217 {
2218 return 0xbeef;
2219 }
2220
2221 static EVP_PKEY_METHOD *custom_pmeth;
2222 #endif
2223
2224 static int test_EVP_PKEY_check(int i)
2225 {
2226 int ret = 0;
2227 EVP_PKEY *pkey = NULL;
2228 EVP_PKEY_CTX *ctx = NULL;
2229 #ifndef OPENSSL_NO_DEPRECATED_3_0
2230 EVP_PKEY_CTX *ctx2 = NULL;
2231 #endif
2232 const APK_DATA *ak = &keycheckdata[i];
2233 const unsigned char *input = ak->kder;
2234 size_t input_len = ak->size;
2235 int expected_id = ak->evptype;
2236 int expected_check = ak->check;
2237 int expected_pub_check = ak->pub_check;
2238 int expected_param_check = ak->param_check;
2239 int type = ak->type;
2240
2241 if (!TEST_ptr(pkey = load_example_key(ak->keytype, input, input_len)))
2242 goto done;
2243 if (type == 0
2244 && !TEST_int_eq(EVP_PKEY_get_id(pkey), expected_id))
2245 goto done;
2246
2247 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq)))
2248 goto done;
2249
2250 if (!TEST_int_eq(EVP_PKEY_check(ctx), expected_check))
2251 goto done;
2252
2253 if (!TEST_int_eq(EVP_PKEY_public_check(ctx), expected_pub_check))
2254 goto done;
2255
2256 if (!TEST_int_eq(EVP_PKEY_param_check(ctx), expected_param_check))
2257 goto done;
2258
2259 #ifndef OPENSSL_NO_DEPRECATED_3_0
2260 ctx2 = EVP_PKEY_CTX_new_id(0xdefaced, NULL);
2261 /* assign the pkey directly, as an internal test */
2262 EVP_PKEY_up_ref(pkey);
2263 ctx2->pkey = pkey;
2264
2265 if (!TEST_int_eq(EVP_PKEY_check(ctx2), 0xbeef))
2266 goto done;
2267
2268 if (!TEST_int_eq(EVP_PKEY_public_check(ctx2), 0xbeef))
2269 goto done;
2270
2271 if (!TEST_int_eq(EVP_PKEY_param_check(ctx2), 0xbeef))
2272 goto done;
2273 #endif
2274
2275 ret = 1;
2276
2277 done:
2278 EVP_PKEY_CTX_free(ctx);
2279 #ifndef OPENSSL_NO_DEPRECATED_3_0
2280 EVP_PKEY_CTX_free(ctx2);
2281 #endif
2282 EVP_PKEY_free(pkey);
2283 return ret;
2284 }
2285
2286 #ifndef OPENSSL_NO_CMAC
2287 static int get_cmac_val(EVP_PKEY *pkey, unsigned char *mac)
2288 {
2289 EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
2290 const char msg[] = "Hello World";
2291 size_t maclen = AES_BLOCK_SIZE;
2292 int ret = 1;
2293
2294 if (!TEST_ptr(mdctx)
2295 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, NULL, testctx,
2296 testpropq, pkey, NULL))
2297 || !TEST_true(EVP_DigestSignUpdate(mdctx, msg, sizeof(msg)))
2298 || !TEST_true(EVP_DigestSignFinal(mdctx, mac, &maclen))
2299 || !TEST_size_t_eq(maclen, AES_BLOCK_SIZE))
2300 ret = 0;
2301
2302 EVP_MD_CTX_free(mdctx);
2303
2304 return ret;
2305 }
2306 static int test_CMAC_keygen(void)
2307 {
2308 static unsigned char key[] = {
2309 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2310 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2311 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
2312 };
2313 EVP_PKEY_CTX *kctx = NULL;
2314 int ret = 0;
2315 EVP_PKEY *pkey = NULL;
2316 unsigned char mac[AES_BLOCK_SIZE];
2317 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
2318 unsigned char mac2[AES_BLOCK_SIZE];
2319 # endif
2320
2321 if (nullprov != NULL)
2322 return TEST_skip("Test does not support a non-default library context");
2323
2324 /*
2325 * This is a legacy method for CMACs, but should still work.
2326 * This verifies that it works without an ENGINE.
2327 */
2328 kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_CMAC, NULL);
2329
2330 /* Test a CMAC key created using the "generated" method */
2331 if (!TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
2332 || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
2333 EVP_PKEY_CTRL_CIPHER,
2334 0, (void *)EVP_aes_256_ecb()), 0)
2335 || !TEST_int_gt(EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,
2336 EVP_PKEY_CTRL_SET_MAC_KEY,
2337 sizeof(key), (void *)key), 0)
2338 || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0)
2339 || !TEST_ptr(pkey)
2340 || !TEST_true(get_cmac_val(pkey, mac)))
2341 goto done;
2342
2343 # if !defined(OPENSSL_NO_DEPRECATED_3_0)
2344 EVP_PKEY_free(pkey);
2345
2346 /*
2347 * Test a CMAC key using the direct method, and compare with the mac
2348 * created above.
2349 */
2350 pkey = EVP_PKEY_new_CMAC_key(NULL, key, sizeof(key), EVP_aes_256_ecb());
2351 if (!TEST_ptr(pkey)
2352 || !TEST_true(get_cmac_val(pkey, mac2))
2353 || !TEST_mem_eq(mac, sizeof(mac), mac2, sizeof(mac2)))
2354 goto done;
2355 # endif
2356
2357 ret = 1;
2358
2359 done:
2360 EVP_PKEY_free(pkey);
2361 EVP_PKEY_CTX_free(kctx);
2362 return ret;
2363 }
2364 #endif
2365
2366 static int test_HKDF(void)
2367 {
2368 EVP_PKEY_CTX *pctx;
2369 unsigned char out[20];
2370 size_t outlen;
2371 int i, ret = 0;
2372 unsigned char salt[] = "0123456789";
2373 unsigned char key[] = "012345678901234567890123456789";
2374 unsigned char info[] = "infostring";
2375 const unsigned char expected[] = {
2376 0xe5, 0x07, 0x70, 0x7f, 0xc6, 0x78, 0xd6, 0x54, 0x32, 0x5f, 0x7e, 0xc5,
2377 0x7b, 0x59, 0x3e, 0xd8, 0x03, 0x6b, 0xed, 0xca
2378 };
2379 size_t expectedlen = sizeof(expected);
2380
2381 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
2382 goto done;
2383
2384 /* We do this twice to test reuse of the EVP_PKEY_CTX */
2385 for (i = 0; i < 2; i++) {
2386 outlen = sizeof(out);
2387 memset(out, 0, outlen);
2388
2389 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
2390 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
2391 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
2392 sizeof(salt) - 1), 0)
2393 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
2394 sizeof(key) - 1), 0)
2395 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
2396 sizeof(info) - 1), 0)
2397 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
2398 || !TEST_mem_eq(out, outlen, expected, expectedlen))
2399 goto done;
2400 }
2401
2402 ret = 1;
2403
2404 done:
2405 EVP_PKEY_CTX_free(pctx);
2406
2407 return ret;
2408 }
2409
2410 static int test_emptyikm_HKDF(void)
2411 {
2412 EVP_PKEY_CTX *pctx;
2413 unsigned char out[20];
2414 size_t outlen;
2415 int ret = 0;
2416 unsigned char salt[] = "9876543210";
2417 unsigned char key[] = "";
2418 unsigned char info[] = "stringinfo";
2419 const unsigned char expected[] = {
2420 0x68, 0x81, 0xa5, 0x3e, 0x5b, 0x9c, 0x7b, 0x6f, 0x2e, 0xec, 0xc8, 0x47,
2421 0x7c, 0xfa, 0x47, 0x35, 0x66, 0x82, 0x15, 0x30
2422 };
2423 size_t expectedlen = sizeof(expected);
2424
2425 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "HKDF", testpropq)))
2426 goto done;
2427
2428 outlen = sizeof(out);
2429 memset(out, 0, outlen);
2430
2431 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
2432 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
2433 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
2434 sizeof(salt) - 1), 0)
2435 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
2436 sizeof(key) - 1), 0)
2437 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
2438 sizeof(info) - 1), 0)
2439 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
2440 || !TEST_mem_eq(out, outlen, expected, expectedlen))
2441 goto done;
2442
2443 ret = 1;
2444
2445 done:
2446 EVP_PKEY_CTX_free(pctx);
2447
2448 return ret;
2449 }
2450
2451 #ifndef OPENSSL_NO_EC
2452 static int test_X509_PUBKEY_inplace(void)
2453 {
2454 int ret = 0;
2455 X509_PUBKEY *xp = X509_PUBKEY_new_ex(testctx, testpropq);
2456 const unsigned char *p = kExampleECPubKeyDER;
2457 size_t input_len = sizeof(kExampleECPubKeyDER);
2458
2459 if (!TEST_ptr(xp))
2460 goto done;
2461 if (!TEST_ptr(d2i_X509_PUBKEY(&xp, &p, input_len)))
2462 goto done;
2463
2464 if (!TEST_ptr(X509_PUBKEY_get0(xp)))
2465 goto done;
2466
2467 p = kExampleBadECPubKeyDER;
2468 input_len = sizeof(kExampleBadECPubKeyDER);
2469
2470 if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len)))
2471 goto done;
2472
2473 if (!TEST_true(X509_PUBKEY_get0(xp) == NULL))
2474 goto done;
2475
2476 ret = 1;
2477
2478 done:
2479 X509_PUBKEY_free(xp);
2480 return ret;
2481 }
2482
2483 static int test_X509_PUBKEY_dup(void)
2484 {
2485 int ret = 0;
2486 X509_PUBKEY *xp = NULL, *xq = NULL;
2487 const unsigned char *p = kExampleECPubKeyDER;
2488 size_t input_len = sizeof(kExampleECPubKeyDER);
2489
2490 xp = X509_PUBKEY_new_ex(testctx, testpropq);
2491 if (!TEST_ptr(xp)
2492 || !TEST_ptr(d2i_X509_PUBKEY(&xp, &p, input_len))
2493 || !TEST_ptr(xq = X509_PUBKEY_dup(xp))
2494 || !TEST_ptr_ne(xp, xq))
2495 goto done;
2496
2497 if (!TEST_ptr(X509_PUBKEY_get0(xq))
2498 || !TEST_ptr(X509_PUBKEY_get0(xp))
2499 || !TEST_ptr_ne(X509_PUBKEY_get0(xq), X509_PUBKEY_get0(xp)))
2500 goto done;
2501
2502 X509_PUBKEY_free(xq);
2503 xq = NULL;
2504 p = kExampleBadECPubKeyDER;
2505 input_len = sizeof(kExampleBadECPubKeyDER);
2506
2507 if (!TEST_ptr(xp = d2i_X509_PUBKEY(&xp, &p, input_len))
2508 || !TEST_ptr(xq = X509_PUBKEY_dup(xp)))
2509 goto done;
2510
2511 X509_PUBKEY_free(xp);
2512 xp = NULL;
2513 if (!TEST_true(X509_PUBKEY_get0(xq) == NULL))
2514 goto done;
2515
2516 ret = 1;
2517
2518 done:
2519 X509_PUBKEY_free(xp);
2520 X509_PUBKEY_free(xq);
2521 return ret;
2522 }
2523 #endif /* OPENSSL_NO_EC */
2524
2525 /* Test getting and setting parameters on an EVP_PKEY_CTX */
2526 static int test_EVP_PKEY_CTX_get_set_params(EVP_PKEY *pkey)
2527 {
2528 EVP_MD_CTX *mdctx = NULL;
2529 EVP_PKEY_CTX *ctx = NULL;
2530 const OSSL_PARAM *params;
2531 OSSL_PARAM ourparams[2], *param = ourparams, *param_md;
2532 int ret = 0;
2533 const EVP_MD *md;
2534 char mdname[OSSL_MAX_NAME_SIZE];
2535 char ssl3ms[48];
2536
2537 /* Initialise a sign operation */
2538 ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, testpropq);
2539 if (!TEST_ptr(ctx)
2540 || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0))
2541 goto err;
2542
2543 /*
2544 * We should be able to query the parameters now.
2545 */
2546 params = EVP_PKEY_CTX_settable_params(ctx);
2547 if (!TEST_ptr(params)
2548 || !TEST_ptr(OSSL_PARAM_locate_const(params,
2549 OSSL_SIGNATURE_PARAM_DIGEST)))
2550 goto err;
2551
2552 params = EVP_PKEY_CTX_gettable_params(ctx);
2553 if (!TEST_ptr(params)
2554 || !TEST_ptr(OSSL_PARAM_locate_const(params,
2555 OSSL_SIGNATURE_PARAM_ALGORITHM_ID))
2556 || !TEST_ptr(OSSL_PARAM_locate_const(params,
2557 OSSL_SIGNATURE_PARAM_DIGEST)))
2558 goto err;
2559
2560 /*
2561 * Test getting and setting params via EVP_PKEY_CTX_set_params() and
2562 * EVP_PKEY_CTX_get_params()
2563 */
2564 strcpy(mdname, "SHA512");
2565 param_md = param;
2566 *param++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2567 mdname, 0);
2568 *param++ = OSSL_PARAM_construct_end();
2569
2570 if (!TEST_true(EVP_PKEY_CTX_set_params(ctx, ourparams)))
2571 goto err;
2572
2573 mdname[0] = '\0';
2574 *param_md = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
2575 mdname, sizeof(mdname));
2576 if (!TEST_true(EVP_PKEY_CTX_get_params(ctx, ourparams))
2577 || !TEST_str_eq(mdname, "SHA512"))
2578 goto err;
2579
2580 /*
2581 * Test the TEST_PKEY_CTX_set_signature_md() and
2582 * TEST_PKEY_CTX_get_signature_md() functions
2583 */
2584 if (!TEST_int_gt(EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()), 0)
2585 || !TEST_int_gt(EVP_PKEY_CTX_get_signature_md(ctx, &md), 0)
2586 || !TEST_ptr_eq(md, EVP_sha256()))
2587 goto err;
2588
2589 /*
2590 * Test getting MD parameters via an associated EVP_PKEY_CTX
2591 */
2592 mdctx = EVP_MD_CTX_new();
2593 if (!TEST_ptr(mdctx)
2594 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, "SHA1", testctx, testpropq,
2595 pkey, NULL)))
2596 goto err;
2597
2598 /*
2599 * We now have an EVP_MD_CTX with an EVP_PKEY_CTX inside it. We should be
2600 * able to obtain the digest's settable parameters from the provider.
2601 */
2602 params = EVP_MD_CTX_settable_params(mdctx);
2603 if (!TEST_ptr(params)
2604 || !TEST_int_eq(strcmp(params[0].key, OSSL_DIGEST_PARAM_SSL3_MS), 0)
2605 /* The final key should be NULL */
2606 || !TEST_ptr_null(params[1].key))
2607 goto err;
2608
2609 param = ourparams;
2610 memset(ssl3ms, 0, sizeof(ssl3ms));
2611 *param++ = OSSL_PARAM_construct_octet_string(OSSL_DIGEST_PARAM_SSL3_MS,
2612 ssl3ms, sizeof(ssl3ms));
2613 *param++ = OSSL_PARAM_construct_end();
2614
2615 if (!TEST_true(EVP_MD_CTX_set_params(mdctx, ourparams)))
2616 goto err;
2617
2618 ret = 1;
2619
2620 err:
2621 EVP_MD_CTX_free(mdctx);
2622 EVP_PKEY_CTX_free(ctx);
2623
2624 return ret;
2625 }
2626
2627 #ifndef OPENSSL_NO_DSA
2628 static int test_DSA_get_set_params(void)
2629 {
2630 OSSL_PARAM_BLD *bld = NULL;
2631 OSSL_PARAM *params = NULL;
2632 BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL, *priv = NULL;
2633 EVP_PKEY_CTX *pctx = NULL;
2634 EVP_PKEY *pkey = NULL;
2635 int ret = 0;
2636
2637 /*
2638 * Setup the parameters for our DSA object. For our purposes they don't
2639 * have to actually be *valid* parameters. We just need to set something.
2640 */
2641 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "DSA", NULL))
2642 || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2643 || !TEST_ptr(p = BN_new())
2644 || !TEST_ptr(q = BN_new())
2645 || !TEST_ptr(g = BN_new())
2646 || !TEST_ptr(pub = BN_new())
2647 || !TEST_ptr(priv = BN_new()))
2648 goto err;
2649 if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
2650 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
2651 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
2652 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
2653 pub))
2654 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
2655 priv)))
2656 goto err;
2657 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2658 goto err;
2659
2660 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2661 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2662 params), 0))
2663 goto err;
2664
2665 if (!TEST_ptr(pkey))
2666 goto err;
2667
2668 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2669
2670 err:
2671 EVP_PKEY_free(pkey);
2672 EVP_PKEY_CTX_free(pctx);
2673 OSSL_PARAM_free(params);
2674 OSSL_PARAM_BLD_free(bld);
2675 BN_free(p);
2676 BN_free(q);
2677 BN_free(g);
2678 BN_free(pub);
2679 BN_free(priv);
2680
2681 return ret;
2682 }
2683
2684 /*
2685 * Test combinations of private, public, missing and private + public key
2686 * params to ensure they are all accepted
2687 */
2688 static int test_DSA_priv_pub(void)
2689 {
2690 return test_EVP_PKEY_ffc_priv_pub("DSA");
2691 }
2692
2693 #endif /* !OPENSSL_NO_DSA */
2694
2695 static int test_RSA_get_set_params(void)
2696 {
2697 OSSL_PARAM_BLD *bld = NULL;
2698 OSSL_PARAM *params = NULL;
2699 BIGNUM *n = NULL, *e = NULL, *d = NULL;
2700 EVP_PKEY_CTX *pctx = NULL;
2701 EVP_PKEY *pkey = NULL;
2702 int ret = 0;
2703
2704 /*
2705 * Setup the parameters for our RSA object. For our purposes they don't
2706 * have to actually be *valid* parameters. We just need to set something.
2707 */
2708 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA", NULL))
2709 || !TEST_ptr(bld = OSSL_PARAM_BLD_new())
2710 || !TEST_ptr(n = BN_new())
2711 || !TEST_ptr(e = BN_new())
2712 || !TEST_ptr(d = BN_new()))
2713 goto err;
2714 if (!TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
2715 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
2716 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d)))
2717 goto err;
2718 if (!TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld)))
2719 goto err;
2720
2721 if (!TEST_int_gt(EVP_PKEY_fromdata_init(pctx), 0)
2722 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR,
2723 params), 0))
2724 goto err;
2725
2726 if (!TEST_ptr(pkey))
2727 goto err;
2728
2729 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
2730
2731 err:
2732 EVP_PKEY_free(pkey);
2733 EVP_PKEY_CTX_free(pctx);
2734 OSSL_PARAM_free(params);
2735 OSSL_PARAM_BLD_free(bld);
2736 BN_free(n);
2737 BN_free(e);
2738 BN_free(d);
2739
2740 return ret;
2741 }
2742
2743 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2744 static int test_decrypt_null_chunks(void)
2745 {
2746 EVP_CIPHER_CTX* ctx = NULL;
2747 EVP_CIPHER *cipher = NULL;
2748 const unsigned char key[32] = {
2749 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
2750 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2751 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1
2752 };
2753 unsigned char iv[12] = {
2754 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b
2755 };
2756 unsigned char msg[] = "It was the best of times, it was the worst of times";
2757 unsigned char ciphertext[80];
2758 unsigned char plaintext[80];
2759 /* We initialise tmp to a non zero value on purpose */
2760 int ctlen, ptlen, tmp = 99;
2761 int ret = 0;
2762 const int enc_offset = 10, dec_offset = 20;
2763
2764 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, "ChaCha20-Poly1305", testpropq))
2765 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
2766 || !TEST_true(EVP_EncryptInit_ex(ctx, cipher, NULL,
2767 key, iv))
2768 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &ctlen, msg,
2769 enc_offset))
2770 /* Deliberate add a zero length update */
2771 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp, NULL,
2772 0))
2773 || !TEST_int_eq(tmp, 0)
2774 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext + ctlen, &tmp,
2775 msg + enc_offset,
2776 sizeof(msg) - enc_offset))
2777 || !TEST_int_eq(ctlen += tmp, sizeof(msg))
2778 || !TEST_true(EVP_EncryptFinal(ctx, ciphertext + ctlen, &tmp))
2779 || !TEST_int_eq(tmp, 0))
2780 goto err;
2781
2782 /* Deliberately initialise tmp to a non zero value */
2783 tmp = 99;
2784 if (!TEST_true(EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv))
2785 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext, &ptlen, ciphertext,
2786 dec_offset))
2787 /*
2788 * Deliberately add a zero length update. We also deliberately do
2789 * this at a different offset than for encryption.
2790 */
2791 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp, NULL,
2792 0))
2793 || !TEST_int_eq(tmp, 0)
2794 || !TEST_true(EVP_DecryptUpdate(ctx, plaintext + ptlen, &tmp,
2795 ciphertext + dec_offset,
2796 ctlen - dec_offset))
2797 || !TEST_int_eq(ptlen += tmp, sizeof(msg))
2798 || !TEST_true(EVP_DecryptFinal(ctx, plaintext + ptlen, &tmp))
2799 || !TEST_int_eq(tmp, 0)
2800 || !TEST_mem_eq(msg, sizeof(msg), plaintext, ptlen))
2801 goto err;
2802
2803 ret = 1;
2804 err:
2805 EVP_CIPHER_CTX_free(ctx);
2806 EVP_CIPHER_free(cipher);
2807 return ret;
2808 }
2809 #endif /* !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) */
2810
2811 #ifndef OPENSSL_NO_DH
2812 /*
2813 * Test combinations of private, public, missing and private + public key
2814 * params to ensure they are all accepted
2815 */
2816 static int test_DH_priv_pub(void)
2817 {
2818 return test_EVP_PKEY_ffc_priv_pub("DH");
2819 }
2820
2821 # ifndef OPENSSL_NO_DEPRECATED_3_0
2822 static int test_EVP_PKEY_set1_DH(void)
2823 {
2824 DH *x942dh = NULL, *noqdh = NULL;
2825 EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
2826 int ret = 0;
2827 BIGNUM *p, *g = NULL;
2828 BIGNUM *pubkey = NULL;
2829 unsigned char pub[2048 / 8];
2830 size_t len = 0;
2831
2832 if (!TEST_ptr(p = BN_new())
2833 || !TEST_ptr(g = BN_new())
2834 || !TEST_ptr(pubkey = BN_new())
2835 || !TEST_true(BN_set_word(p, 9999))
2836 || !TEST_true(BN_set_word(g, 2))
2837 || !TEST_true(BN_set_word(pubkey, 4321))
2838 || !TEST_ptr(noqdh = DH_new())
2839 || !TEST_true(DH_set0_pqg(noqdh, p, NULL, g))
2840 || !TEST_true(DH_set0_key(noqdh, pubkey, NULL))
2841 || !TEST_ptr(pubkey = BN_new())
2842 || !TEST_true(BN_set_word(pubkey, 4321)))
2843 goto err;
2844 p = g = NULL;
2845
2846 x942dh = DH_get_2048_256();
2847 pkey1 = EVP_PKEY_new();
2848 pkey2 = EVP_PKEY_new();
2849 if (!TEST_ptr(x942dh)
2850 || !TEST_ptr(noqdh)
2851 || !TEST_ptr(pkey1)
2852 || !TEST_ptr(pkey2)
2853 || !TEST_true(DH_set0_key(x942dh, pubkey, NULL)))
2854 goto err;
2855 pubkey = NULL;
2856
2857 if (!TEST_true(EVP_PKEY_set1_DH(pkey1, x942dh))
2858 || !TEST_int_eq(EVP_PKEY_get_id(pkey1), EVP_PKEY_DHX))
2859 goto err;
2860
2861 if (!TEST_true(EVP_PKEY_get_bn_param(pkey1, OSSL_PKEY_PARAM_PUB_KEY,
2862 &pubkey))
2863 || !TEST_ptr(pubkey))
2864 goto err;
2865
2866 if (!TEST_true(EVP_PKEY_set1_DH(pkey2, noqdh))
2867 || !TEST_int_eq(EVP_PKEY_get_id(pkey2), EVP_PKEY_DH))
2868 goto err;
2869
2870 if (!TEST_true(EVP_PKEY_get_octet_string_param(pkey2,
2871 OSSL_PKEY_PARAM_PUB_KEY,
2872 pub, sizeof(pub), &len))
2873 || !TEST_size_t_ne(len, 0))
2874 goto err;
2875
2876 ret = 1;
2877 err:
2878 BN_free(p);
2879 BN_free(g);
2880 BN_free(pubkey);
2881 EVP_PKEY_free(pkey1);
2882 EVP_PKEY_free(pkey2);
2883 DH_free(x942dh);
2884 DH_free(noqdh);
2885
2886 return ret;
2887 }
2888 # endif /* !OPENSSL_NO_DEPRECATED_3_0 */
2889 #endif /* !OPENSSL_NO_DH */
2890
2891 /*
2892 * We test what happens with an empty template. For the sake of this test,
2893 * the template must be ignored, and we know that's the case for RSA keys
2894 * (this might arguably be a misfeature, but that's what we currently do,
2895 * even in provider code, since that's how the legacy RSA implementation
2896 * does things)
2897 */
2898 static int test_keygen_with_empty_template(int n)
2899 {
2900 EVP_PKEY_CTX *ctx = NULL;
2901 EVP_PKEY *pkey = NULL;
2902 EVP_PKEY *tkey = NULL;
2903 int ret = 0;
2904
2905 if (nullprov != NULL)
2906 return TEST_skip("Test does not support a non-default library context");
2907
2908 switch (n) {
2909 case 0:
2910 /* We do test with no template at all as well */
2911 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)))
2912 goto err;
2913 break;
2914 case 1:
2915 /* Here we create an empty RSA key that serves as our template */
2916 if (!TEST_ptr(tkey = EVP_PKEY_new())
2917 || !TEST_true(EVP_PKEY_set_type(tkey, EVP_PKEY_RSA))
2918 || !TEST_ptr(ctx = EVP_PKEY_CTX_new(tkey, NULL)))
2919 goto err;
2920 break;
2921 }
2922
2923 if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
2924 || !TEST_int_gt(EVP_PKEY_keygen(ctx, &pkey), 0))
2925 goto err;
2926
2927 ret = 1;
2928 err:
2929 EVP_PKEY_CTX_free(ctx);
2930 EVP_PKEY_free(pkey);
2931 EVP_PKEY_free(tkey);
2932 return ret;
2933 }
2934
2935 /*
2936 * Test that we fail if we attempt to use an algorithm that is not available
2937 * in the current library context (unless we are using an algorithm that
2938 * should be made available via legacy codepaths).
2939 *
2940 * 0: RSA
2941 * 1: SM2
2942 */
2943 static int test_pkey_ctx_fail_without_provider(int tst)
2944 {
2945 OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
2946 OSSL_PROVIDER *tmpnullprov = NULL;
2947 EVP_PKEY_CTX *pctx = NULL;
2948 const char *keytype = NULL;
2949 int expect_null = 0;
2950 int ret = 0;
2951
2952 if (!TEST_ptr(tmpctx))
2953 goto err;
2954
2955 tmpnullprov = OSSL_PROVIDER_load(tmpctx, "null");
2956 if (!TEST_ptr(tmpnullprov))
2957 goto err;
2958
2959 /*
2960 * We check for certain algos in the null provider.
2961 * If an algo is expected to have a provider keymgmt, constructing an
2962 * EVP_PKEY_CTX is expected to fail (return NULL).
2963 * Otherwise, if it's expected to have legacy support, constructing an
2964 * EVP_PKEY_CTX is expected to succeed (return non-NULL).
2965 */
2966 switch (tst) {
2967 case 0:
2968 keytype = "RSA";
2969 expect_null = 1;
2970 break;
2971 case 1:
2972 keytype = "SM2";
2973 expect_null = 1;
2974 #ifdef OPENSSL_NO_EC
2975 TEST_info("EC disable, skipping SM2 check...");
2976 goto end;
2977 #endif
2978 #ifdef OPENSSL_NO_SM2
2979 TEST_info("SM2 disable, skipping SM2 check...");
2980 goto end;
2981 #endif
2982 break;
2983 default:
2984 TEST_error("No test for case %d", tst);
2985 goto err;
2986 }
2987
2988 pctx = EVP_PKEY_CTX_new_from_name(tmpctx, keytype, "");
2989 if (expect_null ? !TEST_ptr_null(pctx) : !TEST_ptr(pctx))
2990 goto err;
2991
2992 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_SM2)
2993 end:
2994 #endif
2995 ret = 1;
2996
2997 err:
2998 EVP_PKEY_CTX_free(pctx);
2999 OSSL_PROVIDER_unload(tmpnullprov);
3000 OSSL_LIB_CTX_free(tmpctx);
3001 return ret;
3002 }
3003
3004 static int test_rand_agglomeration(void)
3005 {
3006 EVP_RAND *rand;
3007 EVP_RAND_CTX *ctx;
3008 OSSL_PARAM params[3], *p = params;
3009 int res;
3010 unsigned int step = 7;
3011 static unsigned char seed[] = "It does not matter how slowly you go "
3012 "as long as you do not stop.";
3013 unsigned char out[sizeof(seed)];
3014
3015 if (!TEST_int_ne(sizeof(seed) % step, 0)
3016 || !TEST_ptr(rand = EVP_RAND_fetch(testctx, "TEST-RAND", testpropq)))
3017 return 0;
3018 ctx = EVP_RAND_CTX_new(rand, NULL);
3019 EVP_RAND_free(rand);
3020 if (!TEST_ptr(ctx))
3021 return 0;
3022
3023 memset(out, 0, sizeof(out));
3024 *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
3025 seed, sizeof(seed));
3026 *p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
3027 *p = OSSL_PARAM_construct_end();
3028 res = TEST_true(EVP_RAND_CTX_set_params(ctx, params))
3029 && TEST_true(EVP_RAND_generate(ctx, out, sizeof(out), 0, 1, NULL, 0))
3030 && TEST_mem_eq(seed, sizeof(seed), out, sizeof(out));
3031 EVP_RAND_CTX_free(ctx);
3032 return res;
3033 }
3034
3035 /*
3036 * Test that we correctly return the original or "running" IV after
3037 * an encryption operation.
3038 * Run multiple times for some different relevant algorithms/modes.
3039 */
3040 static int test_evp_iv_aes(int idx)
3041 {
3042 int ret = 0;
3043 EVP_CIPHER_CTX *ctx = NULL;
3044 unsigned char key[16] = {0x4c, 0x43, 0xdb, 0xdd, 0x42, 0x73, 0x47, 0xd1,
3045 0xe5, 0x62, 0x7d, 0xcd, 0x4d, 0x76, 0x4d, 0x57};
3046 unsigned char init_iv[EVP_MAX_IV_LENGTH] =
3047 {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98, 0x82,
3048 0x5a, 0x55, 0x91, 0x81, 0x42, 0xa8, 0x89, 0x34};
3049 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
3050 9, 10, 11, 12, 13, 14, 15, 16 };
3051 unsigned char ciphertext[32], oiv[16], iv[16];
3052 unsigned char *ref_iv;
3053 unsigned char cbc_state[16] = {0x10, 0x2f, 0x05, 0xcc, 0xc2, 0x55, 0x72, 0xb9,
3054 0x88, 0xe6, 0x4a, 0x17, 0x10, 0x74, 0x22, 0x5e};
3055
3056 unsigned char ofb_state[16] = {0x76, 0xe6, 0x66, 0x61, 0xd0, 0x8a, 0xe4, 0x64,
3057 0xdd, 0x66, 0xbf, 0x00, 0xf0, 0xe3, 0x6f, 0xfd};
3058 unsigned char cfb_state[16] = {0x77, 0xe4, 0x65, 0x65, 0xd5, 0x8c, 0xe3, 0x6c,
3059 0xd4, 0x6c, 0xb4, 0x0c, 0xfd, 0xed, 0x60, 0xed};
3060 unsigned char gcm_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
3061 0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
3062 unsigned char ccm_state[7] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b, 0x98};
3063 #ifndef OPENSSL_NO_OCB
3064 unsigned char ocb_state[12] = {0x57, 0x71, 0x7d, 0xad, 0xdb, 0x9b,
3065 0x98, 0x82, 0x5a, 0x55, 0x91, 0x81};
3066 #endif
3067 int len = sizeof(ciphertext);
3068 size_t ivlen, ref_len;
3069 const EVP_CIPHER *type = NULL;
3070 int iv_reset = 0;
3071
3072 if (nullprov != NULL && idx < 6)
3073 return TEST_skip("Test does not support a non-default library context");
3074
3075 switch (idx) {
3076 case 0:
3077 type = EVP_aes_128_cbc();
3078 /* FALLTHROUGH */
3079 case 6:
3080 type = (type != NULL) ? type :
3081 EVP_CIPHER_fetch(testctx, "aes-128-cbc", testpropq);
3082 ref_iv = cbc_state;
3083 ref_len = sizeof(cbc_state);
3084 iv_reset = 1;
3085 break;
3086 case 1:
3087 type = EVP_aes_128_ofb();
3088 /* FALLTHROUGH */
3089 case 7:
3090 type = (type != NULL) ? type :
3091 EVP_CIPHER_fetch(testctx, "aes-128-ofb", testpropq);
3092 ref_iv = ofb_state;
3093 ref_len = sizeof(ofb_state);
3094 iv_reset = 1;
3095 break;
3096 case 2:
3097 type = EVP_aes_128_cfb();
3098 /* FALLTHROUGH */
3099 case 8:
3100 type = (type != NULL) ? type :
3101 EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq);
3102 ref_iv = cfb_state;
3103 ref_len = sizeof(cfb_state);
3104 iv_reset = 1;
3105 break;
3106 case 3:
3107 type = EVP_aes_128_gcm();
3108 /* FALLTHROUGH */
3109 case 9:
3110 type = (type != NULL) ? type :
3111 EVP_CIPHER_fetch(testctx, "aes-128-gcm", testpropq);
3112 ref_iv = gcm_state;
3113 ref_len = sizeof(gcm_state);
3114 break;
3115 case 4:
3116 type = EVP_aes_128_ccm();
3117 /* FALLTHROUGH */
3118 case 10:
3119 type = (type != NULL) ? type :
3120 EVP_CIPHER_fetch(testctx, "aes-128-ccm", testpropq);
3121 ref_iv = ccm_state;
3122 ref_len = sizeof(ccm_state);
3123 break;
3124 #ifdef OPENSSL_NO_OCB
3125 case 5:
3126 case 11:
3127 return 1;
3128 #else
3129 case 5:
3130 type = EVP_aes_128_ocb();
3131 /* FALLTHROUGH */
3132 case 11:
3133 type = (type != NULL) ? type :
3134 EVP_CIPHER_fetch(testctx, "aes-128-ocb", testpropq);
3135 ref_iv = ocb_state;
3136 ref_len = sizeof(ocb_state);
3137 break;
3138 #endif
3139 default:
3140 return 0;
3141 }
3142
3143 if (!TEST_ptr(type)
3144 || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
3145 || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
3146 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
3147 (int)sizeof(msg)))
3148 || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
3149 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
3150 || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
3151 goto err;
3152 ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
3153 if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
3154 || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
3155 goto err;
3156
3157 /* CBC, OFB, and CFB modes: the updated iv must be reset after reinit */
3158 if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
3159 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
3160 goto err;
3161 if (iv_reset) {
3162 if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
3163 goto err;
3164 } else {
3165 if (!TEST_mem_eq(ref_iv, ivlen, iv, ivlen))
3166 goto err;
3167 }
3168
3169 ret = 1;
3170 err:
3171 EVP_CIPHER_CTX_free(ctx);
3172 if (idx >= 6)
3173 EVP_CIPHER_free((EVP_CIPHER *)type);
3174 return ret;
3175 }
3176
3177 #ifndef OPENSSL_NO_DES
3178 static int test_evp_iv_des(int idx)
3179 {
3180 int ret = 0;
3181 EVP_CIPHER_CTX *ctx = NULL;
3182 static const unsigned char key[24] = {
3183 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
3184 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,
3185 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
3186 };
3187 static const unsigned char init_iv[8] = {
3188 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
3189 };
3190 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8,
3191 9, 10, 11, 12, 13, 14, 15, 16 };
3192 unsigned char ciphertext[32], oiv[8], iv[8];
3193 unsigned const char *ref_iv;
3194 static const unsigned char cbc_state_des[8] = {
3195 0x4f, 0xa3, 0x85, 0xcd, 0x8b, 0xf3, 0x06, 0x2a
3196 };
3197 static const unsigned char cbc_state_3des[8] = {
3198 0x35, 0x27, 0x7d, 0x65, 0x6c, 0xfb, 0x50, 0xd9
3199 };
3200 static const unsigned char ofb_state_des[8] = {
3201 0xa7, 0x0d, 0x1d, 0x45, 0xf9, 0x96, 0x3f, 0x2c
3202 };
3203 static const unsigned char ofb_state_3des[8] = {
3204 0xab, 0x16, 0x24, 0xbb, 0x5b, 0xac, 0xed, 0x5e
3205 };
3206 static const unsigned char cfb_state_des[8] = {
3207 0x91, 0xeb, 0x6d, 0x29, 0x4b, 0x08, 0xbd, 0x73
3208 };
3209 static const unsigned char cfb_state_3des[8] = {
3210 0x34, 0xdd, 0xfb, 0x47, 0x33, 0x1c, 0x61, 0xf7
3211 };
3212 int len = sizeof(ciphertext);
3213 size_t ivlen, ref_len;
3214 EVP_CIPHER *type = NULL;
3215
3216 if (lgcyprov == NULL && idx < 3)
3217 return TEST_skip("Test requires legacy provider to be loaded");
3218
3219 switch (idx) {
3220 case 0:
3221 type = EVP_CIPHER_fetch(testctx, "des-cbc", testpropq);
3222 ref_iv = cbc_state_des;
3223 ref_len = sizeof(cbc_state_des);
3224 break;
3225 case 1:
3226 type = EVP_CIPHER_fetch(testctx, "des-ofb", testpropq);
3227 ref_iv = ofb_state_des;
3228 ref_len = sizeof(ofb_state_des);
3229 break;
3230 case 2:
3231 type = EVP_CIPHER_fetch(testctx, "des-cfb", testpropq);
3232 ref_iv = cfb_state_des;
3233 ref_len = sizeof(cfb_state_des);
3234 break;
3235 case 3:
3236 type = EVP_CIPHER_fetch(testctx, "des-ede3-cbc", testpropq);
3237 ref_iv = cbc_state_3des;
3238 ref_len = sizeof(cbc_state_3des);
3239 break;
3240 case 4:
3241 type = EVP_CIPHER_fetch(testctx, "des-ede3-ofb", testpropq);
3242 ref_iv = ofb_state_3des;
3243 ref_len = sizeof(ofb_state_3des);
3244 break;
3245 case 5:
3246 type = EVP_CIPHER_fetch(testctx, "des-ede3-cfb", testpropq);
3247 ref_iv = cfb_state_3des;
3248 ref_len = sizeof(cfb_state_3des);
3249 break;
3250 default:
3251 return 0;
3252 }
3253
3254 if (!TEST_ptr(type)
3255 || !TEST_ptr((ctx = EVP_CIPHER_CTX_new()))
3256 || !TEST_true(EVP_EncryptInit_ex(ctx, type, NULL, key, init_iv))
3257 || !TEST_true(EVP_EncryptUpdate(ctx, ciphertext, &len, msg,
3258 (int)sizeof(msg)))
3259 || !TEST_true(EVP_CIPHER_CTX_get_original_iv(ctx, oiv, sizeof(oiv)))
3260 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
3261 || !TEST_true(EVP_EncryptFinal_ex(ctx, ciphertext, &len)))
3262 goto err;
3263 ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
3264 if (!TEST_mem_eq(init_iv, ivlen, oiv, ivlen)
3265 || !TEST_mem_eq(ref_iv, ref_len, iv, ivlen))
3266 goto err;
3267
3268 if (!TEST_true(EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, NULL))
3269 || !TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv))))
3270 goto err;
3271 if (!TEST_mem_eq(init_iv, ivlen, iv, ivlen))
3272 goto err;
3273
3274 ret = 1;
3275 err:
3276 EVP_CIPHER_CTX_free(ctx);
3277 EVP_CIPHER_free(type);
3278 return ret;
3279 }
3280 #endif
3281
3282 #ifndef OPENSSL_NO_BF
3283 static int test_evp_bf_default_keylen(int idx)
3284 {
3285 int ret = 0;
3286 static const char *algos[4] = {
3287 "bf-ecb", "bf-cbc", "bf-cfb", "bf-ofb"
3288 };
3289 int ivlen[4] = { 0, 8, 8, 8 };
3290 EVP_CIPHER *cipher = NULL;
3291
3292 if (lgcyprov == NULL)
3293 return TEST_skip("Test requires legacy provider to be loaded");
3294
3295 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, algos[idx], testpropq))
3296 || !TEST_int_eq(EVP_CIPHER_get_key_length(cipher), 16)
3297 || !TEST_int_eq(EVP_CIPHER_get_iv_length(cipher), ivlen[idx]))
3298 goto err;
3299
3300 ret = 1;
3301 err:
3302 EVP_CIPHER_free(cipher);
3303 return ret;
3304 }
3305 #endif
3306
3307 #ifndef OPENSSL_NO_EC
3308 static int ecpub_nids[] = {
3309 NID_brainpoolP256r1, NID_X9_62_prime256v1,
3310 NID_secp384r1, NID_secp521r1,
3311 # ifndef OPENSSL_NO_EC2M
3312 NID_sect233k1, NID_sect233r1, NID_sect283r1,
3313 NID_sect409k1, NID_sect409r1, NID_sect571k1, NID_sect571r1,
3314 # endif
3315 NID_brainpoolP384r1, NID_brainpoolP512r1
3316 };
3317
3318 static int test_ecpub(int idx)
3319 {
3320 int ret = 0, len, savelen;
3321 int nid;
3322 unsigned char buf[1024];
3323 unsigned char *p;
3324 EVP_PKEY *pkey = NULL;
3325 EVP_PKEY_CTX *ctx = NULL;
3326 # ifndef OPENSSL_NO_DEPRECATED_3_0
3327 const unsigned char *q;
3328 EVP_PKEY *pkey2 = NULL;
3329 EC_KEY *ec = NULL;
3330 # endif
3331
3332 if (nullprov != NULL)
3333 return TEST_skip("Test does not support a non-default library context");
3334
3335 nid = ecpub_nids[idx];
3336
3337 ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
3338 if (!TEST_ptr(ctx)
3339 || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
3340 || !TEST_int_gt(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, nid), 0)
3341 || !TEST_true(EVP_PKEY_keygen(ctx, &pkey)))
3342 goto done;
3343 len = i2d_PublicKey(pkey, NULL);
3344 savelen = len;
3345 if (!TEST_int_ge(len, 1)
3346 || !TEST_int_lt(len, 1024))
3347 goto done;
3348 p = buf;
3349 len = i2d_PublicKey(pkey, &p);
3350 if (!TEST_int_ge(len, 1)
3351 || !TEST_int_eq(len, savelen))
3352 goto done;
3353
3354 # ifndef OPENSSL_NO_DEPRECATED_3_0
3355 /* Now try to decode the just-created DER. */
3356 q = buf;
3357 if (!TEST_ptr((pkey2 = EVP_PKEY_new()))
3358 || !TEST_ptr((ec = EC_KEY_new_by_curve_name(nid)))
3359 || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey2, ec)))
3360 goto done;
3361 /* EC_KEY ownership transferred */
3362 ec = NULL;
3363 if (!TEST_ptr(d2i_PublicKey(EVP_PKEY_EC, &pkey2, &q, savelen)))
3364 goto done;
3365 /* The keys should match. */
3366 if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
3367 goto done;
3368 # endif
3369
3370 ret = 1;
3371
3372 done:
3373 EVP_PKEY_CTX_free(ctx);
3374 EVP_PKEY_free(pkey);
3375 # ifndef OPENSSL_NO_DEPRECATED_3_0
3376 EVP_PKEY_free(pkey2);
3377 EC_KEY_free(ec);
3378 # endif
3379 return ret;
3380 }
3381 #endif
3382
3383 static int test_EVP_rsa_pss_with_keygen_bits(void)
3384 {
3385 int ret = 0;
3386 EVP_PKEY_CTX *ctx = NULL;
3387 EVP_PKEY *pkey = NULL;
3388 EVP_MD *md;
3389
3390 md = EVP_MD_fetch(testctx, "sha256", testpropq);
3391 ret = TEST_ptr(md)
3392 && TEST_ptr((ctx = EVP_PKEY_CTX_new_from_name(testctx, "RSA-PSS", testpropq)))
3393 && TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
3394 && TEST_int_gt(EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 512), 0)
3395 && TEST_int_gt(EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md), 0)
3396 && TEST_true(EVP_PKEY_keygen(ctx, &pkey));
3397
3398 EVP_MD_free(md);
3399 EVP_PKEY_free(pkey);
3400 EVP_PKEY_CTX_free(ctx);
3401 return ret;
3402 }
3403
3404 static int test_EVP_rsa_pss_set_saltlen(void)
3405 {
3406 int ret = 0;
3407 EVP_PKEY *pkey = NULL;
3408 EVP_PKEY_CTX *pkey_ctx = NULL;
3409 EVP_MD *sha256 = NULL;
3410 EVP_MD_CTX *sha256_ctx = NULL;
3411 int saltlen = 9999; /* buggy EVP_PKEY_CTX_get_rsa_pss_saltlen() didn't update this */
3412 const int test_value = 32;
3413
3414 ret = TEST_ptr(pkey = load_example_rsa_key())
3415 && TEST_ptr(sha256 = EVP_MD_fetch(testctx, "sha256", NULL))
3416 && TEST_ptr(sha256_ctx = EVP_MD_CTX_new())
3417 && TEST_true(EVP_DigestSignInit(sha256_ctx, &pkey_ctx, sha256, NULL, pkey))
3418 && TEST_true(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING))
3419 && TEST_int_gt(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, test_value), 0)
3420 && TEST_int_gt(EVP_PKEY_CTX_get_rsa_pss_saltlen(pkey_ctx, &saltlen), 0)
3421 && TEST_int_eq(saltlen, test_value);
3422
3423 EVP_MD_CTX_free(sha256_ctx);
3424 EVP_PKEY_free(pkey);
3425 EVP_MD_free(sha256);
3426
3427 return ret;
3428 }
3429
3430 static int success = 1;
3431 static void md_names(const char *name, void *vctx)
3432 {
3433 OSSL_LIB_CTX *ctx = (OSSL_LIB_CTX *)vctx;
3434 /* Force a namemap update */
3435 EVP_CIPHER *aes128 = EVP_CIPHER_fetch(ctx, "AES-128-CBC", NULL);
3436
3437 if (!TEST_ptr(aes128))
3438 success = 0;
3439
3440 EVP_CIPHER_free(aes128);
3441 }
3442
3443 /*
3444 * Test that changing the namemap in a user callback works in a names_do_all
3445 * function.
3446 */
3447 static int test_names_do_all(void)
3448 {
3449 /* We use a custom libctx so that we know the state of the namemap */
3450 OSSL_LIB_CTX *ctx = OSSL_LIB_CTX_new();
3451 EVP_MD *sha256 = NULL;
3452 int testresult = 0;
3453
3454 if (!TEST_ptr(ctx))
3455 goto err;
3456
3457 sha256 = EVP_MD_fetch(ctx, "SHA2-256", NULL);
3458 if (!TEST_ptr(sha256))
3459 goto err;
3460
3461 /*
3462 * We loop through all the names for a given digest. This should still work
3463 * even if the namemap changes part way through.
3464 */
3465 if (!TEST_true(EVP_MD_names_do_all(sha256, md_names, ctx)))
3466 goto err;
3467
3468 if (!TEST_true(success))
3469 goto err;
3470
3471 testresult = 1;
3472 err:
3473 EVP_MD_free(sha256);
3474 OSSL_LIB_CTX_free(ctx);
3475 return testresult;
3476 }
3477
3478 typedef struct {
3479 const char *cipher;
3480 const unsigned char *key;
3481 const unsigned char *iv;
3482 const unsigned char *input;
3483 const unsigned char *expected;
3484 const unsigned char *tag;
3485 size_t ivlen; /* 0 if we do not need to set a specific IV len */
3486 size_t inlen;
3487 size_t expectedlen;
3488 size_t taglen;
3489 int keyfirst;
3490 int initenc;
3491 int finalenc;
3492 } EVP_INIT_TEST_st;
3493
3494 static const EVP_INIT_TEST_st evp_init_tests[] = {
3495 {
3496 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbPlaintext,
3497 cfbCiphertext, NULL, 0, sizeof(cfbPlaintext), sizeof(cfbCiphertext),
3498 0, 1, 0, 1
3499 },
3500 {
3501 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultPlaintext,
3502 gcmDefaultCiphertext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3503 sizeof(gcmDefaultPlaintext), sizeof(gcmDefaultCiphertext),
3504 sizeof(gcmDefaultTag), 1, 0, 1
3505 },
3506 {
3507 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbPlaintext,
3508 cfbCiphertext, NULL, 0, sizeof(cfbPlaintext), sizeof(cfbCiphertext),
3509 0, 0, 0, 1
3510 },
3511 {
3512 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultPlaintext,
3513 gcmDefaultCiphertext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3514 sizeof(gcmDefaultPlaintext), sizeof(gcmDefaultCiphertext),
3515 sizeof(gcmDefaultTag), 0, 0, 1
3516 },
3517 {
3518 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbCiphertext,
3519 cfbPlaintext, NULL, 0, sizeof(cfbCiphertext), sizeof(cfbPlaintext),
3520 0, 1, 1, 0
3521 },
3522 {
3523 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultCiphertext,
3524 gcmDefaultPlaintext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3525 sizeof(gcmDefaultCiphertext), sizeof(gcmDefaultPlaintext),
3526 sizeof(gcmDefaultTag), 1, 1, 0
3527 },
3528 {
3529 "aes-128-cfb", kCFBDefaultKey, iCFBIV, cfbCiphertext,
3530 cfbPlaintext, NULL, 0, sizeof(cfbCiphertext), sizeof(cfbPlaintext),
3531 0, 0, 1, 0
3532 },
3533 {
3534 "aes-256-gcm", kGCMDefaultKey, iGCMDefaultIV, gcmDefaultCiphertext,
3535 gcmDefaultPlaintext, gcmDefaultTag, sizeof(iGCMDefaultIV),
3536 sizeof(gcmDefaultCiphertext), sizeof(gcmDefaultPlaintext),
3537 sizeof(gcmDefaultTag), 0, 1, 0
3538 }
3539 };
3540
3541 static int evp_init_seq_set_iv(EVP_CIPHER_CTX *ctx, const EVP_INIT_TEST_st *t)
3542 {
3543 int res = 0;
3544
3545 if (t->ivlen != 0) {
3546 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen, NULL), 0))
3547 goto err;
3548 }
3549 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, t->iv, -1)))
3550 goto err;
3551 res = 1;
3552 err:
3553 return res;
3554 }
3555
3556 /*
3557 * Test step-wise cipher initialization via EVP_CipherInit_ex where the
3558 * arguments are given one at a time and a final adjustment to the enc
3559 * parameter sets the correct operation.
3560 */
3561 static int test_evp_init_seq(int idx)
3562 {
3563 int outlen1, outlen2;
3564 int testresult = 0;
3565 unsigned char outbuf[1024];
3566 unsigned char tag[16];
3567 const EVP_INIT_TEST_st *t = &evp_init_tests[idx];
3568 EVP_CIPHER_CTX *ctx = NULL;
3569 EVP_CIPHER *type = NULL;
3570 size_t taglen = sizeof(tag);
3571 char *errmsg = NULL;
3572
3573 ctx = EVP_CIPHER_CTX_new();
3574 if (ctx == NULL) {
3575 errmsg = "CTX_ALLOC";
3576 goto err;
3577 }
3578 if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, t->cipher, testpropq))) {
3579 errmsg = "CIPHER_FETCH";
3580 goto err;
3581 }
3582 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, NULL, NULL, t->initenc))) {
3583 errmsg = "EMPTY_ENC_INIT";
3584 goto err;
3585 }
3586 if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3587 errmsg = "PADDING";
3588 goto err;
3589 }
3590 if (t->keyfirst && !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, t->key, NULL, -1))) {
3591 errmsg = "KEY_INIT (before iv)";
3592 goto err;
3593 }
3594 if (!evp_init_seq_set_iv(ctx, t)) {
3595 errmsg = "IV_INIT";
3596 goto err;
3597 }
3598 if (t->keyfirst == 0 && !TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, t->key, NULL, -1))) {
3599 errmsg = "KEY_INIT (after iv)";
3600 goto err;
3601 }
3602 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, t->finalenc))) {
3603 errmsg = "FINAL_ENC_INIT";
3604 goto err;
3605 }
3606 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3607 errmsg = "CIPHER_UPDATE";
3608 goto err;
3609 }
3610 if (t->finalenc == 0 && t->tag != NULL) {
3611 /* Set expected tag */
3612 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
3613 t->taglen, (void *)t->tag), 0)) {
3614 errmsg = "SET_TAG";
3615 goto err;
3616 }
3617 }
3618 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3619 errmsg = "CIPHER_FINAL";
3620 goto err;
3621 }
3622 if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3623 errmsg = "WRONG_RESULT";
3624 goto err;
3625 }
3626 if (t->finalenc != 0 && t->tag != NULL) {
3627 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag), 0)) {
3628 errmsg = "GET_TAG";
3629 goto err;
3630 }
3631 if (!TEST_mem_eq(t->tag, t->taglen, tag, taglen)) {
3632 errmsg = "TAG_ERROR";
3633 goto err;
3634 }
3635 }
3636 testresult = 1;
3637 err:
3638 if (errmsg != NULL)
3639 TEST_info("evp_init_test %d: %s", idx, errmsg);
3640 EVP_CIPHER_CTX_free(ctx);
3641 EVP_CIPHER_free(type);
3642 return testresult;
3643 }
3644
3645 typedef struct {
3646 const unsigned char *input;
3647 const unsigned char *expected;
3648 size_t inlen;
3649 size_t expectedlen;
3650 int enc;
3651 } EVP_RESET_TEST_st;
3652
3653 static const EVP_RESET_TEST_st evp_reset_tests[] = {
3654 {
3655 cfbPlaintext, cfbCiphertext,
3656 sizeof(cfbPlaintext), sizeof(cfbCiphertext), 1
3657 },
3658 {
3659 cfbCiphertext, cfbPlaintext,
3660 sizeof(cfbCiphertext), sizeof(cfbPlaintext), 0
3661 }
3662 };
3663
3664 /*
3665 * Test a reset of a cipher via EVP_CipherInit_ex after the cipher has already
3666 * been used.
3667 */
3668 static int test_evp_reset(int idx)
3669 {
3670 const EVP_RESET_TEST_st *t = &evp_reset_tests[idx];
3671 int outlen1, outlen2;
3672 int testresult = 0;
3673 unsigned char outbuf[1024];
3674 EVP_CIPHER_CTX *ctx = NULL;
3675 EVP_CIPHER *type = NULL;
3676 char *errmsg = NULL;
3677
3678 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3679 errmsg = "CTX_ALLOC";
3680 goto err;
3681 }
3682 if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "aes-128-cfb", testpropq))) {
3683 errmsg = "CIPHER_FETCH";
3684 goto err;
3685 }
3686 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, kCFBDefaultKey, iCFBIV, t->enc))) {
3687 errmsg = "CIPHER_INIT";
3688 goto err;
3689 }
3690 if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3691 errmsg = "PADDING";
3692 goto err;
3693 }
3694 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3695 errmsg = "CIPHER_UPDATE";
3696 goto err;
3697 }
3698 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3699 errmsg = "CIPHER_FINAL";
3700 goto err;
3701 }
3702 if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3703 errmsg = "WRONG_RESULT";
3704 goto err;
3705 }
3706 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, -1))) {
3707 errmsg = "CIPHER_REINIT";
3708 goto err;
3709 }
3710 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, t->input, t->inlen))) {
3711 errmsg = "CIPHER_UPDATE (reinit)";
3712 goto err;
3713 }
3714 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3715 errmsg = "CIPHER_FINAL (reinit)";
3716 goto err;
3717 }
3718 if (!TEST_mem_eq(t->expected, t->expectedlen, outbuf, outlen1 + outlen2)) {
3719 errmsg = "WRONG_RESULT (reinit)";
3720 goto err;
3721 }
3722 testresult = 1;
3723 err:
3724 if (errmsg != NULL)
3725 TEST_info("test_evp_reset %d: %s", idx, errmsg);
3726 EVP_CIPHER_CTX_free(ctx);
3727 EVP_CIPHER_free(type);
3728 return testresult;
3729 }
3730
3731 typedef struct {
3732 const char *cipher;
3733 int enc;
3734 } EVP_UPDATED_IV_TEST_st;
3735
3736 static const EVP_UPDATED_IV_TEST_st evp_updated_iv_tests[] = {
3737 {
3738 "aes-128-cfb", 1
3739 },
3740 {
3741 "aes-128-cfb", 0
3742 },
3743 {
3744 "aes-128-cfb1", 1
3745 },
3746 {
3747 "aes-128-cfb1", 0
3748 },
3749 {
3750 "aes-128-cfb8", 1
3751 },
3752 {
3753 "aes-128-cfb8", 0
3754 },
3755 {
3756 "aes-128-ofb", 1
3757 },
3758 {
3759 "aes-128-ofb", 0
3760 },
3761 {
3762 "aes-128-ctr", 1
3763 },
3764 {
3765 "aes-128-ctr", 0
3766 },
3767 {
3768 "aes-128-cbc", 1
3769 },
3770 {
3771 "aes-128-cbc", 0
3772 }
3773 };
3774
3775 /*
3776 * Test that the IV in the context is updated during a crypto operation for CFB
3777 * and OFB.
3778 */
3779 static int test_evp_updated_iv(int idx)
3780 {
3781 const EVP_UPDATED_IV_TEST_st *t = &evp_updated_iv_tests[idx];
3782 int outlen1, outlen2;
3783 int testresult = 0;
3784 unsigned char outbuf[1024];
3785 EVP_CIPHER_CTX *ctx = NULL;
3786 EVP_CIPHER *type = NULL;
3787 unsigned char updated_iv[EVP_MAX_IV_LENGTH];
3788 int iv_len;
3789 char *errmsg = NULL;
3790
3791 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3792 errmsg = "CTX_ALLOC";
3793 goto err;
3794 }
3795 if ((type = EVP_CIPHER_fetch(testctx, t->cipher, testpropq)) == NULL) {
3796 TEST_info("cipher %s not supported, skipping", t->cipher);
3797 goto ok;
3798 }
3799
3800 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, kCFBDefaultKey, iCFBIV, t->enc))) {
3801 errmsg = "CIPHER_INIT";
3802 goto err;
3803 }
3804 if (!TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))) {
3805 errmsg = "PADDING";
3806 goto err;
3807 }
3808 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, cfbPlaintext, sizeof(cfbPlaintext)))) {
3809 errmsg = "CIPHER_UPDATE";
3810 goto err;
3811 }
3812 if (!TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, updated_iv, sizeof(updated_iv)))) {
3813 errmsg = "CIPHER_CTX_GET_UPDATED_IV";
3814 goto err;
3815 }
3816 if (!TEST_true(iv_len = EVP_CIPHER_CTX_get_iv_length(ctx))) {
3817 errmsg = "CIPHER_CTX_GET_IV_LEN";
3818 goto err;
3819 }
3820 if (!TEST_mem_ne(iCFBIV, sizeof(iCFBIV), updated_iv, iv_len)) {
3821 errmsg = "IV_NOT_UPDATED";
3822 goto err;
3823 }
3824 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3825 errmsg = "CIPHER_FINAL";
3826 goto err;
3827 }
3828 ok:
3829 testresult = 1;
3830 err:
3831 if (errmsg != NULL)
3832 TEST_info("test_evp_updated_iv %d: %s", idx, errmsg);
3833 EVP_CIPHER_CTX_free(ctx);
3834 EVP_CIPHER_free(type);
3835 return testresult;
3836 }
3837
3838 typedef struct {
3839 const unsigned char *iv1;
3840 const unsigned char *iv2;
3841 const unsigned char *expected1;
3842 const unsigned char *expected2;
3843 const unsigned char *tag1;
3844 const unsigned char *tag2;
3845 size_t ivlen1;
3846 size_t ivlen2;
3847 size_t expectedlen1;
3848 size_t expectedlen2;
3849 } TEST_GCM_IV_REINIT_st;
3850
3851 static const TEST_GCM_IV_REINIT_st gcm_reinit_tests[] = {
3852 {
3853 iGCMResetIV1, iGCMResetIV2, gcmResetCiphertext1, gcmResetCiphertext2,
3854 gcmResetTag1, gcmResetTag2, sizeof(iGCMResetIV1), sizeof(iGCMResetIV2),
3855 sizeof(gcmResetCiphertext1), sizeof(gcmResetCiphertext2)
3856 },
3857 {
3858 iGCMResetIV2, iGCMResetIV1, gcmResetCiphertext2, gcmResetCiphertext1,
3859 gcmResetTag2, gcmResetTag1, sizeof(iGCMResetIV2), sizeof(iGCMResetIV1),
3860 sizeof(gcmResetCiphertext2), sizeof(gcmResetCiphertext1)
3861 }
3862 };
3863
3864 static int test_gcm_reinit(int idx)
3865 {
3866 int outlen1, outlen2, outlen3;
3867 int testresult = 0;
3868 unsigned char outbuf[1024];
3869 unsigned char tag[16];
3870 const TEST_GCM_IV_REINIT_st *t = &gcm_reinit_tests[idx];
3871 EVP_CIPHER_CTX *ctx = NULL;
3872 EVP_CIPHER *type = NULL;
3873 size_t taglen = sizeof(tag);
3874 char *errmsg = NULL;
3875
3876 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())) {
3877 errmsg = "CTX_ALLOC";
3878 goto err;
3879 }
3880 if (!TEST_ptr(type = EVP_CIPHER_fetch(testctx, "aes-256-gcm", testpropq))) {
3881 errmsg = "CIPHER_FETCH";
3882 goto err;
3883 }
3884 if (!TEST_true(EVP_CipherInit_ex(ctx, type, NULL, NULL, NULL, 1))) {
3885 errmsg = "ENC_INIT";
3886 goto err;
3887 }
3888 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen1, NULL), 0)) {
3889 errmsg = "SET_IVLEN1";
3890 goto err;
3891 }
3892 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, kGCMResetKey, t->iv1, 1))) {
3893 errmsg = "SET_IV1";
3894 goto err;
3895 }
3896 if (!TEST_true(EVP_CipherUpdate(ctx, NULL, &outlen3, gcmAAD, sizeof(gcmAAD)))) {
3897 errmsg = "AAD1";
3898 goto err;
3899 }
3900 EVP_CIPHER_CTX_set_padding(ctx, 0);
3901 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, gcmResetPlaintext,
3902 sizeof(gcmResetPlaintext)))) {
3903 errmsg = "CIPHER_UPDATE1";
3904 goto err;
3905 }
3906 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3907 errmsg = "CIPHER_FINAL1";
3908 goto err;
3909 }
3910 if (!TEST_mem_eq(t->expected1, t->expectedlen1, outbuf, outlen1 + outlen2)) {
3911 errmsg = "WRONG_RESULT1";
3912 goto err;
3913 }
3914 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag), 0)) {
3915 errmsg = "GET_TAG1";
3916 goto err;
3917 }
3918 if (!TEST_mem_eq(t->tag1, taglen, tag, taglen)) {
3919 errmsg = "TAG_ERROR1";
3920 goto err;
3921 }
3922 /* Now reinit */
3923 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, t->ivlen2, NULL), 0)) {
3924 errmsg = "SET_IVLEN2";
3925 goto err;
3926 }
3927 if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, NULL, t->iv2, -1))) {
3928 errmsg = "SET_IV2";
3929 goto err;
3930 }
3931 if (!TEST_true(EVP_CipherUpdate(ctx, NULL, &outlen3, gcmAAD, sizeof(gcmAAD)))) {
3932 errmsg = "AAD2";
3933 goto err;
3934 }
3935 if (!TEST_true(EVP_CipherUpdate(ctx, outbuf, &outlen1, gcmResetPlaintext,
3936 sizeof(gcmResetPlaintext)))) {
3937 errmsg = "CIPHER_UPDATE2";
3938 goto err;
3939 }
3940 if (!TEST_true(EVP_CipherFinal_ex(ctx, outbuf + outlen1, &outlen2))) {
3941 errmsg = "CIPHER_FINAL2";
3942 goto err;
3943 }
3944 if (!TEST_mem_eq(t->expected2, t->expectedlen2, outbuf, outlen1 + outlen2)) {
3945 errmsg = "WRONG_RESULT2";
3946 goto err;
3947 }
3948 if (!TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag), 0)) {
3949 errmsg = "GET_TAG2";
3950 goto err;
3951 }
3952 if (!TEST_mem_eq(t->tag2, taglen, tag, taglen)) {
3953 errmsg = "TAG_ERROR2";
3954 goto err;
3955 }
3956 testresult = 1;
3957 err:
3958 if (errmsg != NULL)
3959 TEST_info("evp_init_test %d: %s", idx, errmsg);
3960 EVP_CIPHER_CTX_free(ctx);
3961 EVP_CIPHER_free(type);
3962 return testresult;
3963 }
3964
3965 #ifndef OPENSSL_NO_DEPRECATED_3_0
3966 static EVP_PKEY_METHOD *custom_pmeth = NULL;
3967 static const EVP_PKEY_METHOD *orig_pmeth = NULL;
3968
3969 # define EVP_PKEY_CTRL_MY_COMMAND 9999
3970
3971 static int custom_pmeth_init(EVP_PKEY_CTX *ctx)
3972 {
3973 int (*pinit)(EVP_PKEY_CTX *ctx);
3974
3975 EVP_PKEY_meth_get_init(orig_pmeth, &pinit);
3976 return pinit(ctx);
3977 }
3978
3979 static void custom_pmeth_cleanup(EVP_PKEY_CTX *ctx)
3980 {
3981 void (*pcleanup)(EVP_PKEY_CTX *ctx);
3982
3983 EVP_PKEY_meth_get_cleanup(orig_pmeth, &pcleanup);
3984 pcleanup(ctx);
3985 }
3986
3987 static int custom_pmeth_sign(EVP_PKEY_CTX *ctx, unsigned char *out,
3988 size_t *outlen, const unsigned char *in,
3989 size_t inlen)
3990 {
3991 int (*psign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
3992 const unsigned char *tbs, size_t tbslen);
3993
3994 EVP_PKEY_meth_get_sign(orig_pmeth, NULL, &psign);
3995 return psign(ctx, out, outlen, in, inlen);
3996 }
3997
3998 static int custom_pmeth_digestsign(EVP_MD_CTX *ctx, unsigned char *sig,
3999 size_t *siglen, const unsigned char *tbs,
4000 size_t tbslen)
4001 {
4002 int (*pdigestsign)(EVP_MD_CTX *ctx, unsigned char *sig, size_t *siglen,
4003 const unsigned char *tbs, size_t tbslen);
4004
4005 EVP_PKEY_meth_get_digestsign(orig_pmeth, &pdigestsign);
4006 return pdigestsign(ctx, sig, siglen, tbs, tbslen);
4007 }
4008
4009 static int custom_pmeth_derive(EVP_PKEY_CTX *ctx, unsigned char *key,
4010 size_t *keylen)
4011 {
4012 int (*pderive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen);
4013
4014 EVP_PKEY_meth_get_derive(orig_pmeth, NULL, &pderive);
4015 return pderive(ctx, key, keylen);
4016 }
4017
4018 static int custom_pmeth_copy(EVP_PKEY_CTX *dst, const EVP_PKEY_CTX *src)
4019 {
4020 int (*pcopy)(EVP_PKEY_CTX *dst, const EVP_PKEY_CTX *src);
4021
4022 EVP_PKEY_meth_get_copy(orig_pmeth, &pcopy);
4023 return pcopy(dst, src);
4024 }
4025
4026 static int ctrl_called;
4027
4028 static int custom_pmeth_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
4029 {
4030 int (*pctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
4031
4032 EVP_PKEY_meth_get_ctrl(orig_pmeth, &pctrl, NULL);
4033
4034 if (type == EVP_PKEY_CTRL_MY_COMMAND) {
4035 ctrl_called = 1;
4036 return 1;
4037 }
4038
4039 return pctrl(ctx, type, p1, p2);
4040 }
4041
4042 static int test_custom_pmeth(int idx)
4043 {
4044 EVP_PKEY_CTX *pctx = NULL;
4045 EVP_MD_CTX *ctx = NULL;
4046 EVP_PKEY *pkey = NULL;
4047 int id, orig_id, orig_flags;
4048 int testresult = 0;
4049 size_t reslen;
4050 unsigned char *res = NULL;
4051 unsigned char msg[] = { 'H', 'e', 'l', 'l', 'o' };
4052 const EVP_MD *md = EVP_sha256();
4053 int doderive = 0;
4054
4055 ctrl_called = 0;
4056
4057 /* We call deprecated APIs so this test doesn't support a custom libctx */
4058 if (testctx != NULL)
4059 return 1;
4060
4061 switch (idx) {
4062 case 0:
4063 case 6:
4064 id = EVP_PKEY_RSA;
4065 pkey = load_example_rsa_key();
4066 break;
4067 case 1:
4068 case 7:
4069 # ifndef OPENSSL_NO_DSA
4070 id = EVP_PKEY_DSA;
4071 pkey = load_example_dsa_key();
4072 break;
4073 # else
4074 return 1;
4075 # endif
4076 case 2:
4077 case 8:
4078 # ifndef OPENSSL_NO_EC
4079 id = EVP_PKEY_EC;
4080 pkey = load_example_ec_key();
4081 break;
4082 # else
4083 return 1;
4084 # endif
4085 case 3:
4086 case 9:
4087 # ifndef OPENSSL_NO_EC
4088 id = EVP_PKEY_ED25519;
4089 md = NULL;
4090 pkey = load_example_ed25519_key();
4091 break;
4092 # else
4093 return 1;
4094 # endif
4095 case 4:
4096 case 10:
4097 # ifndef OPENSSL_NO_DH
4098 id = EVP_PKEY_DH;
4099 doderive = 1;
4100 pkey = load_example_dh_key();
4101 break;
4102 # else
4103 return 1;
4104 # endif
4105 case 5:
4106 case 11:
4107 # ifndef OPENSSL_NO_EC
4108 id = EVP_PKEY_X25519;
4109 doderive = 1;
4110 pkey = load_example_x25519_key();
4111 break;
4112 # else
4113 return 1;
4114 # endif
4115 default:
4116 TEST_error("Should not happen");
4117 goto err;
4118 }
4119
4120 if (!TEST_ptr(pkey))
4121 goto err;
4122
4123 if (idx < 6) {
4124 if (!TEST_true(evp_pkey_is_provided(pkey)))
4125 goto err;
4126 } else {
4127 EVP_PKEY *tmp = pkey;
4128
4129 /* Convert to a legacy key */
4130 pkey = EVP_PKEY_new();
4131 if (!TEST_ptr(pkey)) {
4132 pkey = tmp;
4133 goto err;
4134 }
4135 if (!TEST_true(evp_pkey_copy_downgraded(&pkey, tmp))) {
4136 EVP_PKEY_free(tmp);
4137 goto err;
4138 }
4139 EVP_PKEY_free(tmp);
4140 if (!TEST_true(evp_pkey_is_legacy(pkey)))
4141 goto err;
4142 }
4143
4144 if (!TEST_ptr(orig_pmeth = EVP_PKEY_meth_find(id))
4145 || !TEST_ptr(pkey))
4146 goto err;
4147
4148 EVP_PKEY_meth_get0_info(&orig_id, &orig_flags, orig_pmeth);
4149 if (!TEST_int_eq(orig_id, id)
4150 || !TEST_ptr(custom_pmeth = EVP_PKEY_meth_new(id, orig_flags)))
4151 goto err;
4152
4153 if (id == EVP_PKEY_ED25519) {
4154 EVP_PKEY_meth_set_digestsign(custom_pmeth, custom_pmeth_digestsign);
4155 } if (id == EVP_PKEY_DH || id == EVP_PKEY_X25519) {
4156 EVP_PKEY_meth_set_derive(custom_pmeth, NULL, custom_pmeth_derive);
4157 } else {
4158 EVP_PKEY_meth_set_sign(custom_pmeth, NULL, custom_pmeth_sign);
4159 }
4160 if (id != EVP_PKEY_ED25519 && id != EVP_PKEY_X25519) {
4161 EVP_PKEY_meth_set_init(custom_pmeth, custom_pmeth_init);
4162 EVP_PKEY_meth_set_cleanup(custom_pmeth, custom_pmeth_cleanup);
4163 EVP_PKEY_meth_set_copy(custom_pmeth, custom_pmeth_copy);
4164 }
4165 EVP_PKEY_meth_set_ctrl(custom_pmeth, custom_pmeth_ctrl, NULL);
4166 if (!TEST_true(EVP_PKEY_meth_add0(custom_pmeth)))
4167 goto err;
4168
4169 if (doderive) {
4170 pctx = EVP_PKEY_CTX_new(pkey, NULL);
4171 if (!TEST_ptr(pctx)
4172 || !TEST_int_eq(EVP_PKEY_derive_init(pctx), 1)
4173 || !TEST_int_ge(EVP_PKEY_CTX_ctrl(pctx, -1, -1,
4174 EVP_PKEY_CTRL_MY_COMMAND, 0, NULL),
4175 1)
4176 || !TEST_int_eq(ctrl_called, 1)
4177 || !TEST_int_ge(EVP_PKEY_derive_set_peer(pctx, pkey), 1)
4178 || !TEST_int_ge(EVP_PKEY_derive(pctx, NULL, &reslen), 1)
4179 || !TEST_ptr(res = OPENSSL_malloc(reslen))
4180 || !TEST_int_ge(EVP_PKEY_derive(pctx, res, &reslen), 1))
4181 goto err;
4182 } else {
4183 ctx = EVP_MD_CTX_new();
4184 reslen = EVP_PKEY_size(pkey);
4185 res = OPENSSL_malloc(reslen);
4186 if (!TEST_ptr(ctx)
4187 || !TEST_ptr(res)
4188 || !TEST_true(EVP_DigestSignInit(ctx, &pctx, md, NULL, pkey))
4189 || !TEST_int_ge(EVP_PKEY_CTX_ctrl(pctx, -1, -1,
4190 EVP_PKEY_CTRL_MY_COMMAND, 0, NULL),
4191 1)
4192 || !TEST_int_eq(ctrl_called, 1))
4193 goto err;
4194
4195 if (id == EVP_PKEY_ED25519) {
4196 if (!TEST_true(EVP_DigestSign(ctx, res, &reslen, msg, sizeof(msg))))
4197 goto err;
4198 } else {
4199 if (!TEST_true(EVP_DigestUpdate(ctx, msg, sizeof(msg)))
4200 || !TEST_true(EVP_DigestSignFinal(ctx, res, &reslen)))
4201 goto err;
4202 }
4203 }
4204
4205 testresult = 1;
4206 err:
4207 OPENSSL_free(res);
4208 EVP_MD_CTX_free(ctx);
4209 if (doderive)
4210 EVP_PKEY_CTX_free(pctx);
4211 EVP_PKEY_free(pkey);
4212 EVP_PKEY_meth_remove(custom_pmeth);
4213 EVP_PKEY_meth_free(custom_pmeth);
4214 custom_pmeth = NULL;
4215 return testresult;
4216 }
4217
4218 static int test_evp_md_cipher_meth(void)
4219 {
4220 EVP_MD *md = EVP_MD_meth_dup(EVP_sha256());
4221 EVP_CIPHER *ciph = EVP_CIPHER_meth_dup(EVP_aes_128_cbc());
4222 int testresult = 0;
4223
4224 if (!TEST_ptr(md) || !TEST_ptr(ciph))
4225 goto err;
4226
4227 testresult = 1;
4228
4229 err:
4230 EVP_MD_meth_free(md);
4231 EVP_CIPHER_meth_free(ciph);
4232
4233 return testresult;
4234 }
4235
4236 typedef struct {
4237 int data;
4238 } custom_dgst_ctx;
4239
4240 static int custom_md_init_called = 0;
4241 static int custom_md_cleanup_called = 0;
4242
4243 static int custom_md_init(EVP_MD_CTX *ctx)
4244 {
4245 custom_dgst_ctx *p = EVP_MD_CTX_md_data(ctx);
4246
4247 if (p == NULL)
4248 return 0;
4249
4250 custom_md_init_called++;
4251 return 1;
4252 }
4253
4254 static int custom_md_cleanup(EVP_MD_CTX *ctx)
4255 {
4256 custom_dgst_ctx *p = EVP_MD_CTX_md_data(ctx);
4257
4258 if (p == NULL)
4259 /* Nothing to do */
4260 return 1;
4261
4262 custom_md_cleanup_called++;
4263 return 1;
4264 }
4265
4266 static int test_custom_md_meth(void)
4267 {
4268 EVP_MD_CTX *mdctx = NULL;
4269 EVP_MD *tmp = NULL;
4270 char mess[] = "Test Message\n";
4271 unsigned char md_value[EVP_MAX_MD_SIZE];
4272 unsigned int md_len;
4273 int testresult = 0;
4274 int nid;
4275
4276 /*
4277 * We are testing deprecated functions. We don't support a non-default
4278 * library context in this test.
4279 */
4280 if (testctx != NULL)
4281 return 1;
4282
4283 custom_md_init_called = custom_md_cleanup_called = 0;
4284
4285 nid = OBJ_create("1.3.6.1.4.1.16604.998866.1", "custom-md", "custom-md");
4286 if (!TEST_int_ne(nid, NID_undef))
4287 goto err;
4288 tmp = EVP_MD_meth_new(nid, NID_undef);
4289 if (!TEST_ptr(tmp))
4290 goto err;
4291
4292 if (!TEST_true(EVP_MD_meth_set_init(tmp, custom_md_init))
4293 || !TEST_true(EVP_MD_meth_set_cleanup(tmp, custom_md_cleanup))
4294 || !TEST_true(EVP_MD_meth_set_app_datasize(tmp,
4295 sizeof(custom_dgst_ctx))))
4296 goto err;
4297
4298 mdctx = EVP_MD_CTX_new();
4299 if (!TEST_ptr(mdctx)
4300 /*
4301 * Initing our custom md and then initing another md should
4302 * result in the init and cleanup functions of the custom md
4303 * from being called.
4304 */
4305 || !TEST_true(EVP_DigestInit_ex(mdctx, tmp, NULL))
4306 || !TEST_true(EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
4307 || !TEST_true(EVP_DigestUpdate(mdctx, mess, strlen(mess)))
4308 || !TEST_true(EVP_DigestFinal_ex(mdctx, md_value, &md_len))
4309 || !TEST_int_eq(custom_md_init_called, 1)
4310 || !TEST_int_eq(custom_md_cleanup_called, 1))
4311 goto err;
4312
4313 testresult = 1;
4314 err:
4315 EVP_MD_CTX_free(mdctx);
4316 EVP_MD_meth_free(tmp);
4317 return testresult;
4318 }
4319
4320 # ifndef OPENSSL_NO_DYNAMIC_ENGINE
4321 /* Test we can create a signature keys with an associated ENGINE */
4322 static int test_signatures_with_engine(int tst)
4323 {
4324 ENGINE *e;
4325 const char *engine_id = "dasync";
4326 EVP_PKEY *pkey = NULL;
4327 const unsigned char badcmackey[] = { 0x00, 0x01 };
4328 const unsigned char cmackey[] = {
4329 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4330 0x0c, 0x0d, 0x0e, 0x0f
4331 };
4332 const unsigned char ed25519key[] = {
4333 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4334 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
4335 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f
4336 };
4337 const unsigned char msg[] = { 0x00, 0x01, 0x02, 0x03 };
4338 int testresult = 0;
4339 EVP_MD_CTX *ctx = NULL;
4340 unsigned char *mac = NULL;
4341 size_t maclen = 0;
4342 int ret;
4343
4344 # ifdef OPENSSL_NO_CMAC
4345 /* Skip CMAC tests in a no-cmac build */
4346 if (tst <= 1)
4347 return 1;
4348 # endif
4349
4350 if (!TEST_ptr(e = ENGINE_by_id(engine_id)))
4351 return 0;
4352
4353 if (!TEST_true(ENGINE_init(e))) {
4354 ENGINE_free(e);
4355 return 0;
4356 }
4357
4358 switch (tst) {
4359 case 0:
4360 pkey = EVP_PKEY_new_CMAC_key(e, cmackey, sizeof(cmackey),
4361 EVP_aes_128_cbc());
4362 break;
4363 case 1:
4364 pkey = EVP_PKEY_new_CMAC_key(e, badcmackey, sizeof(badcmackey),
4365 EVP_aes_128_cbc());
4366 break;
4367 case 2:
4368 pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, e, ed25519key,
4369 sizeof(ed25519key));
4370 break;
4371 default:
4372 TEST_error("Invalid test case");
4373 goto err;
4374 }
4375 if (!TEST_ptr(pkey))
4376 goto err;
4377
4378 if (!TEST_ptr(ctx = EVP_MD_CTX_new()))
4379 goto err;
4380
4381 ret = EVP_DigestSignInit(ctx, NULL, tst == 2 ? NULL : EVP_sha256(), NULL,
4382 pkey);
4383 if (tst == 0) {
4384 if (!TEST_true(ret))
4385 goto err;
4386
4387 if (!TEST_true(EVP_DigestSignUpdate(ctx, msg, sizeof(msg)))
4388 || !TEST_true(EVP_DigestSignFinal(ctx, NULL, &maclen)))
4389 goto err;
4390
4391 if (!TEST_ptr(mac = OPENSSL_malloc(maclen)))
4392 goto err;
4393
4394 if (!TEST_true(EVP_DigestSignFinal(ctx, mac, &maclen)))
4395 goto err;
4396 } else {
4397 /* We used a bad key. We expect a failure here */
4398 if (!TEST_false(ret))
4399 goto err;
4400 }
4401
4402 testresult = 1;
4403 err:
4404 EVP_MD_CTX_free(ctx);
4405 OPENSSL_free(mac);
4406 EVP_PKEY_free(pkey);
4407 ENGINE_finish(e);
4408 ENGINE_free(e);
4409
4410 return testresult;
4411 }
4412
4413 static int test_cipher_with_engine(void)
4414 {
4415 ENGINE *e;
4416 const char *engine_id = "dasync";
4417 const unsigned char keyiv[] = {
4418 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
4419 0x0c, 0x0d, 0x0e, 0x0f
4420 };
4421 const unsigned char msg[] = { 0x00, 0x01, 0x02, 0x03 };
4422 int testresult = 0;
4423 EVP_CIPHER_CTX *ctx = NULL, *ctx2 = NULL;
4424 unsigned char buf[AES_BLOCK_SIZE];
4425 int len = 0;
4426
4427 if (!TEST_ptr(e = ENGINE_by_id(engine_id)))
4428 return 0;
4429
4430 if (!TEST_true(ENGINE_init(e))) {
4431 ENGINE_free(e);
4432 return 0;
4433 }
4434
4435 if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
4436 || !TEST_ptr(ctx2 = EVP_CIPHER_CTX_new()))
4437 goto err;
4438
4439 if (!TEST_true(EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), e, keyiv, keyiv)))
4440 goto err;
4441
4442 /* Copy the ctx, and complete the operation with the new ctx */
4443 if (!TEST_true(EVP_CIPHER_CTX_copy(ctx2, ctx)))
4444 goto err;
4445
4446 if (!TEST_true(EVP_EncryptUpdate(ctx2, buf, &len, msg, sizeof(msg)))
4447 || !TEST_true(EVP_EncryptFinal_ex(ctx2, buf + len, &len)))
4448 goto err;
4449
4450 testresult = 1;
4451 err:
4452 EVP_CIPHER_CTX_free(ctx);
4453 EVP_CIPHER_CTX_free(ctx2);
4454 ENGINE_finish(e);
4455 ENGINE_free(e);
4456
4457 return testresult;
4458 }
4459 # endif /* OPENSSL_NO_DYNAMIC_ENGINE */
4460 #endif /* OPENSSL_NO_DEPRECATED_3_0 */
4461
4462 static int ecxnids[] = {
4463 NID_X25519,
4464 NID_X448,
4465 NID_ED25519,
4466 NID_ED448
4467 };
4468
4469 /* Test that creating ECX keys with a short private key fails as expected */
4470 static int test_ecx_short_keys(int tst)
4471 {
4472 unsigned char ecxkeydata = 1;
4473 EVP_PKEY *pkey;
4474
4475
4476 pkey = EVP_PKEY_new_raw_private_key(ecxnids[tst], NULL, &ecxkeydata, 1);
4477 if (!TEST_ptr_null(pkey)) {
4478 EVP_PKEY_free(pkey);
4479 return 0;
4480 }
4481 return 1;
4482 }
4483
4484 typedef enum OPTION_choice {
4485 OPT_ERR = -1,
4486 OPT_EOF = 0,
4487 OPT_CONTEXT,
4488 OPT_TEST_ENUM
4489 } OPTION_CHOICE;
4490
4491 const OPTIONS *test_get_options(void)
4492 {
4493 static const OPTIONS options[] = {
4494 OPT_TEST_OPTIONS_DEFAULT_USAGE,
4495 { "context", OPT_CONTEXT, '-', "Explicitly use a non-default library context" },
4496 { NULL }
4497 };
4498 return options;
4499 }
4500
4501 int setup_tests(void)
4502 {
4503 OPTION_CHOICE o;
4504
4505 while ((o = opt_next()) != OPT_EOF) {
4506 switch (o) {
4507 case OPT_CONTEXT:
4508 /* Set up an alternate library context */
4509 testctx = OSSL_LIB_CTX_new();
4510 if (!TEST_ptr(testctx))
4511 return 0;
4512 /* Swap the libctx to test non-default context only */
4513 nullprov = OSSL_PROVIDER_load(NULL, "null");
4514 deflprov = OSSL_PROVIDER_load(testctx, "default");
4515 lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
4516 break;
4517 case OPT_TEST_CASES:
4518 break;
4519 default:
4520 return 0;
4521 }
4522 }
4523
4524 ADD_TEST(test_EVP_set_default_properties);
4525 ADD_ALL_TESTS(test_EVP_DigestSignInit, 30);
4526 ADD_TEST(test_EVP_DigestVerifyInit);
4527 #ifndef OPENSSL_NO_SIPHASH
4528 ADD_TEST(test_siphash_digestsign);
4529 #endif
4530 ADD_TEST(test_EVP_Digest);
4531 ADD_TEST(test_EVP_md_null);
4532 ADD_ALL_TESTS(test_EVP_PKEY_sign, 3);
4533 ADD_ALL_TESTS(test_EVP_Enveloped, 2);
4534 ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
4535 ADD_TEST(test_privatekey_to_pkcs8);
4536 ADD_TEST(test_EVP_PKCS82PKEY_wrong_tag);
4537 #ifndef OPENSSL_NO_EC
4538 ADD_TEST(test_EVP_PKCS82PKEY);
4539 #endif
4540 #ifndef OPENSSL_NO_EC
4541 ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings));
4542 #endif
4543 #if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
4544 ADD_TEST(test_EVP_SM2);
4545 ADD_TEST(test_EVP_SM2_verify);
4546 #endif
4547 ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
4548 #ifndef OPENSSL_NO_DEPRECATED_3_0
4549 custom_pmeth = EVP_PKEY_meth_new(0xdefaced, 0);
4550 if (!TEST_ptr(custom_pmeth))
4551 return 0;
4552 EVP_PKEY_meth_set_check(custom_pmeth, pkey_custom_check);
4553 EVP_PKEY_meth_set_public_check(custom_pmeth, pkey_custom_pub_check);
4554 EVP_PKEY_meth_set_param_check(custom_pmeth, pkey_custom_param_check);
4555 if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
4556 return 0;
4557 #endif
4558 ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
4559 #ifndef OPENSSL_NO_CMAC
4560 ADD_TEST(test_CMAC_keygen);
4561 #endif
4562 ADD_TEST(test_HKDF);
4563 ADD_TEST(test_emptyikm_HKDF);
4564 #ifndef OPENSSL_NO_EC
4565 ADD_TEST(test_X509_PUBKEY_inplace);
4566 ADD_TEST(test_X509_PUBKEY_dup);
4567 ADD_ALL_TESTS(test_invalide_ec_char2_pub_range_decode,
4568 OSSL_NELEM(ec_der_pub_keys));
4569 #endif
4570 #ifndef OPENSSL_NO_DSA
4571 ADD_TEST(test_DSA_get_set_params);
4572 ADD_TEST(test_DSA_priv_pub);
4573 #endif
4574 ADD_TEST(test_RSA_get_set_params);
4575 #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
4576 ADD_TEST(test_decrypt_null_chunks);
4577 #endif
4578 #ifndef OPENSSL_NO_DH
4579 ADD_TEST(test_DH_priv_pub);
4580 # ifndef OPENSSL_NO_DEPRECATED_3_0
4581 ADD_TEST(test_EVP_PKEY_set1_DH);
4582 # endif
4583 #endif
4584 #ifndef OPENSSL_NO_EC
4585 ADD_TEST(test_EC_priv_pub);
4586 # ifndef OPENSSL_NO_DEPRECATED_3_0
4587 ADD_TEST(test_EC_priv_only_legacy);
4588 # endif
4589 #endif
4590 ADD_ALL_TESTS(test_keygen_with_empty_template, 2);
4591 ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
4592
4593 ADD_TEST(test_rand_agglomeration);
4594 ADD_ALL_TESTS(test_evp_iv_aes, 12);
4595 #ifndef OPENSSL_NO_DES
4596 ADD_ALL_TESTS(test_evp_iv_des, 6);
4597 #endif
4598 #ifndef OPENSSL_NO_BF
4599 ADD_ALL_TESTS(test_evp_bf_default_keylen, 4);
4600 #endif
4601 ADD_TEST(test_EVP_rsa_pss_with_keygen_bits);
4602 ADD_TEST(test_EVP_rsa_pss_set_saltlen);
4603 #ifndef OPENSSL_NO_EC
4604 ADD_ALL_TESTS(test_ecpub, OSSL_NELEM(ecpub_nids));
4605 #endif
4606
4607 ADD_TEST(test_names_do_all);
4608
4609 ADD_ALL_TESTS(test_evp_init_seq, OSSL_NELEM(evp_init_tests));
4610 ADD_ALL_TESTS(test_evp_reset, OSSL_NELEM(evp_reset_tests));
4611 ADD_ALL_TESTS(test_gcm_reinit, OSSL_NELEM(gcm_reinit_tests));
4612 ADD_ALL_TESTS(test_evp_updated_iv, OSSL_NELEM(evp_updated_iv_tests));
4613
4614 #ifndef OPENSSL_NO_DEPRECATED_3_0
4615 ADD_ALL_TESTS(test_custom_pmeth, 12);
4616 ADD_TEST(test_evp_md_cipher_meth);
4617 ADD_TEST(test_custom_md_meth);
4618
4619 # ifndef OPENSSL_NO_DYNAMIC_ENGINE
4620 /* Tests only support the default libctx */
4621 if (testctx == NULL) {
4622 # ifndef OPENSSL_NO_EC
4623 ADD_ALL_TESTS(test_signatures_with_engine, 3);
4624 # else
4625 ADD_ALL_TESTS(test_signatures_with_engine, 2);
4626 # endif
4627 ADD_TEST(test_cipher_with_engine);
4628 }
4629 # endif
4630 #endif
4631
4632 ADD_ALL_TESTS(test_ecx_short_keys, OSSL_NELEM(ecxnids));
4633
4634 return 1;
4635 }
4636
4637 void cleanup_tests(void)
4638 {
4639 OSSL_PROVIDER_unload(nullprov);
4640 OSSL_PROVIDER_unload(deflprov);
4641 OSSL_PROVIDER_unload(lgcyprov);
4642 OSSL_LIB_CTX_free(testctx);
4643 }