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