xref: /openbsd-src/regress/lib/libcrypto/asn1/asn1x509.c (revision dd700d40f264aa1408518da930609d0112f171fa)
1*dd700d40Stb /* $OpenBSD: asn1x509.c,v 1.5 2023/08/11 22:50:44 tb Exp $ */
2f9c21f9aSjsing /*
3f9c21f9aSjsing  * Copyright (c) 2017 Joel Sing <jsing@openbsd.org>
4*dd700d40Stb  * Copyright (c) 2023 Theo Buehler <tb@openbsd.org>
5f9c21f9aSjsing  *
6f9c21f9aSjsing  * Permission to use, copy, modify, and distribute this software for any
7f9c21f9aSjsing  * purpose with or without fee is hereby granted, provided that the above
8f9c21f9aSjsing  * copyright notice and this permission notice appear in all copies.
9f9c21f9aSjsing  *
10f9c21f9aSjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11f9c21f9aSjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12f9c21f9aSjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13f9c21f9aSjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14f9c21f9aSjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15f9c21f9aSjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16f9c21f9aSjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f9c21f9aSjsing  */
18f9c21f9aSjsing 
19f9c21f9aSjsing #include <err.h>
20f9c21f9aSjsing #include <string.h>
21f9c21f9aSjsing 
22f9c21f9aSjsing #include <openssl/asn1.h>
23f9c21f9aSjsing #include <openssl/bio.h>
24f9c21f9aSjsing #include <openssl/bn.h>
25f9c21f9aSjsing #include <openssl/dsa.h>
26f9c21f9aSjsing #include <openssl/ec.h>
27f9c21f9aSjsing #include <openssl/err.h>
28f9c21f9aSjsing #include <openssl/pem.h>
29f9c21f9aSjsing #include <openssl/rsa.h>
30f9c21f9aSjsing #include <openssl/x509.h>
31f9c21f9aSjsing 
320a470f08Stb const char *dsa_test_key =
330a470f08Stb     "-----BEGIN DSA PRIVATE KEY-----\n"
340a470f08Stb     "MIH5AgEAAkEAt+CNNryEe8t2SkjuP0azjOKjSMXsw3GzjLS5c+vFLQKs0zIuPp8F\n"
350a470f08Stb     "I/z5t8vcNt/D8EyzQZWxgCfoasHqDOJvRwIVAKrJMyIMt9iJtaS31cyIJmIDVlZX\n"
360a470f08Stb     "AkEAs1/Uy+x0+1C1n7V3eJxuBdO/LUalbrZM5PfcwDshf9kcQNLsRu5zTZkU0OX/\n"
370a470f08Stb     "8xANz+ue2o6LON2sTAtuEfSM1QJBAIDRt0rQGGrFCRJ4O39Iqlf27yIO6Gq1ppbE\n"
380a470f08Stb     "Wvsvz4YSIZsG02vlBlzVIhULftNnkpN59MFtIjx8RsbEQ4YTnSICFDXPf/UIRvdH\n"
390a470f08Stb     "20NV++tnUZYUAXM+\n"
40f9c21f9aSjsing     "-----END DSA PRIVATE KEY-----\n";
41f9c21f9aSjsing 
42f9c21f9aSjsing unsigned char dsa_test_asn1_pubkey[] = {
43f9c21f9aSjsing 	0x30, 0x81, 0xf2, 0x30, 0x81, 0xa9, 0x06, 0x07,
44f9c21f9aSjsing 	0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01, 0x30,
45f9c21f9aSjsing 	0x81, 0x9d, 0x02, 0x41, 0x00, 0xb7, 0xe0, 0x8d,
46f9c21f9aSjsing 	0x36, 0xbc, 0x84, 0x7b, 0xcb, 0x76, 0x4a, 0x48,
47f9c21f9aSjsing 	0xee, 0x3f, 0x46, 0xb3, 0x8c, 0xe2, 0xa3, 0x48,
48f9c21f9aSjsing 	0xc5, 0xec, 0xc3, 0x71, 0xb3, 0x8c, 0xb4, 0xb9,
49f9c21f9aSjsing 	0x73, 0xeb, 0xc5, 0x2d, 0x02, 0xac, 0xd3, 0x32,
50f9c21f9aSjsing 	0x2e, 0x3e, 0x9f, 0x05, 0x23, 0xfc, 0xf9, 0xb7,
51f9c21f9aSjsing 	0xcb, 0xdc, 0x36, 0xdf, 0xc3, 0xf0, 0x4c, 0xb3,
52f9c21f9aSjsing 	0x41, 0x95, 0xb1, 0x80, 0x27, 0xe8, 0x6a, 0xc1,
53f9c21f9aSjsing 	0xea, 0x0c, 0xe2, 0x6f, 0x47, 0x02, 0x15, 0x00,
54f9c21f9aSjsing 	0xaa, 0xc9, 0x33, 0x22, 0x0c, 0xb7, 0xd8, 0x89,
55f9c21f9aSjsing 	0xb5, 0xa4, 0xb7, 0xd5, 0xcc, 0x88, 0x26, 0x62,
56f9c21f9aSjsing 	0x03, 0x56, 0x56, 0x57, 0x02, 0x41, 0x00, 0xb3,
57f9c21f9aSjsing 	0x5f, 0xd4, 0xcb, 0xec, 0x74, 0xfb, 0x50, 0xb5,
58f9c21f9aSjsing 	0x9f, 0xb5, 0x77, 0x78, 0x9c, 0x6e, 0x05, 0xd3,
59f9c21f9aSjsing 	0xbf, 0x2d, 0x46, 0xa5, 0x6e, 0xb6, 0x4c, 0xe4,
60f9c21f9aSjsing 	0xf7, 0xdc, 0xc0, 0x3b, 0x21, 0x7f, 0xd9, 0x1c,
61f9c21f9aSjsing 	0x40, 0xd2, 0xec, 0x46, 0xee, 0x73, 0x4d, 0x99,
62f9c21f9aSjsing 	0x14, 0xd0, 0xe5, 0xff, 0xf3, 0x10, 0x0d, 0xcf,
63f9c21f9aSjsing 	0xeb, 0x9e, 0xda, 0x8e, 0x8b, 0x38, 0xdd, 0xac,
64f9c21f9aSjsing 	0x4c, 0x0b, 0x6e, 0x11, 0xf4, 0x8c, 0xd5, 0x03,
65f9c21f9aSjsing 	0x44, 0x00, 0x02, 0x41, 0x00, 0x80, 0xd1, 0xb7,
66f9c21f9aSjsing 	0x4a, 0xd0, 0x18, 0x6a, 0xc5, 0x09, 0x12, 0x78,
67f9c21f9aSjsing 	0x3b, 0x7f, 0x48, 0xaa, 0x57, 0xf6, 0xef, 0x22,
68f9c21f9aSjsing 	0x0e, 0xe8, 0x6a, 0xb5, 0xa6, 0x96, 0xc4, 0x5a,
69f9c21f9aSjsing 	0xfb, 0x2f, 0xcf, 0x86, 0x12, 0x21, 0x9b, 0x06,
70f9c21f9aSjsing 	0xd3, 0x6b, 0xe5, 0x06, 0x5c, 0xd5, 0x22, 0x15,
71f9c21f9aSjsing 	0x0b, 0x7e, 0xd3, 0x67, 0x92, 0x93, 0x79, 0xf4,
72f9c21f9aSjsing 	0xc1, 0x6d, 0x22, 0x3c, 0x7c, 0x46, 0xc6, 0xc4,
73f9c21f9aSjsing 	0x43, 0x86, 0x13, 0x9d, 0x22,
74f9c21f9aSjsing };
75f9c21f9aSjsing 
76*dd700d40Stb const unsigned char dsa_test_asn1_pubkey_noparams[] = {
77*dd700d40Stb 	0x30, 0x51, 0x30, 0x09, 0x06, 0x07, 0x2a, 0x86,
78*dd700d40Stb 	0x48, 0xce, 0x38, 0x04, 0x01, 0x03, 0x44, 0x00,
79*dd700d40Stb 	0x02, 0x41, 0x00, 0x80, 0xd1, 0xb7, 0x4a, 0xd0,
80*dd700d40Stb 	0x18, 0x6a, 0xc5, 0x09, 0x12, 0x78, 0x3b, 0x7f,
81*dd700d40Stb 	0x48, 0xaa, 0x57, 0xf6, 0xef, 0x22, 0x0e, 0xe8,
82*dd700d40Stb 	0x6a, 0xb5, 0xa6, 0x96, 0xc4, 0x5a, 0xfb, 0x2f,
83*dd700d40Stb 	0xcf, 0x86, 0x12, 0x21, 0x9b, 0x06, 0xd3, 0x6b,
84*dd700d40Stb 	0xe5, 0x06, 0x5c, 0xd5, 0x22, 0x15, 0x0b, 0x7e,
85*dd700d40Stb 	0xd3, 0x67, 0x92, 0x93, 0x79, 0xf4, 0xc1, 0x6d,
86*dd700d40Stb 	0x22, 0x3c, 0x7c, 0x46, 0xc6, 0xc4, 0x43, 0x86,
87*dd700d40Stb 	0x13, 0x9d, 0x22,
88*dd700d40Stb };
89*dd700d40Stb 
900a470f08Stb const char *ec_test_key =
910a470f08Stb     "-----BEGIN EC PRIVATE KEY-----\n"
920a470f08Stb     "MHcCAQEEIEDkF84aPdBNu4vbPE+QV3EP9ULp4Enr1N0lz4vzuc2boAoGCCqGSM49\n"
930a470f08Stb     "AwEHoUQDQgAEUQGHBjYwbfHvI3QqdDy8ftNU5UvQqh6TH6upIrtz4CVccxnWO2+s\n"
940a470f08Stb     "qSMOu1z5KnGIOVf2kLQ2S2iMahyFMezr8g==\n"
95f9c21f9aSjsing     "-----END EC PRIVATE KEY-----\n";
96f9c21f9aSjsing 
97f9c21f9aSjsing unsigned char ec_test_asn1_pubkey[] = {
98f9c21f9aSjsing 	0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86,
99f9c21f9aSjsing 	0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
100f9c21f9aSjsing 	0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
101f9c21f9aSjsing 	0x42, 0x00, 0x04, 0x51, 0x01, 0x87, 0x06, 0x36,
102f9c21f9aSjsing 	0x30, 0x6d, 0xf1, 0xef, 0x23, 0x74, 0x2a, 0x74,
103f9c21f9aSjsing 	0x3c, 0xbc, 0x7e, 0xd3, 0x54, 0xe5, 0x4b, 0xd0,
104f9c21f9aSjsing 	0xaa, 0x1e, 0x93, 0x1f, 0xab, 0xa9, 0x22, 0xbb,
105f9c21f9aSjsing 	0x73, 0xe0, 0x25, 0x5c, 0x73, 0x19, 0xd6, 0x3b,
106f9c21f9aSjsing 	0x6f, 0xac, 0xa9, 0x23, 0x0e, 0xbb, 0x5c, 0xf9,
107f9c21f9aSjsing 	0x2a, 0x71, 0x88, 0x39, 0x57, 0xf6, 0x90, 0xb4,
108f9c21f9aSjsing 	0x36, 0x4b, 0x68, 0x8c, 0x6a, 0x1c, 0x85, 0x31,
109f9c21f9aSjsing 	0xec, 0xeb, 0xf2,
110f9c21f9aSjsing };
111f9c21f9aSjsing 
1120a470f08Stb const char *rsa_test_key =
1130a470f08Stb     "-----BEGIN PRIVATE KEY-----\n"
1140a470f08Stb     "MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA4Fs6ljFFQw/ElDf5\n"
1150a470f08Stb     "LTghVw972PVpQuKPQvwb1cWbV3+7W5sXOcoM/RvwzO7WeppkeltVCBoKaQd+9e2Z\n"
1160a470f08Stb     "BHtYhwIDAQABAkEAhWv7dWIrrGvuHa8D0i51NU8R+b5IMOyHAfDnpMN1VByWcBdb\n"
1170a470f08Stb     "G7ZJsEYlO1Tbx1zFQOVyrDUY2hn0YttPjWys0QIhAP9+FRhHCYye/EY14zSa+lxb\n"
1180a470f08Stb     "ljOPjWgddMdJBcPOVNUNAiEA4M1QUtIcTnTnfvcxvEBIhbmSR8fRvZYAeT5EoTKM\n"
1190a470f08Stb     "puMCIQD9898X8JRHWEg9qZabVWiBoO+ddJUD5jOLWsQGKvMbiQIgBOQyxTqRJxvg\n"
1200a470f08Stb     "FaEnUeNMMKyzBCDS7X8gD4NNVvyUluUCIQC/lnO9xYi6S4BFMwHFEUY0jLr5vgsR\n"
1210a470f08Stb     "+esRU9dLkMqt+w==\n"
122f9c21f9aSjsing     "-----END PRIVATE KEY-----\n";
123f9c21f9aSjsing 
124f9c21f9aSjsing unsigned char rsa_test_asn1_pubkey[] = {
125f9c21f9aSjsing 	0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
126f9c21f9aSjsing 	0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
127f9c21f9aSjsing 	0x00, 0x03, 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41,
128f9c21f9aSjsing 	0x00, 0xe0, 0x5b, 0x3a, 0x96, 0x31, 0x45, 0x43,
129f9c21f9aSjsing 	0x0f, 0xc4, 0x94, 0x37, 0xf9, 0x2d, 0x38, 0x21,
130f9c21f9aSjsing 	0x57, 0x0f, 0x7b, 0xd8, 0xf5, 0x69, 0x42, 0xe2,
131f9c21f9aSjsing 	0x8f, 0x42, 0xfc, 0x1b, 0xd5, 0xc5, 0x9b, 0x57,
132f9c21f9aSjsing 	0x7f, 0xbb, 0x5b, 0x9b, 0x17, 0x39, 0xca, 0x0c,
133f9c21f9aSjsing 	0xfd, 0x1b, 0xf0, 0xcc, 0xee, 0xd6, 0x7a, 0x9a,
134f9c21f9aSjsing 	0x64, 0x7a, 0x5b, 0x55, 0x08, 0x1a, 0x0a, 0x69,
135f9c21f9aSjsing 	0x07, 0x7e, 0xf5, 0xed, 0x99, 0x04, 0x7b, 0x58,
136f9c21f9aSjsing 	0x87, 0x02, 0x03, 0x01, 0x00, 0x01,
137f9c21f9aSjsing };
138f9c21f9aSjsing 
139*dd700d40Stb const char dh_test_key[] =
140*dd700d40Stb 	"-----BEGIN PRIVATE KEY-----\n"
141*dd700d40Stb 	"MIICJgIBADCCARcGCSqGSIb3DQEDATCCAQgCggEBAIXmHiRswMxVCnVzq4GuaErl\n"
142*dd700d40Stb 	"2fBPDquOzFaxd/YSN7tVxnz3wcMNfBsHZWqtAXxTBWeyt8ydHcrIWx4EB3XTSwSi\n"
143*dd700d40Stb 	"Jqh3CEcFhDfqKdo/u7vffxG+43lEsvZZIzZHYMcYsHIpcERRoAu0xnqjHUQTkvoi\n"
144*dd700d40Stb 	"w7ukbuWr28bJrncPaxFGC8zZvLhSnUst5yzdyAsIddQvHgYBdCn2UEbz6qBx8gvJ\n"
145*dd700d40Stb 	"lb3Jv1BiVJJ0odL94vpNXRGNZ57PPm5Xlj/n8l8LHpzzxbtjc52MVYbMPpVuWzmv\n"
146*dd700d40Stb 	"2nWV0eL14708S/XG6e2AWGKb8AX8hCitdtVQ28SbEsf8Yd1dyWNo++oedFvU49sC\n"
147*dd700d40Stb 	"AQIEggEEAoIBAGywTP/vBwEeuWIgTPnBf1/jWQgfFA5no3HdRIQsHVgo2EEZHErS\n"
148*dd700d40Stb 	"X82hALavaUTEu+pHu+/yv3BLPr/8Lau6O7LOiqeXMjYX4HtSNmLZIEjugd1aCyCp\n"
149*dd700d40Stb 	"n+jZjIHQCG0fvnwWFqkKTADe4n4DUz5qxuHYmlFY4NsdMj5yARAh9mn7hqwYX+Mf\n"
150*dd700d40Stb 	"WhHLhHIHngXKNs7vKdHH/guo638uL6dv6OuTS0wbBsjLMFvQvccVlVUWlUFkH6I8\n"
151*dd700d40Stb 	"GFt8kAFLdrzz8+oMq3hHsoWIrDSp0GYq6keSu3pBj4q2mTP7ugUU8ag/dZnga5sB\n"
152*dd700d40Stb 	"Mdt2hicktiw/mQZP578plm6z2Lg0gl5yLxk=\n"
153*dd700d40Stb 	"-----END PRIVATE KEY-----\n";
154*dd700d40Stb 
155*dd700d40Stb const unsigned char dh_test_asn1_pubkey[] = {
156*dd700d40Stb 	0x30, 0x82, 0x02, 0x24, 0x30, 0x82, 0x01, 0x17,
157*dd700d40Stb 	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
158*dd700d40Stb 	0x01, 0x03, 0x01, 0x30, 0x82, 0x01, 0x08, 0x02,
159*dd700d40Stb 	0x82, 0x01, 0x01, 0x00, 0x85, 0xe6, 0x1e, 0x24,
160*dd700d40Stb 	0x6c, 0xc0, 0xcc, 0x55, 0x0a, 0x75, 0x73, 0xab,
161*dd700d40Stb 	0x81, 0xae, 0x68, 0x4a, 0xe5, 0xd9, 0xf0, 0x4f,
162*dd700d40Stb 	0x0e, 0xab, 0x8e, 0xcc, 0x56, 0xb1, 0x77, 0xf6,
163*dd700d40Stb 	0x12, 0x37, 0xbb, 0x55, 0xc6, 0x7c, 0xf7, 0xc1,
164*dd700d40Stb 	0xc3, 0x0d, 0x7c, 0x1b, 0x07, 0x65, 0x6a, 0xad,
165*dd700d40Stb 	0x01, 0x7c, 0x53, 0x05, 0x67, 0xb2, 0xb7, 0xcc,
166*dd700d40Stb 	0x9d, 0x1d, 0xca, 0xc8, 0x5b, 0x1e, 0x04, 0x07,
167*dd700d40Stb 	0x75, 0xd3, 0x4b, 0x04, 0xa2, 0x26, 0xa8, 0x77,
168*dd700d40Stb 	0x08, 0x47, 0x05, 0x84, 0x37, 0xea, 0x29, 0xda,
169*dd700d40Stb 	0x3f, 0xbb, 0xbb, 0xdf, 0x7f, 0x11, 0xbe, 0xe3,
170*dd700d40Stb 	0x79, 0x44, 0xb2, 0xf6, 0x59, 0x23, 0x36, 0x47,
171*dd700d40Stb 	0x60, 0xc7, 0x18, 0xb0, 0x72, 0x29, 0x70, 0x44,
172*dd700d40Stb 	0x51, 0xa0, 0x0b, 0xb4, 0xc6, 0x7a, 0xa3, 0x1d,
173*dd700d40Stb 	0x44, 0x13, 0x92, 0xfa, 0x22, 0xc3, 0xbb, 0xa4,
174*dd700d40Stb 	0x6e, 0xe5, 0xab, 0xdb, 0xc6, 0xc9, 0xae, 0x77,
175*dd700d40Stb 	0x0f, 0x6b, 0x11, 0x46, 0x0b, 0xcc, 0xd9, 0xbc,
176*dd700d40Stb 	0xb8, 0x52, 0x9d, 0x4b, 0x2d, 0xe7, 0x2c, 0xdd,
177*dd700d40Stb 	0xc8, 0x0b, 0x08, 0x75, 0xd4, 0x2f, 0x1e, 0x06,
178*dd700d40Stb 	0x01, 0x74, 0x29, 0xf6, 0x50, 0x46, 0xf3, 0xea,
179*dd700d40Stb 	0xa0, 0x71, 0xf2, 0x0b, 0xc9, 0x95, 0xbd, 0xc9,
180*dd700d40Stb 	0xbf, 0x50, 0x62, 0x54, 0x92, 0x74, 0xa1, 0xd2,
181*dd700d40Stb 	0xfd, 0xe2, 0xfa, 0x4d, 0x5d, 0x11, 0x8d, 0x67,
182*dd700d40Stb 	0x9e, 0xcf, 0x3e, 0x6e, 0x57, 0x96, 0x3f, 0xe7,
183*dd700d40Stb 	0xf2, 0x5f, 0x0b, 0x1e, 0x9c, 0xf3, 0xc5, 0xbb,
184*dd700d40Stb 	0x63, 0x73, 0x9d, 0x8c, 0x55, 0x86, 0xcc, 0x3e,
185*dd700d40Stb 	0x95, 0x6e, 0x5b, 0x39, 0xaf, 0xda, 0x75, 0x95,
186*dd700d40Stb 	0xd1, 0xe2, 0xf5, 0xe3, 0xbd, 0x3c, 0x4b, 0xf5,
187*dd700d40Stb 	0xc6, 0xe9, 0xed, 0x80, 0x58, 0x62, 0x9b, 0xf0,
188*dd700d40Stb 	0x05, 0xfc, 0x84, 0x28, 0xad, 0x76, 0xd5, 0x50,
189*dd700d40Stb 	0xdb, 0xc4, 0x9b, 0x12, 0xc7, 0xfc, 0x61, 0xdd,
190*dd700d40Stb 	0x5d, 0xc9, 0x63, 0x68, 0xfb, 0xea, 0x1e, 0x74,
191*dd700d40Stb 	0x5b, 0xd4, 0xe3, 0xdb, 0x02, 0x01, 0x02, 0x03,
192*dd700d40Stb 	0x82, 0x01, 0x05, 0x00, 0x02, 0x82, 0x01, 0x00,
193*dd700d40Stb 	0x44, 0x30, 0x25, 0xe2, 0xeb, 0x8f, 0xd0, 0x81,
194*dd700d40Stb 	0x96, 0x3e, 0x7d, 0x1d, 0x9b, 0x82, 0x8a, 0x2d,
195*dd700d40Stb 	0x0f, 0xb3, 0x2d, 0x9c, 0x2b, 0xb2, 0x88, 0xda,
196*dd700d40Stb 	0xc6, 0xef, 0x6c, 0x9d, 0x1c, 0x80, 0xf1, 0xee,
197*dd700d40Stb 	0x9d, 0x6b, 0x31, 0xb7, 0xb1, 0x9f, 0x30, 0x0d,
198*dd700d40Stb 	0xb7, 0x92, 0xcf, 0x56, 0xeb, 0xfc, 0x91, 0x16,
199*dd700d40Stb 	0x35, 0x96, 0x0c, 0x7b, 0x95, 0xbc, 0x65, 0x66,
200*dd700d40Stb 	0x10, 0x81, 0x4b, 0x46, 0x04, 0xee, 0x95, 0xca,
201*dd700d40Stb 	0xc9, 0x0c, 0xea, 0xc1, 0xd7, 0x3b, 0x83, 0xfb,
202*dd700d40Stb 	0xce, 0x76, 0x17, 0xb4, 0x15, 0xad, 0x03, 0xd0,
203*dd700d40Stb 	0x00, 0xef, 0xb2, 0xee, 0x12, 0x3f, 0x75, 0xd1,
204*dd700d40Stb 	0xb8, 0x6c, 0xfd, 0x87, 0xb5, 0x07, 0xfa, 0x1e,
205*dd700d40Stb 	0x60, 0x9b, 0x49, 0x6f, 0x89, 0xc2, 0x75, 0x4d,
206*dd700d40Stb 	0x7d, 0x21, 0xdb, 0xb6, 0x85, 0x78, 0xa5, 0x77,
207*dd700d40Stb 	0xbe, 0xeb, 0x4d, 0x9e, 0x1c, 0x05, 0xbc, 0x51,
208*dd700d40Stb 	0x97, 0x0f, 0xe9, 0x68, 0x78, 0x5a, 0xc8, 0x4e,
209*dd700d40Stb 	0xef, 0x72, 0x8f, 0x53, 0x41, 0x0d, 0x57, 0xf2,
210*dd700d40Stb 	0xc5, 0x29, 0x33, 0x67, 0xdd, 0x35, 0x43, 0xfc,
211*dd700d40Stb 	0x13, 0x49, 0x92, 0x1d, 0x14, 0x92, 0x40, 0x14,
212*dd700d40Stb 	0x38, 0x32, 0xdb, 0x14, 0x95, 0x44, 0x2a, 0x03,
213*dd700d40Stb 	0xb7, 0x87, 0xa3, 0x5a, 0x5a, 0xe2, 0x3b, 0xc5,
214*dd700d40Stb 	0x44, 0xa4, 0x06, 0xf6, 0x14, 0xe6, 0x08, 0x9c,
215*dd700d40Stb 	0x51, 0x09, 0x2a, 0xc4, 0x2e, 0x72, 0xb3, 0x20,
216*dd700d40Stb 	0x46, 0x77, 0xe2, 0xda, 0x07, 0xd8, 0x10, 0x89,
217*dd700d40Stb 	0xcf, 0x2b, 0xef, 0x67, 0xa2, 0x48, 0xfd, 0xa3,
218*dd700d40Stb 	0x71, 0x59, 0xf0, 0x89, 0x3a, 0x35, 0x31, 0x87,
219*dd700d40Stb 	0xad, 0x45, 0x9e, 0x35, 0xbd, 0x64, 0xec, 0xd1,
220*dd700d40Stb 	0xd7, 0xea, 0x92, 0xed, 0x72, 0x9c, 0x81, 0x8e,
221*dd700d40Stb 	0x11, 0x4e, 0xa5, 0xe7, 0x12, 0xe3, 0x7c, 0x53,
222*dd700d40Stb 	0x2b, 0x31, 0xd4, 0x3d, 0xd5, 0xd9, 0xbd, 0x44,
223*dd700d40Stb 	0x27, 0xa3, 0x4a, 0x3f, 0x20, 0x87, 0xce, 0x73,
224*dd700d40Stb 	0x0e, 0xa8, 0x90, 0xcd, 0xfe, 0x32, 0x69, 0x9a,
225*dd700d40Stb };
226*dd700d40Stb 
227f9c21f9aSjsing static void
hexdump(const unsigned char * buf,size_t len)228f9c21f9aSjsing hexdump(const unsigned char *buf, size_t len)
229f9c21f9aSjsing {
230f9c21f9aSjsing 	size_t i;
231f9c21f9aSjsing 
232f9c21f9aSjsing 	for (i = 1; i <= len; i++)
233f9c21f9aSjsing 		fprintf(stderr, " 0x%02hhx,%s", buf[i - 1], i % 8 ? "" : "\n");
234f9c21f9aSjsing 
235f9c21f9aSjsing 	fprintf(stderr, "\n");
236f9c21f9aSjsing }
237f9c21f9aSjsing 
238f9c21f9aSjsing static int
compare_data(const char * label,const unsigned char * d1,size_t d1_len,const unsigned char * d2,size_t d2_len)239f9c21f9aSjsing compare_data(const char *label, const unsigned char *d1, size_t d1_len,
240f9c21f9aSjsing     const unsigned char *d2, size_t d2_len)
241f9c21f9aSjsing {
242f9c21f9aSjsing 	if (d1_len != d2_len) {
243f9c21f9aSjsing 		fprintf(stderr, "FAIL: got %s with length %zu, want %zu\n",
244f9c21f9aSjsing 		    label, d1_len, d2_len);
245f9c21f9aSjsing 		return -1;
246f9c21f9aSjsing 	}
247f9c21f9aSjsing 	if (memcmp(d1, d2, d1_len) != 0) {
248f9c21f9aSjsing 		fprintf(stderr, "FAIL: %s differs\n", label);
249f9c21f9aSjsing 		fprintf(stderr, "got:\n");
250f9c21f9aSjsing 		hexdump(d1, d1_len);
251f9c21f9aSjsing 		fprintf(stderr, "want:\n");
252f9c21f9aSjsing 		hexdump(d2, d2_len);
253f9c21f9aSjsing 		return -1;
254f9c21f9aSjsing 	}
255f9c21f9aSjsing 	return 0;
256f9c21f9aSjsing }
257f9c21f9aSjsing 
258f9c21f9aSjsing static int
dh_pubkey_test(void)259*dd700d40Stb dh_pubkey_test(void)
260*dd700d40Stb {
261*dd700d40Stb 	EVP_PKEY *pkey = NULL;
262*dd700d40Stb 	EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
263*dd700d40Stb 	unsigned char *out = NULL, *data = NULL;
264*dd700d40Stb 	DH *dh_a = NULL, *dh_b = NULL;
265*dd700d40Stb 	const unsigned char *p;
266*dd700d40Stb 	BIO *bio_mem = NULL;
267*dd700d40Stb 	int failure = 1;
268*dd700d40Stb 	int len;
269*dd700d40Stb 
270*dd700d40Stb 	ERR_clear_error();
271*dd700d40Stb 
272*dd700d40Stb 	if ((bio_mem = BIO_new_mem_buf(dh_test_key, -1)) == NULL)
273*dd700d40Stb 		errx(1, "failed to create BIO");
274*dd700d40Stb 
275*dd700d40Stb 	if ((pkey = PEM_read_bio_PrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
276*dd700d40Stb 		ERR_print_errors_fp(stderr);
277*dd700d40Stb 		errx(1, "failed to decode DH key from PEM");
278*dd700d40Stb 	}
279*dd700d40Stb 
280*dd700d40Stb 	/*
281*dd700d40Stb 	 * Test PEM_write_bio_PrivateKey().
282*dd700d40Stb 	 */
283*dd700d40Stb 	BIO_free_all(bio_mem);
284*dd700d40Stb 	if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
285*dd700d40Stb                 errx(1, "BIO_new failed for BIO_s_mem");
286*dd700d40Stb 
287*dd700d40Stb 	if (!PEM_write_bio_PrivateKey(bio_mem, pkey, NULL, NULL, 0, 0, NULL)) {
288*dd700d40Stb 		fprintf(stderr, "FAIL: PEM_write_bio_PrivateKey failed\n");
289*dd700d40Stb 		goto done;
290*dd700d40Stb 	}
291*dd700d40Stb 
292*dd700d40Stb 	len = BIO_get_mem_data(bio_mem, &data);
293*dd700d40Stb 	if (compare_data("DH PrivateKey", data, len,
294*dd700d40Stb 	    dh_test_key, sizeof(dh_test_key) - 1) == -1)
295*dd700d40Stb 		goto done;
296*dd700d40Stb 
297*dd700d40Stb 	/*
298*dd700d40Stb 	 * Test i2d_PUBKEY/d2i_PUBKEY.
299*dd700d40Stb 	 */
300*dd700d40Stb 
301*dd700d40Stb 	if ((dh_a = EVP_PKEY_get1_DH(pkey)) == NULL) {
302*dd700d40Stb 		ERR_print_errors_fp(stderr);
303*dd700d40Stb 		errx(1, "failed to get1 DH key from PEM");
304*dd700d40Stb 	}
305*dd700d40Stb 
306*dd700d40Stb 	if ((pkey_a = EVP_PKEY_new()) == NULL)
307*dd700d40Stb 		errx(1, "failed to create EVP_PKEY");
308*dd700d40Stb 	if (!EVP_PKEY_set1_DH(pkey_a, dh_a))
309*dd700d40Stb 		errx(1, "failed to set DH on EVP_PKEY");
310*dd700d40Stb 
311*dd700d40Stb 	if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
312*dd700d40Stb 		fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
313*dd700d40Stb 		goto done;
314*dd700d40Stb 	}
315*dd700d40Stb 	if (compare_data("DH PUBKEY", out, len, dh_test_asn1_pubkey,
316*dd700d40Stb 	    sizeof(dh_test_asn1_pubkey)) == -1)
317*dd700d40Stb 		goto done;
318*dd700d40Stb 
319*dd700d40Stb 	p = out;
320*dd700d40Stb 	if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
321*dd700d40Stb 		fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
322*dd700d40Stb 		goto done;
323*dd700d40Stb 	}
324*dd700d40Stb 
325*dd700d40Stb 	if (BN_cmp(DH_get0_pub_key(EVP_PKEY_get0_DH(pkey_a)),
326*dd700d40Stb 	    DH_get0_pub_key(EVP_PKEY_get0_DH(pkey_b))) != 0) {
327*dd700d40Stb 		fprintf(stderr, "FAIL: DH public keys mismatch\n");
328*dd700d40Stb 		goto done;
329*dd700d40Stb 	}
330*dd700d40Stb 
331*dd700d40Stb 	failure = 0;
332*dd700d40Stb 
333*dd700d40Stb  done:
334*dd700d40Stb 	BIO_free_all(bio_mem);
335*dd700d40Stb 	EVP_PKEY_free(pkey);
336*dd700d40Stb 	DH_free(dh_a);
337*dd700d40Stb 	DH_free(dh_b);
338*dd700d40Stb 	EVP_PKEY_free(pkey_a);
339*dd700d40Stb 	EVP_PKEY_free(pkey_b);
340*dd700d40Stb 	free(out);
341*dd700d40Stb 
342*dd700d40Stb 	return failure;
343*dd700d40Stb }
344*dd700d40Stb 
345*dd700d40Stb static int
dsa_pubkey_test(void)346f9c21f9aSjsing dsa_pubkey_test(void)
347f9c21f9aSjsing {
348f9c21f9aSjsing 	EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
349f9c21f9aSjsing 	unsigned char *out = NULL, *data = NULL;
350f9c21f9aSjsing 	DSA *dsa_a = NULL, *dsa_b = NULL;
351f9c21f9aSjsing 	const unsigned char *p;
352f9c21f9aSjsing 	BIO *bio_mem = NULL;
353f9c21f9aSjsing 	int failure = 1;
354*dd700d40Stb 	int len, ret;
355f9c21f9aSjsing 
356fb228d6dSjsing 	ERR_clear_error();
357fb228d6dSjsing 
358f9c21f9aSjsing 	if ((bio_mem = BIO_new_mem_buf((void *)dsa_test_key, -1)) == NULL)
359f9c21f9aSjsing 		errx(1, "failed to create BIO");
360f9c21f9aSjsing 
361f9c21f9aSjsing 	if ((dsa_a = PEM_read_bio_DSAPrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
362f9c21f9aSjsing 		ERR_print_errors_fp(stderr);
363f9c21f9aSjsing 		errx(1, "failed to decode DSA key from PEM");
364f9c21f9aSjsing 	}
365f9c21f9aSjsing 
366f9c21f9aSjsing 	/*
367f9c21f9aSjsing 	 * Test i2d_PUBKEY/d2i_PUBKEY.
368f9c21f9aSjsing 	 */
369f9c21f9aSjsing 	if ((pkey_a = EVP_PKEY_new()) == NULL)
370f9c21f9aSjsing 		errx(1, "failed to create EVP_PKEY");
371f9c21f9aSjsing 	if (!EVP_PKEY_set1_DSA(pkey_a, dsa_a))
372f9c21f9aSjsing 		errx(1, "failed to set DSA on EVP_PKEY");
373f9c21f9aSjsing 
374f9c21f9aSjsing 	if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
375f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
376f9c21f9aSjsing 		goto done;
377f9c21f9aSjsing 	}
378f9c21f9aSjsing 	if (compare_data("DSA PUBKEY", out, len, dsa_test_asn1_pubkey,
379f9c21f9aSjsing 	    sizeof(dsa_test_asn1_pubkey)) == -1)
380f9c21f9aSjsing 		goto done;
381f9c21f9aSjsing 
382f9c21f9aSjsing 	p = out;
383f9c21f9aSjsing 	if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
384f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
385f9c21f9aSjsing 		goto done;
386f9c21f9aSjsing 	}
387f9c21f9aSjsing 
388e292ee02Stb 	if (BN_cmp(DSA_get0_pub_key(EVP_PKEY_get0_DSA(pkey_a)),
389e292ee02Stb 	    DSA_get0_pub_key(EVP_PKEY_get0_DSA(pkey_b))) != 0) {
390f9c21f9aSjsing 		fprintf(stderr, "FAIL: DSA public keys mismatch\n");
391f9c21f9aSjsing 		goto done;
392f9c21f9aSjsing 	}
393f9c21f9aSjsing 
394*dd700d40Stb 	if (EVP_PKEY_missing_parameters(pkey_b)) {
395*dd700d40Stb 		fprintf(stderr, "FAIL: DSA pkey_b has missing parameters\n");
396*dd700d40Stb 		goto done;
397*dd700d40Stb 	}
398*dd700d40Stb 
399*dd700d40Stb 	if (!EVP_PKEY_cmp_parameters(pkey_a, pkey_b)) {
400*dd700d40Stb 		fprintf(stderr, "FAIL: DSA parameters mismatch\n");
401*dd700d40Stb 		goto done;
402*dd700d40Stb 	}
403*dd700d40Stb 
404*dd700d40Stb 	/*
405*dd700d40Stb 	 * Check save_parameters defaults - EVP_PKEY_save_parameters() returns
406*dd700d40Stb 	 * the current save_parameters; mode -1 inspects without setting.
407*dd700d40Stb 	 */
408*dd700d40Stb 	if ((ret = EVP_PKEY_save_parameters(pkey_b, 0)) != 1) {
409*dd700d40Stb 		fprintf(stderr, "FAIL: DSA save_parameters want 1, got %d\n", ret);
410*dd700d40Stb 		goto done;
411*dd700d40Stb 	}
412*dd700d40Stb 	if ((ret = EVP_PKEY_save_parameters(pkey_b, -1)) != 0) {
413*dd700d40Stb 		fprintf(stderr, "FAIL: DSA save_parameters want 0, got %d\n", ret);
414*dd700d40Stb 		goto done;
415*dd700d40Stb 	}
416*dd700d40Stb 
417*dd700d40Stb 	free(out);
418*dd700d40Stb 	out = NULL;
419*dd700d40Stb 
420*dd700d40Stb 	if ((len = i2d_PUBKEY(pkey_b, &out)) < 0) {
421*dd700d40Stb 		fprintf(stderr, "FAIL: i2d_PUBKEY (no params) failed\n");
422*dd700d40Stb 		goto done;
423*dd700d40Stb 	}
424*dd700d40Stb 
425*dd700d40Stb 	if (compare_data("PUBKEY (no params)", dsa_test_asn1_pubkey_noparams,
426*dd700d40Stb 	    sizeof(dsa_test_asn1_pubkey_noparams), out, len) == -1)
427*dd700d40Stb 		goto done;
428*dd700d40Stb 
429*dd700d40Stb 	EVP_PKEY_free(pkey_b);
430*dd700d40Stb 
431*dd700d40Stb 	p = out;
432*dd700d40Stb 	if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
433*dd700d40Stb 		fprintf(stderr, "FAIL: d2i_PUBKEY (no params) failed\n");
434*dd700d40Stb 		goto done;
435*dd700d40Stb 	}
436*dd700d40Stb 
437*dd700d40Stb 	if (!EVP_PKEY_missing_parameters(pkey_b)) {
438*dd700d40Stb 		fprintf(stderr, "FAIL: DSA pkey_b has no missing parameters\n");
439*dd700d40Stb 		goto done;
440*dd700d40Stb 	}
441*dd700d40Stb 
442*dd700d40Stb 	if (BN_cmp(DSA_get0_pub_key(EVP_PKEY_get0_DSA(pkey_a)),
443*dd700d40Stb 	    DSA_get0_pub_key(EVP_PKEY_get0_DSA(pkey_b))) != 0) {
444*dd700d40Stb 		fprintf(stderr, "FAIL: DSA public keys mismatch\n");
445*dd700d40Stb 		goto done;
446*dd700d40Stb 	}
447*dd700d40Stb 
448*dd700d40Stb 	if (EVP_PKEY_cmp_parameters(pkey_a, pkey_b)) {
449*dd700d40Stb 		fprintf(stderr, "FAIL: DSA parameters match\n");
450*dd700d40Stb 		goto done;
451*dd700d40Stb 	}
452*dd700d40Stb 
453*dd700d40Stb 	if (EVP_PKEY_cmp(pkey_a, pkey_b)) {
454*dd700d40Stb 		fprintf(stderr, "FAIL: DSA keys should not match\n");
455*dd700d40Stb 		goto done;
456*dd700d40Stb 	}
457*dd700d40Stb 
458*dd700d40Stb 	if (!EVP_PKEY_copy_parameters(pkey_b, pkey_a)) {
459*dd700d40Stb 		fprintf(stderr, "FAIL: failed to copy DSA parameters\n");
460*dd700d40Stb 		goto done;
461*dd700d40Stb 	}
462*dd700d40Stb 
463*dd700d40Stb 	if (!EVP_PKEY_cmp(pkey_a, pkey_b)) {
464*dd700d40Stb 		fprintf(stderr, "FAIL: DSA keys should match\n");
465*dd700d40Stb 		goto done;
466*dd700d40Stb 	}
467*dd700d40Stb 
468f9c21f9aSjsing 	free(out);
469f9c21f9aSjsing 	out = NULL;
470f9c21f9aSjsing 
471f9c21f9aSjsing 	/*
472f9c21f9aSjsing 	 * Test i2d_DSA_PUBKEY/d2i_DSA_PUBKEY.
473f9c21f9aSjsing 	 */
474f9c21f9aSjsing 
475f9c21f9aSjsing 	if ((len = i2d_DSA_PUBKEY(dsa_a, &out)) < 0) {
476f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_DSA_PUBKEY failed\n");
477f9c21f9aSjsing 		goto done;
478f9c21f9aSjsing 	}
479f9c21f9aSjsing 	if (compare_data("DSA_PUBKEY", out, len, dsa_test_asn1_pubkey,
480f9c21f9aSjsing 	    sizeof(dsa_test_asn1_pubkey)) == -1)
481f9c21f9aSjsing 		goto done;
482f9c21f9aSjsing 
483f9c21f9aSjsing 	p = out;
484f9c21f9aSjsing 	if ((dsa_b = d2i_DSA_PUBKEY(NULL, &p, len)) == NULL) {
485f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_DSA_PUBKEY failed\n");
486f9c21f9aSjsing 		goto done;
487f9c21f9aSjsing 	}
488f9c21f9aSjsing 
489e292ee02Stb 	if (BN_cmp(DSA_get0_pub_key(dsa_a), DSA_get0_pub_key(dsa_b)) != 0) {
490f9c21f9aSjsing 		fprintf(stderr, "FAIL: DSA public keys mismatch\n");
491f9c21f9aSjsing 		goto done;
492f9c21f9aSjsing 	}
493f9c21f9aSjsing 
494f9c21f9aSjsing 	p = out;
495f9c21f9aSjsing 	if ((dsa_a = d2i_DSA_PUBKEY(&dsa_a, &p, len)) == NULL) {
496f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_DSA_PUBKEY failed\n");
497f9c21f9aSjsing 		goto done;
498f9c21f9aSjsing 	}
499f9c21f9aSjsing 
500e292ee02Stb 	if (BN_cmp(DSA_get0_pub_key(dsa_a), DSA_get0_pub_key(dsa_b)) != 0) {
501f9c21f9aSjsing 		fprintf(stderr, "FAIL: DSA public keys mismatch\n");
502f9c21f9aSjsing 		goto done;
503f9c21f9aSjsing 	}
504f9c21f9aSjsing 
505f9c21f9aSjsing 	/*
506f9c21f9aSjsing 	 * Test i2d_DSA_PUBKEY_bio/d2i_DSA_PUBKEY_bio.
507f9c21f9aSjsing 	 */
508f9c21f9aSjsing 	BIO_free_all(bio_mem);
509f9c21f9aSjsing 	if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
510f9c21f9aSjsing                 errx(1, "BIO_new failed for BIO_s_mem");
511f9c21f9aSjsing 
512f9c21f9aSjsing 	if ((len = i2d_DSA_PUBKEY_bio(bio_mem, dsa_a)) < 0) {
513f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_DSA_PUBKEY_bio failed\n");
514f9c21f9aSjsing 		goto done;
515f9c21f9aSjsing 	}
516f9c21f9aSjsing 
517f9c21f9aSjsing 	len = BIO_get_mem_data(bio_mem, &data);
518f9c21f9aSjsing 	if (compare_data("DSA_PUBKEY", data, len, dsa_test_asn1_pubkey,
519f9c21f9aSjsing 	    sizeof(dsa_test_asn1_pubkey)) == -1)
520f9c21f9aSjsing 		goto done;
521f9c21f9aSjsing 
522f9c21f9aSjsing 	DSA_free(dsa_b);
523f9c21f9aSjsing 	if ((dsa_b = d2i_DSA_PUBKEY_bio(bio_mem, NULL)) == NULL) {
524f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_DSA_PUBKEY_bio failed\n");
525f9c21f9aSjsing 		goto done;
526f9c21f9aSjsing 	}
527f9c21f9aSjsing 
528e292ee02Stb 	if (BN_cmp(DSA_get0_pub_key(dsa_a), DSA_get0_pub_key(dsa_b)) != 0) {
529f9c21f9aSjsing 		fprintf(stderr, "FAIL: DSA public keys mismatch\n");
530f9c21f9aSjsing 		goto done;
531f9c21f9aSjsing 	}
532f9c21f9aSjsing 
533f9c21f9aSjsing 	failure = 0;
534f9c21f9aSjsing 
535f9c21f9aSjsing  done:
536f9c21f9aSjsing 	BIO_free_all(bio_mem);
537f9c21f9aSjsing 	DSA_free(dsa_a);
538f9c21f9aSjsing 	DSA_free(dsa_b);
539f9c21f9aSjsing 	EVP_PKEY_free(pkey_a);
540f9c21f9aSjsing 	EVP_PKEY_free(pkey_b);
541f9c21f9aSjsing 	free(out);
542f9c21f9aSjsing 
543f9c21f9aSjsing 	return (failure);
544f9c21f9aSjsing }
545f9c21f9aSjsing 
546f9c21f9aSjsing static int
ec_pubkey_test(void)547f9c21f9aSjsing ec_pubkey_test(void)
548f9c21f9aSjsing {
549f9c21f9aSjsing 	EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
550f9c21f9aSjsing 	unsigned char *out = NULL, *data = NULL;
551f9c21f9aSjsing 	EC_KEY *ec_a = NULL, *ec_b = NULL;
552f9c21f9aSjsing 	const unsigned char *p;
553f9c21f9aSjsing 	BIO *bio_mem = NULL;
554f9c21f9aSjsing 	int failure = 1;
555f9c21f9aSjsing 	int len;
556f9c21f9aSjsing 
557fb228d6dSjsing 	ERR_clear_error();
558fb228d6dSjsing 
559f9c21f9aSjsing 	if ((bio_mem = BIO_new_mem_buf((void *)ec_test_key, -1)) == NULL)
560f9c21f9aSjsing 		errx(1, "failed to create BIO");
561f9c21f9aSjsing 
562f9c21f9aSjsing 	if ((ec_a = PEM_read_bio_ECPrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
563f9c21f9aSjsing 		ERR_print_errors_fp(stderr);
564f9c21f9aSjsing 		errx(1, "failed to decode EC key from PEM");
565f9c21f9aSjsing 	}
566f9c21f9aSjsing 
567f9c21f9aSjsing 	/*
568f9c21f9aSjsing 	 * Test i2d_PUBKEY/d2i_PUBKEY.
569f9c21f9aSjsing 	 */
570f9c21f9aSjsing 	if ((pkey_a = EVP_PKEY_new()) == NULL)
571f9c21f9aSjsing 		errx(1, "failed to create EVP_PKEY");
572f9c21f9aSjsing 	if (!EVP_PKEY_set1_EC_KEY(pkey_a, ec_a))
573f9c21f9aSjsing 		errx(1, "failed to set EC_KEY on EVP_PKEY");
574f9c21f9aSjsing 
575f9c21f9aSjsing 	if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
576f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
577f9c21f9aSjsing 		goto done;
578f9c21f9aSjsing 	}
579f9c21f9aSjsing 	if (compare_data("EC_KEY PUBKEY", out, len, ec_test_asn1_pubkey,
580f9c21f9aSjsing 	    sizeof(ec_test_asn1_pubkey)) == -1)
581f9c21f9aSjsing 		goto done;
582f9c21f9aSjsing 
583f9c21f9aSjsing 	p = out;
584f9c21f9aSjsing 	if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
585f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
586f9c21f9aSjsing 		goto done;
587f9c21f9aSjsing 	}
588f9c21f9aSjsing 
589e292ee02Stb 	if (EC_GROUP_cmp(EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey_a)),
590e292ee02Stb 	    EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey_b)), NULL) != 0) {
591f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
592f9c21f9aSjsing 		goto done;
593f9c21f9aSjsing 	}
594e292ee02Stb         if (EC_POINT_cmp(EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey_a)),
595e292ee02Stb 	    EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(pkey_a)),
596e292ee02Stb 	    EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(pkey_b)), NULL) != 0) {
597f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
598f9c21f9aSjsing 		goto done;
599f9c21f9aSjsing 	}
600f9c21f9aSjsing 
601f9c21f9aSjsing 	free(out);
602f9c21f9aSjsing 	out = NULL;
603f9c21f9aSjsing 
604f9c21f9aSjsing 	/*
605f9c21f9aSjsing 	 * Test i2d_EC_PUBKEY/d2i_EC_PUBKEY.
606f9c21f9aSjsing 	 */
607f9c21f9aSjsing 
608f9c21f9aSjsing 	if ((len = i2d_EC_PUBKEY(ec_a, &out)) < 0) {
609f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_EC_PUBKEY failed\n");
610f9c21f9aSjsing 		goto done;
611f9c21f9aSjsing 	}
612f9c21f9aSjsing 	if (compare_data("EC_PUBKEY", out, len, ec_test_asn1_pubkey,
613f9c21f9aSjsing 	    sizeof(ec_test_asn1_pubkey)) == -1)
614f9c21f9aSjsing 		goto done;
615f9c21f9aSjsing 
616f9c21f9aSjsing 	p = out;
617f9c21f9aSjsing 	if ((ec_b = d2i_EC_PUBKEY(NULL, &p, len)) == NULL) {
618f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_EC_PUBKEY failed\n");
619f9c21f9aSjsing 		goto done;
620f9c21f9aSjsing 	}
621f9c21f9aSjsing 
622f9c21f9aSjsing 	if (EC_GROUP_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_group(ec_b),
623f9c21f9aSjsing 	    NULL) != 0) {
624f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
625f9c21f9aSjsing 		goto done;
626f9c21f9aSjsing 	}
627f9c21f9aSjsing         if (EC_POINT_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_public_key(ec_a),
628f9c21f9aSjsing 	    EC_KEY_get0_public_key(ec_b), NULL) != 0) {
629f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
630f9c21f9aSjsing 		goto done;
631f9c21f9aSjsing 	}
632f9c21f9aSjsing 
633f9c21f9aSjsing 	p = out;
634f9c21f9aSjsing 	if ((ec_a = d2i_EC_PUBKEY(&ec_a, &p, len)) == NULL) {
635f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_EC_PUBKEY failed\n");
636f9c21f9aSjsing 		goto done;
637f9c21f9aSjsing 	}
638f9c21f9aSjsing 
639f9c21f9aSjsing 	if (EC_GROUP_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_group(ec_b),
640f9c21f9aSjsing 	    NULL) != 0) {
641f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
642f9c21f9aSjsing 		goto done;
643f9c21f9aSjsing 	}
644f9c21f9aSjsing         if (EC_POINT_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_public_key(ec_a),
645f9c21f9aSjsing 	    EC_KEY_get0_public_key(ec_b), NULL) != 0) {
646f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
647f9c21f9aSjsing 		goto done;
648f9c21f9aSjsing 	}
649f9c21f9aSjsing 
650f9c21f9aSjsing 	/*
651f9c21f9aSjsing 	 * Test i2d_EC_PUBKEY_bio/d2i_EC_PUBKEY_bio.
652f9c21f9aSjsing 	 */
653f9c21f9aSjsing 	BIO_free_all(bio_mem);
654f9c21f9aSjsing 	if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
655f9c21f9aSjsing                 errx(1, "BIO_new failed for BIO_s_mem");
656f9c21f9aSjsing 
657f9c21f9aSjsing 	if ((len = i2d_EC_PUBKEY_bio(bio_mem, ec_a)) < 0) {
658f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_EC_PUBKEY_bio failed\n");
659f9c21f9aSjsing 		goto done;
660f9c21f9aSjsing 	}
661f9c21f9aSjsing 
662f9c21f9aSjsing 	len = BIO_get_mem_data(bio_mem, &data);
663f9c21f9aSjsing 	if (compare_data("EC_PUBKEY", data, len, ec_test_asn1_pubkey,
664f9c21f9aSjsing 	    sizeof(ec_test_asn1_pubkey)) == -1)
665f9c21f9aSjsing 		goto done;
666f9c21f9aSjsing 
667f9c21f9aSjsing 	EC_KEY_free(ec_b);
668f9c21f9aSjsing 	if ((ec_b = d2i_EC_PUBKEY_bio(bio_mem, NULL)) == NULL) {
669f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_EC_PUBKEY_bio failed\n");
670f9c21f9aSjsing 		goto done;
671f9c21f9aSjsing 	}
672f9c21f9aSjsing 
673f9c21f9aSjsing 	if (EC_GROUP_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_group(ec_b),
674f9c21f9aSjsing 	    NULL) != 0) {
675f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY groups keys mismatch\n");
676f9c21f9aSjsing 		goto done;
677f9c21f9aSjsing 	}
678f9c21f9aSjsing         if (EC_POINT_cmp(EC_KEY_get0_group(ec_a), EC_KEY_get0_public_key(ec_a),
679f9c21f9aSjsing 	    EC_KEY_get0_public_key(ec_b), NULL) != 0) {
680f9c21f9aSjsing 		fprintf(stderr, "FAIL: EC_KEY public keys mismatch\n");
681f9c21f9aSjsing 		goto done;
682f9c21f9aSjsing 	}
683f9c21f9aSjsing 
684f9c21f9aSjsing 	failure = 0;
685f9c21f9aSjsing 
686f9c21f9aSjsing  done:
687f9c21f9aSjsing 	BIO_free_all(bio_mem);
688f9c21f9aSjsing 	EC_KEY_free(ec_a);
689f9c21f9aSjsing 	EC_KEY_free(ec_b);
690f9c21f9aSjsing 	EVP_PKEY_free(pkey_a);
691f9c21f9aSjsing 	EVP_PKEY_free(pkey_b);
692f9c21f9aSjsing 	free(out);
693f9c21f9aSjsing 
694f9c21f9aSjsing 	return (failure);
695f9c21f9aSjsing }
696f9c21f9aSjsing 
697f9c21f9aSjsing static int
rsa_pubkey_test(void)698f9c21f9aSjsing rsa_pubkey_test(void)
699f9c21f9aSjsing {
700f9c21f9aSjsing 	EVP_PKEY *pkey_a = NULL, *pkey_b = NULL;
701f9c21f9aSjsing 	RSA *rsa_a = NULL, *rsa_b = NULL;
702f9c21f9aSjsing 	unsigned char *out = NULL, *data = NULL;
703f9c21f9aSjsing 	const unsigned char *p;
704f9c21f9aSjsing 	BIO *bio_mem = NULL;
705f9c21f9aSjsing 	int failure = 1;
706f9c21f9aSjsing 	int len;
707f9c21f9aSjsing 
708fb228d6dSjsing 	ERR_clear_error();
709fb228d6dSjsing 
710f9c21f9aSjsing 	if ((bio_mem = BIO_new_mem_buf((void *)rsa_test_key, -1)) == NULL)
711f9c21f9aSjsing 		errx(1, "failed to create BIO");
712f9c21f9aSjsing 
713f9c21f9aSjsing 	if ((rsa_a = PEM_read_bio_RSAPrivateKey(bio_mem, NULL, NULL, NULL)) == NULL) {
714f9c21f9aSjsing 		ERR_print_errors_fp(stderr);
715f9c21f9aSjsing 		errx(1, "failed to decode RSA key from PEM");
716f9c21f9aSjsing 	}
717f9c21f9aSjsing 
718f9c21f9aSjsing 	/*
719f9c21f9aSjsing 	 * Test i2d_PUBKEY/d2i_PUBKEY.
720f9c21f9aSjsing 	 */
721f9c21f9aSjsing 	if ((pkey_a = EVP_PKEY_new()) == NULL)
722f9c21f9aSjsing 		errx(1, "failed to create EVP_PKEY");
723f9c21f9aSjsing 	if (!EVP_PKEY_set1_RSA(pkey_a, rsa_a))
724f9c21f9aSjsing 		errx(1, "failed to set RSA on EVP_PKEY");
725f9c21f9aSjsing 
726f9c21f9aSjsing 	if ((len = i2d_PUBKEY(pkey_a, &out)) < 0) {
727f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_PUBKEY failed\n");
728f9c21f9aSjsing 		goto done;
729f9c21f9aSjsing 	}
730f9c21f9aSjsing 	if (compare_data("RSA PUBKEY", out, len, rsa_test_asn1_pubkey,
731f9c21f9aSjsing 	    sizeof(rsa_test_asn1_pubkey)) == -1)
732f9c21f9aSjsing 		goto done;
733f9c21f9aSjsing 
734f9c21f9aSjsing 	p = out;
735f9c21f9aSjsing 	if ((pkey_b = d2i_PUBKEY(NULL, &p, len)) == NULL) {
736f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_PUBKEY failed\n");
737f9c21f9aSjsing 		goto done;
738f9c21f9aSjsing 	}
739f9c21f9aSjsing 
740e292ee02Stb 	if (BN_cmp(RSA_get0_n(EVP_PKEY_get0_RSA(pkey_a)),
741e292ee02Stb 	    RSA_get0_n(EVP_PKEY_get0_RSA(pkey_b))) != 0 ||
742e292ee02Stb 	    BN_cmp(RSA_get0_e(EVP_PKEY_get0_RSA(pkey_a)),
743e292ee02Stb 	    RSA_get0_e(EVP_PKEY_get0_RSA(pkey_b))) != 0) {
744f9c21f9aSjsing 		fprintf(stderr, "FAIL: RSA public keys mismatch\n");
745f9c21f9aSjsing 		goto done;
746f9c21f9aSjsing 	}
747f9c21f9aSjsing 
748f9c21f9aSjsing 	free(out);
749f9c21f9aSjsing 	out = NULL;
750f9c21f9aSjsing 
751f9c21f9aSjsing 	/*
752f9c21f9aSjsing 	 * Test i2d_RSA_PUBKEY/d2i_RSA_PUBKEY.
753f9c21f9aSjsing 	 */
754f9c21f9aSjsing 
755f9c21f9aSjsing 	if ((len = i2d_RSA_PUBKEY(rsa_a, &out)) < 0) {
756f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_RSA_PUBKEY failed\n");
757f9c21f9aSjsing 		goto done;
758f9c21f9aSjsing 	}
759f9c21f9aSjsing 	if (compare_data("RSA_PUBKEY", out, len, rsa_test_asn1_pubkey,
760f9c21f9aSjsing 	    sizeof(rsa_test_asn1_pubkey)) == -1)
761f9c21f9aSjsing 		goto done;
762f9c21f9aSjsing 
763f9c21f9aSjsing 	p = out;
764f9c21f9aSjsing 	if ((rsa_b = d2i_RSA_PUBKEY(NULL, &p, len)) == NULL) {
765f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_RSA_PUBKEY failed\n");
766f9c21f9aSjsing 		goto done;
767f9c21f9aSjsing 	}
768f9c21f9aSjsing 
769e292ee02Stb 	if (BN_cmp(RSA_get0_n(rsa_a), RSA_get0_n(rsa_b)) != 0 ||
770e292ee02Stb 	    BN_cmp(RSA_get0_e(rsa_a), RSA_get0_e(rsa_b)) != 0) {
771f9c21f9aSjsing 		fprintf(stderr, "FAIL: RSA public keys mismatch\n");
772f9c21f9aSjsing 		goto done;
773f9c21f9aSjsing 	}
774f9c21f9aSjsing 
775f9c21f9aSjsing 	p = out;
776f9c21f9aSjsing 	if ((rsa_a = d2i_RSA_PUBKEY(&rsa_a, &p, len)) == NULL) {
777f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_RSA_PUBKEY failed\n");
778f9c21f9aSjsing 		goto done;
779f9c21f9aSjsing 	}
780f9c21f9aSjsing 
781e292ee02Stb 	if (BN_cmp(RSA_get0_n(rsa_a), RSA_get0_n(rsa_b)) != 0 ||
782e292ee02Stb 	    BN_cmp(RSA_get0_e(rsa_a), RSA_get0_e(rsa_b)) != 0) {
783f9c21f9aSjsing 		fprintf(stderr, "FAIL: RSA public keys mismatch\n");
784f9c21f9aSjsing 		goto done;
785f9c21f9aSjsing 	}
786f9c21f9aSjsing 
787f9c21f9aSjsing 	/*
788f9c21f9aSjsing 	 * Test i2d_RSA_PUBKEY_bio/d2i_RSA_PUBKEY_bio.
789f9c21f9aSjsing 	 */
790f9c21f9aSjsing 	BIO_free_all(bio_mem);
791f9c21f9aSjsing 	if ((bio_mem = BIO_new(BIO_s_mem())) == NULL)
792f9c21f9aSjsing                 errx(1, "BIO_new failed for BIO_s_mem");
793f9c21f9aSjsing 
794f9c21f9aSjsing 	if ((len = i2d_RSA_PUBKEY_bio(bio_mem, rsa_a)) < 0) {
795f9c21f9aSjsing 		fprintf(stderr, "FAIL: i2d_RSA_PUBKEY_bio failed\n");
796f9c21f9aSjsing 		goto done;
797f9c21f9aSjsing 	}
798f9c21f9aSjsing 
799f9c21f9aSjsing 	len = BIO_get_mem_data(bio_mem, &data);
800f9c21f9aSjsing 	if (compare_data("RSA_PUBKEY", data, len, rsa_test_asn1_pubkey,
801f9c21f9aSjsing 	    sizeof(rsa_test_asn1_pubkey)) == -1)
802f9c21f9aSjsing 		goto done;
803f9c21f9aSjsing 
804f9c21f9aSjsing 	RSA_free(rsa_b);
805f9c21f9aSjsing 	if ((rsa_b = d2i_RSA_PUBKEY_bio(bio_mem, NULL)) == NULL) {
806f9c21f9aSjsing 		fprintf(stderr, "FAIL: d2i_RSA_PUBKEY_bio failed\n");
807f9c21f9aSjsing 		goto done;
808f9c21f9aSjsing 	}
809f9c21f9aSjsing 
810e292ee02Stb 	if (BN_cmp(RSA_get0_n(rsa_a), RSA_get0_n(rsa_b)) != 0 ||
811e292ee02Stb 	    BN_cmp(RSA_get0_e(rsa_a), RSA_get0_e(rsa_b)) != 0) {
812f9c21f9aSjsing 		fprintf(stderr, "FAIL: RSA public keys mismatch\n");
813f9c21f9aSjsing 		goto done;
814f9c21f9aSjsing 	}
815f9c21f9aSjsing 
816f9c21f9aSjsing 	failure = 0;
817f9c21f9aSjsing 
818f9c21f9aSjsing  done:
819f9c21f9aSjsing 	BIO_free_all(bio_mem);
820f9c21f9aSjsing 	RSA_free(rsa_a);
821f9c21f9aSjsing 	RSA_free(rsa_b);
822f9c21f9aSjsing 	EVP_PKEY_free(pkey_a);
823f9c21f9aSjsing 	EVP_PKEY_free(pkey_b);
824f9c21f9aSjsing 	free(out);
825f9c21f9aSjsing 
826f9c21f9aSjsing 	return (failure);
827f9c21f9aSjsing }
828f9c21f9aSjsing 
829f9c21f9aSjsing int
main(int argc,char ** argv)830f9c21f9aSjsing main(int argc, char **argv)
831f9c21f9aSjsing {
832f9c21f9aSjsing 	int failed = 0;
833f9c21f9aSjsing 
834f9c21f9aSjsing 	ERR_load_crypto_strings();
835f9c21f9aSjsing 
836*dd700d40Stb 	failed |= dh_pubkey_test();
837f9c21f9aSjsing 	failed |= dsa_pubkey_test();
838f9c21f9aSjsing 	failed |= ec_pubkey_test();
839f9c21f9aSjsing 	failed |= rsa_pubkey_test();
840f9c21f9aSjsing 
841f9c21f9aSjsing 	return (failed);
842f9c21f9aSjsing }
843