blob: a52b472ba611cc984dea93f0b3aa039bb644f4ce [file] [log] [blame]
Rich Salz440e5d82016-05-17 14:20:24 -04001/*
Matt Caswell33388b42020-04-23 13:55:52 +01002 * Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
Matt Caswell71ea6b42015-02-09 09:45:35 +00003 *
Richard Levitte909f1a22018-12-06 13:05:25 +01004 * Licensed under the Apache License 2.0 (the "License"). You may not use
Rich Salz440e5d82016-05-17 14:20:24 -04005 * 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
Matt Caswell71ea6b42015-02-09 09:45:35 +00008 */
9
Pauli41bbba52020-02-13 11:00:57 +100010/* We need to use some deprecated APIs */
11#define OPENSSL_SUPPRESS_DEPRECATED
12
Matt Caswell71ea6b42015-02-09 09:45:35 +000013#include <stdio.h>
14#include <stdlib.h>
Matt Caswellbb5f2812018-06-01 15:06:52 +010015#include <string.h>
Matt Caswell71ea6b42015-02-09 09:45:35 +000016#include <openssl/bio.h>
Shane Lontis7bb82f92019-09-15 19:55:10 +100017#include <openssl/conf.h>
Matt Caswell71ea6b42015-02-09 09:45:35 +000018#include <openssl/crypto.h>
19#include <openssl/err.h>
20#include <openssl/evp.h>
Matt Caswell71ea6b42015-02-09 09:45:35 +000021#include <openssl/x509.h>
Paul Yang48037172018-09-04 17:21:10 +080022#include <openssl/pem.h>
Matt Caswell10d5b412018-10-26 12:45:27 +010023#include <openssl/kdf.h>
Matt Caswell847d0f82019-03-18 14:36:41 +000024#include <openssl/provider.h>
Matt Caswell9c452222019-09-04 12:46:02 +010025#include <openssl/core_names.h>
Richard Levittef54a4102019-12-02 11:26:15 +010026#include <openssl/params.h>
Richard Levitted7e498a2020-10-04 16:34:31 +020027#include <openssl/param_build.h>
Matt Caswell9c452222019-09-04 12:46:02 +010028#include <openssl/dsa.h>
Matt Caswelle295de12019-12-09 12:03:02 +000029#include <openssl/dh.h>
Matt Caswelle5bc0ce2020-08-12 14:41:12 +010030#include <openssl/aes.h>
Richard Levitted7e498a2020-10-04 16:34:31 +020031#include <openssl/decoder.h>
Rich Salzadcd8e32017-04-18 16:33:15 -040032#include "testutil.h"
Rich Salz176db6d2017-08-22 08:35:43 -040033#include "internal/nelem.h"
Richard Levitte00bc1ad2020-02-02 12:55:05 +010034#include "internal/sizes.h"
Dr. Matthias St. Pierre25f21382019-09-28 00:45:33 +020035#include "crypto/evp.h"
Richard Levittef0c62c52020-09-11 08:36:54 +020036#include "../e_os.h" /* strcasecmp */
Matt Caswell71ea6b42015-02-09 09:45:35 +000037
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +030038static OSSL_LIB_CTX *testctx = NULL;
Matt Caswell86dc26b2020-04-27 17:17:05 +010039
Matt Caswell71ea6b42015-02-09 09:45:35 +000040/*
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
Paul Yang2aee35d2017-09-04 22:02:59 +080098/*
Matt Caswell59d0e6c2019-10-07 18:21:39 +010099* 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 */
Matt Caswellf650ab42019-11-07 09:24:18 +0000102#ifndef OPENSSL_NO_DSA
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100103static 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};
Matt Caswellf650ab42019-11-07 09:24:18 +0000143#endif
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100144
145/*
Paul Yang2aee35d2017-09-04 22:02:59 +0800146 * 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
Matt Caswell71ea6b42015-02-09 09:45:35 +0000241static 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
Matt Caswella9880362015-02-26 10:35:50 +0000317#ifndef OPENSSL_NO_EC
Matt Caswell71ea6b42015-02-09 09:45:35 +0000318/*
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};
Paul Yangb0004702017-11-01 00:45:24 +0800351
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
Bernd Edlinger5dc40a82019-01-30 16:20:31 +0100364/*
David Makepeace87762932019-06-07 10:45:51 +1000365 * kExampleBadECPubKeyDER is a sample EC public key with a wrong OID
Bernd Edlinger5dc40a82019-01-30 16:20:31 +0100366 * 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
Paul Yangb0004702017-11-01 00:45:24 +0800379static const unsigned char pExampleECParamDER[] = {
380 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
381};
Matt Caswella9880362015-02-26 10:35:50 +0000382#endif
Matt Caswell71ea6b42015-02-09 09:45:35 +0000383
Rich Salzadcd8e32017-04-18 16:33:15 -0400384typedef struct APK_DATA_st {
385 const unsigned char *kder;
386 size_t size;
387 int evptype;
Paul Yang2aee35d2017-09-04 22:02:59 +0800388 int check;
Paul Yangb0004702017-11-01 00:45:24 +0800389 int pub_check;
390 int param_check;
391 int type; /* 0 for private, 1 for public, 2 for params */
Rich Salzadcd8e32017-04-18 16:33:15 -0400392} APK_DATA;
393
394static APK_DATA keydata[] = {
395 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), EVP_PKEY_RSA},
396 {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), EVP_PKEY_RSA},
Dr. Stephen Hensonaa24cd12017-04-26 17:08:22 +0100397#ifndef OPENSSL_NO_EC
Rich Salzadcd8e32017-04-18 16:33:15 -0400398 {kExampleECKeyDER, sizeof(kExampleECKeyDER), EVP_PKEY_EC}
Dr. Stephen Hensonaa24cd12017-04-26 17:08:22 +0100399#endif
Rich Salzadcd8e32017-04-18 16:33:15 -0400400};
401
Paul Yang2aee35d2017-09-04 22:02:59 +0800402static APK_DATA keycheckdata[] = {
Richard Levittee6774a72020-11-06 10:37:43 +0100403 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), EVP_PKEY_RSA, 1, 1, 1, 0},
Paul Yangb0004702017-11-01 00:45:24 +0800404 {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), EVP_PKEY_RSA,
Richard Levittee6774a72020-11-06 10:37:43 +0100405 0, 1, 1, 0},
Paul Yang2aee35d2017-09-04 22:02:59 +0800406#ifndef OPENSSL_NO_EC
Paul Yangb0004702017-11-01 00:45:24 +0800407 {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}
Paul Yang2aee35d2017-09-04 22:02:59 +0800411#endif
412};
413
Richard Levitted7e498a2020-10-04 16:34:31 +0200414static EVP_PKEY *load_example_key(const char *keytype,
415 const unsigned char *data, size_t data_len)
416{
417 const unsigned char **pdata = &data;
418 EVP_PKEY *pkey = NULL;
419 OSSL_DECODER_CTX *dctx =
420 OSSL_DECODER_CTX_new_by_EVP_PKEY(&pkey, "DER", NULL, keytype, 0,
421 testctx, NULL);
422
423 /* |pkey| will be NULL on error */
424 (void)OSSL_DECODER_from_data(dctx, pdata, &data_len);
425 OSSL_DECODER_CTX_free(dctx);
426 return pkey;
427}
428
Matt Caswell71ea6b42015-02-09 09:45:35 +0000429static EVP_PKEY *load_example_rsa_key(void)
430{
Richard Levitted7e498a2020-10-04 16:34:31 +0200431 return load_example_key("RSA", kExampleRSAKeyDER,
432 sizeof(kExampleRSAKeyDER));
Matt Caswell71ea6b42015-02-09 09:45:35 +0000433}
434
Matt Caswellf650ab42019-11-07 09:24:18 +0000435#ifndef OPENSSL_NO_DSA
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100436static 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}
Matt Caswellf650ab42019-11-07 09:24:18 +0000459#endif
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100460
Matt Caswell6d242fa2020-01-09 15:21:14 +0000461static 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
Paulif9e504e2020-06-12 10:34:46 +1000477static int test_EVP_set_default_properties(void)
478{
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +0300479 OSSL_LIB_CTX *ctx;
Paulif9e504e2020-06-12 10:34:46 +1000480 EVP_MD *md = NULL;
481 int res = 0;
482
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +0300483 if (!TEST_ptr(ctx = OSSL_LIB_CTX_new())
Paulif9e504e2020-06-12 10:34:46 +1000484 || !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);
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +0300502 OSSL_LIB_CTX_free(ctx);
Paulif9e504e2020-06-12 10:34:46 +1000503 return res;
504}
505
Shane Lontis2eb2b4f2018-09-06 08:34:45 +1000506static 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
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100549/*
Matt Caswell6d242fa2020-01-09 15:21:14 +0000550 * 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)
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100559 */
560static int test_EVP_DigestSignInit(int tst)
Matt Caswell71ea6b42015-02-09 09:45:35 +0000561{
562 int ret = 0;
563 EVP_PKEY *pkey = NULL;
564 unsigned char *sig = NULL;
565 size_t sig_len = 0;
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100566 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;
Matt Caswell6d242fa2020-01-09 15:21:14 +0000570 const EVP_MD *md;
571 EVP_MD *mdexp = NULL;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000572
Matt Caswell6d242fa2020-01-09 15:21:14 +0000573 if (tst >= 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100574 membio = BIO_new(BIO_s_mem());
575 mdbio = BIO_new(BIO_f_md());
576 if (!TEST_ptr(membio) || !TEST_ptr(mdbio))
577 goto out;
578 BIO_push(mdbio, membio);
579 if (!TEST_int_gt(BIO_get_md_ctx(mdbio, &md_ctx), 0))
580 goto out;
581 } else {
582 if (!TEST_ptr(a_md_ctx = md_ctx = EVP_MD_CTX_new())
583 || !TEST_ptr(a_md_ctx_verify = md_ctx_verify = EVP_MD_CTX_new()))
584 goto out;
585 }
586
Matt Caswell6d242fa2020-01-09 15:21:14 +0000587 if (tst == 0 || tst == 3 || tst == 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100588 if (!TEST_ptr(pkey = load_example_rsa_key()))
589 goto out;
Matt Caswell6d242fa2020-01-09 15:21:14 +0000590 } else if (tst == 1 || tst == 4 || tst == 7) {
Matt Caswellf650ab42019-11-07 09:24:18 +0000591#ifndef OPENSSL_NO_DSA
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100592 if (!TEST_ptr(pkey = load_example_dsa_key()))
593 goto out;
Matt Caswellf650ab42019-11-07 09:24:18 +0000594#else
595 ret = 1;
596 goto out;
597#endif
Matt Caswell6d242fa2020-01-09 15:21:14 +0000598 } else {
599 if (!TEST_ptr(pkey = load_example_hmac_key()))
600 goto out;
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100601 }
602
Matt Caswell6d242fa2020-01-09 15:21:14 +0000603 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)))
Richard Levitte6e59a892015-11-27 14:02:12 +0100609 goto out;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000610
Matt Caswell6d242fa2020-01-09 15:21:14 +0000611 if (tst >= 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100612 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 }
Rich Salzadcd8e32017-04-18 16:33:15 -0400618
Matt Caswell71ea6b42015-02-09 09:45:35 +0000619 /* Determine the size of the signature. */
Rich Salzadcd8e32017-04-18 16:33:15 -0400620 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
Richard Levitte0a054d22020-01-09 21:37:32 +0100621 || !TEST_ptr(sig = OPENSSL_malloc(sig_len))
Rich Salzadcd8e32017-04-18 16:33:15 -0400622 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000623 goto out;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000624
Matt Caswell6d242fa2020-01-09 15:21:14 +0000625 if (tst >= 6) {
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100626 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
Matt Caswell6d242fa2020-01-09 15:21:14 +0000631 /*
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)))
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100638 goto out;
Matt Caswell6d242fa2020-01-09 15:21:14 +0000639
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)))
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100649 goto out;
650 }
Matt Caswell71ea6b42015-02-09 09:45:35 +0000651
652 ret = 1;
653
654 out:
Matt Caswell59d0e6c2019-10-07 18:21:39 +0100655 BIO_free(membio);
656 BIO_free(mdbio);
657 EVP_MD_CTX_free(a_md_ctx);
658 EVP_MD_CTX_free(a_md_ctx_verify);
Rich Salzc5ba2d92015-03-28 10:54:15 -0400659 EVP_PKEY_free(pkey);
Rich Salzb548a1f2015-05-01 10:02:07 -0400660 OPENSSL_free(sig);
Matt Caswell6d242fa2020-01-09 15:21:14 +0000661 EVP_MD_free(mdexp);
Matt Caswell71ea6b42015-02-09 09:45:35 +0000662
663 return ret;
664}
665
666static int test_EVP_DigestVerifyInit(void)
667{
668 int ret = 0;
669 EVP_PKEY *pkey = NULL;
Rich Salzadcd8e32017-04-18 16:33:15 -0400670 EVP_MD_CTX *md_ctx = NULL;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000671
Rich Salzadcd8e32017-04-18 16:33:15 -0400672 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
673 || !TEST_ptr(pkey = load_example_rsa_key()))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000674 goto out;
Rich Salzadcd8e32017-04-18 16:33:15 -0400675
676 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
677 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
678 || !TEST_true(EVP_DigestVerifyFinal(md_ctx, kSignature,
679 sizeof(kSignature))))
680 goto out;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000681 ret = 1;
682
683 out:
Richard Levittebfb06412015-12-02 00:49:35 +0100684 EVP_MD_CTX_free(md_ctx);
Rich Salzc5ba2d92015-03-28 10:54:15 -0400685 EVP_PKEY_free(pkey);
Matt Caswell71ea6b42015-02-09 09:45:35 +0000686 return ret;
687}
688
Rich Salzadcd8e32017-04-18 16:33:15 -0400689static int test_d2i_AutoPrivateKey(int i)
Matt Caswell71ea6b42015-02-09 09:45:35 +0000690{
691 int ret = 0;
692 const unsigned char *p;
693 EVP_PKEY *pkey = NULL;
Rich Salzadcd8e32017-04-18 16:33:15 -0400694 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;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000698
699 p = input;
Rich Salzadcd8e32017-04-18 16:33:15 -0400700 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))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000703 goto done;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000704
705 ret = 1;
706
707 done:
Rich Salzc5ba2d92015-03-28 10:54:15 -0400708 EVP_PKEY_free(pkey);
Matt Caswell71ea6b42015-02-09 09:45:35 +0000709 return ret;
710}
711
Matt Caswella9880362015-02-26 10:35:50 +0000712#ifndef OPENSSL_NO_EC
Shane Lontiscad83472019-03-27 17:38:28 +1000713
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
Matt Caswell71ea6b42015-02-09 09:45:35 +0000773/* 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
Rich Salzadcd8e32017-04-18 16:33:15 -0400781 if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
782 sizeof(kExampleBadECKeyDER))))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000783 goto done;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000784
Rich Salzadcd8e32017-04-18 16:33:15 -0400785 if (!TEST_ptr_eq(derp,
786 kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
Matt Caswell71ea6b42015-02-09 09:45:35 +0000787 goto done;
Rich Salzadcd8e32017-04-18 16:33:15 -0400788
789 if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
790 goto done;
Matt Caswell71ea6b42015-02-09 09:45:35 +0000791
792 ret = 1;
793
794 done:
Rich Salze0e920b2015-04-11 16:32:54 -0400795 PKCS8_PRIV_KEY_INFO_free(p8inf);
Rich Salzc5ba2d92015-03-28 10:54:15 -0400796 EVP_PKEY_free(pkey);
Matt Caswell71ea6b42015-02-09 09:45:35 +0000797
798 return ret;
799}
Matt Caswella9880362015-02-26 10:35:50 +0000800#endif
Matt Caswell71ea6b42015-02-09 09:45:35 +0000801
Richard Levitte29c49b22020-05-18 08:35:29 +0200802/* 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;
Shane Lontise2cc68c2020-07-06 17:35:23 +1000808 long membuf_len = 0;
Richard Levitte29c49b22020-05-18 08:35:29 +0200809 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)
Shane Lontise2cc68c2020-07-06 17:35:23 +1000816 || !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,
Richard Levitte29c49b22020-05-18 08:35:29 +0200819 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
Richard Levittef0c62c52020-09-11 08:36:54 +0200836#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
Richard Levittef844f9e2020-04-13 22:34:56 +0200910#if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
Jack Lloydddb634f2018-06-18 15:51:56 -0400911
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800912static int test_EVP_SM2_verify(void)
913{
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800914 const char *pubkey =
Paul Yangd0b79f82020-03-04 23:49:43 +0800915 "-----BEGIN PUBLIC KEY-----\n"
916 "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEp1KLWq1ZE2jmoAnnBJE1LBGxVr18\n"
917 "YvvqECWCpXfAQ9qUJ+UmthnUPf0iM3SaXKHe6PlLIDyNlWMWb9RUh/yU3g==\n"
918 "-----END PUBLIC KEY-----\n";
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800919
920 const char *msg = "message digest";
921 const char *id = "ALICE123@YAHOO.COM";
922
923 const uint8_t signature[] = {
Paul Yangd0b79f82020-03-04 23:49:43 +0800924 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
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800931 };
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
Richard Levitte8a288602020-09-23 06:18:06 +0200947 if (!TEST_true(EVP_PKEY_is_a(pkey, "SM2")))
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800948 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
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800956 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
Paul Yangd0b79f82020-03-04 23:49:43 +0800961 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, id, strlen(id)), 0))
962 goto done;
963
Jack Lloyda6c4cb82018-09-04 23:25:29 +0800964 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
Jack Lloydddb634f2018-06-18 15:51:56 -0400979static int test_EVP_SM2(void)
980{
981 int ret = 0;
982 EVP_PKEY *pkey = NULL;
Matt Caswellbfb56a92020-09-18 11:57:24 +0100983 EVP_PKEY *pkeyparams = NULL;
Jack Lloydddb634f2018-06-18 15:51:56 -0400984 EVP_PKEY_CTX *pctx = NULL;
985 EVP_PKEY_CTX *kctx = NULL;
Paul Yang48037172018-09-04 17:21:10 +0800986 EVP_PKEY_CTX *sctx = NULL;
Jack Lloydddb634f2018-06-18 15:51:56 -0400987 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
Paul Yang48037172018-09-04 17:21:10 +0800999 uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
1000
Matt Caswellbfb56a92020-09-18 11:57:24 +01001001 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
Paul Yangd0b79f82020-03-04 23:49:43 +08001006 pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SM2, NULL);
Jack Lloydddb634f2018-06-18 15:51:56 -04001007 if (!TEST_ptr(pctx))
1008 goto done;
1009
1010 if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
1011 goto done;
1012
Paul Yangd0b79f82020-03-04 23:49:43 +08001013 /* TODO is this even needed? */
Jack Lloydddb634f2018-06-18 15:51:56 -04001014 if (!TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2)))
1015 goto done;
1016
Matt Caswellbfb56a92020-09-18 11:57:24 +01001017 if (!TEST_true(EVP_PKEY_paramgen(pctx, &pkeyparams)))
Jack Lloydddb634f2018-06-18 15:51:56 -04001018 goto done;
1019
Matt Caswellbfb56a92020-09-18 11:57:24 +01001020 kctx = EVP_PKEY_CTX_new(pkeyparams, NULL);
Jack Lloydddb634f2018-06-18 15:51:56 -04001021 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
Jack Lloydddb634f2018-06-18 15:51:56 -04001030 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
Paul Yang48037172018-09-04 17:21:10 +08001036 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
Paul Yangd0b79f82020-03-04 23:49:43 +08001042 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, EVP_sm3(), NULL, pkey)))
Paul Yang48037172018-09-04 17:21:10 +08001043 goto done;
1044
Paul Yangd0b79f82020-03-04 23:49:43 +08001045 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
Jack Lloydddb634f2018-06-18 15:51:56 -04001046 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
Jack Lloydddb634f2018-06-18 15:51:56 -04001055 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
Paul Yangd0b79f82020-03-04 23:49:43 +08001066 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
1067 goto done;
1068
Jack Lloydddb634f2018-06-18 15:51:56 -04001069 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
Matt Caswellbfb56a92020-09-18 11:57:24 +01001077 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);
Jack Lloydddb634f2018-06-18 15:51:56 -04001081
Matt Caswellbfb56a92020-09-18 11:57:24 +01001082 sparams[0] = OSSL_PARAM_construct_utf8_string(OSSL_ASYM_CIPHER_PARAM_DIGEST,
1083 i == 0 ? "SM3" : "SHA2-256",
1084 0);
Jack Lloydddb634f2018-06-18 15:51:56 -04001085
Matt Caswellbfb56a92020-09-18 11:57:24 +01001086 if (!TEST_ptr(cctx = EVP_PKEY_CTX_new(pkey, NULL)))
1087 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001088
Matt Caswellbfb56a92020-09-18 11:57:24 +01001089 if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
1090 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001091
Matt Caswellbfb56a92020-09-18 11:57:24 +01001092 if (!TEST_true(EVP_PKEY_CTX_set_params(cctx, sparams)))
1093 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001094
Matt Caswellbfb56a92020-09-18 11:57:24 +01001095 if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg,
1096 sizeof(kMsg))))
1097 goto done;
Jack Lloydddb634f2018-06-18 15:51:56 -04001098
Matt Caswellbfb56a92020-09-18 11:57:24 +01001099 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 }
Jack Lloydddb634f2018-06-18 15:51:56 -04001124
1125 ret = 1;
1126done:
1127 EVP_PKEY_CTX_free(pctx);
1128 EVP_PKEY_CTX_free(kctx);
Paul Yang48037172018-09-04 17:21:10 +08001129 EVP_PKEY_CTX_free(sctx);
Jack Lloydddb634f2018-06-18 15:51:56 -04001130 EVP_PKEY_CTX_free(cctx);
1131 EVP_PKEY_free(pkey);
Matt Caswellbfb56a92020-09-18 11:57:24 +01001132 EVP_PKEY_free(pkeyparams);
Jack Lloydddb634f2018-06-18 15:51:56 -04001133 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
Matt Caswellbb5f2812018-06-01 15:06:52 +01001141static 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
Matt Caswell896dcb82018-06-08 11:20:34 +01001152 },
1153#ifndef OPENSSL_NO_EC
1154 {
Matt Caswellbb5f2812018-06-01 15:06:52 +01001155 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 }
Matt Caswell896dcb82018-06-08 11:20:34 +01001169#endif
Matt Caswellbb5f2812018-06-01 15:06:52 +01001170};
1171
Matt Caswell86dc26b2020-04-27 17:17:05 +01001172static int test_set_get_raw_keys_int(int tst, int pub, int uselibctx)
Matt Caswellbb5f2812018-06-01 15:06:52 +01001173{
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;
Matt Caswell86dc26b2020-04-27 17:17:05 +01001189 if (uselibctx) {
Matt Caswelld8652be2020-09-24 10:42:23 +01001190 pkey = EVP_PKEY_new_raw_public_key_ex(
Matt Caswell86dc26b2020-04-27 17:17:05 +01001191 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 }
Matt Caswellbb5f2812018-06-01 15:06:52 +01001202 } else {
1203 inlen = strlen(keys[tst].priv);
1204 in = (unsigned char *)keys[tst].priv;
Matt Caswell86dc26b2020-04-27 17:17:05 +01001205 if (uselibctx) {
Matt Caswelld8652be2020-09-24 10:42:23 +01001206 pkey = EVP_PKEY_new_raw_private_key_ex(
Matt Caswell86dc26b2020-04-27 17:17:05 +01001207 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 }
Matt Caswellbb5f2812018-06-01 15:06:52 +01001217 }
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{
Matt Caswell86dc26b2020-04-27 17:17:05 +01001236 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);
Matt Caswellbb5f2812018-06-01 15:06:52 +01001240}
1241
Pauli41bbba52020-02-13 11:00:57 +10001242#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001243static int pkey_custom_check(EVP_PKEY *pkey)
1244{
1245 return 0xbeef;
1246}
1247
Paul Yangb0004702017-11-01 00:45:24 +08001248static 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
Paul Yang2aee35d2017-09-04 22:02:59 +08001258static EVP_PKEY_METHOD *custom_pmeth;
Pauli41bbba52020-02-13 11:00:57 +10001259#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001260
1261static int test_EVP_PKEY_check(int i)
1262{
1263 int ret = 0;
1264 const unsigned char *p;
1265 EVP_PKEY *pkey = NULL;
Benjamin Kaduk8a8bc662017-12-07 17:57:21 -06001266#ifndef OPENSSL_NO_EC
Paul Yangb0004702017-11-01 00:45:24 +08001267 EC_KEY *eckey = NULL;
Benjamin Kaduk8a8bc662017-12-07 17:57:21 -06001268#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001269 EVP_PKEY_CTX *ctx = NULL;
Pauli41bbba52020-02-13 11:00:57 +10001270#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001271 EVP_PKEY_CTX *ctx2 = NULL;
Pauli41bbba52020-02-13 11:00:57 +10001272#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001273 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;
Paul Yangb0004702017-11-01 00:45:24 +08001278 int expected_pub_check = ak->pub_check;
1279 int expected_param_check = ak->param_check;
1280 int type = ak->type;
1281 BIO *pubkey = NULL;
Paul Yang2aee35d2017-09-04 22:02:59 +08001282
1283 p = input;
Paul Yangb0004702017-11-01 00:45:24 +08001284
Dr. Matthias St. Pierre35db3662018-09-10 00:20:12 +02001285 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;
Benjamin Kaduk8a8bc662017-12-07 17:57:21 -06001292#ifndef OPENSSL_NO_EC
Dr. Matthias St. Pierre35db3662018-09-10 00:20:12 +02001293 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;
Benjamin Kaduk8a8bc662017-12-07 17:57:21 -06001307#endif
Dr. Matthias St. Pierre35db3662018-09-10 00:20:12 +02001308 default:
1309 return 0;
1310 }
Paul Yang2aee35d2017-09-04 22:02:59 +08001311
1312 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new(pkey, NULL)))
1313 goto done;
1314
Paul Yangb0004702017-11-01 00:45:24 +08001315 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;
Paul Yang2aee35d2017-09-04 22:02:59 +08001323
Pauli41bbba52020-02-13 11:00:57 +10001324#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001325 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
Paul Yangb0004702017-11-01 00:45:24 +08001333 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;
Pauli41bbba52020-02-13 11:00:57 +10001338#endif
Paul Yangb0004702017-11-01 00:45:24 +08001339
Paul Yang2aee35d2017-09-04 22:02:59 +08001340 ret = 1;
1341
1342 done:
1343 EVP_PKEY_CTX_free(ctx);
Pauli41bbba52020-02-13 11:00:57 +10001344#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08001345 EVP_PKEY_CTX_free(ctx2);
Pauli41bbba52020-02-13 11:00:57 +10001346#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08001347 EVP_PKEY_free(pkey);
Paul Yangb0004702017-11-01 00:45:24 +08001348 BIO_free(pubkey);
Paul Yang2aee35d2017-09-04 22:02:59 +08001349 return ret;
1350}
1351
Richard Levittefab8fde2020-05-14 17:15:05 +02001352#ifndef OPENSSL_NO_CMAC
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001353static 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}
Richard Levittea87820e2020-05-12 15:27:32 +02001371static int test_CMAC_keygen(void)
1372{
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001373 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 };
Richard Levittea87820e2020-05-12 15:27:32 +02001378 /*
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;
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001384 EVP_PKEY *pkey = NULL;
1385 unsigned char mac[AES_BLOCK_SIZE], mac2[AES_BLOCK_SIZE];
Richard Levittea87820e2020-05-12 15:27:32 +02001386
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001387 /* 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)))
Richard Levittea87820e2020-05-12 15:27:32 +02001398 goto done;
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001399
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)))
1410 goto done;
1411
Richard Levittea87820e2020-05-12 15:27:32 +02001412 ret = 1;
1413
1414 done:
Matt Caswelle5bc0ce2020-08-12 14:41:12 +01001415 EVP_PKEY_free(pkey);
Richard Levittea87820e2020-05-12 15:27:32 +02001416 EVP_PKEY_CTX_free(kctx);
1417 return ret;
1418}
Richard Levittefab8fde2020-05-14 17:15:05 +02001419#endif
Richard Levittea87820e2020-05-12 15:27:32 +02001420
Matt Caswell10d5b412018-10-26 12:45:27 +01001421static 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
Benjamin Kaduk2cd3ebc2020-05-21 12:53:59 -07001465static 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
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01001506#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}
Shane Lontis7bb82f92019-09-15 19:55:10 +10001535#endif /* OPENSSL_NO_EC */
Shane Lontis784883f2019-08-19 09:30:59 +10001536
Matt Caswell9c452222019-09-04 12:46:02 +01001537/* Test getting and setting parameters on an EVP_PKEY_CTX */
Richard Levittef54a4102019-12-02 11:26:15 +01001538static int test_EVP_PKEY_CTX_get_set_params(EVP_PKEY *pkey)
Matt Caswell9c452222019-09-04 12:46:02 +01001539{
Matt Caswell9a071fe2019-09-25 11:49:04 +01001540 EVP_MD_CTX *mdctx = NULL;
Matt Caswell9c452222019-09-04 12:46:02 +01001541 EVP_PKEY_CTX *ctx = NULL;
Matt Caswell9c452222019-09-04 12:46:02 +01001542 const OSSL_PARAM *params;
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001543 OSSL_PARAM ourparams[2], *param = ourparams, *param_md;
Matt Caswell9c452222019-09-04 12:46:02 +01001544 int ret = 0;
1545 const EVP_MD *md;
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001546 char mdname[OSSL_MAX_NAME_SIZE];
Matt Caswell9a071fe2019-09-25 11:49:04 +01001547 char ssl3ms[48];
Matt Caswell9c452222019-09-04 12:46:02 +01001548
Matt Caswell9c452222019-09-04 12:46:02 +01001549 /* Initialise a sign operation */
1550 ctx = EVP_PKEY_CTX_new(pkey, NULL);
Matt Caswell9c452222019-09-04 12:46:02 +01001551 if (!TEST_ptr(ctx)
Richard Levittec9c4a352019-10-30 17:06:48 +01001552 || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0))
Matt Caswell9c452222019-09-04 12:46:02 +01001553 goto err;
1554
1555 /*
Richard Levittef54a4102019-12-02 11:26:15 +01001556 * We should be able to query the parameters now.
Matt Caswell9c452222019-09-04 12:46:02 +01001557 */
1558 params = EVP_PKEY_CTX_settable_params(ctx);
1559 if (!TEST_ptr(params)
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001560 || !TEST_ptr(OSSL_PARAM_locate_const(params,
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001561 OSSL_SIGNATURE_PARAM_DIGEST)))
Matt Caswell9c452222019-09-04 12:46:02 +01001562 goto err;
1563
Matt Caswell9c452222019-09-04 12:46:02 +01001564 params = EVP_PKEY_CTX_gettable_params(ctx);
1565 if (!TEST_ptr(params)
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001566 || !TEST_ptr(OSSL_PARAM_locate_const(params,
1567 OSSL_SIGNATURE_PARAM_ALGORITHM_ID))
1568 || !TEST_ptr(OSSL_PARAM_locate_const(params,
Richard Levitte0cb3f4f2020-01-22 20:59:56 +01001569 OSSL_SIGNATURE_PARAM_DIGEST)))
Matt Caswell9c452222019-09-04 12:46:02 +01001570 goto err;
1571
1572 /*
1573 * Test getting and setting params via EVP_PKEY_CTX_set_params() and
1574 * EVP_PKEY_CTX_get_params()
1575 */
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001576 strcpy(mdname, "SHA512");
1577 param_md = param;
1578 *param++ = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1579 mdname, 0);
Matt Caswell9c452222019-09-04 12:46:02 +01001580 *param++ = OSSL_PARAM_construct_end();
1581
1582 if (!TEST_true(EVP_PKEY_CTX_set_params(ctx, ourparams)))
1583 goto err;
1584
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001585 mdname[0] = '\0';
1586 *param_md = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST,
1587 mdname, sizeof(mdname));
Matt Caswell9c452222019-09-04 12:46:02 +01001588 if (!TEST_true(EVP_PKEY_CTX_get_params(ctx, ourparams))
Richard Levitte00bc1ad2020-02-02 12:55:05 +01001589 || !TEST_str_eq(mdname, "SHA512"))
Matt Caswell9c452222019-09-04 12:46:02 +01001590 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
Matt Caswell9a071fe2019-09-25 11:49:04 +01001601 /*
1602 * Test getting MD parameters via an associated EVP_PKEY_CTX
1603 */
1604 mdctx = EVP_MD_CTX_new();
1605 if (!TEST_ptr(mdctx)
Matt Caswelld8652be2020-09-24 10:42:23 +01001606 || !TEST_true(EVP_DigestSignInit_ex(mdctx, NULL, "SHA1", NULL, NULL,
1607 pkey)))
Matt Caswell9a071fe2019-09-25 11:49:04 +01001608 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
Matt Caswell9c452222019-09-04 12:46:02 +01001630 ret = 1;
1631
1632 err:
Matt Caswell9a071fe2019-09-25 11:49:04 +01001633 EVP_MD_CTX_free(mdctx);
Matt Caswell9c452222019-09-04 12:46:02 +01001634 EVP_PKEY_CTX_free(ctx);
Richard Levittef54a4102019-12-02 11:26:15 +01001635
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:
Matt Caswell9c452222019-09-04 12:46:02 +01001677 EVP_PKEY_free(pkey);
1678 DSA_free(dsa);
1679 BN_free(p);
1680 BN_free(q);
1681 BN_free(g);
Richard Levittecd32a0f2019-10-15 11:35:09 +02001682 BN_free(pub);
1683 BN_free(priv);
Matt Caswell9c452222019-09-04 12:46:02 +01001684
1685 return ret;
1686}
Matt Caswell8d0f8c82019-09-11 10:04:23 +01001687#endif
Matt Caswell9c452222019-09-04 12:46:02 +01001688
Richard Levittef54a4102019-12-02 11:26:15 +01001689static int test_RSA_get_set_params(void)
1690{
Richard Levitted7e498a2020-10-04 16:34:31 +02001691 OSSL_PARAM_BLD *bld = NULL;
1692 OSSL_PARAM *params = NULL;
Richard Levittef54a4102019-12-02 11:26:15 +01001693 BIGNUM *n = NULL, *e = NULL, *d = NULL;
Richard Levitted7e498a2020-10-04 16:34:31 +02001694 EVP_PKEY_CTX *pctx = NULL;
Richard Levittef54a4102019-12-02 11:26:15 +01001695 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 */
Richard Levitted7e498a2020-10-04 16:34:31 +02001702 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()))
Richard Levittef54a4102019-12-02 11:26:15 +01001707 goto err;
Richard Levitted7e498a2020-10-04 16:34:31 +02001708 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)))
Richard Levittef54a4102019-12-02 11:26:15 +01001713 goto err;
1714
Richard Levitted7e498a2020-10-04 16:34:31 +02001715 if (!TEST_int_gt(EVP_PKEY_key_fromdata_init(pctx), 0)
1716 || !TEST_int_gt(EVP_PKEY_fromdata(pctx, &pkey, params), 0))
1717 goto err;
1718
1719 if (!TEST_ptr(pkey))
1720 goto err;
Richard Levittef54a4102019-12-02 11:26:15 +01001721
1722 ret = test_EVP_PKEY_CTX_get_set_params(pkey);
1723
1724 err:
1725 EVP_PKEY_free(pkey);
Richard Levitted7e498a2020-10-04 16:34:31 +02001726 EVP_PKEY_CTX_free(pctx);
1727 OSSL_PARAM_BLD_free_params(params);
1728 OSSL_PARAM_BLD_free(bld);
Richard Levittef54a4102019-12-02 11:26:15 +01001729 BN_free(n);
1730 BN_free(e);
1731 BN_free(d);
1732
1733 return ret;
1734}
1735
Matt Caswellb4be6932019-05-31 14:32:55 +01001736#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
Matt Caswell501fcfb2019-12-18 11:00:42 +00001802#ifndef OPENSSL_NO_DH
Matt Caswelle295de12019-12-09 12:03:02 +00001803static int test_EVP_PKEY_set1_DH(void)
1804{
Shane Lontisca2bf552020-01-31 08:18:46 +10001805 DH *x942dh = NULL, *noqdh = NULL;
1806 EVP_PKEY *pkey1 = NULL, *pkey2 = NULL;
Matt Caswelle295de12019-12-09 12:03:02 +00001807 int ret = 0;
Shane Lontisca2bf552020-01-31 08:18:46 +10001808 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;
Matt Caswelle295de12019-12-09 12:03:02 +00001818
1819 x942dh = DH_get_2048_256();
Matt Caswelle295de12019-12-09 12:03:02 +00001820 pkey1 = EVP_PKEY_new();
1821 pkey2 = EVP_PKEY_new();
1822 if (!TEST_ptr(x942dh)
Shane Lontisca2bf552020-01-31 08:18:46 +10001823 || !TEST_ptr(noqdh)
Matt Caswelle295de12019-12-09 12:03:02 +00001824 || !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
Shane Lontisca2bf552020-01-31 08:18:46 +10001832 if(!TEST_true(EVP_PKEY_set1_DH(pkey2, noqdh))
Matt Caswelle295de12019-12-09 12:03:02 +00001833 || !TEST_int_eq(EVP_PKEY_id(pkey2), EVP_PKEY_DH))
1834 goto err;
1835
1836 ret = 1;
1837 err:
Shane Lontisca2bf552020-01-31 08:18:46 +10001838 BN_free(p);
1839 BN_free(g);
Matt Caswelle295de12019-12-09 12:03:02 +00001840 EVP_PKEY_free(pkey1);
1841 EVP_PKEY_free(pkey2);
1842 DH_free(x942dh);
Shane Lontisca2bf552020-01-31 08:18:46 +10001843 DH_free(noqdh);
Matt Caswelle295de12019-12-09 12:03:02 +00001844
1845 return ret;
1846}
Matt Caswell501fcfb2019-12-18 11:00:42 +00001847#endif
Matt Caswelle295de12019-12-09 12:03:02 +00001848
Richard Levitte8a5cb592020-04-15 13:36:19 +02001849/*
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
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001890/*
1891 * Test that we fail if we attempt to use an algorithm that is not available
Richard Levitte08497fc2020-09-04 10:52:20 +02001892 * 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
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001897 */
1898static int test_pkey_ctx_fail_without_provider(int tst)
1899{
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03001900 OSSL_LIB_CTX *tmpctx = OSSL_LIB_CTX_new();
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001901 OSSL_PROVIDER *nullprov = NULL;
1902 EVP_PKEY_CTX *pctx = NULL;
Richard Levitte08497fc2020-09-04 10:52:20 +02001903 const char *keytype = NULL;
1904 int expect_null = 0;
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001905 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
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001914 /*
Richard Levitte08497fc2020-09-04 10:52:20 +02001915 * 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).
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001920 */
Richard Levitte08497fc2020-09-04 10:52:20 +02001921 switch (tst) {
1922 case 0:
1923 keytype = "RSA";
1924 expect_null = 1;
1925 break;
1926 case 1:
1927 keytype = "SM2";
Paul Yangd0b79f82020-03-04 23:49:43 +08001928 expect_null = 1;
Richard Levitte08497fc2020-09-04 10:52:20 +02001929#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))
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001945 goto err;
1946
Richard Levitte08497fc2020-09-04 10:52:20 +02001947#if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_SM2)
1948 end:
1949#endif
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001950 ret = 1;
1951
1952 err:
1953 EVP_PKEY_CTX_free(pctx);
1954 OSSL_PROVIDER_unload(nullprov);
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03001955 OSSL_LIB_CTX_free(tmpctx);
Matt Caswell5ddec6a2020-05-14 11:33:01 +01001956 return ret;
1957}
1958
Pauli1c19ff32020-06-11 11:07:13 +10001959static 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));
Pauli0d4460d2020-10-30 15:53:47 +10001981 *p++ = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_MAX_REQUEST, &step);
Pauli1c19ff32020-06-11 11:07:13 +10001982 *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
Benjamin Kaduk440b8522020-06-19 20:42:29 -07001990/*
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
Pauliad887412017-07-18 11:48:27 +10002102int setup_tests(void)
Matt Caswell71ea6b42015-02-09 09:45:35 +00002103{
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03002104 testctx = OSSL_LIB_CTX_new();
Matt Caswell86dc26b2020-04-27 17:17:05 +01002105
2106 if (!TEST_ptr(testctx))
2107 return 0;
2108
Paulif9e504e2020-06-12 10:34:46 +10002109 ADD_TEST(test_EVP_set_default_properties);
Matt Caswell6d242fa2020-01-09 15:21:14 +00002110 ADD_ALL_TESTS(test_EVP_DigestSignInit, 9);
Rich Salzadcd8e32017-04-18 16:33:15 -04002111 ADD_TEST(test_EVP_DigestVerifyInit);
Shane Lontis2eb2b4f2018-09-06 08:34:45 +10002112 ADD_TEST(test_EVP_Enveloped);
Pauliad887412017-07-18 11:48:27 +10002113 ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
Richard Levitte29c49b22020-05-18 08:35:29 +02002114 ADD_TEST(test_privatekey_to_pkcs8);
Matt Caswella9880362015-02-26 10:35:50 +00002115#ifndef OPENSSL_NO_EC
Rich Salzadcd8e32017-04-18 16:33:15 -04002116 ADD_TEST(test_EVP_PKCS82PKEY);
Matt Caswella9880362015-02-26 10:35:50 +00002117#endif
Richard Levittef0c62c52020-09-11 08:36:54 +02002118#ifndef OPENSSL_NO_EC
2119 ADD_ALL_TESTS(test_EC_keygen_with_enc, OSSL_NELEM(ec_encodings));
2120#endif
Richard Levittef844f9e2020-04-13 22:34:56 +02002121#if !defined(OPENSSL_NO_SM2) && !defined(FIPS_MODULE)
Jack Lloydddb634f2018-06-18 15:51:56 -04002122 ADD_TEST(test_EVP_SM2);
Jack Lloyda6c4cb82018-09-04 23:25:29 +08002123 ADD_TEST(test_EVP_SM2_verify);
Jack Lloydddb634f2018-06-18 15:51:56 -04002124#endif
Matt Caswellbb5f2812018-06-01 15:06:52 +01002125 ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
Pauli41bbba52020-02-13 11:00:57 +10002126#ifndef OPENSSL_NO_DEPRECATED_3_0
Paul Yang2aee35d2017-09-04 22:02:59 +08002127 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);
Paul Yangb0004702017-11-01 00:45:24 +08002131 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);
Paul Yang2aee35d2017-09-04 22:02:59 +08002133 if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
2134 return 0;
Pauli41bbba52020-02-13 11:00:57 +10002135#endif
Paul Yang2aee35d2017-09-04 22:02:59 +08002136 ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
Richard Levittefab8fde2020-05-14 17:15:05 +02002137#ifndef OPENSSL_NO_CMAC
Richard Levittea87820e2020-05-12 15:27:32 +02002138 ADD_TEST(test_CMAC_keygen);
Richard Levittefab8fde2020-05-14 17:15:05 +02002139#endif
Matt Caswell10d5b412018-10-26 12:45:27 +01002140 ADD_TEST(test_HKDF);
Benjamin Kaduk2cd3ebc2020-05-21 12:53:59 -07002141 ADD_TEST(test_emptyikm_HKDF);
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01002142#ifndef OPENSSL_NO_EC
2143 ADD_TEST(test_X509_PUBKEY_inplace);
Shane Lontiscad83472019-03-27 17:38:28 +10002144 ADD_ALL_TESTS(test_invalide_ec_char2_pub_range_decode,
2145 OSSL_NELEM(ec_der_pub_keys));
Bernd Edlinger5dc40a82019-01-30 16:20:31 +01002146#endif
Matt Caswell8d0f8c82019-09-11 10:04:23 +01002147#ifndef OPENSSL_NO_DSA
Richard Levittef54a4102019-12-02 11:26:15 +01002148 ADD_TEST(test_DSA_get_set_params);
Matt Caswell8d0f8c82019-09-11 10:04:23 +01002149#endif
Richard Levittef54a4102019-12-02 11:26:15 +01002150 ADD_TEST(test_RSA_get_set_params);
Matt Caswellb4be6932019-05-31 14:32:55 +01002151#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
2152 ADD_TEST(test_decrypt_null_chunks);
2153#endif
Matt Caswell501fcfb2019-12-18 11:00:42 +00002154#ifndef OPENSSL_NO_DH
Matt Caswelle295de12019-12-09 12:03:02 +00002155 ADD_TEST(test_EVP_PKEY_set1_DH);
Matt Caswell501fcfb2019-12-18 11:00:42 +00002156#endif
Richard Levitte8a5cb592020-04-15 13:36:19 +02002157 ADD_ALL_TESTS(test_keygen_with_empty_template, 2);
Matt Caswell5ddec6a2020-05-14 11:33:01 +01002158 ADD_ALL_TESTS(test_pkey_ctx_fail_without_provider, 2);
Matt Caswelle295de12019-12-09 12:03:02 +00002159
Pauli1c19ff32020-06-11 11:07:13 +10002160 ADD_TEST(test_rand_agglomeration);
Benjamin Kaduk440b8522020-06-19 20:42:29 -07002161 ADD_ALL_TESTS(test_evp_iv, 10);
Pauli1c19ff32020-06-11 11:07:13 +10002162
Pauliad887412017-07-18 11:48:27 +10002163 return 1;
Matt Caswell71ea6b42015-02-09 09:45:35 +00002164}
Matt Caswell86dc26b2020-04-27 17:17:05 +01002165
2166void cleanup_tests(void)
2167{
Dr. Matthias St. Pierreb4250012020-10-15 12:55:50 +03002168 OSSL_LIB_CTX_free(testctx);
Matt Caswell86dc26b2020-04-27 17:17:05 +01002169}