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