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