1221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * project 2006. 3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* ==================================================================== 5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Redistribution and use in source and binary forms, with or without 8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * modification, are permitted provided that the following conditions 9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * are met: 10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 1. Redistributions of source code must retain the above copyright 12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * notice, this list of conditions and the following disclaimer. 13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 2. Redistributions in binary form must reproduce the above copyright 15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * notice, this list of conditions and the following disclaimer in 16221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * the documentation and/or other materials provided with the 17221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * distribution. 18221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 19221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 3. All advertising materials mentioning features or use of this 20221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * software must display the following acknowledgment: 21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * "This product includes software developed by the OpenSSL Project 22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * endorse or promote products derived from this software without 26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * prior written permission. For written permission, please contact 27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * licensing@OpenSSL.org. 28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 5. Products derived from this software may not be called "OpenSSL" 30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * nor may "OpenSSL" appear in their names without prior written 31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * permission of the OpenSSL Project. 32221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 6. Redistributions of any form whatsoever must retain the following 34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * acknowledgment: 35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * "This product includes software developed by the OpenSSL Project 36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 40221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 41221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 44221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 45221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 46221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 47221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 48221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 49221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * OF THE POSSIBILITY OF SUCH DAMAGE. 50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ==================================================================== 51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * This product includes cryptographic software written by Eric Young 53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * (eay@cryptsoft.com). This product includes software written by Tim 54221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Hudson (tjh@cryptsoft.com). 55221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * 56221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <stdio.h> 59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include "cryptlib.h" 60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/x509.h> 61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/asn1.h> 62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/dsa.h> 63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/bn.h> 64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_CMS 65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/cms.h> 66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include "asn1_locl.h" 68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey) 70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *p, *pm; 72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int pklen, pmlen; 73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int ptype; 74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *pval; 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING *pstr; 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR *palg; 77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER *public_key = NULL; 78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA *dsa = NULL; 80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey)) 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR_get0(NULL, &ptype, &pval, palg); 84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ptype == V_ASN1_SEQUENCE) 87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pstr = pval; 89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pm = pstr->data; 90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pmlen = pstr->length; 91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen))) 93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR); 95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if ((ptype == V_ASN1_NULL) || (ptype == V_ASN1_UNDEF)) 100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa = DSA_new())) 102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_DECODE, ERR_R_MALLOC_FAILURE); 104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_PARAMETER_ENCODING_ERROR); 110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(public_key=d2i_ASN1_INTEGER(NULL, &p, pklen))) 114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR); 116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa->pub_key = ASN1_INTEGER_to_BN(public_key, NULL))) 120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_BN_DECODE_ERROR); 122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(public_key); 126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_assign_DSA(pkey, dsa); 127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (public_key) 131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(public_key); 132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (dsa) 133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA_free(dsa); 134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey) 139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA *dsa; 141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *pval = NULL; 142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int ptype; 143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned char *penc = NULL; 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int penclen; 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa=pkey->pkey.dsa; 147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pkey->save_parameters && dsa->p && dsa->q && dsa->g) 148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING *str; 150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str = ASN1_STRING_new(); 151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom str->length = i2d_DSAparams(dsa, &str->data); 152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (str->length <= 0) 153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE); 155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pval = str; 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ptype = V_ASN1_SEQUENCE; 159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ptype = V_ASN1_UNDEF; 162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa->write_params=0; 164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom penclen = i2d_DSAPublicKey(dsa, &penc); 166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (penclen <= 0) 168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE); 170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_DSA), 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ptype, pval, penc, penclen)) 175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (penc) 179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(penc); 180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pval) 181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING_free(pval); 182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* In PKCS#8 DSA: you just get a private key integer and parameters in the 187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * AlgorithmIdentifier the pubkey must be recalculated. 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8) 191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *p, *pm; 193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int pklen, pmlen; 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int ptype; 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void *pval; 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING *pstr; 197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR *palg; 198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER *privkey = NULL; 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_CTX *ctx = NULL; 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(ASN1_TYPE) *ndsa = NULL; 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA *dsa = NULL; 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8)) 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR_get0(NULL, &ptype, &pval, palg); 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Check for broken DSA PKCS#8, UGH! */ 209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (*p == (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED)) 210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_TYPE *t1, *t2; 2123d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom if(!(ndsa = d2i_ASN1_SEQUENCE_ANY(NULL, &p, pklen))) 213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sk_ASN1_TYPE_num(ndsa) != 2) 215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Handle Two broken types: 217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * SEQUENCE {parameters, priv_key} 218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * SEQUENCE {pub_key, priv_key} 219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t1 = sk_ASN1_TYPE_value(ndsa, 0); 222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t2 = sk_ASN1_TYPE_value(ndsa, 1); 223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (t1->type == V_ASN1_SEQUENCE) 224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p8->broken = PKCS8_EMBEDDED_PARAM; 226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pval = t1->value.ptr; 227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (ptype == V_ASN1_SEQUENCE) 229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p8->broken = PKCS8_NS_DB; 230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (t2->type != V_ASN1_INTEGER) 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom privkey = t2->value.integer; 237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *q = p; 241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(privkey=d2i_ASN1_INTEGER(NULL, &p, pklen))) 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (privkey->type == V_ASN1_NEG_INTEGER) 244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p8->broken = PKCS8_NEG_PRIVKEY; 246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(privkey); 247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(privkey=d2i_ASN1_UINTEGER(NULL, &q, pklen))) 248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ptype != V_ASN1_SEQUENCE) 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pstr = pval; 255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pm = pstr->data; 256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pmlen = pstr->length; 257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen))) 258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto decerr; 259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* We have parameters now set private key */ 260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa->priv_key = ASN1_INTEGER_to_BN(privkey, NULL))) 261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_DECODE,DSA_R_BN_ERROR); 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto dsaerr; 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Calculate public key */ 266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa->pub_key = BN_new())) 267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE); 269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto dsaerr; 270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(ctx = BN_CTX_new())) 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE); 274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto dsaerr; 275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx)) 278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_DECODE,DSA_R_BN_ERROR); 280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto dsaerr; 281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_assign_DSA(pkey, dsa); 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_CTX_free (ctx); 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(ndsa) 286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); 287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(privkey); 289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom decerr: 293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_DECODE, EVP_R_DECODE_ERROR); 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsaerr: 295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_CTX_free (ctx); 296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (privkey) 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(privkey); 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA_free(dsa); 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) 304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ 305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING *params = NULL; 306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER *prkey = NULL; 307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned char *dp = NULL; 308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int dplen; 309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 310c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if (!pkey->pkey.dsa || !pkey->pkey.dsa->priv_key) 311c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root { 312c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root DSAerr(DSA_F_DSA_PRIV_ENCODE,DSA_R_MISSING_PARAMETERS); 313c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root goto err; 314c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root } 315c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root 316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom params = ASN1_STRING_new(); 317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!params) 319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE); 321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom params->length = i2d_DSAparams(pkey->pkey.dsa, ¶ms->data); 325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (params->length <= 0) 326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE); 328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom params->type = V_ASN1_SEQUENCE; 331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Get private key into integer */ 333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom prkey = BN_to_ASN1_INTEGER(pkey->pkey.dsa->priv_key, NULL); 334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!prkey) 336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PRIV_ENCODE,DSA_R_BN_ERROR); 338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dplen = i2d_ASN1_INTEGER(prkey, &dp); 342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(prkey); 344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 345221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0, 346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom V_ASN1_SEQUENCE, params, dp, dplen)) 347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromerr: 352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (dp != NULL) 353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(dp); 354221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (params != NULL) 355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_STRING_free(params); 356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (prkey != NULL) 357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_INTEGER_free(prkey); 358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int int_dsa_size(const EVP_PKEY *pkey) 362221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(DSA_size(pkey->pkey.dsa)); 364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_bits(const EVP_PKEY *pkey) 367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return BN_num_bits(pkey->pkey.dsa->p); 369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_missing_parameters(const EVP_PKEY *pkey) 372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA *dsa; 374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa=pkey->pkey.dsa; 375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL)) 376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from) 381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIGNUM *a; 383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((a=BN_dup(from->pkey.dsa->p)) == NULL) 385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (to->pkey.dsa->p != NULL) 387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_free(to->pkey.dsa->p); 388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom to->pkey.dsa->p=a; 389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((a=BN_dup(from->pkey.dsa->q)) == NULL) 391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (to->pkey.dsa->q != NULL) 393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_free(to->pkey.dsa->q); 394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom to->pkey.dsa->q=a; 395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((a=BN_dup(from->pkey.dsa->g)) == NULL) 397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (to->pkey.dsa->g != NULL) 399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_free(to->pkey.dsa->g); 400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom to->pkey.dsa->g=a; 401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b) 405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ( BN_cmp(a->pkey.dsa->p,b->pkey.dsa->p) || 407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_cmp(a->pkey.dsa->q,b->pkey.dsa->q) || 408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_cmp(a->pkey.dsa->g,b->pkey.dsa->g)) 409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) 415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (BN_cmp(b->pkey.dsa->pub_key,a->pkey.dsa->pub_key) != 0) 417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void int_dsa_free(EVP_PKEY *pkey) 423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA_free(pkey->pkey.dsa); 425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void update_buflen(const BIGNUM *b, size_t *pbuflen) 428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom size_t i; 430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!b) 431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (*pbuflen < (i = (size_t)BN_num_bytes(b))) 433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *pbuflen = i; 434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype) 437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom unsigned char *m=NULL; 439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int ret=0; 440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom size_t buf_len=0; 441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *ktype = NULL; 442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const BIGNUM *priv_key, *pub_key; 444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ptype == 2) 446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom priv_key = x->priv_key; 447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom priv_key = NULL; 449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ptype > 0) 451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pub_key = x->pub_key; 452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pub_key = NULL; 454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ptype == 2) 456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ktype = "Private-Key"; 457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (ptype == 1) 458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ktype = "Public-Key"; 459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ktype = "DSA-Parameters"; 461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom update_buflen(x->p, &buf_len); 463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom update_buflen(x->q, &buf_len); 464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom update_buflen(x->g, &buf_len); 465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom update_buflen(priv_key, &buf_len); 466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom update_buflen(pub_key, &buf_len); 467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom m=(unsigned char *)OPENSSL_malloc(buf_len+10); 469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (m == NULL) 470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DO_DSA_PRINT,ERR_R_MALLOC_FAILURE); 472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (priv_key) 476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(!BIO_indent(bp,off,128)) 478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (BIO_printf(bp,"%s: (%d bit)\n",ktype, BN_num_bits(x->p)) 480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom <= 0) goto err; 481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ASN1_bn_print(bp,"priv:",priv_key,m,off)) 484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ASN1_bn_print(bp,"pub: ",pub_key,m,off)) 486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ASN1_bn_print(bp,"P: ",x->p,m,off)) goto err; 488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ASN1_bn_print(bp,"Q: ",x->q,m,off)) goto err; 489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ASN1_bn_print(bp,"G: ",x->g,m,off)) goto err; 490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=1; 491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromerr: 492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (m != NULL) OPENSSL_free(m); 493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(ret); 494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_param_decode(EVP_PKEY *pkey, 497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char **pder, int derlen) 498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA *dsa; 500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa = d2i_DSAparams(NULL, pder, derlen))) 501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB); 503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_assign_DSA(pkey, dsa); 506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder) 510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return i2d_DSAparams(pkey->pkey.dsa, pder); 512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent, 515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PCTX *ctx) 516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return do_dsa_print(bp, pkey->pkey.dsa, indent, 0); 518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent, 521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PCTX *ctx) 522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return do_dsa_print(bp, pkey->pkey.dsa, indent, 1); 524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent, 528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PCTX *ctx) 529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return do_dsa_print(bp, pkey->pkey.dsa, indent, 2); 531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int old_dsa_priv_decode(EVP_PKEY *pkey, 534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char **pder, int derlen) 535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSA *dsa; 537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!(dsa = d2i_DSAPrivateKey (NULL, pder, derlen))) 538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB); 540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_assign_DSA(pkey, dsa); 543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder) 547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return i2d_DSAPrivateKey(pkey->pkey.dsa, pder); 549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg, 552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const ASN1_STRING *sig, 553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int indent, ASN1_PCTX *pctx) 554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom DSA_SIG *dsa_sig; 556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom const unsigned char *p; 557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!sig) 558392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (BIO_puts(bp, "\n") <= 0) 560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 1; 563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom p = sig->data; 565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length); 566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (dsa_sig) 567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int rv = 0; 569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom size_t buf_len = 0; 570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom unsigned char *m=NULL; 571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom update_buflen(dsa_sig->r, &buf_len); 572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom update_buflen(dsa_sig->s, &buf_len); 573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom m = OPENSSL_malloc(buf_len+10); 574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (m == NULL) 575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom DSAerr(DSA_F_DSA_SIG_PRINT,ERR_R_MALLOC_FAILURE); 577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 578392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 579392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 580392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (BIO_write(bp, "\n", 1) != 1) 581392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 582392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 583392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!ASN1_bn_print(bp,"r: ",dsa_sig->r,m,indent)) 584392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 585392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!ASN1_bn_print(bp,"s: ",dsa_sig->s,m,indent)) 586392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom goto err; 587392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom rv = 1; 588392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom err: 589392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (m) 590392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_free(m); 591392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom DSA_SIG_free(dsa_sig); 592392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return rv; 593392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 594392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return X509_signature_dump(bp, sig, indent); 595392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 596392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2) 598221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom switch (op) 600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ASN1_PKEY_CTRL_PKCS7_SIGN: 602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (arg1 == 0) 603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int snid, hnid; 605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR *alg1, *alg2; 606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2); 607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (alg1 == NULL || alg1->algorithm == NULL) 608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -1; 609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom hnid = OBJ_obj2nid(alg1->algorithm); 610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (hnid == NID_undef) 611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -1; 612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey))) 613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -1; 614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0); 615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_CMS 618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ASN1_PKEY_CTRL_CMS_SIGN: 619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (arg1 == 0) 620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int snid, hnid; 622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR *alg1, *alg2; 623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CMS_SignerInfo_get0_algs(arg2, NULL, NULL, &alg1, &alg2); 624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (alg1 == NULL || alg1->algorithm == NULL) 625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -1; 626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom hnid = OBJ_obj2nid(alg1->algorithm); 627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (hnid == NID_undef) 628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -1; 629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey))) 630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -1; 631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0); 632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom case ASN1_PKEY_CTRL_DEFAULT_MD_NID: 637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *(int *)arg2 = NID_sha1; 638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 2; 639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default: 641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return -2; 642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* NB these are sorted in pkey_id order, lowest first */ 648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] = 650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA2, 654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA, 655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PKEY_ALIAS 656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom }, 657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA1, 660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA, 661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PKEY_ALIAS 662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom }, 663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA4, 666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA, 667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PKEY_ALIAS 668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom }, 669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA3, 672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA, 673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ASN1_PKEY_ALIAS 674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom }, 675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA, 678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_DSA, 679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 0, 680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom "DSA", 682221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom "OpenSSL DSA method", 683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_pub_decode, 685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_pub_encode, 686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_pub_cmp, 687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_pub_print, 688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 689221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_priv_decode, 690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_priv_encode, 691221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_priv_print, 692221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int_dsa_size, 694221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_bits, 695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_param_decode, 697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_param_encode, 698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_missing_parameters, 699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_copy_parameters, 700221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_cmp_parameters, 701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_param_print, 702392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom dsa_sig_print, 703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int_dsa_free, 705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dsa_pkey_ctrl, 706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom old_dsa_priv_decode, 707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom old_dsa_priv_encode 708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom }; 710