p12_utl.c revision 205128
1187770Sluigi/* p12_utl.c */ 2187770Sluigi/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3187770Sluigi * project 1999. 4187770Sluigi */ 5187770Sluigi/* ==================================================================== 6187770Sluigi * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 7187770Sluigi * 8187770Sluigi * Redistribution and use in source and binary forms, with or without 9187770Sluigi * modification, are permitted provided that the following conditions 10187770Sluigi * are met: 11187770Sluigi * 12187770Sluigi * 1. Redistributions of source code must retain the above copyright 13187770Sluigi * notice, this list of conditions and the following disclaimer. 14187770Sluigi * 15187770Sluigi * 2. Redistributions in binary form must reproduce the above copyright 16187770Sluigi * notice, this list of conditions and the following disclaimer in 17187770Sluigi * the documentation and/or other materials provided with the 18187770Sluigi * distribution. 19187770Sluigi * 20187770Sluigi * 3. All advertising materials mentioning features or use of this 21187770Sluigi * software must display the following acknowledgment: 22187770Sluigi * "This product includes software developed by the OpenSSL Project 23187770Sluigi * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 24187770Sluigi * 25187770Sluigi * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 26187770Sluigi * endorse or promote products derived from this software without 27187770Sluigi * prior written permission. For written permission, please contact 28187770Sluigi * licensing@OpenSSL.org. 29187770Sluigi * 30187770Sluigi * 5. Products derived from this software may not be called "OpenSSL" 31187770Sluigi * nor may "OpenSSL" appear in their names without prior written 32187770Sluigi * permission of the OpenSSL Project. 33187770Sluigi * 34187770Sluigi * 6. Redistributions of any form whatsoever must retain the following 35187770Sluigi * acknowledgment: 36187770Sluigi * "This product includes software developed by the OpenSSL Project 37187770Sluigi * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 38187770Sluigi * 39187770Sluigi * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 40187770Sluigi * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 41187770Sluigi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 42187770Sluigi * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 43187770Sluigi * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 44187770Sluigi * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 45187770Sluigi * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46187770Sluigi * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 47187770Sluigi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 48187770Sluigi * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 49187770Sluigi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 50187770Sluigi * OF THE POSSIBILITY OF SUCH DAMAGE. 51187770Sluigi * ==================================================================== 52187770Sluigi * 53187770Sluigi * This product includes cryptographic software written by Eric Young 54187770Sluigi * (eay@cryptsoft.com). This product includes software written by Tim 55187770Sluigi * Hudson (tjh@cryptsoft.com). 56187770Sluigi * 57187770Sluigi */ 58187770Sluigi 59187770Sluigi#include <stdio.h> 60187770Sluigi#include "cryptlib.h" 61187770Sluigi#include <openssl/pkcs12.h> 62187770Sluigi 63187770Sluigi#ifdef OPENSSL_SYS_NETWARE 64187770Sluigi/* Rename these functions to avoid name clashes on NetWare OS */ 65187770Sluigi#define uni2asc OPENSSL_uni2asc 66187770Sluigi#define asc2uni OPENSSL_asc2uni 67187770Sluigi#endif 68187770Sluigi 69187770Sluigi/* Cheap and nasty Unicode stuff */ 70187770Sluigi 71187770Sluigiunsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen) 72187770Sluigi{ 73187770Sluigi int ulen, i; 74187770Sluigi unsigned char *unitmp; 75187770Sluigi if (asclen == -1) asclen = strlen(asc); 76187770Sluigi ulen = asclen*2 + 2; 77187770Sluigi if (!(unitmp = OPENSSL_malloc(ulen))) return NULL; 78187770Sluigi for (i = 0; i < ulen - 2; i+=2) { 79187770Sluigi unitmp[i] = 0; 80187770Sluigi unitmp[i + 1] = asc[i>>1]; 81187770Sluigi } 82187770Sluigi /* Make result double null terminated */ 83187770Sluigi unitmp[ulen - 2] = 0; 84187770Sluigi unitmp[ulen - 1] = 0; 85187770Sluigi if (unilen) *unilen = ulen; 86187770Sluigi if (uni) *uni = unitmp; 87187770Sluigi return unitmp; 88187770Sluigi} 89187770Sluigi 90187770Sluigichar *uni2asc(unsigned char *uni, int unilen) 91187770Sluigi{ 92187770Sluigi int asclen, i; 93187770Sluigi char *asctmp; 94187770Sluigi asclen = unilen / 2; 95187770Sluigi /* If no terminating zero allow for one */ 96187770Sluigi if (!unilen || uni[unilen - 1]) asclen++; 97187770Sluigi uni++; 98187770Sluigi if (!(asctmp = OPENSSL_malloc(asclen))) return NULL; 99187770Sluigi for (i = 0; i < unilen; i+=2) asctmp[i>>1] = uni[i]; 100187770Sluigi asctmp[asclen - 1] = 0; 101187770Sluigi return asctmp; 102187770Sluigi} 103187770Sluigi 104187770Sluigiint i2d_PKCS12_bio(BIO *bp, PKCS12 *p12) 105187770Sluigi{ 106187770Sluigi return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS12), bp, p12); 107187770Sluigi} 108187770Sluigi 109187770Sluigi#ifndef OPENSSL_NO_FP_API 110187770Sluigiint i2d_PKCS12_fp(FILE *fp, PKCS12 *p12) 111187770Sluigi{ 112187770Sluigi return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS12), fp, p12); 113187770Sluigi} 114187770Sluigi#endif 115187770Sluigi 116187770SluigiPKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12) 117187770Sluigi{ 118187770Sluigi return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS12), bp, p12); 119187770Sluigi} 120187770Sluigi#ifndef OPENSSL_NO_FP_API 121187770SluigiPKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12) 122187770Sluigi{ 123187770Sluigi return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS12), fp, p12); 124187770Sluigi} 125187770Sluigi#endif 126187770Sluigi 127187770SluigiPKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509) 128187770Sluigi{ 129187770Sluigi return PKCS12_item_pack_safebag(x509, ASN1_ITEM_rptr(X509), 130187770Sluigi NID_x509Certificate, NID_certBag); 131187770Sluigi} 132187770Sluigi 133187770SluigiPKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl) 134187770Sluigi{ 135187770Sluigi return PKCS12_item_pack_safebag(crl, ASN1_ITEM_rptr(X509_CRL), 136187770Sluigi NID_x509Crl, NID_crlBag); 137187770Sluigi} 138187770Sluigi 139187770SluigiX509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag) 140187770Sluigi{ 141187770Sluigi if(M_PKCS12_bag_type(bag) != NID_certBag) return NULL; 142187770Sluigi if(M_PKCS12_cert_bag_type(bag) != NID_x509Certificate) return NULL; 143187770Sluigi return ASN1_item_unpack(bag->value.bag->value.octet, ASN1_ITEM_rptr(X509)); 144187770Sluigi} 145187770Sluigi 146187770SluigiX509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag) 147187770Sluigi{ 148187770Sluigi if(M_PKCS12_bag_type(bag) != NID_crlBag) return NULL; 149187770Sluigi if(M_PKCS12_cert_bag_type(bag) != NID_x509Crl) return NULL; 150187770Sluigi return ASN1_item_unpack(bag->value.bag->value.octet, 151187770Sluigi ASN1_ITEM_rptr(X509_CRL)); 152187770Sluigi} 153187770Sluigi