certificate: currently this includes trust settings and a "friendly name".master
@ -0,0 +1,99 @@ | |||
/* t_bitst.c */ | |||
/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | |||
* project 1999. | |||
*/ | |||
/* ==================================================================== | |||
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. All advertising materials mentioning features or use of this | |||
* software must display the following acknowledgment: | |||
* "This product includes software developed by the OpenSSL Project | |||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | |||
* | |||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | |||
* endorse or promote products derived from this software without | |||
* prior written permission. For written permission, please contact | |||
* licensing@OpenSSL.org. | |||
* | |||
* 5. Products derived from this software may not be called "OpenSSL" | |||
* nor may "OpenSSL" appear in their names without prior written | |||
* permission of the OpenSSL Project. | |||
* | |||
* 6. Redistributions of any form whatsoever must retain the following | |||
* acknowledgment: | |||
* "This product includes software developed by the OpenSSL Project | |||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | |||
* | |||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | |||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||
* OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This product includes cryptographic software written by Eric Young | |||
* (eay@cryptsoft.com). This product includes software written by Tim | |||
* Hudson (tjh@cryptsoft.com). | |||
* | |||
*/ | |||
#include <stdio.h> | |||
#include "cryptlib.h" | |||
#include <openssl/conf.h> | |||
#include <openssl/x509v3.h> | |||
int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs, | |||
BIT_STRING_BITNAME *tbl, int indent) | |||
{ | |||
BIT_STRING_BITNAME *bnam; | |||
char first = 1; | |||
BIO_printf(out, "%*s", indent, ""); | |||
for(bnam = tbl; bnam->lname; bnam++) { | |||
if(ASN1_BIT_STRING_get_bit(bs, bnam->bitnum)) { | |||
if(!first) BIO_puts(out, ", "); | |||
BIO_puts(out, bnam->lname); | |||
first = 0; | |||
} | |||
} | |||
BIO_puts(out, "\n"); | |||
return 1; | |||
} | |||
int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value, | |||
BIT_STRING_BITNAME *tbl) | |||
{ | |||
int bitnum; | |||
bitnum = ASN1_BIT_STRING_num_asc(name, tbl); | |||
if(bitnum < 0) return 0; | |||
if(bs) ASN1_BIT_STRING_set_bit(bs, bitnum, value); | |||
return 1; | |||
} | |||
int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl) | |||
{ | |||
BIT_STRING_BITNAME *bnam; | |||
for(bnam = tbl; bnam->lname; bnam++) { | |||
if(!strcmp(bnam->sname, name) || | |||
!strcmp(bnam->lname, name) ) return bnam->bitnum; | |||
} | |||
return -1; | |||
} |
@ -0,0 +1,138 @@ | |||
/* t_x509a.c */ | |||
/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | |||
* project 1999. | |||
*/ | |||
/* ==================================================================== | |||
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. All advertising materials mentioning features or use of this | |||
* software must display the following acknowledgment: | |||
* "This product includes software developed by the OpenSSL Project | |||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | |||
* | |||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | |||
* endorse or promote products derived from this software without | |||
* prior written permission. For written permission, please contact | |||
* licensing@OpenSSL.org. | |||
* | |||
* 5. Products derived from this software may not be called "OpenSSL" | |||
* nor may "OpenSSL" appear in their names without prior written | |||
* permission of the OpenSSL Project. | |||
* | |||
* 6. Redistributions of any form whatsoever must retain the following | |||
* acknowledgment: | |||
* "This product includes software developed by the OpenSSL Project | |||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | |||
* | |||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | |||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||
* OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This product includes cryptographic software written by Eric Young | |||
* (eay@cryptsoft.com). This product includes software written by Tim | |||
* Hudson (tjh@cryptsoft.com). | |||
* | |||
*/ | |||
#include <stdio.h> | |||
#include "cryptlib.h" | |||
#include <openssl/evp.h> | |||
#include <openssl/asn1_mac.h> | |||
#include <openssl/x509.h> | |||
/* X509_CERT_AUX and string set routines | |||
*/ | |||
static BIT_STRING_BITNAME tbits[] = { | |||
{X509_TRUST_ALL, "All Purposes", "all"}, | |||
{X509_TRUST_SSL_CLIENT, "SSL client", "sslclient"}, | |||
{X509_TRUST_SSL_SERVER, "SSL server", "sslserver"}, | |||
{X509_TRUST_EMAIL, "S/MIME email", "email"}, | |||
{X509_TRUST_OBJECT_SIGN, "Object Signing", "objsign"}, | |||
{-1, NULL, NULL} | |||
}; | |||
int X509_trust_set_bit_asc(X509 *x, char *str, int value) | |||
{ | |||
int bitnum; | |||
bitnum = ASN1_BIT_STRING_num_asc(str, tbits); | |||
if(bitnum < 0) return 0; | |||
if(x) return X509_trust_set_bit(x, bitnum, value); | |||
return 1; | |||
} | |||
int X509_notrust_set_bit_asc(X509 *x, char *str, int value) | |||
{ | |||
int bitnum; | |||
bitnum = ASN1_BIT_STRING_num_asc(str, tbits); | |||
if(bitnum < 0) return 0; | |||
if(x) return X509_notrust_set_bit(x, bitnum, value); | |||
return 1; | |||
} | |||
int X509_CERT_AUX_print(BIO *out, X509_CERT_AUX *aux, int indent) | |||
{ | |||
char oidstr[80], first; | |||
int i; | |||
if(!aux) return 1; | |||
if(aux->trust) { | |||
BIO_printf(out, "%*sTrusted for:\n", indent, ""); | |||
ASN1_BIT_STRING_name_print(out, aux->trust, tbits, indent + 2); | |||
} else BIO_printf(out, "%*sNo Trust Settings\n", indent + 2, ""); | |||
if(aux->notrust) { | |||
BIO_printf(out, "%*sUntrusted for:\n", indent, ""); | |||
ASN1_BIT_STRING_name_print(out, aux->notrust, tbits, indent + 2); | |||
} else BIO_printf(out, "%*sNo Untrusted Settings\n", indent + 2, ""); | |||
if(aux->othertrust) { | |||
first = 1; | |||
BIO_printf(out, "%*sOther Trusted Uses:\n%*s", | |||
indent, "", indent + 2, ""); | |||
for(i = 0; i < sk_ASN1_OBJECT_num(aux->othertrust); i++) { | |||
if(!first) BIO_puts(out, ", "); | |||
else first = 0; | |||
OBJ_obj2txt(oidstr, 80, | |||
sk_ASN1_OBJECT_value(aux->othertrust, i), 0); | |||
BIO_puts(out, oidstr); | |||
} | |||
BIO_puts(out, "\n"); | |||
} | |||
if(aux->othernotrust) { | |||
first = 1; | |||
BIO_printf(out, "%*sOther Untrusted Uses:\n%*s", | |||
indent, "", indent + 2, ""); | |||
for(i = 0; i < sk_ASN1_OBJECT_num(aux->othernotrust); i++) { | |||
if(!first) BIO_puts(out, ", "); | |||
else first = 0; | |||
OBJ_obj2txt(oidstr, 80, | |||
sk_ASN1_OBJECT_value(aux->othernotrust, i), 0); | |||
BIO_puts(out, oidstr); | |||
} | |||
BIO_puts(out, "\n"); | |||
} | |||
if(aux->alias) BIO_printf(out, "%*sAlias: %s\n", indent, "", | |||
aux->alias->data); | |||
return 1; | |||
} |
@ -0,0 +1,218 @@ | |||
/* a_x509a.c */ | |||
/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL | |||
* project 1999. | |||
*/ | |||
/* ==================================================================== | |||
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. All advertising materials mentioning features or use of this | |||
* software must display the following acknowledgment: | |||
* "This product includes software developed by the OpenSSL Project | |||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" | |||
* | |||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | |||
* endorse or promote products derived from this software without | |||
* prior written permission. For written permission, please contact | |||
* licensing@OpenSSL.org. | |||
* | |||
* 5. Products derived from this software may not be called "OpenSSL" | |||
* nor may "OpenSSL" appear in their names without prior written | |||
* permission of the OpenSSL Project. | |||
* | |||
* 6. Redistributions of any form whatsoever must retain the following | |||
* acknowledgment: | |||
* "This product includes software developed by the OpenSSL Project | |||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" | |||
* | |||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | |||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||
* OF THE POSSIBILITY OF SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This product includes cryptographic software written by Eric Young | |||
* (eay@cryptsoft.com). This product includes software written by Tim | |||
* Hudson (tjh@cryptsoft.com). | |||
* | |||
*/ | |||
#include <stdio.h> | |||
#include "cryptlib.h" | |||
#include <openssl/evp.h> | |||
#include <openssl/asn1_mac.h> | |||
#include <openssl/x509.h> | |||
/* X509_CERT_AUX routines. These are used to encode additional | |||
* user modifiable data about a certificate. This data is | |||
* appended to the X509 encoding when the *_X509_AUX routines | |||
* are used. This means that the "traditional" X509 routines | |||
* will simply ignore the extra data. | |||
*/ | |||
static X509_CERT_AUX *aux_get(X509 *x); | |||
X509_CERT_AUX *d2i_X509_CERT_AUX(X509_CERT_AUX **a, unsigned char **pp, long length) | |||
{ | |||
M_ASN1_D2I_vars(a, X509_CERT_AUX *, X509_CERT_AUX_new); | |||
M_ASN1_D2I_Init(); | |||
M_ASN1_D2I_start_sequence(); | |||
M_ASN1_D2I_get_opt(ret->trust, d2i_ASN1_BIT_STRING, | |||
V_ASN1_BIT_STRING); | |||
M_ASN1_D2I_get_IMP_opt(ret->notrust, d2i_ASN1_BIT_STRING,0, | |||
V_ASN1_BIT_STRING); | |||
M_ASN1_D2I_get_seq_opt_type(ASN1_OBJECT, ret->othertrust, | |||
d2i_ASN1_OBJECT, ASN1_OBJECT_free); | |||
M_ASN1_D2I_get_IMP_set_opt_type(ASN1_OBJECT, ret->othernotrust, | |||
d2i_ASN1_OBJECT, ASN1_OBJECT_free, 1); | |||
M_ASN1_D2I_get_opt(ret->alias, d2i_ASN1_UTF8STRING, V_ASN1_UTF8STRING); | |||
M_ASN1_D2I_get_opt(ret->other, d2i_ASN1_TYPE, V_ASN1_SEQUENCE); | |||
M_ASN1_D2I_Finish(a, X509_CERT_AUX_free, ASN1_F_D2I_X509_CERT_AUX); | |||
} | |||
X509_CERT_AUX *X509_CERT_AUX_new() | |||
{ | |||
X509_CERT_AUX *ret = NULL; | |||
ASN1_CTX c; | |||
M_ASN1_New_Malloc(ret, X509_CERT_AUX); | |||
ret->trust = NULL; | |||
ret->notrust = NULL; | |||
ret->othertrust = NULL; | |||
ret->othernotrust = NULL; | |||
ret->alias = NULL; | |||
ret->other = NULL; | |||
return(ret); | |||
M_ASN1_New_Error(ASN1_F_X509_CERT_AUX_NEW); | |||
} | |||
void X509_CERT_AUX_free(X509_CERT_AUX *a) | |||
{ | |||
if(a == NULL) return; | |||
ASN1_BIT_STRING_free(a->trust); | |||
ASN1_BIT_STRING_free(a->notrust); | |||
sk_ASN1_OBJECT_pop_free(a->othertrust, ASN1_OBJECT_free); | |||
sk_ASN1_OBJECT_pop_free(a->othernotrust, ASN1_OBJECT_free); | |||
ASN1_UTF8STRING_free(a->alias); | |||
ASN1_TYPE_free(a->other); | |||
} | |||
int i2d_X509_CERT_AUX(X509_CERT_AUX *a, unsigned char **pp) | |||
{ | |||
M_ASN1_I2D_vars(a); | |||
M_ASN1_I2D_len(a->trust, i2d_ASN1_BIT_STRING); | |||
M_ASN1_I2D_len_IMP_opt(a->notrust, i2d_ASN1_BIT_STRING); | |||
M_ASN1_I2D_len_SEQUENCE_opt_type(ASN1_OBJECT, a->othertrust, i2d_ASN1_OBJECT); | |||
M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(ASN1_OBJECT, a->othernotrust, i2d_ASN1_OBJECT, 1); | |||
M_ASN1_I2D_len(a->alias, i2d_ASN1_UTF8STRING); | |||
M_ASN1_I2D_len(a->other, i2d_ASN1_TYPE); | |||
M_ASN1_I2D_seq_total(); | |||
M_ASN1_I2D_put(a->trust, i2d_ASN1_BIT_STRING); | |||
M_ASN1_I2D_put_IMP_opt(a->notrust, i2d_ASN1_BIT_STRING, 0); | |||
M_ASN1_I2D_put_SEQUENCE_opt_type(ASN1_OBJECT, a->othertrust, i2d_ASN1_OBJECT); | |||
M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(ASN1_OBJECT, a->othernotrust, i2d_ASN1_OBJECT, 1); | |||
M_ASN1_I2D_put(a->alias, i2d_ASN1_UTF8STRING); | |||
M_ASN1_I2D_put(a->other, i2d_ASN1_TYPE); | |||
M_ASN1_I2D_finish(); | |||
} | |||
static X509_CERT_AUX *aux_get(X509 *x) | |||
{ | |||
if(!x) return NULL; | |||
if(!x->aux && !(x->aux = X509_CERT_AUX_new())) return NULL; | |||
return x->aux; | |||
} | |||
int X509_alias_set(X509 *x, unsigned char *name, int len) | |||
{ | |||
X509_CERT_AUX *aux; | |||
if(!(aux = aux_get(x))) return 0; | |||
if(!aux->alias && !(aux->alias = ASN1_UTF8STRING_new())) return 0; | |||
return ASN1_STRING_set(aux->alias, name, len); | |||
} | |||
unsigned char *X509_alias_get(X509 *x, int *len) | |||
{ | |||
if(!x->aux || !x->aux->alias) return NULL; | |||
if(len) *len = x->aux->alias->length; | |||
return x->aux->alias->data; | |||
} | |||
int X509_trust_set_bit(X509 *x, int bit, int value) | |||
{ | |||
X509_CERT_AUX *aux; | |||
if(bit == -1) { | |||
if(x->aux && x->aux->trust) { | |||
ASN1_BIT_STRING_free(x->aux->trust); | |||
x->aux->trust = NULL; | |||
} | |||
return 1; | |||
} | |||
if(!(aux = aux_get(x))) return 0; | |||
if(!aux->trust && !(aux->trust = ASN1_BIT_STRING_new())) return 0; | |||
return ASN1_BIT_STRING_set_bit(aux->trust, bit, value); | |||
} | |||
int X509_notrust_set_bit(X509 *x, int bit, int value) | |||
{ | |||
X509_CERT_AUX *aux; | |||
if(bit == -1) { | |||
if(x->aux && x->aux->notrust) { | |||
ASN1_BIT_STRING_free(x->aux->notrust); | |||
x->aux->notrust = NULL; | |||
} | |||
return 1; | |||
} | |||
if(!(aux = aux_get(x))) return 0; | |||
if(!aux->notrust && !(aux->notrust = ASN1_BIT_STRING_new())) return 0; | |||
return ASN1_BIT_STRING_set_bit(aux->notrust, bit, value); | |||
} | |||
int X509_add_trust_object(X509 *x, ASN1_OBJECT *obj) | |||
{ | |||
X509_CERT_AUX *aux; | |||
if(!(aux = aux_get(x))) return 0; | |||
if(!aux->othertrust | |||
&& !(aux->othertrust = sk_ASN1_OBJECT_new_null())) return 0; | |||
return sk_ASN1_OBJECT_push(aux->othertrust, obj); | |||
} | |||
int X509_add_notrust_object(X509 *x, ASN1_OBJECT *obj) | |||
{ | |||
X509_CERT_AUX *aux; | |||
if(!(aux = aux_get(x))) return 0; | |||
if(!aux->othernotrust | |||
&& !(aux->othernotrust = sk_ASN1_OBJECT_new_null())) return 0; | |||
return sk_ASN1_OBJECT_push(aux->othernotrust, obj); | |||
} | |||