x509spki.c revision 59191
156083Skris/* x509spki.c */ 256083Skris/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL 3194206Ssimon * project 1999. 456083Skris */ 556083Skris/* ==================================================================== 656083Skris * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 756083Skris * 856083Skris * Redistribution and use in source and binary forms, with or without 956083Skris * modification, are permitted provided that the following conditions 10296465Sdelphij * are met: 1156083Skris * 1256083Skris * 1. Redistributions of source code must retain the above copyright 1356083Skris * notice, this list of conditions and the following disclaimer. 1456083Skris * 1556083Skris * 2. Redistributions in binary form must reproduce the above copyright 1656083Skris * notice, this list of conditions and the following disclaimer in 1756083Skris * the documentation and/or other materials provided with the 1856083Skris * distribution. 1956083Skris * 2056083Skris * 3. All advertising materials mentioning features or use of this 2156083Skris * software must display the following acknowledgment: 2256083Skris * "This product includes software developed by the OpenSSL Project 2356083Skris * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 2456083Skris * 2556083Skris * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 2656083Skris * endorse or promote products derived from this software without 2756083Skris * prior written permission. For written permission, please contact 2856083Skris * licensing@OpenSSL.org. 2956083Skris * 3056083Skris * 5. Products derived from this software may not be called "OpenSSL" 3156083Skris * nor may "OpenSSL" appear in their names without prior written 3256083Skris * permission of the OpenSSL Project. 3356083Skris * 3456083Skris * 6. Redistributions of any form whatsoever must retain the following 3556083Skris * acknowledgment: 3656083Skris * "This product includes software developed by the OpenSSL Project 3756083Skris * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 3856083Skris * 3956083Skris * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 4056083Skris * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4156083Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 4256083Skris * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 4356083Skris * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4456083Skris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 4556083Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 4656083Skris * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4756083Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 4856083Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 4956083Skris * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 5056083Skris * OF THE POSSIBILITY OF SUCH DAMAGE. 5156083Skris * ==================================================================== 5256083Skris * 5356083Skris * This product includes cryptographic software written by Eric Young 5456083Skris * (eay@cryptsoft.com). This product includes software written by Tim 5556083Skris * Hudson (tjh@cryptsoft.com). 56296465Sdelphij * 57296465Sdelphij */ 5859191Skris 5959191Skris#include <stdio.h> 6056083Skris#include "cryptlib.h" 6156083Skris#include <openssl/x509.h> 6256083Skris#include <openssl/asn1_mac.h> 6356083Skris 6456083Skrisint NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey) 6556083Skris{ 6656083Skris if ((x == NULL) || (x->spkac == NULL)) return(0); 67109998Smarkm return(X509_PUBKEY_set(&(x->spkac->pubkey),pkey)); 68160814Ssimon} 69296465Sdelphij 70296465SdelphijEVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x) 71160814Ssimon{ 72296465Sdelphij if ((x == NULL) || (x->spkac == NULL)) 73296465Sdelphij return(NULL); 74296465Sdelphij return(X509_PUBKEY_get(x->spkac->pubkey)); 75296465Sdelphij} 76296465Sdelphij 77296465Sdelphij/* Load a Netscape SPKI from a base64 encoded string */ 78296465Sdelphij 79296465SdelphijNETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len) 80296465Sdelphij{ 81296465Sdelphij unsigned char *spki_der, *p; 82296465Sdelphij int spki_len; 83296465Sdelphij NETSCAPE_SPKI *spki; 84296465Sdelphij if(len <= 0) len = strlen(str); 85296465Sdelphij if (!(spki_der = Malloc(len + 1))) { 86296465Sdelphij X509err(X509_F_NETSCAPE_SPKI_B64_DECODE, ERR_R_MALLOC_FAILURE); 87296465Sdelphij return NULL; 88296465Sdelphij } 89296465Sdelphij spki_len = EVP_DecodeBlock(spki_der, (const unsigned char *)str, len); 90296465Sdelphij if(spki_len < 0) { 91296465Sdelphij X509err(X509_F_NETSCAPE_SPKI_B64_DECODE, 92296465Sdelphij X509_R_BASE64_DECODE_ERROR); 93296465Sdelphij Free(spki_der); 94296465Sdelphij return NULL; 95296465Sdelphij } 96296465Sdelphij p = spki_der; 97296465Sdelphij spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len); 98296465Sdelphij Free(spki_der); 99296465Sdelphij return spki; 100296465Sdelphij} 101296465Sdelphij 102296465Sdelphij/* Generate a base64 encoded string from an SPKI */ 103296465Sdelphij 104296465Sdelphijchar * NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki) 105296465Sdelphij{ 106296465Sdelphij unsigned char *der_spki, *p; 107296465Sdelphij char *b64_str; 108296465Sdelphij int der_len; 109296465Sdelphij der_len = i2d_NETSCAPE_SPKI(spki, NULL); 110296465Sdelphij der_spki = Malloc(der_len); 111296465Sdelphij b64_str = Malloc(der_len * 2); 112296465Sdelphij if(!der_spki || !b64_str) { 113296465Sdelphij X509err(X509_F_NETSCAPE_SPKI_B64_ENCODE, ERR_R_MALLOC_FAILURE); 114296465Sdelphij return NULL; 115296465Sdelphij } 116296465Sdelphij p = der_spki; 117296465Sdelphij i2d_NETSCAPE_SPKI(spki, &p); 118296465Sdelphij EVP_EncodeBlock((unsigned char *)b64_str, der_spki, der_len); 119296465Sdelphij Free(der_spki); 120296465Sdelphij return b64_str; 121296465Sdelphij} 122296465Sdelphij