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