1296341Sdelphij/* Copyright (c) 2014, Google Inc.
2296341Sdelphij *
3296341Sdelphij * Permission to use, copy, modify, and/or distribute this software for any
4296341Sdelphij * purpose with or without fee is hereby granted, provided that the above
5296341Sdelphij * copyright notice and this permission notice appear in all copies.
6296341Sdelphij *
7296341Sdelphij * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8296341Sdelphij * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9296341Sdelphij * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10296341Sdelphij * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11296341Sdelphij * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12296341Sdelphij * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13296341Sdelphij * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14296341Sdelphij */
15296341Sdelphij/* ====================================================================
16296341Sdelphij * Copyright (c) 1998-2015 The OpenSSL Project.  All rights reserved.
17296341Sdelphij *
18296341Sdelphij * Redistribution and use in source and binary forms, with or without
19296341Sdelphij * modification, are permitted provided that the following conditions
20296341Sdelphij * are met:
21296341Sdelphij *
22296341Sdelphij * 1. Redistributions of source code must retain the above copyright
23296341Sdelphij *    notice, this list of conditions and the following disclaimer.
24296341Sdelphij *
25296341Sdelphij * 2. Redistributions in binary form must reproduce the above copyright
26296341Sdelphij *    notice, this list of conditions and the following disclaimer in
27296341Sdelphij *    the documentation and/or other materials provided with the
28296341Sdelphij *    distribution.
29296341Sdelphij *
30296341Sdelphij * 3. All advertising materials mentioning features or use of this
31296341Sdelphij *    software must display the following acknowledgment:
32296341Sdelphij *    "This product includes software developed by the OpenSSL Project
33296341Sdelphij *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
34296341Sdelphij *
35296341Sdelphij * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
36296341Sdelphij *    endorse or promote products derived from this software without
37296341Sdelphij *    prior written permission. For written permission, please contact
38296341Sdelphij *    openssl-core@openssl.org.
39296341Sdelphij *
40296341Sdelphij * 5. Products derived from this software may not be called "OpenSSL"
41296341Sdelphij *    nor may "OpenSSL" appear in their names without prior written
42296341Sdelphij *    permission of the OpenSSL Project.
43296341Sdelphij *
44296341Sdelphij * 6. Redistributions of any form whatsoever must retain the following
45296341Sdelphij *    acknowledgment:
46296341Sdelphij *    "This product includes software developed by the OpenSSL Project
47296341Sdelphij *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
48296341Sdelphij *
49296341Sdelphij * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
50296341Sdelphij * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51296341Sdelphij * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
52296341Sdelphij * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
53296341Sdelphij * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
54296341Sdelphij * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
55296341Sdelphij * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
56296341Sdelphij * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57296341Sdelphij * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
58296341Sdelphij * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
59296341Sdelphij * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
60296341Sdelphij * OF THE POSSIBILITY OF SUCH DAMAGE.
61296341Sdelphij * ====================================================================
62296341Sdelphij *
63296341Sdelphij * This product includes cryptographic software written by Eric Young
64296341Sdelphij * (eay@cryptsoft.com).  This product includes software written by Tim
65296341Sdelphij * Hudson (tjh@cryptsoft.com).
66296341Sdelphij *
67296341Sdelphij */
68296341Sdelphij
69296341Sdelphij#include <stdio.h>
70296341Sdelphij#include <stdlib.h>
71296341Sdelphij#include <openssl/bio.h>
72296341Sdelphij#include <openssl/crypto.h>
73296341Sdelphij#include <openssl/err.h>
74296341Sdelphij#include <openssl/evp.h>
75296341Sdelphij#include <openssl/rsa.h>
76296341Sdelphij#include <openssl/x509.h>
77296341Sdelphij
78296341Sdelphij/*
79296341Sdelphij * kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you
80296341Sdelphij * should never use this key anywhere but in an example.
81296341Sdelphij */
82296341Sdelphijstatic const unsigned char kExampleRSAKeyDER[] = {
83296341Sdelphij    0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8,
84296341Sdelphij    0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59,
85296341Sdelphij    0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37,
86296341Sdelphij    0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71,
87296341Sdelphij    0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a,
88296341Sdelphij    0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4,
89296341Sdelphij    0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec,
90296341Sdelphij    0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76,
91296341Sdelphij    0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8,
92296341Sdelphij    0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7,
93296341Sdelphij    0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c,
94296341Sdelphij    0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01,
95296341Sdelphij    0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7,
96296341Sdelphij    0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85,
97296341Sdelphij    0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee,
98296341Sdelphij    0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85,
99296341Sdelphij    0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a,
100296341Sdelphij    0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15,
101296341Sdelphij    0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83,
102296341Sdelphij    0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b,
103296341Sdelphij    0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73,
104296341Sdelphij    0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99,
105296341Sdelphij    0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02,
106296341Sdelphij    0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41,
107296341Sdelphij    0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59,
108296341Sdelphij    0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9,
109296341Sdelphij    0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef,
110296341Sdelphij    0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87,
111296341Sdelphij    0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf,
112296341Sdelphij    0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5,
113296341Sdelphij    0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5,
114296341Sdelphij    0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62,
115296341Sdelphij    0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64,
116296341Sdelphij    0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8,
117296341Sdelphij    0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba,
118296341Sdelphij    0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe,
119296341Sdelphij    0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7,
120296341Sdelphij    0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe,
121296341Sdelphij    0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb,
122296341Sdelphij    0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34,
123296341Sdelphij    0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27,
124296341Sdelphij    0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0,
125296341Sdelphij    0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba,
126296341Sdelphij    0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06,
127296341Sdelphij    0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c,
128296341Sdelphij    0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e,
129296341Sdelphij    0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf,
130296341Sdelphij    0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a,
131296341Sdelphij    0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17,
132296341Sdelphij    0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1,
133296341Sdelphij    0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
134296341Sdelphij};
135296341Sdelphij
136296341Sdelphijstatic const unsigned char kMsg[] = { 1, 2, 3, 4 };
137296341Sdelphij
138296341Sdelphijstatic const unsigned char kSignature[] = {
139296341Sdelphij    0xa5, 0xf0, 0x8a, 0x47, 0x5d, 0x3c, 0xb3, 0xcc, 0xa9, 0x79, 0xaf, 0x4d,
140296341Sdelphij    0x8c, 0xae, 0x4c, 0x14, 0xef, 0xc2, 0x0b, 0x34, 0x36, 0xde, 0xf4, 0x3e,
141296341Sdelphij    0x3d, 0xbb, 0x4a, 0x60, 0x5c, 0xc8, 0x91, 0x28, 0xda, 0xfb, 0x7e, 0x04,
142296341Sdelphij    0x96, 0x7e, 0x63, 0x13, 0x90, 0xce, 0xb9, 0xb4, 0x62, 0x7a, 0xfd, 0x09,
143296341Sdelphij    0x3d, 0xc7, 0x67, 0x78, 0x54, 0x04, 0xeb, 0x52, 0x62, 0x6e, 0x24, 0x67,
144296341Sdelphij    0xb4, 0x40, 0xfc, 0x57, 0x62, 0xc6, 0xf1, 0x67, 0xc1, 0x97, 0x8f, 0x6a,
145296341Sdelphij    0xa8, 0xae, 0x44, 0x46, 0x5e, 0xab, 0x67, 0x17, 0x53, 0x19, 0x3a, 0xda,
146296341Sdelphij    0x5a, 0xc8, 0x16, 0x3e, 0x86, 0xd5, 0xc5, 0x71, 0x2f, 0xfc, 0x23, 0x48,
147296341Sdelphij    0xd9, 0x0b, 0x13, 0xdd, 0x7b, 0x5a, 0x25, 0x79, 0xef, 0xa5, 0x7b, 0x04,
148296341Sdelphij    0xed, 0x44, 0xf6, 0x18, 0x55, 0xe4, 0x0a, 0xe9, 0x57, 0x79, 0x5d, 0xd7,
149296341Sdelphij    0x55, 0xa7, 0xab, 0x45, 0x02, 0x97, 0x60, 0x42,
150296341Sdelphij};
151296341Sdelphij
152296341Sdelphij/*
153296341Sdelphij * kExampleRSAKeyPKCS8 is kExampleRSAKeyDER encoded in a PKCS #8
154296341Sdelphij * PrivateKeyInfo.
155296341Sdelphij */
156296341Sdelphijstatic const unsigned char kExampleRSAKeyPKCS8[] = {
157296341Sdelphij    0x30, 0x82, 0x02, 0x76, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
158296341Sdelphij    0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
159296341Sdelphij    0x02, 0x60, 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81,
160296341Sdelphij    0x00, 0xf8, 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5,
161296341Sdelphij    0xb4, 0x59, 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e,
162296341Sdelphij    0xd3, 0x37, 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34,
163296341Sdelphij    0x75, 0x71, 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde,
164296341Sdelphij    0x97, 0x8a, 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8,
165296341Sdelphij    0x50, 0xe4, 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b,
166296341Sdelphij    0xdc, 0xec, 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83,
167296341Sdelphij    0x58, 0x76, 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48,
168296341Sdelphij    0x1a, 0xd8, 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a,
169296341Sdelphij    0x5c, 0xd7, 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2,
170296341Sdelphij    0xa7, 0x2c, 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01,
171296341Sdelphij    0x00, 0x01, 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a,
172296341Sdelphij    0x6d, 0xc7, 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5,
173296341Sdelphij    0x32, 0x85, 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6,
174296341Sdelphij    0x5f, 0xee, 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8,
175296341Sdelphij    0x66, 0x85, 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6,
176296341Sdelphij    0xa4, 0x0a, 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f,
177296341Sdelphij    0xc2, 0x15, 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c,
178296341Sdelphij    0x5b, 0x83, 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78,
179296341Sdelphij    0x80, 0x1b, 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71,
180296341Sdelphij    0x99, 0x73, 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60,
181296341Sdelphij    0x1f, 0x99, 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d,
182296341Sdelphij    0xb1, 0x02, 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3,
183296341Sdelphij    0x40, 0x41, 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d,
184296341Sdelphij    0x3d, 0x59, 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18,
185296341Sdelphij    0xc6, 0xd9, 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d,
186296341Sdelphij    0x9f, 0xef, 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32,
187296341Sdelphij    0x46, 0x87, 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc,
188296341Sdelphij    0x2c, 0xdf, 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63,
189296341Sdelphij    0x55, 0xf5, 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05,
190296341Sdelphij    0xcd, 0xb5, 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16,
191296341Sdelphij    0xb3, 0x62, 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3,
192296341Sdelphij    0x9b, 0x64, 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85,
193296341Sdelphij    0xfa, 0xb8, 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97,
194296341Sdelphij    0xe8, 0xba, 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7,
195296341Sdelphij    0xe7, 0xfe, 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99,
196296341Sdelphij    0x75, 0xe7, 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4,
197296341Sdelphij    0x9d, 0xfe, 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d,
198296341Sdelphij    0xf1, 0xdb, 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40,
199296341Sdelphij    0x5a, 0x34, 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26,
200296341Sdelphij    0x84, 0x27, 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1,
201296341Sdelphij    0xe9, 0xc0, 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c,
202296341Sdelphij    0xb9, 0xba, 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30,
203296341Sdelphij    0x10, 0x06, 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea,
204296341Sdelphij    0x52, 0x2c, 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b,
205296341Sdelphij    0xc4, 0x1e, 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e,
206296341Sdelphij    0x49, 0xaf, 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9,
207296341Sdelphij    0xd1, 0x8a, 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae,
208296341Sdelphij    0x17, 0x17, 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d,
209296341Sdelphij    0x08, 0xf1, 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf,
210296341Sdelphij};
211296341Sdelphij
212296341Sdelphij#ifndef OPENSSL_NO_EC
213296341Sdelphij/*
214296341Sdelphij * kExampleECKeyDER is a sample EC private key encoded as an ECPrivateKey
215296341Sdelphij * structure.
216296341Sdelphij */
217296341Sdelphijstatic const unsigned char kExampleECKeyDER[] = {
218296341Sdelphij    0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x07, 0x0f, 0x08, 0x72, 0x7a,
219296341Sdelphij    0xd4, 0xa0, 0x4a, 0x9c, 0xdd, 0x59, 0xc9, 0x4d, 0x89, 0x68, 0x77, 0x08,
220296341Sdelphij    0xb5, 0x6f, 0xc9, 0x5d, 0x30, 0x77, 0x0e, 0xe8, 0xd1, 0xc9, 0xce, 0x0a,
221296341Sdelphij    0x8b, 0xb4, 0x6a, 0xa0, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
222296341Sdelphij    0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xe6, 0x2b, 0x69,
223296341Sdelphij    0xe2, 0xbf, 0x65, 0x9f, 0x97, 0xbe, 0x2f, 0x1e, 0x0d, 0x94, 0x8a, 0x4c,
224296341Sdelphij    0xd5, 0x97, 0x6b, 0xb7, 0xa9, 0x1e, 0x0d, 0x46, 0xfb, 0xdd, 0xa9, 0xa9,
225296341Sdelphij    0x1e, 0x9d, 0xdc, 0xba, 0x5a, 0x01, 0xe7, 0xd6, 0x97, 0xa8, 0x0a, 0x18,
226296341Sdelphij    0xf9, 0xc3, 0xc4, 0xa3, 0x1e, 0x56, 0xe2, 0x7c, 0x83, 0x48, 0xdb, 0x16,
227296341Sdelphij    0x1a, 0x1c, 0xf5, 0x1d, 0x7e, 0xf1, 0x94, 0x2d, 0x4b, 0xcf, 0x72, 0x22,
228296341Sdelphij    0xc1,
229296341Sdelphij};
230296341Sdelphij
231296341Sdelphij/*
232296341Sdelphij * kExampleBadECKeyDER is a sample EC private key encoded as an ECPrivateKey
233296341Sdelphij * structure. The private key is equal to the order and will fail to import
234296341Sdelphij */
235296341Sdelphijstatic const unsigned char kExampleBadECKeyDER[] = {
236296341Sdelphij    0x30, 0x66, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48,
237296341Sdelphij    0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03,
238296341Sdelphij    0x01, 0x07, 0x04, 0x4C, 0x30, 0x4A, 0x02, 0x01, 0x01, 0x04, 0x20, 0xFF,
239296341Sdelphij    0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
240296341Sdelphij    0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, 0xF3,
241296341Sdelphij    0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51, 0xA1, 0x23, 0x03, 0x21, 0x00,
242296341Sdelphij    0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
243296341Sdelphij    0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
244296341Sdelphij    0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
245296341Sdelphij};
246296341Sdelphij#endif
247296341Sdelphij
248296341Sdelphijstatic EVP_PKEY *load_example_rsa_key(void)
249296341Sdelphij{
250296341Sdelphij    EVP_PKEY *ret = NULL;
251296341Sdelphij    const unsigned char *derp = kExampleRSAKeyDER;
252296341Sdelphij    EVP_PKEY *pkey = NULL;
253296341Sdelphij    RSA *rsa = NULL;
254296341Sdelphij
255296341Sdelphij    if (!d2i_RSAPrivateKey(&rsa, &derp, sizeof(kExampleRSAKeyDER))) {
256296341Sdelphij        return NULL;
257296341Sdelphij    }
258296341Sdelphij
259296341Sdelphij    pkey = EVP_PKEY_new();
260296341Sdelphij    if (pkey == NULL || !EVP_PKEY_set1_RSA(pkey, rsa)) {
261296341Sdelphij        goto out;
262296341Sdelphij    }
263296341Sdelphij
264296341Sdelphij    ret = pkey;
265296341Sdelphij    pkey = NULL;
266296341Sdelphij
267296341Sdelphij out:
268296341Sdelphij    if (pkey) {
269296341Sdelphij        EVP_PKEY_free(pkey);
270296341Sdelphij    }
271296341Sdelphij    if (rsa) {
272296341Sdelphij        RSA_free(rsa);
273296341Sdelphij    }
274296341Sdelphij
275296341Sdelphij    return ret;
276296341Sdelphij}
277296341Sdelphij
278296341Sdelphijstatic int test_EVP_DigestSignInit(void)
279296341Sdelphij{
280296341Sdelphij    int ret = 0;
281296341Sdelphij    EVP_PKEY *pkey = NULL;
282296341Sdelphij    unsigned char *sig = NULL;
283296341Sdelphij    size_t sig_len = 0;
284296341Sdelphij    EVP_MD_CTX md_ctx, md_ctx_verify;
285296341Sdelphij
286296341Sdelphij    EVP_MD_CTX_init(&md_ctx);
287296341Sdelphij    EVP_MD_CTX_init(&md_ctx_verify);
288296341Sdelphij
289296341Sdelphij    pkey = load_example_rsa_key();
290296341Sdelphij    if (pkey == NULL ||
291296341Sdelphij        !EVP_DigestSignInit(&md_ctx, NULL, EVP_sha256(), NULL, pkey) ||
292296341Sdelphij        !EVP_DigestSignUpdate(&md_ctx, kMsg, sizeof(kMsg))) {
293296341Sdelphij        goto out;
294296341Sdelphij    }
295296341Sdelphij    /* Determine the size of the signature. */
296296341Sdelphij    if (!EVP_DigestSignFinal(&md_ctx, NULL, &sig_len)) {
297296341Sdelphij        goto out;
298296341Sdelphij    }
299296341Sdelphij    /* Sanity check for testing. */
300296341Sdelphij    if (sig_len != (size_t)EVP_PKEY_size(pkey)) {
301296341Sdelphij        fprintf(stderr, "sig_len mismatch\n");
302296341Sdelphij        goto out;
303296341Sdelphij    }
304296341Sdelphij
305296341Sdelphij    sig = OPENSSL_malloc(sig_len);
306296341Sdelphij    if (sig == NULL || !EVP_DigestSignFinal(&md_ctx, sig, &sig_len)) {
307296341Sdelphij        goto out;
308296341Sdelphij    }
309296341Sdelphij
310296341Sdelphij    /* Ensure that the signature round-trips. */
311296341Sdelphij    if (!EVP_DigestVerifyInit(&md_ctx_verify, NULL, EVP_sha256(), NULL, pkey)
312296341Sdelphij        || !EVP_DigestVerifyUpdate(&md_ctx_verify, kMsg, sizeof(kMsg))
313296341Sdelphij        || !EVP_DigestVerifyFinal(&md_ctx_verify, sig, sig_len)) {
314296341Sdelphij        goto out;
315296341Sdelphij    }
316296341Sdelphij
317296341Sdelphij    ret = 1;
318296341Sdelphij
319296341Sdelphij out:
320296341Sdelphij    if (!ret) {
321296341Sdelphij        ERR_print_errors_fp(stderr);
322296341Sdelphij    }
323296341Sdelphij
324296341Sdelphij    EVP_MD_CTX_cleanup(&md_ctx);
325296341Sdelphij    EVP_MD_CTX_cleanup(&md_ctx_verify);
326296341Sdelphij    if (pkey) {
327296341Sdelphij        EVP_PKEY_free(pkey);
328296341Sdelphij    }
329296341Sdelphij    if (sig) {
330296341Sdelphij        OPENSSL_free(sig);
331296341Sdelphij    }
332296341Sdelphij
333296341Sdelphij    return ret;
334296341Sdelphij}
335296341Sdelphij
336296341Sdelphijstatic int test_EVP_DigestVerifyInit(void)
337296341Sdelphij{
338296341Sdelphij    int ret = 0;
339296341Sdelphij    EVP_PKEY *pkey = NULL;
340296341Sdelphij    EVP_MD_CTX md_ctx;
341296341Sdelphij
342296341Sdelphij    EVP_MD_CTX_init(&md_ctx);
343296341Sdelphij
344296341Sdelphij    pkey = load_example_rsa_key();
345296341Sdelphij    if (pkey == NULL ||
346296341Sdelphij        !EVP_DigestVerifyInit(&md_ctx, NULL, EVP_sha256(), NULL, pkey) ||
347296341Sdelphij        !EVP_DigestVerifyUpdate(&md_ctx, kMsg, sizeof(kMsg)) ||
348296341Sdelphij        !EVP_DigestVerifyFinal(&md_ctx, (unsigned char *)kSignature, sizeof(kSignature))) {
349296341Sdelphij        goto out;
350296341Sdelphij    }
351296341Sdelphij    ret = 1;
352296341Sdelphij
353296341Sdelphij out:
354296341Sdelphij    if (!ret) {
355296341Sdelphij        ERR_print_errors_fp(stderr);
356296341Sdelphij    }
357296341Sdelphij
358296341Sdelphij    EVP_MD_CTX_cleanup(&md_ctx);
359296341Sdelphij    if (pkey) {
360296341Sdelphij        EVP_PKEY_free(pkey);
361296341Sdelphij    }
362296341Sdelphij
363296341Sdelphij    return ret;
364296341Sdelphij}
365296341Sdelphij
366296341Sdelphijstatic int test_d2i_AutoPrivateKey(const unsigned char *input,
367296341Sdelphij                                   size_t input_len, int expected_id)
368296341Sdelphij{
369296341Sdelphij    int ret = 0;
370296341Sdelphij    const unsigned char *p;
371296341Sdelphij    EVP_PKEY *pkey = NULL;
372296341Sdelphij
373296341Sdelphij    p = input;
374296341Sdelphij    pkey = d2i_AutoPrivateKey(NULL, &p, input_len);
375296341Sdelphij    if (pkey == NULL || p != input + input_len) {
376296341Sdelphij        fprintf(stderr, "d2i_AutoPrivateKey failed\n");
377296341Sdelphij        goto done;
378296341Sdelphij    }
379296341Sdelphij
380296341Sdelphij    if (EVP_PKEY_id(pkey) != expected_id) {
381296341Sdelphij        fprintf(stderr, "Did not decode expected type\n");
382296341Sdelphij        goto done;
383296341Sdelphij    }
384296341Sdelphij
385296341Sdelphij    ret = 1;
386296341Sdelphij
387296341Sdelphij done:
388296341Sdelphij    if (!ret) {
389296341Sdelphij        ERR_print_errors_fp(stderr);
390296341Sdelphij    }
391296341Sdelphij
392296341Sdelphij    if (pkey != NULL) {
393296341Sdelphij        EVP_PKEY_free(pkey);
394296341Sdelphij    }
395296341Sdelphij    return ret;
396296341Sdelphij}
397296341Sdelphij
398296341Sdelphij#ifndef OPENSSL_NO_EC
399296341Sdelphij/* Tests loading a bad key in PKCS8 format */
400296341Sdelphijstatic int test_EVP_PKCS82PKEY(void)
401296341Sdelphij{
402296341Sdelphij    int ret = 0;
403296341Sdelphij    const unsigned char *derp = kExampleBadECKeyDER;
404296341Sdelphij    PKCS8_PRIV_KEY_INFO *p8inf = NULL;
405296341Sdelphij    EVP_PKEY *pkey = NULL;
406296341Sdelphij
407296341Sdelphij    p8inf = d2i_PKCS8_PRIV_KEY_INFO(NULL, &derp, sizeof(kExampleBadECKeyDER));
408296341Sdelphij
409296341Sdelphij    if (!p8inf || derp != kExampleBadECKeyDER + sizeof(kExampleBadECKeyDER)) {
410296341Sdelphij        fprintf(stderr, "Failed to parse key\n");
411296341Sdelphij        goto done;
412296341Sdelphij    }
413296341Sdelphij
414296341Sdelphij    pkey = EVP_PKCS82PKEY(p8inf);
415296341Sdelphij    if (pkey) {
416296341Sdelphij        fprintf(stderr, "Imported invalid EC key\n");
417296341Sdelphij        goto done;
418296341Sdelphij    }
419296341Sdelphij
420296341Sdelphij    ret = 1;
421296341Sdelphij
422296341Sdelphij done:
423296341Sdelphij    if (p8inf != NULL) {
424296341Sdelphij        PKCS8_PRIV_KEY_INFO_free(p8inf);
425296341Sdelphij    }
426296341Sdelphij
427296341Sdelphij    if (pkey != NULL) {
428296341Sdelphij        EVP_PKEY_free(pkey);
429296341Sdelphij    }
430296341Sdelphij
431296341Sdelphij    return ret;
432296341Sdelphij}
433296341Sdelphij#endif
434296341Sdelphij
435296341Sdelphijint main(void)
436296341Sdelphij{
437296341Sdelphij    CRYPTO_malloc_debug_init();
438296341Sdelphij    CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
439296341Sdelphij    CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
440296341Sdelphij
441296341Sdelphij    ERR_load_crypto_strings();
442296341Sdelphij    /* Load up the software EVP_CIPHER and EVP_MD definitions */
443296341Sdelphij    OpenSSL_add_all_ciphers();
444296341Sdelphij    OpenSSL_add_all_digests();
445296341Sdelphij
446296341Sdelphij    if (!test_EVP_DigestSignInit()) {
447296341Sdelphij        fprintf(stderr, "EVP_DigestSignInit failed\n");
448296341Sdelphij        return 1;
449296341Sdelphij    }
450296341Sdelphij
451296341Sdelphij    if (!test_EVP_DigestVerifyInit()) {
452296341Sdelphij        fprintf(stderr, "EVP_DigestVerifyInit failed\n");
453296341Sdelphij        return 1;
454296341Sdelphij    }
455296341Sdelphij
456296341Sdelphij    if (!test_d2i_AutoPrivateKey(kExampleRSAKeyDER, sizeof(kExampleRSAKeyDER),
457296341Sdelphij                                 EVP_PKEY_RSA)) {
458296341Sdelphij        fprintf(stderr, "d2i_AutoPrivateKey(kExampleRSAKeyDER) failed\n");
459296341Sdelphij        return 1;
460296341Sdelphij    }
461296341Sdelphij
462296341Sdelphij    if (!test_d2i_AutoPrivateKey
463296341Sdelphij        (kExampleRSAKeyPKCS8, sizeof(kExampleRSAKeyPKCS8), EVP_PKEY_RSA)) {
464296341Sdelphij        fprintf(stderr, "d2i_AutoPrivateKey(kExampleRSAKeyPKCS8) failed\n");
465296341Sdelphij        return 1;
466296341Sdelphij    }
467296341Sdelphij
468296341Sdelphij#ifndef OPENSSL_NO_EC
469296341Sdelphij    if (!test_d2i_AutoPrivateKey(kExampleECKeyDER, sizeof(kExampleECKeyDER),
470296341Sdelphij                                 EVP_PKEY_EC)) {
471296341Sdelphij        fprintf(stderr, "d2i_AutoPrivateKey(kExampleECKeyDER) failed\n");
472296341Sdelphij        return 1;
473296341Sdelphij    }
474296341Sdelphij
475296341Sdelphij    if (!test_EVP_PKCS82PKEY()) {
476296341Sdelphij        fprintf(stderr, "test_EVP_PKCS82PKEY failed\n");
477296341Sdelphij        return 1;
478296341Sdelphij    }
479296341Sdelphij#endif
480296341Sdelphij
481296341Sdelphij    EVP_cleanup();
482296341Sdelphij    CRYPTO_cleanup_all_ex_data();
483296341Sdelphij    ERR_remove_thread_state(NULL);
484296341Sdelphij    ERR_free_strings();
485296341Sdelphij    CRYPTO_mem_leaks_fp(stderr);
486296341Sdelphij
487296341Sdelphij    printf("PASS\n");
488296341Sdelphij    return 0;
489296341Sdelphij}
490