/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef DEV_H #include "dev.h" #endif /* DEV_H */ #ifndef PKIM_H #include "pkim.h" #endif /* PKIM_H */ #ifndef PKISTORE_H #include "pkistore.h" #endif /* PKISTORE_H */ extern const NSSError NSS_ERROR_NOT_FOUND; extern const NSSError NSS_ERROR_INVALID_ARGUMENT; NSS_IMPLEMENT NSSCryptoContext * nssCryptoContext_Create ( NSSTrustDomain *td, NSSCallback *uhhOpt ) { NSSArena *arena; NSSCryptoContext *rvCC; arena = NSSArena_Create(); if (!arena) { return NULL; } rvCC = nss_ZNEW(arena, NSSCryptoContext); if (!rvCC) { return NULL; } rvCC->td = td; rvCC->arena = arena; rvCC->certStore = nssCertificateStore_Create(rvCC->arena); if (!rvCC->certStore) { nssArena_Destroy(arena); return NULL; } return rvCC; } NSS_IMPLEMENT PRStatus NSSCryptoContext_Destroy ( NSSCryptoContext *cc ) { PRStatus status = PR_SUCCESS; PORT_Assert(cc->certStore); if (cc->certStore) { status = nssCertificateStore_Destroy(cc->certStore); if (status == PR_FAILURE) { return status; } } else { status = PR_FAILURE; } nssArena_Destroy(cc->arena); return status; } NSS_IMPLEMENT PRStatus NSSCryptoContext_SetDefaultCallback ( NSSCryptoContext *td, NSSCallback *newCallback, NSSCallback **oldCallbackOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSCallback * NSSCryptoContext_GetDefaultCallback ( NSSCryptoContext *td, PRStatus *statusOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSTrustDomain * NSSCryptoContext_GetTrustDomain ( NSSCryptoContext *td ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindOrImportCertificate ( NSSCryptoContext *cc, NSSCertificate *c ) { NSSCertificate *rvCert = NULL; PORT_Assert(cc->certStore); if (!cc->certStore) { nss_SetError(NSS_ERROR_INVALID_ARGUMENT); return rvCert; } rvCert = nssCertificateStore_FindOrAdd(cc->certStore, c); if (rvCert == c && c->object.cryptoContext != cc) { PORT_Assert(!c->object.cryptoContext); c->object.cryptoContext = cc; } if (rvCert) { /* an NSSCertificate cannot be part of two crypto contexts ** simultaneously. If this assertion fails, then there is ** a serious Stan design flaw. */ PORT_Assert(cc == c->object.cryptoContext); } return rvCert; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_ImportPKIXCertificate ( NSSCryptoContext *cc, struct NSSPKIXCertificateStr *pc ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_ImportEncodedCertificate ( NSSCryptoContext *cc, NSSBER *ber ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_ImportEncodedPKIXCertificateChain ( NSSCryptoContext *cc, NSSBER *ber ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT PRStatus nssCryptoContext_ImportTrust ( NSSCryptoContext *cc, NSSTrust *trust ) { PRStatus nssrv; PORT_Assert(cc->certStore); if (!cc->certStore) { return PR_FAILURE; } nssrv = nssCertificateStore_AddTrust(cc->certStore, trust); #if 0 if (nssrv == PR_SUCCESS) { trust->object.cryptoContext = cc; } #endif return nssrv; } NSS_IMPLEMENT PRStatus nssCryptoContext_ImportSMIMEProfile ( NSSCryptoContext *cc, nssSMIMEProfile *profile ) { PRStatus nssrv; PORT_Assert(cc->certStore); if (!cc->certStore) { return PR_FAILURE; } nssrv = nssCertificateStore_AddSMIMEProfile(cc->certStore, profile); #if 0 if (nssrv == PR_SUCCESS) { profile->object.cryptoContext = cc; } #endif return nssrv; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestCertificateByNickname ( NSSCryptoContext *cc, const NSSUTF8 *name, NSSTime *timeOpt, /* NULL for "now" */ NSSUsage *usage, NSSPolicies *policiesOpt /* NULL for none */ ) { NSSCertificate **certs; NSSCertificate *rvCert = NULL; PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } certs = nssCertificateStore_FindCertificatesByNickname(cc->certStore, name, NULL, 0, NULL); if (certs) { rvCert = nssCertificateArray_FindBestCertificate(certs, timeOpt, usage, policiesOpt); nssCertificateArray_Destroy(certs); } return rvCert; } NSS_IMPLEMENT NSSCertificate ** NSSCryptoContext_FindCertificatesByNickname ( NSSCryptoContext *cc, NSSUTF8 *name, NSSCertificate *rvOpt[], PRUint32 maximumOpt, /* 0 for no max */ NSSArena *arenaOpt ) { NSSCertificate **rvCerts; PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } rvCerts = nssCertificateStore_FindCertificatesByNickname(cc->certStore, name, rvOpt, maximumOpt, arenaOpt); return rvCerts; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindCertificateByIssuerAndSerialNumber ( NSSCryptoContext *cc, NSSDER *issuer, NSSDER *serialNumber ) { PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } return nssCertificateStore_FindCertificateByIssuerAndSerialNumber( cc->certStore, issuer, serialNumber); } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestCertificateBySubject ( NSSCryptoContext *cc, NSSDER *subject, NSSTime *timeOpt, NSSUsage *usage, NSSPolicies *policiesOpt ) { NSSCertificate **certs; NSSCertificate *rvCert = NULL; PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } certs = nssCertificateStore_FindCertificatesBySubject(cc->certStore, subject, NULL, 0, NULL); if (certs) { rvCert = nssCertificateArray_FindBestCertificate(certs, timeOpt, usage, policiesOpt); nssCertificateArray_Destroy(certs); } return rvCert; } NSS_IMPLEMENT NSSCertificate ** nssCryptoContext_FindCertificatesBySubject ( NSSCryptoContext *cc, NSSDER *subject, NSSCertificate *rvOpt[], PRUint32 maximumOpt, /* 0 for no max */ NSSArena *arenaOpt ) { NSSCertificate **rvCerts; PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } rvCerts = nssCertificateStore_FindCertificatesBySubject(cc->certStore, subject, rvOpt, maximumOpt, arenaOpt); return rvCerts; } NSS_IMPLEMENT NSSCertificate ** NSSCryptoContext_FindCertificatesBySubject ( NSSCryptoContext *cc, NSSDER *subject, NSSCertificate *rvOpt[], PRUint32 maximumOpt, /* 0 for no max */ NSSArena *arenaOpt ) { return nssCryptoContext_FindCertificatesBySubject(cc, subject, rvOpt, maximumOpt, arenaOpt); } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestCertificateByNameComponents ( NSSCryptoContext *cc, NSSUTF8 *nameComponents, NSSTime *timeOpt, NSSUsage *usage, NSSPolicies *policiesOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate ** NSSCryptoContext_FindCertificatesByNameComponents ( NSSCryptoContext *cc, NSSUTF8 *nameComponents, NSSCertificate *rvOpt[], PRUint32 maximumOpt, /* 0 for no max */ NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindCertificateByEncodedCertificate ( NSSCryptoContext *cc, NSSBER *encodedCertificate ) { PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } return nssCertificateStore_FindCertificateByEncodedCertificate( cc->certStore, encodedCertificate); } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestCertificateByEmail ( NSSCryptoContext *cc, NSSASCII7 *email, NSSTime *timeOpt, NSSUsage *usage, NSSPolicies *policiesOpt ) { NSSCertificate **certs; NSSCertificate *rvCert = NULL; PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } certs = nssCertificateStore_FindCertificatesByEmail(cc->certStore, email, NULL, 0, NULL); if (certs) { rvCert = nssCertificateArray_FindBestCertificate(certs, timeOpt, usage, policiesOpt); nssCertificateArray_Destroy(certs); } return rvCert; } NSS_IMPLEMENT NSSCertificate ** NSSCryptoContext_FindCertificatesByEmail ( NSSCryptoContext *cc, NSSASCII7 *email, NSSCertificate *rvOpt[], PRUint32 maximumOpt, /* 0 for no max */ NSSArena *arenaOpt ) { NSSCertificate **rvCerts; PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } rvCerts = nssCertificateStore_FindCertificatesByEmail(cc->certStore, email, rvOpt, maximumOpt, arenaOpt); return rvCerts; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindCertificateByOCSPHash ( NSSCryptoContext *cc, NSSItem *hash ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestUserCertificate ( NSSCryptoContext *cc, NSSTime *timeOpt, NSSUsage *usage, NSSPolicies *policiesOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate ** NSSCryptoContext_FindUserCertificates ( NSSCryptoContext *cc, NSSTime *timeOpt, NSSUsage *usageOpt, NSSPolicies *policiesOpt, NSSCertificate **rvOpt, PRUint32 rvLimit, /* zero for no limit */ NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestUserCertificateForSSLClientAuth ( NSSCryptoContext *cc, NSSUTF8 *sslHostOpt, NSSDER *rootCAsOpt[], /* null pointer for none */ PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */ NSSAlgorithmAndParameters *apOpt, NSSPolicies *policiesOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate ** NSSCryptoContext_FindUserCertificatesForSSLClientAuth ( NSSCryptoContext *cc, NSSUTF8 *sslHostOpt, NSSDER *rootCAsOpt[], /* null pointer for none */ PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */ NSSAlgorithmAndParameters *apOpt, NSSPolicies *policiesOpt, NSSCertificate **rvOpt, PRUint32 rvLimit, /* zero for no limit */ NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindBestUserCertificateForEmailSigning ( NSSCryptoContext *cc, NSSASCII7 *signerOpt, NSSASCII7 *recipientOpt, /* anything more here? */ NSSAlgorithmAndParameters *apOpt, NSSPolicies *policiesOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSCertificate * NSSCryptoContext_FindUserCertificatesForEmailSigning ( NSSCryptoContext *cc, NSSASCII7 *signerOpt, /* fgmr or a more general name? */ NSSASCII7 *recipientOpt, /* anything more here? */ NSSAlgorithmAndParameters *apOpt, NSSPolicies *policiesOpt, NSSCertificate **rvOpt, PRUint32 rvLimit, /* zero for no limit */ NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSTrust * nssCryptoContext_FindTrustForCertificate ( NSSCryptoContext *cc, NSSCertificate *cert ) { PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } return nssCertificateStore_FindTrustForCertificate(cc->certStore, cert); } NSS_IMPLEMENT nssSMIMEProfile * nssCryptoContext_FindSMIMEProfileForCertificate ( NSSCryptoContext *cc, NSSCertificate *cert ) { PORT_Assert(cc->certStore); if (!cc->certStore) { return NULL; } return nssCertificateStore_FindSMIMEProfileForCertificate(cc->certStore, cert); } NSS_IMPLEMENT PRStatus NSSCryptoContext_GenerateKeyPair ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *ap, NSSPrivateKey **pvkOpt, NSSPublicKey **pbkOpt, PRBool privateKeyIsSensitive, NSSToken *destination, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSSymmetricKey * NSSCryptoContext_GenerateSymmetricKey ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *ap, PRUint32 keysize, NSSToken *destination, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSSymmetricKey * NSSCryptoContext_GenerateSymmetricKeyFromPassword ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *ap, NSSUTF8 *passwordOpt, /* if null, prompt */ NSSToken *destinationOpt, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSSymmetricKey * NSSCryptoContext_FindSymmetricKeyByAlgorithmAndKeyID ( NSSCryptoContext *cc, NSSOID *algorithm, NSSItem *keyID, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } struct token_session_str { NSSToken *token; nssSession *session; }; NSS_IMPLEMENT NSSItem * NSSCryptoContext_Decrypt ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *encryptedData, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginDecrypt ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_ContinueDecrypt ( NSSCryptoContext *cc, NSSItem *data, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_FinishDecrypt ( NSSCryptoContext *cc, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_Sign ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *data, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginSign ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT PRStatus NSSCryptoContext_ContinueSign ( NSSCryptoContext *cc, NSSItem *data ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_FinishSign ( NSSCryptoContext *cc, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_SignRecover ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *data, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginSignRecover ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_ContinueSignRecover ( NSSCryptoContext *cc, NSSItem *data, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_FinishSignRecover ( NSSCryptoContext *cc, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSSymmetricKey * NSSCryptoContext_UnwrapSymmetricKey ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *wrappedKey, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSSymmetricKey * NSSCryptoContext_DeriveSymmetricKey ( NSSCryptoContext *cc, NSSPublicKey *bk, NSSAlgorithmAndParameters *apOpt, NSSOID *target, PRUint32 keySizeOpt, /* zero for best allowed */ NSSOperations operations, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_Encrypt ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *data, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginEncrypt ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_ContinueEncrypt ( NSSCryptoContext *cc, NSSItem *data, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_FinishEncrypt ( NSSCryptoContext *cc, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_Verify ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *data, NSSItem *signature, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginVerify ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *signature, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT PRStatus NSSCryptoContext_ContinueVerify ( NSSCryptoContext *cc, NSSItem *data ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT PRStatus NSSCryptoContext_FinishVerify ( NSSCryptoContext *cc ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_VerifyRecover ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *signature, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginVerifyRecover ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSCallback *uhhOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return PR_FAILURE; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_ContinueVerifyRecover ( NSSCryptoContext *cc, NSSItem *data, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_FinishVerifyRecover ( NSSCryptoContext *cc, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_WrapSymmetricKey ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSSymmetricKey *keyToWrap, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; } NSS_IMPLEMENT NSSItem * NSSCryptoContext_Digest ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *data, NSSCallback *uhhOpt, NSSItem *rvOpt, NSSArena *arenaOpt ) { return nssToken_Digest(cc->token, cc->session, apOpt, data, rvOpt, arenaOpt); } NSS_IMPLEMENT PRStatus NSSCryptoContext_BeginDigest ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSCallback *uhhOpt ) { return nssToken_BeginDigest(cc->token, cc->session, apOpt); } NSS_IMPLEMENT PRStatus NSSCryptoContext_ContinueDigest ( NSSCryptoContext *cc, NSSAlgorithmAndParameters *apOpt, NSSItem *item ) { /* NSSAlgorithmAndParameters *ap; ap = (apOpt) ? apOpt : cc->ap; */ /* why apOpt? can't change it at this point... */ return nssToken_ContinueDigest(cc->token, cc->session, item); } NSS_IMPLEMENT NSSItem * NSSCryptoContext_FinishDigest ( NSSCryptoContext *cc, NSSItem *rvOpt, NSSArena *arenaOpt ) { return nssToken_FinishDigest(cc->token, cc->session, rvOpt, arenaOpt); } NSS_IMPLEMENT NSSCryptoContext * NSSCryptoContext_Clone ( NSSCryptoContext *cc ) { nss_SetError(NSS_ERROR_NOT_FOUND); return NULL; }