1*e71b7053SJung-uk Kim=pod 2*e71b7053SJung-uk Kim 3*e71b7053SJung-uk Kim=head1 NAME 4*e71b7053SJung-uk Kim 5*e71b7053SJung-uk KimCMS_add1_signer, CMS_SignerInfo_sign - add a signer to a CMS_ContentInfo signed data structure 6*e71b7053SJung-uk Kim 7*e71b7053SJung-uk Kim=head1 SYNOPSIS 8*e71b7053SJung-uk Kim 9*e71b7053SJung-uk Kim #include <openssl/cms.h> 10*e71b7053SJung-uk Kim 11*e71b7053SJung-uk Kim CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, X509 *signcert, 12*e71b7053SJung-uk Kim EVP_PKEY *pkey, const EVP_MD *md, 13*e71b7053SJung-uk Kim unsigned int flags); 14*e71b7053SJung-uk Kim 15*e71b7053SJung-uk Kim int CMS_SignerInfo_sign(CMS_SignerInfo *si); 16*e71b7053SJung-uk Kim 17*e71b7053SJung-uk Kim=head1 DESCRIPTION 18*e71b7053SJung-uk Kim 19*e71b7053SJung-uk KimCMS_add1_signer() adds a signer with certificate B<signcert> and private 20*e71b7053SJung-uk Kimkey B<pkey> using message digest B<md> to CMS_ContentInfo SignedData 21*e71b7053SJung-uk Kimstructure B<cms>. 22*e71b7053SJung-uk Kim 23*e71b7053SJung-uk KimThe CMS_ContentInfo structure should be obtained from an initial call to 24*e71b7053SJung-uk KimCMS_sign() with the flag B<CMS_PARTIAL> set or in the case or re-signing a 25*e71b7053SJung-uk Kimvalid CMS_ContentInfo SignedData structure. 26*e71b7053SJung-uk Kim 27*e71b7053SJung-uk KimIf the B<md> parameter is B<NULL> then the default digest for the public 28*e71b7053SJung-uk Kimkey algorithm will be used. 29*e71b7053SJung-uk Kim 30*e71b7053SJung-uk KimUnless the B<CMS_REUSE_DIGEST> flag is set the returned CMS_ContentInfo 31*e71b7053SJung-uk Kimstructure is not complete and must be finalized either by streaming (if 32*e71b7053SJung-uk Kimapplicable) or a call to CMS_final(). 33*e71b7053SJung-uk Kim 34*e71b7053SJung-uk KimThe CMS_SignerInfo_sign() function will explicitly sign a CMS_SignerInfo 35*e71b7053SJung-uk Kimstructure, its main use is when B<CMS_REUSE_DIGEST> and B<CMS_PARTIAL> flags 36*e71b7053SJung-uk Kimare both set. 37*e71b7053SJung-uk Kim 38*e71b7053SJung-uk Kim=head1 NOTES 39*e71b7053SJung-uk Kim 40*e71b7053SJung-uk KimThe main purpose of CMS_add1_signer() is to provide finer control 41*e71b7053SJung-uk Kimover a CMS signed data structure where the simpler CMS_sign() function defaults 42*e71b7053SJung-uk Kimare not appropriate. For example if multiple signers or non default digest 43*e71b7053SJung-uk Kimalgorithms are needed. New attributes can also be added using the returned 44*e71b7053SJung-uk KimCMS_SignerInfo structure and the CMS attribute utility functions or the 45*e71b7053SJung-uk KimCMS signed receipt request functions. 46*e71b7053SJung-uk Kim 47*e71b7053SJung-uk KimAny of the following flags (ored together) can be passed in the B<flags> 48*e71b7053SJung-uk Kimparameter. 49*e71b7053SJung-uk Kim 50*e71b7053SJung-uk KimIf B<CMS_REUSE_DIGEST> is set then an attempt is made to copy the content 51*e71b7053SJung-uk Kimdigest value from the CMS_ContentInfo structure: to add a signer to an existing 52*e71b7053SJung-uk Kimstructure. An error occurs if a matching digest value cannot be found to copy. 53*e71b7053SJung-uk KimThe returned CMS_ContentInfo structure will be valid and finalized when this 54*e71b7053SJung-uk Kimflag is set. 55*e71b7053SJung-uk Kim 56*e71b7053SJung-uk KimIf B<CMS_PARTIAL> is set in addition to B<CMS_REUSE_DIGEST> then the 57*e71b7053SJung-uk KimCMS_SignerInfo structure will not be finalized so additional attributes 58*e71b7053SJung-uk Kimcan be added. In this case an explicit call to CMS_SignerInfo_sign() is 59*e71b7053SJung-uk Kimneeded to finalize it. 60*e71b7053SJung-uk Kim 61*e71b7053SJung-uk KimIf B<CMS_NOCERTS> is set the signer's certificate will not be included in the 62*e71b7053SJung-uk KimCMS_ContentInfo structure, the signer's certificate must still be supplied in 63*e71b7053SJung-uk Kimthe B<signcert> parameter though. This can reduce the size of the signature if 64*e71b7053SJung-uk Kimthe signers certificate can be obtained by other means: for example a 65*e71b7053SJung-uk Kimpreviously signed message. 66*e71b7053SJung-uk Kim 67*e71b7053SJung-uk KimThe SignedData structure includes several CMS signedAttributes including the 68*e71b7053SJung-uk Kimsigning time, the CMS content type and the supported list of ciphers in an 69*e71b7053SJung-uk KimSMIMECapabilities attribute. If B<CMS_NOATTR> is set then no signedAttributes 70*e71b7053SJung-uk Kimwill be used. If B<CMS_NOSMIMECAP> is set then just the SMIMECapabilities are 71*e71b7053SJung-uk Kimomitted. 72*e71b7053SJung-uk Kim 73*e71b7053SJung-uk KimOpenSSL will by default identify signing certificates using issuer name 74*e71b7053SJung-uk Kimand serial number. If B<CMS_USE_KEYID> is set it will use the subject key 75*e71b7053SJung-uk Kimidentifier value instead. An error occurs if the signing certificate does not 76*e71b7053SJung-uk Kimhave a subject key identifier extension. 77*e71b7053SJung-uk Kim 78*e71b7053SJung-uk KimIf present the SMIMECapabilities attribute indicates support for the following 79*e71b7053SJung-uk Kimalgorithms in preference order: 256 bit AES, Gost R3411-94, Gost 28147-89, 192 80*e71b7053SJung-uk Kimbit AES, 128 bit AES, triple DES, 128 bit RC2, 64 bit RC2, DES and 40 bit RC2. 81*e71b7053SJung-uk KimIf any of these algorithms is not available then it will not be included: for example the GOST algorithms will not be included if the GOST ENGINE is 82*e71b7053SJung-uk Kimnot loaded. 83*e71b7053SJung-uk Kim 84*e71b7053SJung-uk KimCMS_add1_signer() returns an internal pointer to the CMS_SignerInfo 85*e71b7053SJung-uk Kimstructure just added, this can be used to set additional attributes 86*e71b7053SJung-uk Kimbefore it is finalized. 87*e71b7053SJung-uk Kim 88*e71b7053SJung-uk Kim=head1 RETURN VALUES 89*e71b7053SJung-uk Kim 90*e71b7053SJung-uk KimCMS_add1_signer() returns an internal pointer to the CMS_SignerInfo 91*e71b7053SJung-uk Kimstructure just added or NULL if an error occurs. 92*e71b7053SJung-uk Kim 93*e71b7053SJung-uk Kim=head1 SEE ALSO 94*e71b7053SJung-uk Kim 95*e71b7053SJung-uk KimL<ERR_get_error(3)>, L<CMS_sign(3)>, 96*e71b7053SJung-uk KimL<CMS_final(3)>, 97*e71b7053SJung-uk Kim 98*e71b7053SJung-uk Kim=head1 COPYRIGHT 99*e71b7053SJung-uk Kim 100*e71b7053SJung-uk KimCopyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. 101*e71b7053SJung-uk Kim 102*e71b7053SJung-uk KimLicensed under the OpenSSL license (the "License"). You may not use 103*e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 104*e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 105*e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 106*e71b7053SJung-uk Kim 107*e71b7053SJung-uk Kim=cut 108