1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/pkcs7/pk7_lib.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com). 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to. The following conditions 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA, 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed. 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used. 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package. 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in the 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * documentation and/or other materials provided with the distribution. 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * must display the following acknowledgement: 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes cryptographic software written by 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Eric Young (eay@cryptsoft.com)" 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The word 'cryptographic' can be left out if the rouines from the library 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * being used are not cryptographic related :-). 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the apps directory (application code) you must include an acknowledgement: 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE. 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed. i.e. this code cannot simply be 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.] 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <stdio.h> 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "cryptlib.h" 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/objects.h> 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include <openssl/x509.h> 63480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include "asn1_locl.h" 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orglong PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg) 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int nid; 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long ret; 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org nid=OBJ_obj2nid(p7->type); 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (cmd) 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case PKCS7_OP_SET_DETACHED_SIGNATURE: 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (nid == NID_pkcs7_signed) 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=p7->detached=(int)larg; 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret && PKCS7_type_is_data(p7->d.sign->contents)) 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OCTET_STRING *os; 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org os=p7->d.sign->contents->d.data; 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OCTET_STRING_free(os); 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.sign->contents->d.data = NULL; 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_CTRL,PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE); 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=0; 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case PKCS7_OP_GET_DETACHED_SIGNATURE: 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (nid == NID_pkcs7_signed) 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(!p7->d.sign || !p7->d.sign->contents->d.ptr) 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret = 1; 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else ret = 0; 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->detached = ret; 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_CTRL,PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE); 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=0; 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_CTRL,PKCS7_R_UNKNOWN_OPERATION); 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ret=0; 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(ret); 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_content_new(PKCS7 *p7, int type) 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7 *ret=NULL; 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ret=PKCS7_new()) == NULL) goto err; 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!PKCS7_set_type(ret,type)) goto err; 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!PKCS7_set_content(p7,ret)) goto err; 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (ret != NULL) PKCS7_free(ret); 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data) 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i; 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=OBJ_obj2nid(p7->type); 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (i) 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signed: 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (p7->d.sign->contents != NULL) 138c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7_free(p7->d.sign->contents); 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.sign->contents=p7_data; 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_digest: 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (p7->d.digest->contents != NULL) 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7_free(p7->d.digest->contents); 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.digest->contents=p7_data; 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_data: 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_enveloped: 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_encrypted: 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_SET_CONTENT,PKCS7_R_UNSUPPORTED_CONTENT_TYPE); 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_set_type(PKCS7 *p7, int type) 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_OBJECT *obj; 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /*PKCS7_content_free(p7);*/ 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org obj=OBJ_nid2obj(type); /* will not fail */ 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (type) 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signed: 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type=obj; 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p7->d.sign=PKCS7_SIGNED_new()) == NULL) 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7->d.sign->version,1)) 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7_SIGNED_free(p7->d.sign); 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.sign=NULL; 176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_data: 180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type=obj; 181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p7->d.data=M_ASN1_OCTET_STRING_new()) == NULL) 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type=obj; 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p7->d.signed_and_enveloped=PKCS7_SIGN_ENVELOPE_new()) 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org == NULL) goto err; 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ASN1_INTEGER_set(p7->d.signed_and_enveloped->version,1); 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7->d.signed_and_enveloped->version,1)) 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.signed_and_enveloped->enc_data->content_type 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org = OBJ_nid2obj(NID_pkcs7_data); 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_enveloped: 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type=obj; 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p7->d.enveloped=PKCS7_ENVELOPE_new()) 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org == NULL) goto err; 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7->d.enveloped->version,0)) 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.enveloped->enc_data->content_type 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org = OBJ_nid2obj(NID_pkcs7_data); 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 203c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_encrypted: 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type=obj; 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p7->d.encrypted=PKCS7_ENCRYPT_new()) 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org == NULL) goto err; 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7->d.encrypted->version,0)) 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.encrypted->enc_data->content_type 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org = OBJ_nid2obj(NID_pkcs7_data); 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_digest: 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type=obj; 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((p7->d.digest=PKCS7_DIGEST_new()) 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org == NULL) goto err; 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7->d.digest->version,0)) 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_SET_TYPE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE); 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other) 230c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->type = OBJ_nid2obj(type); 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.other = other; 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 1; 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi) 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i,j,nid; 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_ALGOR *alg; 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org STACK_OF(PKCS7_SIGNER_INFO) *signer_sk; 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org STACK_OF(X509_ALGOR) *md_sk; 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=OBJ_obj2nid(p7->type); 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (i) 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signed: 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org signer_sk= p7->d.sign->signer_info; 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org md_sk= p7->d.sign->md_algs; 249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org signer_sk= p7->d.signed_and_enveloped->signer_info; 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org md_sk= p7->d.signed_and_enveloped->md_algs; 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_SIGNER,PKCS7_R_WRONG_CONTENT_TYPE); 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org nid=OBJ_obj2nid(psi->digest_alg->algorithm); 260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* If the digest is not currently listed, add it */ 262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org j=0; 263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (i=0; i<sk_X509_ALGOR_num(md_sk); i++) 264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org alg=sk_X509_ALGOR_value(md_sk,i); 266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (OBJ_obj2nid(alg->algorithm) == nid) 267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org j=1; 269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!j) /* we need to add another algorithm */ 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(!(alg=X509_ALGOR_new()) 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org || !(alg->parameter = ASN1_TYPE_new())) 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_ALGOR_free(alg); 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_SIGNER,ERR_R_MALLOC_FAILURE); 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org alg->algorithm=OBJ_nid2obj(nid); 282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org alg->parameter->type = V_ASN1_NULL; 283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!sk_X509_ALGOR_push(md_sk,alg)) 284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_ALGOR_free(alg); 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!sk_PKCS7_SIGNER_INFO_push(signer_sk,psi)) 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_add_certificate(PKCS7 *p7, X509 *x509) 296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i; 298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org STACK_OF(X509) **sk; 299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=OBJ_obj2nid(p7->type); 301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (i) 302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signed: 304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk= &(p7->d.sign->cert); 305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk= &(p7->d.signed_and_enveloped->cert); 308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_CERTIFICATE,PKCS7_R_WRONG_CONTENT_TYPE); 311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*sk == NULL) 315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *sk=sk_X509_new_null(); 316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*sk == NULL) 317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 318480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_CERTIFICATE, ERR_R_MALLOC_FAILURE); 319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); 322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!sk_X509_push(*sk,x509)) 323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_free(x509); 325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl) 331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i; 333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org STACK_OF(X509_CRL) **sk; 334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=OBJ_obj2nid(p7->type); 336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (i) 337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signed: 339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk= &(p7->d.sign->crl); 340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk= &(p7->d.signed_and_enveloped->crl); 343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_CRL,PKCS7_R_WRONG_CONTENT_TYPE); 346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*sk == NULL) 350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org *sk=sk_X509_CRL_new_null(); 351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (*sk == NULL) 352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_CRL,ERR_R_MALLOC_FAILURE); 354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org CRYPTO_add(&crl->references,1,CRYPTO_LOCK_X509_CRL); 358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!sk_X509_CRL_push(*sk,crl)) 359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_CRL_free(crl); 361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, 367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org const EVP_MD *dgst) 368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 369480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org int ret; 370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* We now need to add another PKCS7_SIGNER_INFO entry */ 372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7i->version,1)) 373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!X509_NAME_set(&p7i->issuer_and_serial->issuer, 375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_get_issuer_name(x509))) 376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* because ASN1_INTEGER_set is used to set a 'long' we will do 379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * things the ugly way. */ 380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org M_ASN1_INTEGER_free(p7i->issuer_and_serial->serial); 381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(p7i->issuer_and_serial->serial= 382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org M_ASN1_INTEGER_dup(X509_get_serialNumber(x509)))) 383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org goto err; 384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* lets keep the pkey around for a while */ 386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); 387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7i->pkey=pkey; 388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* Set the algorithms */ 390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 391480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org X509_ALGOR_set0(p7i->digest_alg, OBJ_nid2obj(EVP_MD_type(dgst)), 392480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org V_ASN1_NULL, NULL); 393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 394480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (pkey->ameth && pkey->ameth->pkey_ctrl) 395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 396480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org ret = pkey->ameth->pkey_ctrl(pkey, ASN1_PKEY_CTRL_PKCS7_SIGN, 397480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 0, p7i); 398480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (ret > 0) 399480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 1; 400480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (ret != -2) 401480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 402480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_SIGNER_INFO_SET, 403480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_R_SIGNING_CTRL_FAILURE); 404480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 405480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 406c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 407480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_SIGNER_INFO_SET, 408480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); 409c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 410480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 411c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 412c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 413c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgPKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, EVP_PKEY *pkey, 414c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org const EVP_MD *dgst) 415c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 416480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_SIGNER_INFO *si = NULL; 417480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 418480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (dgst == NULL) 419480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 420480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org int def_nid; 421480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) <= 0) 422480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org goto err; 423480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org dgst = EVP_get_digestbynid(def_nid); 424480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (dgst == NULL) 425480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 426480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_SIGNATURE, 427480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_R_NO_DEFAULT_DIGEST); 428480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org goto err; 429480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 430480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 431c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 432c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((si=PKCS7_SIGNER_INFO_new()) == NULL) goto err; 433c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!PKCS7_SIGNER_INFO_set(si,x509,pkey,dgst)) goto err; 434c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!PKCS7_add_signer(p7,si)) goto err; 435c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(si); 436c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 437480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (si) 438480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_SIGNER_INFO_free(si); 439c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(NULL); 440c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 441c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 442c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md) 443c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 444c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (PKCS7_type_is_digest(p7)) 445c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 446c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(!(p7->d.digest->md->parameter = ASN1_TYPE_new())) 447c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 448c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_SET_DIGEST,ERR_R_MALLOC_FAILURE); 449c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 450c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 451c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.digest->md->parameter->type = V_ASN1_NULL; 452c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7->d.digest->md->algorithm = OBJ_nid2obj(EVP_MD_nid(md)); 453c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 1; 454c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 455c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 456c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_SET_DIGEST,PKCS7_R_WRONG_CONTENT_TYPE); 457c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 1; 458c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 459c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 460c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgSTACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7) 461c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 462c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (PKCS7_type_is_signed(p7)) 463c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 464c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(p7->d.sign->signer_info); 465c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 466c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else if (PKCS7_type_is_signedAndEnveloped(p7)) 467c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 468c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(p7->d.signed_and_enveloped->signer_info); 469c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 470c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 471c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(NULL); 472c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 473c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 474480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, 475480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org X509_ALGOR **pdig, X509_ALGOR **psig) 476480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 477480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (pk) 478480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org *pk = si->pkey; 479480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (pdig) 480480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org *pdig = si->digest_alg; 481480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (psig) 482480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org *psig = si->digest_enc_alg; 483480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 484480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 485480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc) 486480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 487480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (penc) 488480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org *penc = ri->key_enc_algor; 489480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 490480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 491c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgPKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509) 492c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 493c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7_RECIP_INFO *ri; 494c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 495c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ((ri=PKCS7_RECIP_INFO_new()) == NULL) goto err; 496c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!PKCS7_RECIP_INFO_set(ri,x509)) goto err; 497c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!PKCS7_add_recipient_info(p7,ri)) goto err; 498480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return ri; 499c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgerr: 500480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (ri) 501480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_RECIP_INFO_free(ri); 502480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return NULL; 503c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 504c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 505c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri) 506c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 507c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i; 508c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org STACK_OF(PKCS7_RECIP_INFO) *sk; 509c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 510c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=OBJ_obj2nid(p7->type); 511c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (i) 512c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 513c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 514c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk= p7->d.signed_and_enveloped->recipientinfo; 515c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 516c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_enveloped: 517c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sk= p7->d.enveloped->recipientinfo; 518c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 519c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 520c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_ADD_RECIPIENT_INFO,PKCS7_R_WRONG_CONTENT_TYPE); 521c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 522c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 523c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 524c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!sk_PKCS7_RECIP_INFO_push(sk,ri)) 525c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 526c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(1); 527c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 528c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 529c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509) 530c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 531480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org int ret; 532480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY *pkey = NULL; 533c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!ASN1_INTEGER_set(p7i->version,0)) 534c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 535c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!X509_NAME_set(&p7i->issuer_and_serial->issuer, 536c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org X509_get_issuer_name(x509))) 537c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 538c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 539c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org M_ASN1_INTEGER_free(p7i->issuer_and_serial->serial); 540c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (!(p7i->issuer_and_serial->serial= 541c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org M_ASN1_INTEGER_dup(X509_get_serialNumber(x509)))) 542c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 0; 543c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 544480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org pkey = X509_get_pubkey(x509); 545480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 546480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!pkey || !pkey->ameth || !pkey->ameth->pkey_ctrl) 547480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 548480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_RECIP_INFO_SET, 549480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); 550480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org goto err; 551480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 552480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 553480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org ret = pkey->ameth->pkey_ctrl(pkey, ASN1_PKEY_CTRL_PKCS7_ENCRYPT, 554480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 0, p7i); 555480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (ret == -2) 556480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 557480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_RECIP_INFO_SET, 558480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); 559480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org goto err; 560480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 561480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (ret <= 0) 562480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 563480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7err(PKCS7_F_PKCS7_RECIP_INFO_SET, 564480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org PKCS7_R_ENCRYPTION_CTRL_FAILURE); 565480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org goto err; 566480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 567480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 568480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY_free(pkey); 569c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 570c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); 571c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org p7i->cert=x509; 572c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 573480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 1; 574480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 575480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org err: 576480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (pkey) 577480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org EVP_PKEY_free(pkey); 578480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 579c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 580c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 581c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgX509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si) 582c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 583c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (PKCS7_type_is_signed(p7)) 584c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(X509_find_by_issuer_and_serial(p7->d.sign->cert, 585c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org si->issuer_and_serial->issuer, 586c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org si->issuer_and_serial->serial)); 587c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 588c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(NULL); 589c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 590c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 591c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgint PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher) 592c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 593c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org int i; 594c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7_ENC_CONTENT *ec; 595c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 596c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i=OBJ_obj2nid(p7->type); 597c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org switch (i) 598c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 599c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_signedAndEnveloped: 600c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ec=p7->d.signed_and_enveloped->enc_data; 601c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 602c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org case NID_pkcs7_enveloped: 603c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ec=p7->d.enveloped->enc_data; 604c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org break; 605c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org default: 606c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_SET_CIPHER,PKCS7_R_WRONG_CONTENT_TYPE); 607c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 608c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 609c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 610c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* Check cipher OID exists and has data in it*/ 611c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org i = EVP_CIPHER_type(cipher); 612c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if(i == NID_undef) { 613c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org PKCS7err(PKCS7_F_PKCS7_SET_CIPHER,PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER); 614c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return(0); 615c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 616c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 617c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org ec->cipher = cipher; 618c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org return 1; 619c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 620c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 621480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgint PKCS7_stream(unsigned char ***boundary, PKCS7 *p7) 622480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 623480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org ASN1_OCTET_STRING *os = NULL; 624480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 625480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org switch (OBJ_obj2nid(p7->type)) 626480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 627480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org case NID_pkcs7_data: 628480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os = p7->d.data; 629480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org break; 630480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 631480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org case NID_pkcs7_signedAndEnveloped: 632480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os = p7->d.signed_and_enveloped->enc_data->enc_data; 633480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (os == NULL) 634480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 635480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os=M_ASN1_OCTET_STRING_new(); 636480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org p7->d.signed_and_enveloped->enc_data->enc_data=os; 637480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 638480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org break; 639480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 640480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org case NID_pkcs7_enveloped: 641480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os = p7->d.enveloped->enc_data->enc_data; 642480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (os == NULL) 643480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 644480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os=M_ASN1_OCTET_STRING_new(); 645480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org p7->d.enveloped->enc_data->enc_data=os; 646480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 647480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org break; 648480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 649480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org case NID_pkcs7_signed: 650480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os=p7->d.sign->contents->d.data; 651480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org break; 652480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 653480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org default: 654480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os = NULL; 655480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org break; 656480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 657480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 658480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (os == NULL) 659480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 660480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 661480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org os->flags |= ASN1_STRING_FLAG_NDEF; 662480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org *boundary = &os->data; 663480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 664480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 1; 665480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 666