]> git.ipfire.org Git - thirdparty/openssl.git/blame - test/evp_extra_test.c
Following the license change, modify the boilerplates in test/
[thirdparty/openssl.git] / test / evp_extra_test.c
CommitLineData
440e5d80 1/*
fd38836b 2 * Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.
71ea6b48 3 *
909f1a2e 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
440e5d80
RS
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
71ea6b48
MC
8 */
9
10#include <stdio.h>
11#include <stdlib.h>
bb5f281a 12#include <string.h>
71ea6b48
MC
13#include <openssl/bio.h>
14#include <openssl/crypto.h>
15#include <openssl/err.h>
16#include <openssl/evp.h>
17#include <openssl/rsa.h>
18#include <openssl/x509.h>
4803717f 19#include <openssl/pem.h>
10d5b415 20#include <openssl/kdf.h>
adcd8e37 21#include "testutil.h"
176db6dc 22#include "internal/nelem.h"
2aee35d3 23#include "internal/evp_int.h"
71ea6b48
MC
24
25/*
26 * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
27 * should never use this key anywhere but in an example.
28 */
29static const unsigned char kExampleRSAKeyDER[] = {
30 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8,
31 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59,
32 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37,
33 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71,
34 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a,
35 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4,
36 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec,
37 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76,
38 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8,
39 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7,
40 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c,
41 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01,
42 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7,
43 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85,
44 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee,
45 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85,
46 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a,
47 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15,
48 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83,
49 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b,
50 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73,
51 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99,
52 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02,
53 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41,
54 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59,
55 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9,
56 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef,
57 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87,
58 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf,
59 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5,
60 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5,
61 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62,
62 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64,
63 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8,
64 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba,
65 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe,
66 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7,
67 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe,
68 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb,
69 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34,
70 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27,
71 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0,
72 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba,
73 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06,
74 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c,
75 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e,
76 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf,
77 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a,
78 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17,
79 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1,
80 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
81};
82
2aee35d3
PY
83/*
84 * kExampleBadRSAKeyDER is an RSA private key in ASN.1, DER format. The private
85 * components are not correct.
86 */
87static const unsigned char kExampleBadRSAKeyDER[] = {
88 0x30, 0x82, 0x04, 0x27, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
89 0xa6, 0x1a, 0x1e, 0x6e, 0x7b, 0xee, 0xc6, 0x89, 0x66, 0xe7, 0x93, 0xef,
90 0x54, 0x12, 0x68, 0xea, 0xbf, 0x86, 0x2f, 0xdd, 0xd2, 0x79, 0xb8, 0xa9,
91 0x6e, 0x03, 0xc2, 0xa3, 0xb9, 0xa3, 0xe1, 0x4b, 0x2a, 0xb3, 0xf8, 0xb4,
92 0xcd, 0xea, 0xbe, 0x24, 0xa6, 0x57, 0x5b, 0x83, 0x1f, 0x0f, 0xf2, 0xd3,
93 0xb7, 0xac, 0x7e, 0xd6, 0x8e, 0x6e, 0x1e, 0xbf, 0xb8, 0x73, 0x8c, 0x05,
94 0x56, 0xe6, 0x35, 0x1f, 0xe9, 0x04, 0x0b, 0x09, 0x86, 0x7d, 0xf1, 0x26,
95 0x08, 0x99, 0xad, 0x7b, 0xc8, 0x4d, 0x94, 0xb0, 0x0b, 0x8b, 0x38, 0xa0,
96 0x5c, 0x62, 0xa0, 0xab, 0xd3, 0x8f, 0xd4, 0x09, 0x60, 0x72, 0x1e, 0x33,
97 0x50, 0x80, 0x6e, 0x22, 0xa6, 0x77, 0x57, 0x6b, 0x9a, 0x33, 0x21, 0x66,
98 0x87, 0x6e, 0x21, 0x7b, 0xc7, 0x24, 0x0e, 0xd8, 0x13, 0xdf, 0x83, 0xde,
99 0xcd, 0x40, 0x58, 0x1d, 0x84, 0x86, 0xeb, 0xb8, 0x12, 0x4e, 0xd2, 0xfa,
100 0x80, 0x1f, 0xe4, 0xe7, 0x96, 0x29, 0xb8, 0xcc, 0xce, 0x66, 0x6d, 0x53,
101 0xca, 0xb9, 0x5a, 0xd7, 0xf6, 0x84, 0x6c, 0x2d, 0x9a, 0x1a, 0x14, 0x1c,
102 0x4e, 0x93, 0x39, 0xba, 0x74, 0xed, 0xed, 0x87, 0x87, 0x5e, 0x48, 0x75,
103 0x36, 0xf0, 0xbc, 0x34, 0xfb, 0x29, 0xf9, 0x9f, 0x96, 0x5b, 0x0b, 0xa7,
104 0x54, 0x30, 0x51, 0x29, 0x18, 0x5b, 0x7d, 0xac, 0x0f, 0xd6, 0x5f, 0x7c,
105 0xf8, 0x98, 0x8c, 0xd8, 0x86, 0x62, 0xb3, 0xdc, 0xff, 0x0f, 0xff, 0x7a,
106 0xaf, 0x5c, 0x4c, 0x61, 0x49, 0x2e, 0xc8, 0x95, 0x86, 0xc4, 0x0e, 0x87,
107 0xfc, 0x1d, 0xcf, 0x8b, 0x7c, 0x61, 0xf6, 0xd8, 0xd0, 0x69, 0xf6, 0xcd,
108 0x8a, 0x8c, 0xf6, 0x62, 0xa2, 0x56, 0xa9, 0xe3, 0xd1, 0xcf, 0x4d, 0xa0,
109 0xf6, 0x2d, 0x20, 0x0a, 0x04, 0xb7, 0xa2, 0xf7, 0xb5, 0x99, 0x47, 0x18,
110 0x56, 0x85, 0x87, 0xc7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
111 0x01, 0x00, 0x99, 0x41, 0x38, 0x1a, 0xd0, 0x96, 0x7a, 0xf0, 0x83, 0xd5,
112 0xdf, 0x94, 0xce, 0x89, 0x3d, 0xec, 0x7a, 0x52, 0x21, 0x10, 0x16, 0x06,
113 0xe0, 0xee, 0xd2, 0xe6, 0xfd, 0x4b, 0x7b, 0x19, 0x4d, 0xe1, 0xc0, 0xc0,
114 0xd5, 0x14, 0x5d, 0x79, 0xdd, 0x7e, 0x8b, 0x4b, 0xc6, 0xcf, 0xb0, 0x75,
115 0x52, 0xa3, 0x2d, 0xb1, 0x26, 0x46, 0x68, 0x9c, 0x0a, 0x1a, 0xf2, 0xe1,
116 0x09, 0xac, 0x53, 0x85, 0x8c, 0x36, 0xa9, 0x14, 0x65, 0xea, 0xa0, 0x00,
117 0xcb, 0xe3, 0x3f, 0xc4, 0x2b, 0x61, 0x2e, 0x6b, 0x06, 0x69, 0x77, 0xfd,
118 0x38, 0x7e, 0x1d, 0x3f, 0x92, 0xe7, 0x77, 0x08, 0x19, 0xa7, 0x9d, 0x29,
119 0x2d, 0xdc, 0x42, 0xc6, 0x7c, 0xd7, 0xd3, 0xa8, 0x01, 0x2c, 0xf2, 0xd5,
120 0x82, 0x57, 0xcb, 0x55, 0x3d, 0xe7, 0xaa, 0xd2, 0x06, 0x30, 0x30, 0x05,
121 0xe6, 0xf2, 0x47, 0x86, 0xba, 0xc6, 0x61, 0x64, 0xeb, 0x4f, 0x2a, 0x5e,
122 0x07, 0x29, 0xe0, 0x96, 0xb2, 0x43, 0xff, 0x5f, 0x1a, 0x54, 0x16, 0xcf,
123 0xb5, 0x56, 0x5c, 0xa0, 0x9b, 0x0c, 0xfd, 0xb3, 0xd2, 0xe3, 0x79, 0x1d,
124 0x21, 0xe2, 0xd6, 0x13, 0xc4, 0x74, 0xa6, 0xf5, 0x8e, 0x8e, 0x81, 0xbb,
125 0xb4, 0xad, 0x8a, 0xf0, 0x93, 0x0a, 0xd8, 0x0a, 0x42, 0x36, 0xbc, 0xe5,
126 0x26, 0x2a, 0x0d, 0x5d, 0x57, 0x13, 0xc5, 0x4e, 0x2f, 0x12, 0x0e, 0xef,
127 0xa7, 0x81, 0x1e, 0xc3, 0xa5, 0xdb, 0xc9, 0x24, 0xeb, 0x1a, 0xa1, 0xf9,
128 0xf6, 0xa1, 0x78, 0x98, 0x93, 0x77, 0x42, 0x45, 0x03, 0xe2, 0xc9, 0xa2,
129 0xfe, 0x2d, 0x77, 0xc8, 0xc6, 0xac, 0x9b, 0x98, 0x89, 0x6d, 0x9a, 0xe7,
130 0x61, 0x63, 0xb7, 0xf2, 0xec, 0xd6, 0xb1, 0xa1, 0x6e, 0x0a, 0x1a, 0xff,
131 0xfd, 0x43, 0x28, 0xc3, 0x0c, 0xdc, 0xf2, 0x47, 0x4f, 0x27, 0xaa, 0x99,
132 0x04, 0x8e, 0xac, 0xe8, 0x7c, 0x01, 0x02, 0x04, 0x12, 0x34, 0x56, 0x78,
133 0x02, 0x81, 0x81, 0x00, 0xca, 0x69, 0xe5, 0xbb, 0x3a, 0x90, 0x82, 0xcb,
134 0x82, 0x50, 0x2f, 0x29, 0xe2, 0x76, 0x6a, 0x57, 0x55, 0x45, 0x4e, 0x35,
135 0x18, 0x61, 0xe0, 0x12, 0x70, 0xc0, 0xab, 0xc7, 0x80, 0xa2, 0xd4, 0x46,
136 0x34, 0x03, 0xa0, 0x19, 0x26, 0x23, 0x9e, 0xef, 0x1a, 0xcb, 0x75, 0xd6,
137 0xba, 0x81, 0xf4, 0x7e, 0x52, 0xe5, 0x2a, 0xe8, 0xf1, 0x49, 0x6c, 0x0f,
138 0x1a, 0xa0, 0xf9, 0xc6, 0xe7, 0xec, 0x60, 0xe4, 0xcb, 0x2a, 0xb5, 0x56,
139 0xe9, 0x9c, 0xcd, 0x19, 0x75, 0x92, 0xb1, 0x66, 0xce, 0xc3, 0xd9, 0x3d,
140 0x11, 0xcb, 0xc4, 0x09, 0xce, 0x1e, 0x30, 0xba, 0x2f, 0x60, 0x60, 0x55,
141 0x8d, 0x02, 0xdc, 0x5d, 0xaf, 0xf7, 0x52, 0x31, 0x17, 0x07, 0x53, 0x20,
142 0x33, 0xad, 0x8c, 0xd5, 0x2f, 0x5a, 0xd0, 0x57, 0xd7, 0xd1, 0x80, 0xd6,
143 0x3a, 0x9b, 0x04, 0x4f, 0x35, 0xbf, 0xe7, 0xd5, 0xbc, 0x8f, 0xd4, 0x81,
144 0x02, 0x81, 0x81, 0x00, 0xc0, 0x9f, 0xf8, 0xcd, 0xf7, 0x3f, 0x26, 0x8a,
145 0x3d, 0x4d, 0x2b, 0x0c, 0x01, 0xd0, 0xa2, 0xb4, 0x18, 0xfe, 0xf7, 0x5e,
146 0x2f, 0x06, 0x13, 0xcd, 0x63, 0xaa, 0x12, 0xa9, 0x24, 0x86, 0xe3, 0xf3,
147 0x7b, 0xda, 0x1a, 0x3c, 0xb1, 0x38, 0x80, 0x80, 0xef, 0x64, 0x64, 0xa1,
148 0x9b, 0xfe, 0x76, 0x63, 0x8e, 0x83, 0xd2, 0xd9, 0xb9, 0x86, 0xb0, 0xe6,
149 0xa6, 0x0c, 0x7e, 0xa8, 0x84, 0x90, 0x98, 0x0c, 0x1e, 0xf3, 0x14, 0x77,
150 0xe0, 0x5f, 0x81, 0x08, 0x11, 0x8f, 0xa6, 0x23, 0xc4, 0xba, 0xc0, 0x8a,
151 0xe4, 0xc6, 0xe3, 0x5c, 0xbe, 0xc5, 0xec, 0x2c, 0xb9, 0xd8, 0x8c, 0x4d,
152 0x1a, 0x9d, 0xe7, 0x7c, 0x85, 0x4c, 0x0d, 0x71, 0x4e, 0x72, 0x33, 0x1b,
153 0xfe, 0xa9, 0x17, 0x72, 0x76, 0x56, 0x9d, 0x74, 0x7e, 0x52, 0x67, 0x9a,
154 0x87, 0x9a, 0xdb, 0x30, 0xde, 0xe4, 0x49, 0x28, 0x3b, 0xd2, 0x67, 0xaf,
155 0x02, 0x81, 0x81, 0x00, 0x89, 0x74, 0x9a, 0x8e, 0xa7, 0xb9, 0xa5, 0x28,
156 0xc0, 0x68, 0xe5, 0x6e, 0x63, 0x1c, 0x99, 0x20, 0x8f, 0x86, 0x8e, 0x12,
157 0x9e, 0x69, 0x30, 0xfa, 0x34, 0xd9, 0x92, 0x8d, 0xdb, 0x7c, 0x37, 0xfd,
158 0x28, 0xab, 0x61, 0x98, 0x52, 0x7f, 0x14, 0x1a, 0x39, 0xae, 0xfb, 0x6a,
159 0x03, 0xa3, 0xe6, 0xbd, 0xb6, 0x5b, 0x6b, 0xe5, 0x5e, 0x9d, 0xc6, 0xa5,
160 0x07, 0x27, 0x54, 0x17, 0xd0, 0x3d, 0x84, 0x9b, 0x3a, 0xa0, 0xd9, 0x1e,
161 0x99, 0x6c, 0x63, 0x17, 0xab, 0xf1, 0x1f, 0x49, 0xba, 0x95, 0xe3, 0x3b,
162 0x86, 0x8f, 0x42, 0xa4, 0x89, 0xf5, 0x94, 0x8f, 0x8b, 0x46, 0xbe, 0x84,
163 0xba, 0x4a, 0xbc, 0x0d, 0x5f, 0x46, 0xeb, 0xe8, 0xec, 0x43, 0x8c, 0x1e,
164 0xad, 0x19, 0x69, 0x2f, 0x08, 0x86, 0x7a, 0x3f, 0x7d, 0x0f, 0x07, 0x97,
165 0xf3, 0x9a, 0x7b, 0xb5, 0xb2, 0xc1, 0x8c, 0x95, 0x68, 0x04, 0xa0, 0x81,
166 0x02, 0x81, 0x80, 0x4e, 0xbf, 0x7e, 0x1b, 0xcb, 0x13, 0x61, 0x75, 0x3b,
167 0xdb, 0x59, 0x5f, 0xb1, 0xd4, 0xb8, 0xeb, 0x9e, 0x73, 0xb5, 0xe7, 0xf6,
168 0x89, 0x3d, 0x1c, 0xda, 0xf0, 0x36, 0xff, 0x35, 0xbd, 0x1e, 0x0b, 0x74,
169 0xe3, 0x9e, 0xf0, 0xf2, 0xf7, 0xd7, 0x82, 0xb7, 0x7b, 0x6a, 0x1b, 0x0e,
170 0x30, 0x4a, 0x98, 0x0e, 0xb4, 0xf9, 0x81, 0x07, 0xe4, 0x75, 0x39, 0xe9,
171 0x53, 0xca, 0xbb, 0x5c, 0xaa, 0x93, 0x07, 0x0e, 0xa8, 0x2f, 0xba, 0x98,
172 0x49, 0x30, 0xa7, 0xcc, 0x1a, 0x3c, 0x68, 0x0c, 0xe1, 0xa4, 0xb1, 0x05,
173 0xe6, 0xe0, 0x25, 0x78, 0x58, 0x14, 0x37, 0xf5, 0x1f, 0xe3, 0x22, 0xef,
174 0xa8, 0x0e, 0x22, 0xa0, 0x94, 0x3a, 0xf6, 0xc9, 0x13, 0xe6, 0x06, 0xbf,
175 0x7f, 0x99, 0xc6, 0xcc, 0xd8, 0xc6, 0xbe, 0xd9, 0x2e, 0x24, 0xc7, 0x69,
176 0x8c, 0x95, 0xba, 0xf6, 0x04, 0xb3, 0x0a, 0xf4, 0xcb, 0xf0, 0xce,
177};
178
71ea6b48
MC
179static const unsigned char kMsg[] = { 1, 2, 3, 4 };
180
181static const unsigned char kSignature[] = {
182 0xa5, 0xf0, 0x8a, 0x47, 0x5d, 0x3c, 0xb3, 0xcc, 0xa9, 0x79, 0xaf, 0x4d,
183 0x8c, 0xae, 0x4c, 0x14, 0xef, 0xc2, 0x0b, 0x34, 0x36, 0xde, 0xf4, 0x3e,
184 0x3d, 0xbb, 0x4a, 0x60, 0x5c, 0xc8, 0x91, 0x28, 0xda, 0xfb, 0x7e, 0x04,
185 0x96, 0x7e, 0x63, 0x13, 0x90, 0xce, 0xb9, 0xb4, 0x62, 0x7a, 0xfd, 0x09,
186 0x3d, 0xc7, 0x67, 0x78, 0x54, 0x04, 0xeb, 0x52, 0x62, 0x6e, 0x24, 0x67,
187 0xb4, 0x40, 0xfc, 0x57, 0x62, 0xc6, 0xf1, 0x67, 0xc1, 0x97, 0x8f, 0x6a,
188 0xa8, 0xae, 0x44, 0x46, 0x5e, 0xab, 0x67, 0x17, 0x53, 0x19, 0x3a, 0xda,
189 0x5a, 0xc8, 0x16, 0x3e, 0x86, 0xd5, 0xc5, 0x71, 0x2f, 0xfc, 0x23, 0x48,
190 0xd9, 0x0b, 0x13, 0xdd, 0x7b, 0x5a, 0x25, 0x79, 0xef, 0xa5, 0x7b, 0x04,
191 0xed, 0x44, 0xf6, 0x18, 0x55, 0xe4, 0x0a, 0xe9, 0x57, 0x79, 0x5d, 0xd7,
192 0x55, 0xa7, 0xab, 0x45, 0x02, 0x97, 0x60, 0x42,
193};
194
195/*
196 * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8
197 * PrivateKeyInfo.
198 */
199static const unsigned char kExampleRSAKeyPKCS8[] = {
200 0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
201 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
202 0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
203 0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5,
204 0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e,
205 0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34,
206 0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde,
207 0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8,
208 0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b,
209 0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83,
210 0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48,
211 0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a,
212 0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2,
213 0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01,
214 0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a,
215 0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5,
216 0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6,
217 0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8,
218 0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6,
219 0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f,
220 0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c,
221 0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78,
222 0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71,
223 0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60,
224 0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d,
225 0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3,
226 0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d,
227 0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18,
228 0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d,
229 0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32,
230 0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc,
231 0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63,
232 0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05,
233 0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16,
234 0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3,
235 0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85,
236 0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97,
237 0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7,
238 0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99,
239 0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4,
240 0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d,
241 0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40,
242 0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26,
243 0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1,
244 0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c,
245 0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30,
246 0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea,
247 0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b,
248 0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e,
249 0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9,
250 0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae,
251 0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d,
252 0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
253};
254
a9880362 255#ifndef OPENSSL_NO_EC
71ea6b48
MC
256/*
257 * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
258 * structure.
259 */
260static const unsigned char kExampleECKeyDER[] = {
261 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a,
262 0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08,
263 0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a,
264 0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
265 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69,
266 0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c,
267 0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9,
268 0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18,
269 0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16,
270 0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22,
271 0xc1,
272};
273
274/*
275 * kExampleBadECKeyDER is a sample EC private key encoded as an ECPrivateKey
276 * structure. The private key is equal to the order and will fail to import
277 */
278static const unsigned char kExampleBadECKeyDER[] = {
279 0x30, 0x66, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48,
280 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03,
281 0x01, 0x07, 0x04, 0x4C, 0x30, 0x4A, 0x02, 0x01, 0x01, 0x04, 0x20, 0xFF,
282 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
283 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, 0xF3,
284 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51, 0xA1, 0x23, 0x03, 0x21, 0x00,
285 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
286 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
287 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
288};
b0004708
PY
289
290/* prime256v1 */
291static const unsigned char kExampleECPubKeyDER[] = {
292 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
293 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
294 0x42, 0x00, 0x04, 0xba, 0xeb, 0x83, 0xfb, 0x3b, 0xb2, 0xff, 0x30, 0x53,
295 0xdb, 0xce, 0x32, 0xf2, 0xac, 0xae, 0x44, 0x0d, 0x3d, 0x13, 0x53, 0xb8,
296 0xd1, 0x68, 0x55, 0xde, 0x44, 0x46, 0x05, 0xa6, 0xc9, 0xd2, 0x04, 0xb7,
297 0xe3, 0xa2, 0x96, 0xc8, 0xb2, 0x5e, 0x22, 0x03, 0xd7, 0x03, 0x7a, 0x8b,
298 0x13, 0x5c, 0x42, 0x49, 0xc2, 0xab, 0x86, 0xd6, 0xac, 0x6b, 0x93, 0x20,
299 0x56, 0x6a, 0xc6, 0xc8, 0xa5, 0x0b, 0xe5
300};
301
302static const unsigned char pExampleECParamDER[] = {
303 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
304};
a9880362 305#endif
71ea6b48 306
adcd8e37
RS
307typedef struct APK_DATA_st {
308 const unsigned char *kder;
309 size_t size;
310 int evptype;
2aee35d3 311 int check;
b0004708
PY
312 int pub_check;
313 int param_check;
314 int type; /* 0 for private, 1 for public, 2 for params */
adcd8e37
RS
315} APK_DATA;
316
317static APK_DATA keydata[] = {
318 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), EVP_PKEY_RSA},
319 {kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), EVP_PKEY_RSA},
aa24cd1b 320#ifndef OPENSSL_NO_EC
adcd8e37 321 {kExampleECKeyDER, sizeof(kExampleECKeyDER), EVP_PKEY_EC}
aa24cd1b 322#endif
adcd8e37
RS
323};
324
2aee35d3 325static APK_DATA keycheckdata[] = {
b0004708
PY
326 {kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER), EVP_PKEY_RSA, 1, -2, -2, 0},
327 {kExampleBadRSAKeyDER, sizeof(kExampleBadRSAKeyDER), EVP_PKEY_RSA,
328 0, -2, -2, 0},
2aee35d3 329#ifndef OPENSSL_NO_EC
b0004708
PY
330 {kExampleECKeyDER, sizeof(kExampleECKeyDER), EVP_PKEY_EC, 1, 1, 1, 0},
331 /* group is also associated in our pub key */
332 {kExampleECPubKeyDER, sizeof(kExampleECPubKeyDER), EVP_PKEY_EC, 0, 1, 1, 1},
333 {pExampleECParamDER, sizeof(pExampleECParamDER), EVP_PKEY_EC, 0, 0, 1, 2}
2aee35d3
PY
334#endif
335};
336
71ea6b48
MC
337static EVP_PKEY *load_example_rsa_key(void)
338{
339 EVP_PKEY *ret = NULL;
340 const unsigned char *derp = kExampleRSAKeyDER;
341 EVP_PKEY *pkey = NULL;
342 RSA *rsa = NULL;
343
adcd8e37 344 if (!TEST_true(d2i_RSAPrivateKey(&rsa, &derp, sizeof(kExampleRSAKeyDER))))
71ea6b48 345 return NULL;
71ea6b48 346
adcd8e37
RS
347 if (!TEST_ptr(pkey = EVP_PKEY_new())
348 || !TEST_true(EVP_PKEY_set1_RSA(pkey, rsa)))
349 goto end;
71ea6b48
MC
350
351 ret = pkey;
352 pkey = NULL;
353
adcd8e37 354end:
c5ba2d99 355 EVP_PKEY_free(pkey);
d6407083 356 RSA_free(rsa);
71ea6b48
MC
357
358 return ret;
359}
360
2eb2b4f3
SL
361static int test_EVP_Enveloped(void)
362{
363 int ret = 0;
364 EVP_CIPHER_CTX *ctx = NULL;
365 EVP_PKEY *keypair = NULL;
366 unsigned char *kek = NULL;
367 unsigned char iv[EVP_MAX_IV_LENGTH];
368 static const unsigned char msg[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
369 int len, kek_len, ciphertext_len, plaintext_len;
370 unsigned char ciphertext[32], plaintext[16];
371 const EVP_CIPHER *type = EVP_aes_256_cbc();
372
373 if (!TEST_ptr(keypair = load_example_rsa_key())
374 || !TEST_ptr(kek = OPENSSL_zalloc(EVP_PKEY_size(keypair)))
375 || !TEST_ptr(ctx = EVP_CIPHER_CTX_new())
376 || !TEST_true(EVP_SealInit(ctx, type, &kek, &kek_len, iv,
377 &keypair, 1))
378 || !TEST_true(EVP_SealUpdate(ctx, ciphertext, &ciphertext_len,
379 msg, sizeof(msg)))
380 || !TEST_true(EVP_SealFinal(ctx, ciphertext + ciphertext_len,
381 &len)))
382 goto err;
383
384 ciphertext_len += len;
385
386 if (!TEST_true(EVP_OpenInit(ctx, type, kek, kek_len, iv, keypair))
387 || !TEST_true(EVP_OpenUpdate(ctx, plaintext, &plaintext_len,
388 ciphertext, ciphertext_len))
389 || !TEST_true(EVP_OpenFinal(ctx, plaintext + plaintext_len, &len)))
390 goto err;
391
392 plaintext_len += len;
393 if (!TEST_mem_eq(msg, sizeof(msg), plaintext, plaintext_len))
394 goto err;
395
396 ret = 1;
397err:
398 OPENSSL_free(kek);
399 EVP_PKEY_free(keypair);
400 EVP_CIPHER_CTX_free(ctx);
401 return ret;
402}
403
404
71ea6b48
MC
405static int test_EVP_DigestSignInit(void)
406{
407 int ret = 0;
408 EVP_PKEY *pkey = NULL;
409 unsigned char *sig = NULL;
410 size_t sig_len = 0;
adcd8e37 411 EVP_MD_CTX *md_ctx, *md_ctx_verify = NULL;
71ea6b48 412
adcd8e37
RS
413 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
414 || !TEST_ptr(md_ctx_verify = EVP_MD_CTX_new())
415 || !TEST_ptr(pkey = load_example_rsa_key()))
6e59a892 416 goto out;
71ea6b48 417
adcd8e37
RS
418 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
419 || !TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
71ea6b48 420 goto out;
adcd8e37 421
71ea6b48 422 /* Determine the size of the signature. */
adcd8e37
RS
423 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len))
424 || !TEST_size_t_eq(sig_len, (size_t)EVP_PKEY_size(pkey)))
71ea6b48 425 goto out;
71ea6b48 426
adcd8e37
RS
427 if (!TEST_ptr(sig = OPENSSL_malloc(sig_len))
428 || !TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
71ea6b48 429 goto out;
71ea6b48
MC
430
431 /* Ensure that the signature round-trips. */
adcd8e37
RS
432 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, EVP_sha256(),
433 NULL, pkey))
434 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify,
435 kMsg, sizeof(kMsg)))
436 || !TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
71ea6b48 437 goto out;
71ea6b48
MC
438
439 ret = 1;
440
441 out:
bfb0641f
RL
442 EVP_MD_CTX_free(md_ctx);
443 EVP_MD_CTX_free(md_ctx_verify);
c5ba2d99 444 EVP_PKEY_free(pkey);
b548a1f1 445 OPENSSL_free(sig);
71ea6b48
MC
446
447 return ret;
448}
449
450static int test_EVP_DigestVerifyInit(void)
451{
452 int ret = 0;
453 EVP_PKEY *pkey = NULL;
adcd8e37 454 EVP_MD_CTX *md_ctx = NULL;
71ea6b48 455
adcd8e37
RS
456 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new())
457 || !TEST_ptr(pkey = load_example_rsa_key()))
458 goto out;
71ea6b48 459
adcd8e37
RS
460 if (!TEST_true(EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, pkey))
461 || !TEST_true(EVP_DigestVerifyUpdate(md_ctx, kMsg, sizeof(kMsg)))
462 || !TEST_true(EVP_DigestVerifyFinal(md_ctx, kSignature,
463 sizeof(kSignature))))
71ea6b48 464 goto out;
71ea6b48
MC
465 ret = 1;
466
467 out:
bfb0641f 468 EVP_MD_CTX_free(md_ctx);
c5ba2d99 469 EVP_PKEY_free(pkey);
71ea6b48
MC
470 return ret;
471}
472
adcd8e37 473static int test_d2i_AutoPrivateKey(int i)
71ea6b48
MC
474{
475 int ret = 0;
476 const unsigned char *p;
477 EVP_PKEY *pkey = NULL;
adcd8e37
RS
478 const APK_DATA *ak = &keydata[i];
479 const unsigned char *input = ak->kder;
480 size_t input_len = ak->size;
481 int expected_id = ak->evptype;
71ea6b48
MC
482
483 p = input;
adcd8e37
RS
484 if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
485 || !TEST_ptr_eq(p, input + input_len)
486 || !TEST_int_eq(EVP_PKEY_id(pkey), expected_id))
71ea6b48 487 goto done;
71ea6b48
MC
488
489 ret = 1;
490
491 done:
c5ba2d99 492 EVP_PKEY_free(pkey);
71ea6b48
MC
493 return ret;
494}
495
a9880362 496#ifndef OPENSSL_NO_EC
71ea6b48
MC
497/* Tests loading a bad key in PKCS8 format */
498static int test_EVP_PKCS82PKEY(void)
499{
500 int ret = 0;
501 const unsigned char *derp = kExampleBadECKeyDER;
502 PKCS8_PRIV_KEY_INFO *p8inf = NULL;
503 EVP_PKEY *pkey = NULL;
504
adcd8e37
RS
505 if (!TEST_ptr(p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp,
506 sizeof(kExampleBadECKeyDER))))
507 goto done;
71ea6b48 508
adcd8e37
RS
509 if (!TEST_ptr_eq(derp,
510 kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)))
71ea6b48 511 goto done;
71ea6b48 512
adcd8e37 513 if (!TEST_ptr_null(pkey = EVP_PKCS82PKEY(p8inf)))
71ea6b48 514 goto done;
71ea6b48
MC
515
516 ret = 1;
517
518 done:
e0e920b1 519 PKCS8_PRIV_KEY_INFO_free(p8inf);
c5ba2d99 520 EVP_PKEY_free(pkey);
71ea6b48
MC
521
522 return ret;
523}
a9880362 524#endif
71ea6b48 525
ddb634fe
JL
526#ifndef OPENSSL_NO_SM2
527
a6c4cb84
JL
528static int test_EVP_SM2_verify(void)
529{
530 /* From https://tools.ietf.org/html/draft-shen-sm2-ecdsa-02#appendix-A */
531 const char *pubkey =
532 "-----BEGIN PUBLIC KEY-----\n"
533 "MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAhULWnkwETxjouSQ1\n"
534 "v2/33kVyg5FcRVF9ci7biwjx38MwRAQgeHlotPoyw/0kF4Quc7v+/y88hItoMdfg\n"
535 "7GUiizk35JgEIGPkxtOyOwyEnPhCQUhL/kj2HVmlsWugbm4S0donxSSaBEEEQh3r\n"
536 "1hti6rZ0ZDTrw8wxXjIiCzut1QvcTE5sFH/t1D0GgFEry7QsB9RzSdIVO3DE5df9\n"
537 "/L+jbqGoWEG55G4JogIhAIVC1p5MBE8Y6LkkNb9v990pdyBjBIVijVrnTufDLnm3\n"
538 "AgEBA0IABArkx3mKoPEZRxvuEYJb5GICu3nipYRElel8BP9N8lSKfAJA+I8c1OFj\n"
539 "Uqc8F7fxbwc1PlOhdtaEqf4Ma7eY6Fc=\n"
540 "-----END PUBLIC KEY-----\n";
541
542 const char *msg = "message digest";
543 const char *id = "ALICE123@YAHOO.COM";
544
545 const uint8_t signature[] = {
546 0x30, 0x44, 0x02, 0x20,
547
548 0x40, 0xF1, 0xEC, 0x59, 0xF7, 0x93, 0xD9, 0xF4, 0x9E, 0x09, 0xDC,
549 0xEF, 0x49, 0x13, 0x0D, 0x41, 0x94, 0xF7, 0x9F, 0xB1, 0xEE, 0xD2,
550 0xCA, 0xA5, 0x5B, 0xAC, 0xDB, 0x49, 0xC4, 0xE7, 0x55, 0xD1,
551
552 0x02, 0x20,
553
554 0x6F, 0xC6, 0xDA, 0xC3, 0x2C, 0x5D, 0x5C, 0xF1, 0x0C, 0x77, 0xDF,
555 0xB2, 0x0F, 0x7C, 0x2E, 0xB6, 0x67, 0xA4, 0x57, 0x87, 0x2F, 0xB0,
556 0x9E, 0xC5, 0x63, 0x27, 0xA6, 0x7E, 0xC7, 0xDE, 0xEB, 0xE7
557 };
558
559 int rc = 0;
560 BIO *bio = NULL;
561 EVP_PKEY *pkey = NULL;
562 EVP_MD_CTX *mctx = NULL;
563 EVP_PKEY_CTX *pctx = NULL;
564
565 bio = BIO_new_mem_buf(pubkey, strlen(pubkey));
566 if (!TEST_true(bio != NULL))
567 goto done;
568
569 pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
570 if (!TEST_true(pkey != NULL))
571 goto done;
572
573 if (!TEST_true(EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2)))
574 goto done;
575
576 if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
577 goto done;
578
579 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new(pkey, NULL)))
580 goto done;
581
582 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(pctx, (const uint8_t *)id,
583 strlen(id)), 0))
584 goto done;
585
586 EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
587
588 if (!TEST_true(EVP_DigestVerifyInit(mctx, NULL, EVP_sm3(), NULL, pkey)))
589 goto done;
590
591 if (!TEST_true(EVP_DigestVerifyUpdate(mctx, msg, strlen(msg))))
592 goto done;
593
594 if (!TEST_true(EVP_DigestVerifyFinal(mctx, signature, sizeof(signature))))
595 goto done;
596 rc = 1;
597
598 done:
599 BIO_free(bio);
600 EVP_PKEY_free(pkey);
601 EVP_PKEY_CTX_free(pctx);
602 EVP_MD_CTX_free(mctx);
603 return rc;
604}
605
ddb634fe
JL
606static int test_EVP_SM2(void)
607{
608 int ret = 0;
609 EVP_PKEY *pkey = NULL;
610 EVP_PKEY *params = NULL;
611 EVP_PKEY_CTX *pctx = NULL;
612 EVP_PKEY_CTX *kctx = NULL;
4803717f 613 EVP_PKEY_CTX *sctx = NULL;
ddb634fe
JL
614 size_t sig_len = 0;
615 unsigned char *sig = NULL;
616 EVP_MD_CTX *md_ctx = NULL;
617 EVP_MD_CTX *md_ctx_verify = NULL;
618 EVP_PKEY_CTX *cctx = NULL;
619
620 uint8_t ciphertext[128];
621 size_t ctext_len = sizeof(ciphertext);
622
623 uint8_t plaintext[8];
624 size_t ptext_len = sizeof(plaintext);
625
4803717f
PY
626 uint8_t sm2_id[] = {1, 2, 3, 4, 'l', 'e', 't', 't', 'e', 'r'};
627
ddb634fe
JL
628 pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
629 if (!TEST_ptr(pctx))
630 goto done;
631
632 if (!TEST_true(EVP_PKEY_paramgen_init(pctx) == 1))
633 goto done;
634
635 if (!TEST_true(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx, NID_sm2)))
636 goto done;
637
638 if (!TEST_true(EVP_PKEY_paramgen(pctx, &params)))
639 goto done;
640
641 kctx = EVP_PKEY_CTX_new(params, NULL);
642 if (!TEST_ptr(kctx))
643 goto done;
644
645 if (!TEST_true(EVP_PKEY_keygen_init(kctx)))
646 goto done;
647
648 if (!TEST_true(EVP_PKEY_keygen(kctx, &pkey)))
649 goto done;
650
651 if (!TEST_true(EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2)))
652 goto done;
653
654 if (!TEST_ptr(md_ctx = EVP_MD_CTX_new()))
655 goto done;
656
657 if (!TEST_ptr(md_ctx_verify = EVP_MD_CTX_new()))
658 goto done;
659
4803717f
PY
660 if (!TEST_ptr(sctx = EVP_PKEY_CTX_new(pkey, NULL)))
661 goto done;
662
663 EVP_MD_CTX_set_pkey_ctx(md_ctx, sctx);
664 EVP_MD_CTX_set_pkey_ctx(md_ctx_verify, sctx);
665
666 if (!TEST_int_gt(EVP_PKEY_CTX_set1_id(sctx, sm2_id, sizeof(sm2_id)), 0))
667 goto done;
668
ddb634fe
JL
669 if (!TEST_true(EVP_DigestSignInit(md_ctx, NULL, EVP_sm3(), NULL, pkey)))
670 goto done;
671
672 if(!TEST_true(EVP_DigestSignUpdate(md_ctx, kMsg, sizeof(kMsg))))
673 goto done;
674
675 /* Determine the size of the signature. */
676 if (!TEST_true(EVP_DigestSignFinal(md_ctx, NULL, &sig_len)))
677 goto done;
678
679 if (!TEST_size_t_eq(sig_len, (size_t)EVP_PKEY_size(pkey)))
680 goto done;
681
682 if (!TEST_ptr(sig = OPENSSL_malloc(sig_len)))
683 goto done;
684
685 if (!TEST_true(EVP_DigestSignFinal(md_ctx, sig, &sig_len)))
686 goto done;
687
688 /* Ensure that the signature round-trips. */
689
690 if (!TEST_true(EVP_DigestVerifyInit(md_ctx_verify, NULL, EVP_sm3(), NULL, pkey)))
691 goto done;
692
693 if (!TEST_true(EVP_DigestVerifyUpdate(md_ctx_verify, kMsg, sizeof(kMsg))))
694 goto done;
695
696 if (!TEST_true(EVP_DigestVerifyFinal(md_ctx_verify, sig, sig_len)))
697 goto done;
698
699 /* now check encryption/decryption */
700
701 if (!TEST_ptr(cctx = EVP_PKEY_CTX_new(pkey, NULL)))
702 goto done;
703
704 if (!TEST_true(EVP_PKEY_encrypt_init(cctx)))
705 goto done;
706
707 if (!TEST_true(EVP_PKEY_encrypt(cctx, ciphertext, &ctext_len, kMsg, sizeof(kMsg))))
708 goto done;
709
710 if (!TEST_true(EVP_PKEY_decrypt_init(cctx)))
711 goto done;
712
713 if (!TEST_true(EVP_PKEY_decrypt(cctx, plaintext, &ptext_len, ciphertext, ctext_len)))
714 goto done;
715
716 if (!TEST_true(ptext_len == sizeof(kMsg)))
717 goto done;
718
719 if (!TEST_true(memcmp(plaintext, kMsg, sizeof(kMsg)) == 0))
720 goto done;
721
722 ret = 1;
723done:
724 EVP_PKEY_CTX_free(pctx);
725 EVP_PKEY_CTX_free(kctx);
4803717f 726 EVP_PKEY_CTX_free(sctx);
ddb634fe
JL
727 EVP_PKEY_CTX_free(cctx);
728 EVP_PKEY_free(pkey);
729 EVP_PKEY_free(params);
730 EVP_MD_CTX_free(md_ctx);
731 EVP_MD_CTX_free(md_ctx_verify);
732 OPENSSL_free(sig);
733 return ret;
734}
735
736#endif
737
bb5f281a
MC
738static struct keys_st {
739 int type;
740 char *priv;
741 char *pub;
742} keys[] = {
743 {
744 EVP_PKEY_HMAC, "0123456789", NULL
745 }, {
746 EVP_PKEY_POLY1305, "01234567890123456789012345678901", NULL
747 }, {
748 EVP_PKEY_SIPHASH, "0123456789012345", NULL
896dcb80
MC
749 },
750#ifndef OPENSSL_NO_EC
751 {
bb5f281a
MC
752 EVP_PKEY_X25519, "01234567890123456789012345678901",
753 "abcdefghijklmnopqrstuvwxyzabcdef"
754 }, {
755 EVP_PKEY_ED25519, "01234567890123456789012345678901",
756 "abcdefghijklmnopqrstuvwxyzabcdef"
757 }, {
758 EVP_PKEY_X448,
759 "01234567890123456789012345678901234567890123456789012345",
760 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd"
761 }, {
762 EVP_PKEY_ED448,
763 "012345678901234567890123456789012345678901234567890123456",
764 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde"
765 }
896dcb80 766#endif
bb5f281a
MC
767};
768
769static int test_set_get_raw_keys_int(int tst, int pub)
770{
771 int ret = 0;
772 unsigned char buf[80];
773 unsigned char *in;
774 size_t inlen, len = 0;
775 EVP_PKEY *pkey;
776
777 /* Check if this algorithm supports public keys */
778 if (keys[tst].pub == NULL)
779 return 1;
780
781 memset(buf, 0, sizeof(buf));
782
783 if (pub) {
784 inlen = strlen(keys[tst].pub);
785 in = (unsigned char *)keys[tst].pub;
786 pkey = EVP_PKEY_new_raw_public_key(keys[tst].type,
787 NULL,
788 in,
789 inlen);
790 } else {
791 inlen = strlen(keys[tst].priv);
792 in = (unsigned char *)keys[tst].priv;
793 pkey = EVP_PKEY_new_raw_private_key(keys[tst].type,
794 NULL,
795 in,
796 inlen);
797 }
798
799 if (!TEST_ptr(pkey)
800 || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, NULL, &len)))
801 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, NULL, &len)))
802 || !TEST_true(len == inlen)
803 || (!pub && !TEST_true(EVP_PKEY_get_raw_private_key(pkey, buf, &len)))
804 || (pub && !TEST_true(EVP_PKEY_get_raw_public_key(pkey, buf, &len)))
805 || !TEST_mem_eq(in, inlen, buf, len))
806 goto done;
807
808 ret = 1;
809 done:
810 EVP_PKEY_free(pkey);
811 return ret;
812}
813
814static int test_set_get_raw_keys(int tst)
815{
816 return test_set_get_raw_keys_int(tst, 0)
817 && test_set_get_raw_keys_int(tst, 1);
818}
819
2aee35d3
PY
820static int pkey_custom_check(EVP_PKEY *pkey)
821{
822 return 0xbeef;
823}
824
b0004708
PY
825static int pkey_custom_pub_check(EVP_PKEY *pkey)
826{
827 return 0xbeef;
828}
829
830static int pkey_custom_param_check(EVP_PKEY *pkey)
831{
832 return 0xbeef;
833}
834
2aee35d3
PY
835static EVP_PKEY_METHOD *custom_pmeth;
836
837static int test_EVP_PKEY_check(int i)
838{
839 int ret = 0;
840 const unsigned char *p;
841 EVP_PKEY *pkey = NULL;
8a8bc665 842#ifndef OPENSSL_NO_EC
b0004708 843 EC_KEY *eckey = NULL;
8a8bc665 844#endif
2aee35d3
PY
845 EVP_PKEY_CTX *ctx = NULL;
846 EVP_PKEY_CTX *ctx2 = NULL;
847 const APK_DATA *ak = &keycheckdata[i];
848 const unsigned char *input = ak->kder;
849 size_t input_len = ak->size;
850 int expected_id = ak->evptype;
851 int expected_check = ak->check;
b0004708
PY
852 int expected_pub_check = ak->pub_check;
853 int expected_param_check = ak->param_check;
854 int type = ak->type;
855 BIO *pubkey = NULL;
2aee35d3
PY
856
857 p = input;
b0004708 858
35db366c
DMSP
859 switch (type) {
860 case 0:
861 if (!TEST_ptr(pkey = d2i_AutoPrivateKey(NULL, &p, input_len))
862 || !TEST_ptr_eq(p, input + input_len)
863 || !TEST_int_eq(EVP_PKEY_id(pkey), expected_id))
864 goto done;
865 break;
8a8bc665 866#ifndef OPENSSL_NO_EC
35db366c
DMSP
867 case 1:
868 if (!TEST_ptr(pubkey = BIO_new_mem_buf(input, input_len))
869 || !TEST_ptr(eckey = d2i_EC_PUBKEY_bio(pubkey, NULL))
870 || !TEST_ptr(pkey = EVP_PKEY_new())
871 || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
872 goto done;
873 break;
874 case 2:
875 if (!TEST_ptr(eckey = d2i_ECParameters(NULL, &p, input_len))
876 || !TEST_ptr_eq(p, input + input_len)
877 || !TEST_ptr(pkey = EVP_PKEY_new())
878 || !TEST_true(EVP_PKEY_assign_EC_KEY(pkey, eckey)))
879 goto done;
880 break;
8a8bc665 881#endif
35db366c
DMSP
882 default:
883 return 0;
884 }
2aee35d3
PY
885
886 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new(pkey, NULL)))
887 goto done;
888
b0004708
PY
889 if (!TEST_int_eq(EVP_PKEY_check(ctx), expected_check))
890 goto done;
891
892 if (!TEST_int_eq(EVP_PKEY_public_check(ctx), expected_pub_check))
893 goto done;
894
895 if (!TEST_int_eq(EVP_PKEY_param_check(ctx), expected_param_check))
896 goto done;
2aee35d3
PY
897
898 ctx2 = EVP_PKEY_CTX_new_id(0xdefaced, NULL);
899 /* assign the pkey directly, as an internal test */
900 EVP_PKEY_up_ref(pkey);
901 ctx2->pkey = pkey;
902
903 if (!TEST_int_eq(EVP_PKEY_check(ctx2), 0xbeef))
904 goto done;
905
b0004708
PY
906 if (!TEST_int_eq(EVP_PKEY_public_check(ctx2), 0xbeef))
907 goto done;
908
909 if (!TEST_int_eq(EVP_PKEY_param_check(ctx2), 0xbeef))
910 goto done;
911
2aee35d3
PY
912 ret = 1;
913
914 done:
915 EVP_PKEY_CTX_free(ctx);
916 EVP_PKEY_CTX_free(ctx2);
917 EVP_PKEY_free(pkey);
b0004708 918 BIO_free(pubkey);
2aee35d3
PY
919 return ret;
920}
921
10d5b415
MC
922static int test_HKDF(void)
923{
924 EVP_PKEY_CTX *pctx;
925 unsigned char out[20];
926 size_t outlen;
927 int i, ret = 0;
928 unsigned char salt[] = "0123456789";
929 unsigned char key[] = "012345678901234567890123456789";
930 unsigned char info[] = "infostring";
931 const unsigned char expected[] = {
932 0xe5, 0x07, 0x70, 0x7f, 0xc6, 0x78, 0xd6, 0x54, 0x32, 0x5f, 0x7e, 0xc5,
933 0x7b, 0x59, 0x3e, 0xd8, 0x03, 0x6b, 0xed, 0xca
934 };
935 size_t expectedlen = sizeof(expected);
936
937 if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)))
938 goto done;
939
940 /* We do this twice to test reuse of the EVP_PKEY_CTX */
941 for (i = 0; i < 2; i++) {
942 outlen = sizeof(out);
943 memset(out, 0, outlen);
944
945 if (!TEST_int_gt(EVP_PKEY_derive_init(pctx), 0)
946 || !TEST_int_gt(EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()), 0)
947 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt,
948 sizeof(salt) - 1), 0)
949 || !TEST_int_gt(EVP_PKEY_CTX_set1_hkdf_key(pctx, key,
950 sizeof(key) - 1), 0)
951 || !TEST_int_gt(EVP_PKEY_CTX_add1_hkdf_info(pctx, info,
952 sizeof(info) - 1), 0)
953 || !TEST_int_gt(EVP_PKEY_derive(pctx, out, &outlen), 0)
954 || !TEST_mem_eq(out, outlen, expected, expectedlen))
955 goto done;
956 }
957
958 ret = 1;
959
960 done:
961 EVP_PKEY_CTX_free(pctx);
962
963 return ret;
964}
965
ad887416 966int setup_tests(void)
71ea6b48 967{
adcd8e37
RS
968 ADD_TEST(test_EVP_DigestSignInit);
969 ADD_TEST(test_EVP_DigestVerifyInit);
2eb2b4f3 970 ADD_TEST(test_EVP_Enveloped);
ad887416 971 ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
a9880362 972#ifndef OPENSSL_NO_EC
adcd8e37 973 ADD_TEST(test_EVP_PKCS82PKEY);
ddb634fe
JL
974#endif
975#ifndef OPENSSL_NO_SM2
976 ADD_TEST(test_EVP_SM2);
a6c4cb84 977 ADD_TEST(test_EVP_SM2_verify);
a9880362 978#endif
bb5f281a 979 ADD_ALL_TESTS(test_set_get_raw_keys, OSSL_NELEM(keys));
2aee35d3
PY
980 custom_pmeth = EVP_PKEY_meth_new(0xdefaced, 0);
981 if (!TEST_ptr(custom_pmeth))
982 return 0;
983 EVP_PKEY_meth_set_check(custom_pmeth, pkey_custom_check);
b0004708
PY
984 EVP_PKEY_meth_set_public_check(custom_pmeth, pkey_custom_pub_check);
985 EVP_PKEY_meth_set_param_check(custom_pmeth, pkey_custom_param_check);
2aee35d3
PY
986 if (!TEST_int_eq(EVP_PKEY_meth_add0(custom_pmeth), 1))
987 return 0;
988 ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
10d5b415 989 ADD_TEST(test_HKDF);
ad887416 990 return 1;
71ea6b48 991}