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