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