195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Copyright (c) 2014, Google Inc. 295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Permission to use, copy, modify, and/or distribute this software for any 495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * purpose with or without fee is hereby granted, provided that the above 595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * copyright notice and this permission notice appear in all copies. 695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 1095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 1295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 1395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 1495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 1595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <stdint.h> 1695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <stdio.h> 1795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <stdlib.h> 1895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 1995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/bio.h> 20a70c75cfc0ca32a43985e3f24d737ca9cafcb910David Benjamin#include <openssl/crypto.h> 2195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/digest.h> 2295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/evp.h> 2395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/rsa.h> 2495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 2595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 2695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* kExampleRSAKeyDER is an RSA private key in ASN.1, DER format. Of course, you 2795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * should never use this key anywhere but in an example. */ 2895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic const uint8_t kExampleRSAKeyDER[] = { 2995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xf8, 3095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xb8, 0x6c, 0x83, 0xb4, 0xbc, 0xd9, 0xa8, 0x57, 0xc0, 0xa5, 0xb4, 0x59, 3195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x76, 0x8c, 0x54, 0x1d, 0x79, 0xeb, 0x22, 0x52, 0x04, 0x7e, 0xd3, 0x37, 3295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xeb, 0x41, 0xfd, 0x83, 0xf9, 0xf0, 0xa6, 0x85, 0x15, 0x34, 0x75, 0x71, 3395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x5a, 0x84, 0xa8, 0x3c, 0xd2, 0xef, 0x5a, 0x4e, 0xd3, 0xde, 0x97, 0x8a, 3495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xdd, 0xff, 0xbb, 0xcf, 0x0a, 0xaa, 0x86, 0x92, 0xbe, 0xb8, 0x50, 0xe4, 3595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xcd, 0x6f, 0x80, 0x33, 0x30, 0x76, 0x13, 0x8f, 0xca, 0x7b, 0xdc, 0xec, 3695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x5a, 0xca, 0x63, 0xc7, 0x03, 0x25, 0xef, 0xa8, 0x8a, 0x83, 0x58, 0x76, 3795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x20, 0xfa, 0x16, 0x77, 0xd7, 0x79, 0x92, 0x63, 0x01, 0x48, 0x1a, 0xd8, 3895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x7b, 0x67, 0xf1, 0x52, 0x55, 0x49, 0x4e, 0xd6, 0x6e, 0x4a, 0x5c, 0xd7, 3995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x7a, 0x37, 0x36, 0x0c, 0xde, 0xdd, 0x8f, 0x44, 0xe8, 0xc2, 0xa7, 0x2c, 4095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x2b, 0xb5, 0xaf, 0x64, 0x4b, 0x61, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 4195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x02, 0x81, 0x80, 0x74, 0x88, 0x64, 0x3f, 0x69, 0x45, 0x3a, 0x6d, 0xc7, 4295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x7f, 0xb9, 0xa3, 0xc0, 0x6e, 0xec, 0xdc, 0xd4, 0x5a, 0xb5, 0x32, 0x85, 4395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x5f, 0x19, 0xd4, 0xf8, 0xd4, 0x3f, 0x3c, 0xfa, 0xc2, 0xf6, 0x5f, 0xee, 4495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xe6, 0xba, 0x87, 0x74, 0x2e, 0xc7, 0x0c, 0xd4, 0x42, 0xb8, 0x66, 0x85, 4595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x9c, 0x7b, 0x24, 0x61, 0xaa, 0x16, 0x11, 0xf6, 0xb5, 0xb6, 0xa4, 0x0a, 4695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xc9, 0x55, 0x2e, 0x81, 0xa5, 0x47, 0x61, 0xcb, 0x25, 0x8f, 0xc2, 0x15, 4795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x7b, 0x0e, 0x7c, 0x36, 0x9f, 0x3a, 0xda, 0x58, 0x86, 0x1c, 0x5b, 0x83, 4895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x79, 0xe6, 0x2b, 0xcc, 0xe6, 0xfa, 0x2c, 0x61, 0xf2, 0x78, 0x80, 0x1b, 4995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xe2, 0xf3, 0x9d, 0x39, 0x2b, 0x65, 0x57, 0x91, 0x3d, 0x71, 0x99, 0x73, 5095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xa5, 0xc2, 0x79, 0x20, 0x8c, 0x07, 0x4f, 0xe5, 0xb4, 0x60, 0x1f, 0x99, 5195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xa2, 0xb1, 0x4f, 0x0c, 0xef, 0xbc, 0x59, 0x53, 0x00, 0x7d, 0xb1, 0x02, 5295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x41, 0x00, 0xfc, 0x7e, 0x23, 0x65, 0x70, 0xf8, 0xce, 0xd3, 0x40, 0x41, 5395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x80, 0x6a, 0x1d, 0x01, 0xd6, 0x01, 0xff, 0xb6, 0x1b, 0x3d, 0x3d, 0x59, 5495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x09, 0x33, 0x79, 0xc0, 0x4f, 0xde, 0x96, 0x27, 0x4b, 0x18, 0xc6, 0xd9, 5595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x78, 0xf1, 0xf4, 0x35, 0x46, 0xe9, 0x7c, 0x42, 0x7a, 0x5d, 0x9f, 0xef, 5695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x54, 0xb8, 0xf7, 0x9f, 0xc4, 0x33, 0x6c, 0xf3, 0x8c, 0x32, 0x46, 0x87, 5795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x67, 0x30, 0x7b, 0xa7, 0xac, 0xe3, 0x02, 0x41, 0x00, 0xfc, 0x2c, 0xdf, 5895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x0c, 0x0d, 0x88, 0xf5, 0xb1, 0x92, 0xa8, 0x93, 0x47, 0x63, 0x55, 0xf5, 5995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xca, 0x58, 0x43, 0xba, 0x1c, 0xe5, 0x9e, 0xb6, 0x95, 0x05, 0xcd, 0xb5, 6095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x82, 0xdf, 0xeb, 0x04, 0x53, 0x9d, 0xbd, 0xc2, 0x38, 0x16, 0xb3, 0x62, 6195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xdd, 0xa1, 0x46, 0xdb, 0x6d, 0x97, 0x93, 0x9f, 0x8a, 0xc3, 0x9b, 0x64, 6295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x7e, 0x42, 0xe3, 0x32, 0x57, 0x19, 0x1b, 0xd5, 0x6e, 0x85, 0xfa, 0xb8, 6395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x8d, 0x02, 0x41, 0x00, 0xbc, 0x3d, 0xde, 0x6d, 0xd6, 0x97, 0xe8, 0xba, 6495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x9e, 0x81, 0x37, 0x17, 0xe5, 0xa0, 0x64, 0xc9, 0x00, 0xb7, 0xe7, 0xfe, 6595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xf4, 0x29, 0xd9, 0x2e, 0x43, 0x6b, 0x19, 0x20, 0xbd, 0x99, 0x75, 0xe7, 6695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x76, 0xf8, 0xd3, 0xae, 0xaf, 0x7e, 0xb8, 0xeb, 0x81, 0xf4, 0x9d, 0xfe, 6795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x07, 0x2b, 0x0b, 0x63, 0x0b, 0x5a, 0x55, 0x90, 0x71, 0x7d, 0xf1, 0xdb, 6895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xd9, 0xb1, 0x41, 0x41, 0x68, 0x2f, 0x4e, 0x39, 0x02, 0x40, 0x5a, 0x34, 6995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x66, 0xd8, 0xf5, 0xe2, 0x7f, 0x18, 0xb5, 0x00, 0x6e, 0x26, 0x84, 0x27, 7095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x14, 0x93, 0xfb, 0xfc, 0xc6, 0x0f, 0x5e, 0x27, 0xe6, 0xe1, 0xe9, 0xc0, 7195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x8a, 0xe4, 0x34, 0xda, 0xe9, 0xa2, 0x4b, 0x73, 0xbc, 0x8c, 0xb9, 0xba, 7295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x13, 0x6c, 0x7a, 0x2b, 0x51, 0x84, 0xa3, 0x4a, 0xe0, 0x30, 0x10, 0x06, 7395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x7e, 0xed, 0x17, 0x5a, 0x14, 0x00, 0xc9, 0xef, 0x85, 0xea, 0x52, 0x2c, 7495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xbc, 0x65, 0x02, 0x40, 0x51, 0xe3, 0xf2, 0x83, 0x19, 0x9b, 0xc4, 0x1e, 7595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x2f, 0x50, 0x3d, 0xdf, 0x5a, 0xa2, 0x18, 0xca, 0x5f, 0x2e, 0x49, 0xaf, 7695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x6f, 0xcc, 0xfa, 0x65, 0x77, 0x94, 0xb5, 0xa1, 0x0a, 0xa9, 0xd1, 0x8a, 7795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x39, 0x37, 0xf4, 0x0b, 0xa0, 0xd7, 0x82, 0x27, 0x5e, 0xae, 0x17, 0x17, 7895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xa1, 0x1e, 0x54, 0x34, 0xbf, 0x6e, 0xc4, 0x8e, 0x99, 0x5d, 0x08, 0xf1, 7995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x2d, 0x86, 0x9d, 0xa5, 0x20, 0x1b, 0xe5, 0xdf, 8095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley}; 8195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 8295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic const uint8_t kMsg[] = {1, 2, 3, 4}; 8395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 8495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic const uint8_t kSignature[] = { 8595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xa5, 0xf0, 0x8a, 0x47, 0x5d, 0x3c, 0xb3, 0xcc, 0xa9, 0x79, 0xaf, 0x4d, 8695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x8c, 0xae, 0x4c, 0x14, 0xef, 0xc2, 0x0b, 0x34, 0x36, 0xde, 0xf4, 0x3e, 8795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x3d, 0xbb, 0x4a, 0x60, 0x5c, 0xc8, 0x91, 0x28, 0xda, 0xfb, 0x7e, 0x04, 8895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x96, 0x7e, 0x63, 0x13, 0x90, 0xce, 0xb9, 0xb4, 0x62, 0x7a, 0xfd, 0x09, 8995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x3d, 0xc7, 0x67, 0x78, 0x54, 0x04, 0xeb, 0x52, 0x62, 0x6e, 0x24, 0x67, 9095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xb4, 0x40, 0xfc, 0x57, 0x62, 0xc6, 0xf1, 0x67, 0xc1, 0x97, 0x8f, 0x6a, 9195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xa8, 0xae, 0x44, 0x46, 0x5e, 0xab, 0x67, 0x17, 0x53, 0x19, 0x3a, 0xda, 9295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x5a, 0xc8, 0x16, 0x3e, 0x86, 0xd5, 0xc5, 0x71, 0x2f, 0xfc, 0x23, 0x48, 9395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xd9, 0x0b, 0x13, 0xdd, 0x7b, 0x5a, 0x25, 0x79, 0xef, 0xa5, 0x7b, 0x04, 9495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0xed, 0x44, 0xf6, 0x18, 0x55, 0xe4, 0x0a, 0xe9, 0x57, 0x79, 0x5d, 0xd7, 9595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 0x55, 0xa7, 0xab, 0x45, 0x02, 0x97, 0x60, 0x42, 9695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley}; 9795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 9895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 99c44d2f4cb8a892a603edbbe710fa82bcd30f9cb5David Benjaminint example_EVP_DigestSignInit(void) { 10095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int ret = 0; 10195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_PKEY *pkey = NULL; 10295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley RSA *rsa = NULL; 10395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley const uint8_t *derp = kExampleRSAKeyDER; 10495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley uint8_t *sig = NULL; 1059b561e69b63266a34675ad610f3da76c899c5750David Benjamin size_t sig_len = 0; 10695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_MD_CTX md_ctx; 10795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 10895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_MD_CTX_init(&md_ctx); 10995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 11095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!d2i_RSAPrivateKey(&rsa, &derp, sizeof(kExampleRSAKeyDER))) { 11195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley goto out; 11295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 11395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 11495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley pkey = EVP_PKEY_new(); 11595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley sig = malloc(sig_len); 11695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (pkey == NULL || 11795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley !EVP_PKEY_set1_RSA(pkey, rsa) || 11895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_DigestSignInit(&md_ctx, NULL, EVP_sha256(), NULL, pkey) != 1 || 1199b561e69b63266a34675ad610f3da76c899c5750David Benjamin EVP_DigestSignUpdate(&md_ctx, kMsg, sizeof(kMsg)) != 1) { 1209b561e69b63266a34675ad610f3da76c899c5750David Benjamin goto out; 1219b561e69b63266a34675ad610f3da76c899c5750David Benjamin } 1229b561e69b63266a34675ad610f3da76c899c5750David Benjamin /* Determine the size of the signature. */ 1239b561e69b63266a34675ad610f3da76c899c5750David Benjamin if (EVP_DigestSignFinal(&md_ctx, NULL, &sig_len) != 1) { 1249b561e69b63266a34675ad610f3da76c899c5750David Benjamin goto out; 1259b561e69b63266a34675ad610f3da76c899c5750David Benjamin } 1269b561e69b63266a34675ad610f3da76c899c5750David Benjamin /* Sanity check for testing. */ 1279b561e69b63266a34675ad610f3da76c899c5750David Benjamin if (sig_len != RSA_size(rsa)) { 1289b561e69b63266a34675ad610f3da76c899c5750David Benjamin fprintf(stderr, "sig_len mismatch\n"); 1299b561e69b63266a34675ad610f3da76c899c5750David Benjamin goto out; 1309b561e69b63266a34675ad610f3da76c899c5750David Benjamin } 131b2cb0ece7678586c9ca9c02dbc40069037b4f5a9Adam Langley 1329b561e69b63266a34675ad610f3da76c899c5750David Benjamin sig = malloc(sig_len); 133b2cb0ece7678586c9ca9c02dbc40069037b4f5a9Adam Langley if (sig == NULL) { 134b2cb0ece7678586c9ca9c02dbc40069037b4f5a9Adam Langley goto out; 135b2cb0ece7678586c9ca9c02dbc40069037b4f5a9Adam Langley } 136b2cb0ece7678586c9ca9c02dbc40069037b4f5a9Adam Langley if (EVP_DigestSignFinal(&md_ctx, sig, &sig_len) != 1) { 137b2cb0ece7678586c9ca9c02dbc40069037b4f5a9Adam Langley free(sig); 13895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley goto out; 13995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 1409b561e69b63266a34675ad610f3da76c899c5750David Benjamin 14195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret = 1; 14295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 14395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyout: 14495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ret) { 14595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley BIO_print_errors_fp(stderr); 14695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 14795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 14895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_MD_CTX_cleanup(&md_ctx); 14995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (pkey) { 15095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_PKEY_free(pkey); 15195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 15295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (rsa) { 15395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley RSA_free(rsa); 15495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 15595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (sig) { 15695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley free(sig); 15795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 15895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 15995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return ret; 16095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 16195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 162c44d2f4cb8a892a603edbbe710fa82bcd30f9cb5David Benjaminint example_EVP_DigestVerifyInit(void) { 16395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int ret = 0; 16495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_PKEY *pkey = NULL; 16595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley RSA *rsa = NULL; 16695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley const uint8_t *derp = kExampleRSAKeyDER; 16795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_MD_CTX md_ctx; 16895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 16995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_MD_CTX_init(&md_ctx); 17095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 17195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!d2i_RSAPrivateKey(&rsa, &derp, sizeof(kExampleRSAKeyDER))) { 17295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley goto out; 17395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 17495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 17595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley pkey = EVP_PKEY_new(); 17695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (pkey == NULL || 17795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley !EVP_PKEY_set1_RSA(pkey, rsa) || 17895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_DigestVerifyInit(&md_ctx, NULL, EVP_sha256(), NULL, pkey) != 1 || 17995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_DigestVerifyUpdate(&md_ctx, kMsg, sizeof(kMsg)) != 1 || 18095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_DigestVerifyFinal(&md_ctx, kSignature, sizeof(kSignature)) != 1) { 18195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley goto out; 18295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 18395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret = 1; 18495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 18595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyout: 18695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ret) { 18795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley BIO_print_errors_fp(stderr); 18895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 18995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 19095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_MD_CTX_cleanup(&md_ctx); 19195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (pkey) { 19295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley EVP_PKEY_free(pkey); 19395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 19495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (rsa) { 19595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley RSA_free(rsa); 19695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 19795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 19895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return ret; 19995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 20095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 201c44d2f4cb8a892a603edbbe710fa82bcd30f9cb5David Benjaminint main(void) { 202a70c75cfc0ca32a43985e3f24d737ca9cafcb910David Benjamin CRYPTO_library_init(); 203a70c75cfc0ca32a43985e3f24d737ca9cafcb910David Benjamin 20495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!example_EVP_DigestSignInit()) { 20595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley fprintf(stderr, "EVP_DigestSignInit failed\n"); 20695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 20795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 20895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 20995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!example_EVP_DigestVerifyInit()) { 21095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley fprintf(stderr, "EVP_DigestVerifyInit failed\n"); 21195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 21295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 21395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 21495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley printf("PASS\n"); 21595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 21695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley} 217