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