159191Skris/* pk7_attr.c */ 2280297Sjkim/* 3280297Sjkim * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 4280297Sjkim * 2001. 559191Skris */ 689837Skris/* ==================================================================== 7142425Snectar * Copyright (c) 2001-2004 The OpenSSL Project. All rights reserved. 889837Skris * 989837Skris * Redistribution and use in source and binary forms, with or without 1089837Skris * modification, are permitted provided that the following conditions 1189837Skris * are met: 1289837Skris * 1389837Skris * 1. Redistributions of source code must retain the above copyright 14280297Sjkim * notice, this list of conditions and the following disclaimer. 1589837Skris * 1689837Skris * 2. Redistributions in binary form must reproduce the above copyright 1789837Skris * notice, this list of conditions and the following disclaimer in 1889837Skris * the documentation and/or other materials provided with the 1989837Skris * distribution. 2089837Skris * 2189837Skris * 3. All advertising materials mentioning features or use of this 2289837Skris * software must display the following acknowledgment: 2389837Skris * "This product includes software developed by the OpenSSL Project 2489837Skris * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 2589837Skris * 2689837Skris * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 2789837Skris * endorse or promote products derived from this software without 2889837Skris * prior written permission. For written permission, please contact 2989837Skris * licensing@OpenSSL.org. 3089837Skris * 3189837Skris * 5. Products derived from this software may not be called "OpenSSL" 3289837Skris * nor may "OpenSSL" appear in their names without prior written 3389837Skris * permission of the OpenSSL Project. 3489837Skris * 3589837Skris * 6. Redistributions of any form whatsoever must retain the following 3689837Skris * acknowledgment: 3789837Skris * "This product includes software developed by the OpenSSL Project 3889837Skris * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 3989837Skris * 4089837Skris * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 4189837Skris * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4289837Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 4389837Skris * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 4489837Skris * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4589837Skris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 4689837Skris * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 4789837Skris * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4889837Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 4989837Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 5089837Skris * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 5189837Skris * OF THE POSSIBILITY OF SUCH DAMAGE. 5289837Skris * ==================================================================== 5389837Skris * 5489837Skris * This product includes cryptographic software written by Eric Young 5589837Skris * (eay@cryptsoft.com). This product includes software written by Tim 5689837Skris * Hudson (tjh@cryptsoft.com). 5789837Skris * 5889837Skris */ 5959191Skris 6059191Skris#include <stdio.h> 6159191Skris#include <stdlib.h> 6259191Skris#include <openssl/bio.h> 6359191Skris#include <openssl/asn1.h> 64238405Sjkim#include <openssl/asn1t.h> 6559191Skris#include <openssl/pem.h> 6659191Skris#include <openssl/pkcs7.h> 6768651Skris#include <openssl/x509.h> 6859191Skris#include <openssl/err.h> 6959191Skris 70280297Sjkimint PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, 71280297Sjkim STACK_OF(X509_ALGOR) *cap) 7259191Skris{ 73280297Sjkim ASN1_STRING *seq; 74280297Sjkim if (!(seq = ASN1_STRING_new())) { 75280297Sjkim PKCS7err(PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP, ERR_R_MALLOC_FAILURE); 76280297Sjkim return 0; 77280297Sjkim } 78280297Sjkim seq->length = ASN1_item_i2d((ASN1_VALUE *)cap, &seq->data, 79280297Sjkim ASN1_ITEM_rptr(X509_ALGORS)); 80280297Sjkim return PKCS7_add_signed_attribute(si, NID_SMIMECapabilities, 81280297Sjkim V_ASN1_SEQUENCE, seq); 8259191Skris} 8359191Skris 8468651SkrisSTACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si) 85280297Sjkim{ 86280297Sjkim ASN1_TYPE *cap; 87280297Sjkim const unsigned char *p; 88160814Ssimon 89280297Sjkim cap = PKCS7_get_signed_attribute(si, NID_SMIMECapabilities); 90280297Sjkim if (!cap || (cap->type != V_ASN1_SEQUENCE)) 91280297Sjkim return NULL; 92280297Sjkim p = cap->value.sequence->data; 93280297Sjkim return (STACK_OF(X509_ALGOR) *) 94280297Sjkim ASN1_item_d2i(NULL, &p, cap->value.sequence->length, 95280297Sjkim ASN1_ITEM_rptr(X509_ALGORS)); 96280297Sjkim} 9759191Skris 9859191Skris/* Basic smime-capabilities OID and optional integer arg */ 9968651Skrisint PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg) 10059191Skris{ 101280297Sjkim X509_ALGOR *alg; 10268651Skris 103280297Sjkim if (!(alg = X509_ALGOR_new())) { 104280297Sjkim PKCS7err(PKCS7_F_PKCS7_SIMPLE_SMIMECAP, ERR_R_MALLOC_FAILURE); 105280297Sjkim return 0; 106280297Sjkim } 107280297Sjkim ASN1_OBJECT_free(alg->algorithm); 108280297Sjkim alg->algorithm = OBJ_nid2obj(nid); 109280297Sjkim if (arg > 0) { 110280297Sjkim ASN1_INTEGER *nbit; 111280297Sjkim if (!(alg->parameter = ASN1_TYPE_new())) { 112280297Sjkim PKCS7err(PKCS7_F_PKCS7_SIMPLE_SMIMECAP, ERR_R_MALLOC_FAILURE); 113280297Sjkim return 0; 114280297Sjkim } 115280297Sjkim if (!(nbit = ASN1_INTEGER_new())) { 116280297Sjkim PKCS7err(PKCS7_F_PKCS7_SIMPLE_SMIMECAP, ERR_R_MALLOC_FAILURE); 117280297Sjkim return 0; 118280297Sjkim } 119280297Sjkim if (!ASN1_INTEGER_set(nbit, arg)) { 120280297Sjkim PKCS7err(PKCS7_F_PKCS7_SIMPLE_SMIMECAP, ERR_R_MALLOC_FAILURE); 121280297Sjkim return 0; 122280297Sjkim } 123280297Sjkim alg->parameter->value.integer = nbit; 124280297Sjkim alg->parameter->type = V_ASN1_INTEGER; 125280297Sjkim } 126280297Sjkim sk_X509_ALGOR_push(sk, alg); 127280297Sjkim return 1; 12859191Skris} 129238405Sjkim 130238405Sjkimint PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid) 131280297Sjkim{ 132280297Sjkim if (PKCS7_get_signed_attribute(si, NID_pkcs9_contentType)) 133280297Sjkim return 0; 134280297Sjkim if (!coid) 135280297Sjkim coid = OBJ_nid2obj(NID_pkcs7_data); 136280297Sjkim return PKCS7_add_signed_attribute(si, NID_pkcs9_contentType, 137280297Sjkim V_ASN1_OBJECT, coid); 138280297Sjkim} 139238405Sjkim 140238405Sjkimint PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t) 141280297Sjkim{ 142280297Sjkim if (!t && !(t = X509_gmtime_adj(NULL, 0))) { 143280297Sjkim PKCS7err(PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME, 144280297Sjkim ERR_R_MALLOC_FAILURE); 145280297Sjkim return 0; 146280297Sjkim } 147280297Sjkim return PKCS7_add_signed_attribute(si, NID_pkcs9_signingTime, 148280297Sjkim V_ASN1_UTCTIME, t); 149280297Sjkim} 150238405Sjkim 151238405Sjkimint PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, 152280297Sjkim const unsigned char *md, int mdlen) 153280297Sjkim{ 154280297Sjkim ASN1_OCTET_STRING *os; 155280297Sjkim os = ASN1_OCTET_STRING_new(); 156280297Sjkim if (!os) 157280297Sjkim return 0; 158280297Sjkim if (!ASN1_STRING_set(os, md, mdlen) 159280297Sjkim || !PKCS7_add_signed_attribute(si, NID_pkcs9_messageDigest, 160280297Sjkim V_ASN1_OCTET_STRING, os)) { 161280297Sjkim ASN1_OCTET_STRING_free(os); 162280297Sjkim return 0; 163280297Sjkim } 164280297Sjkim return 1; 165280297Sjkim} 166