diff options
author | nelsonb%netscape.com <devnull@localhost> | 2001-06-09 03:18:09 +0000 |
---|---|---|
committer | nelsonb%netscape.com <devnull@localhost> | 2001-06-09 03:18:09 +0000 |
commit | 1043d7d06ef17e12ef0e00225dc0a89d28288ee8 (patch) | |
tree | aeec4b4a11c7aca09a6e1204e953fc3a0c5bd91a /security/nss/lib/smime/cmsdigdata.c | |
parent | cec6b0126ae75967f8619e5b3a5c30a800cbf8b1 (diff) | |
parent | 30debe533c0537e49febeefe135ea069d7fbe2f2 (diff) | |
download | nss-hg-1043d7d06ef17e12ef0e00225dc0a89d28288ee8.tar.gz |
3 Changes:
1. New SSL server session cache implementation that uses finer grained
locking to reduce lock contention, and does 128-way associative caching.
2. rename symbol SSL_SESSIONID_BYTES to SSL2_SESSIONID_BYTES.
3. Work around compiler bug on Solaris i386.
Modified Files:
manifest.mn sslcon.c sslimpl.h sslsecur.c sslsnce.c
Diffstat (limited to 'security/nss/lib/smime/cmsdigdata.c')
-rw-r--r-- | security/nss/lib/smime/cmsdigdata.c | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/security/nss/lib/smime/cmsdigdata.c b/security/nss/lib/smime/cmsdigdata.c new file mode 100644 index 000000000..04a670b68 --- /dev/null +++ b/security/nss/lib/smime/cmsdigdata.c @@ -0,0 +1,223 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Netscape security libraries. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1994-2000 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the + * terms of the GNU General Public License Version 2 or later (the + * "GPL"), in which case the provisions of the GPL are applicable + * instead of those above. If you wish to allow use of your + * version of this file only under the terms of the GPL and not to + * allow others to use your version of this file under the MPL, + * indicate your decision by deleting the provisions above and + * replace them with the notice and other provisions required by + * the GPL. If you do not delete the provisions above, a recipient + * may use your version of this file under either the MPL or the + * GPL. + */ + +/* + * CMS digestedData methods. + * + * $Id$ + */ + +#include "cmslocal.h" + +#include "secitem.h" +#include "secasn1.h" +#include "secoid.h" +#include "secerr.h" + +/* + * NSS_CMSDigestedData_Create - create a digestedData object (presumably for encoding) + * + * version will be set by NSS_CMSDigestedData_Encode_BeforeStart + * digestAlg is passed as parameter + * contentInfo must be filled by the user + * digest will be calculated while encoding + */ +NSSCMSDigestedData * +NSS_CMSDigestedData_Create(NSSCMSMessage *cmsg, SECAlgorithmID *digestalg) +{ + void *mark; + NSSCMSDigestedData *digd; + PLArenaPool *poolp; + + poolp = cmsg->poolp; + + mark = PORT_ArenaMark(poolp); + + digd = (NSSCMSDigestedData *)PORT_ArenaZAlloc(poolp, sizeof(NSSCMSDigestedData)); + if (digd == NULL) + goto loser; + + digd->cmsg = cmsg; + + if (SECOID_CopyAlgorithmID (poolp, &(digd->digestAlg), digestalg) != SECSuccess) + goto loser; + + PORT_ArenaUnmark(poolp, mark); + return digd; + +loser: + PORT_ArenaRelease(poolp, mark); + return NULL; +} + +/* + * NSS_CMSDigestedData_Destroy - destroy a digestedData object + */ +void +NSS_CMSDigestedData_Destroy(NSSCMSDigestedData *digd) +{ + /* everything's in a pool, so don't worry about the storage */ + return; +} + +/* + * NSS_CMSDigestedData_GetContentInfo - return pointer to digestedData object's contentInfo + */ +NSSCMSContentInfo * +NSS_CMSDigestedData_GetContentInfo(NSSCMSDigestedData *digd) +{ + return &(digd->contentInfo); +} + +/* + * NSS_CMSDigestedData_Encode_BeforeStart - do all the necessary things to a DigestedData + * before encoding begins. + * + * In particular: + * - set the right version number. The contentInfo's content type must be set up already. + */ +SECStatus +NSS_CMSDigestedData_Encode_BeforeStart(NSSCMSDigestedData *digd) +{ + unsigned long version; + SECItem *dummy; + + version = NSS_CMS_DIGESTED_DATA_VERSION_DATA; + if (NSS_CMSContentInfo_GetContentTypeTag(&(digd->contentInfo)) != SEC_OID_PKCS7_DATA) + version = NSS_CMS_DIGESTED_DATA_VERSION_ENCAP; + + dummy = SEC_ASN1EncodeInteger(digd->cmsg->poolp, &(digd->version), version); + return (dummy == NULL) ? SECFailure : SECSuccess; +} + +/* + * NSS_CMSDigestedData_Encode_BeforeData - do all the necessary things to a DigestedData + * before the encapsulated data is passed through the encoder. + * + * In detail: + * - set up the digests if necessary + */ +SECStatus +NSS_CMSDigestedData_Encode_BeforeData(NSSCMSDigestedData *digd) +{ + /* set up the digests */ + if (digd->digestAlg.algorithm.len != 0 && digd->digest.len == 0) { + /* if digest is already there, do nothing */ + digd->contentInfo.digcx = NSS_CMSDigestContext_StartSingle(&(digd->digestAlg)); + if (digd->contentInfo.digcx == NULL) + return SECFailure; + } + return SECSuccess; +} + +/* + * NSS_CMSDigestedData_Encode_AfterData - do all the necessary things to a DigestedData + * after all the encapsulated data was passed through the encoder. + * + * In detail: + * - finish the digests + */ +SECStatus +NSS_CMSDigestedData_Encode_AfterData(NSSCMSDigestedData *digd) +{ + /* did we have digest calculation going on? */ + if (digd->contentInfo.digcx) { + if (NSS_CMSDigestContext_FinishSingle(digd->contentInfo.digcx, + digd->cmsg->poolp, &(digd->digest)) != SECSuccess) + return SECFailure; /* error has been set by NSS_CMSDigestContext_FinishSingle */ + digd->contentInfo.digcx = NULL; + } + + return SECSuccess; +} + +/* + * NSS_CMSDigestedData_Decode_BeforeData - do all the necessary things to a DigestedData + * before the encapsulated data is passed through the encoder. + * + * In detail: + * - set up the digests if necessary + */ +SECStatus +NSS_CMSDigestedData_Decode_BeforeData(NSSCMSDigestedData *digd) +{ + /* is there a digest algorithm yet? */ + if (digd->digestAlg.algorithm.len == 0) + return SECFailure; + + digd->contentInfo.digcx = NSS_CMSDigestContext_StartSingle(&(digd->digestAlg)); + if (digd->contentInfo.digcx == NULL) + return SECFailure; + + return SECSuccess; +} + +/* + * NSS_CMSDigestedData_Decode_AfterData - do all the necessary things to a DigestedData + * after all the encapsulated data was passed through the encoder. + * + * In detail: + * - finish the digests + */ +SECStatus +NSS_CMSDigestedData_Decode_AfterData(NSSCMSDigestedData *digd) +{ + /* did we have digest calculation going on? */ + if (digd->contentInfo.digcx) { + if (NSS_CMSDigestContext_FinishSingle(digd->contentInfo.digcx, + digd->cmsg->poolp, &(digd->cdigest)) != SECSuccess) + return SECFailure; /* error has been set by NSS_CMSDigestContext_FinishSingle */ + digd->contentInfo.digcx = NULL; + } + + return SECSuccess; +} + +/* + * NSS_CMSDigestedData_Decode_AfterEnd - finalize a digestedData. + * + * In detail: + * - check the digests for equality + */ +SECStatus +NSS_CMSDigestedData_Decode_AfterEnd(NSSCMSDigestedData *digd) +{ + /* did we have digest calculation going on? */ + if (digd->cdigest.len != 0) { + /* XXX comparision btw digest & cdigest */ + /* XXX set status */ + /* TODO!!!! */ + } + + return SECSuccess; +} |