1 /* Written by Dr Stephen N Henson (steve (at) openssl.org) for the OpenSSL 2 * project 2000. */ 3 /* ==================================================================== 4 * Copyright (c) 2000 The OpenSSL Project. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * 3. All advertising materials mentioning features or use of this 19 * software must display the following acknowledgment: 20 * "This product includes software developed by the OpenSSL Project 21 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 22 * 23 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 24 * endorse or promote products derived from this software without 25 * prior written permission. For written permission, please contact 26 * licensing (at) OpenSSL.org. 27 * 28 * 5. Products derived from this software may not be called "OpenSSL" 29 * nor may "OpenSSL" appear in their names without prior written 30 * permission of the OpenSSL Project. 31 * 32 * 6. Redistributions of any form whatsoever must retain the following 33 * acknowledgment: 34 * "This product includes software developed by the OpenSSL Project 35 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 36 * 37 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 38 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 39 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 40 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 43 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 44 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 45 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 46 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 47 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 48 * OF THE POSSIBILITY OF SUCH DAMAGE. 49 * ==================================================================== 50 * 51 * This product includes cryptographic software written by Eric Young 52 * (eay (at) cryptsoft.com). This product includes software written by Tim 53 * Hudson (tjh (at) cryptsoft.com). */ 54 55 #include <openssl/x509.h> 56 57 #include <openssl/asn1.h> 58 #include <openssl/asn1t.h> 59 #include <openssl/digest.h> 60 #include <openssl/obj.h> 61 62 63 ASN1_SEQUENCE(X509_ALGOR) = { 64 ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT), 65 ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY) 66 } ASN1_SEQUENCE_END(X509_ALGOR) 67 68 ASN1_ITEM_TEMPLATE(X509_ALGORS) = 69 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, algorithms, X509_ALGOR) 70 ASN1_ITEM_TEMPLATE_END(X509_ALGORS) 71 72 IMPLEMENT_ASN1_FUNCTIONS(X509_ALGOR) 73 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_ALGORS, X509_ALGORS, X509_ALGORS) 74 IMPLEMENT_ASN1_DUP_FUNCTION(X509_ALGOR) 75 76 IMPLEMENT_ASN1_SET_OF(X509_ALGOR) 77 78 int X509_ALGOR_set0(X509_ALGOR *alg, const ASN1_OBJECT *aobj, int ptype, void *pval) 79 { 80 if (!alg) 81 return 0; 82 if (ptype != V_ASN1_UNDEF) 83 { 84 if (alg->parameter == NULL) 85 alg->parameter = ASN1_TYPE_new(); 86 if (alg->parameter == NULL) 87 return 0; 88 } 89 if (alg) 90 { 91 if (alg->algorithm) 92 ASN1_OBJECT_free(alg->algorithm); 93 alg->algorithm = (ASN1_OBJECT*) aobj; 94 } 95 if (ptype == 0) 96 return 1; 97 if (ptype == V_ASN1_UNDEF) 98 { 99 if (alg->parameter) 100 { 101 ASN1_TYPE_free(alg->parameter); 102 alg->parameter = NULL; 103 } 104 } 105 else 106 ASN1_TYPE_set(alg->parameter, ptype, pval); 107 return 1; 108 } 109 110 void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, 111 X509_ALGOR *algor) 112 { 113 if (paobj) 114 *paobj = algor->algorithm; 115 if (pptype) 116 { 117 if (algor->parameter == NULL) 118 { 119 *pptype = V_ASN1_UNDEF; 120 return; 121 } 122 else 123 *pptype = algor->parameter->type; 124 if (ppval) 125 *ppval = algor->parameter->value.ptr; 126 } 127 } 128 129 /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */ 130 131 void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md) 132 { 133 int param_type; 134 135 if (EVP_MD_flags(md) & EVP_MD_FLAG_DIGALGID_ABSENT) 136 param_type = V_ASN1_UNDEF; 137 else 138 param_type = V_ASN1_NULL; 139 140 X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); 141 142 } 143 144 /* X509_ALGOR_cmp returns 0 if |a| and |b| are equal and non-zero otherwise. */ 145 int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) 146 { 147 int rv; 148 rv = OBJ_cmp(a->algorithm, b->algorithm); 149 if (rv) 150 return rv; 151 if (!a->parameter && !b->parameter) 152 return 0; 153 return ASN1_TYPE_cmp(a->parameter, b->parameter); 154 } 155