gecko/security/nss/lib/ckfw/crypto.c
2009-02-10 09:18:32 -08:00

378 lines
10 KiB
C

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* 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
* Red Hat, Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Bob Relyea (rrelyea@redhat.com)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifdef DEBUG
static const char CVS_ID[] = "@(#) $RCSfile: crypto.c,v $ $Revision: 1.4 $ $Date: 2009/02/09 07:55:51 $";
#endif /* DEBUG */
/*
* crypto.c
*
* This file implements the NSSCKFWCryptoOperation type and methods.
*/
#ifndef CK_T
#include "ck.h"
#endif /* CK_T */
/*
* NSSCKFWCryptoOperation
*
* -- create/destroy --
* nssCKFWCrytoOperation_Create
* nssCKFWCryptoOperation_Destroy
*
* -- implement public accessors --
* nssCKFWCryptoOperation_GetMDCryptoOperation
* nssCKFWCryptoOperation_GetType
*
* -- private accessors --
*
* -- module fronts --
* nssCKFWCryptoOperation_GetFinalLength
* nssCKFWCryptoOperation_GetOperationLength
* nssCKFWCryptoOperation_Final
* nssCKFWCryptoOperation_Update
* nssCKFWCryptoOperation_DigestUpdate
* nssCKFWCryptoOperation_UpdateFinal
*/
struct NSSCKFWCryptoOperationStr {
/* NSSArena *arena; */
NSSCKMDCryptoOperation *mdOperation;
NSSCKMDSession *mdSession;
NSSCKFWSession *fwSession;
NSSCKMDToken *mdToken;
NSSCKFWToken *fwToken;
NSSCKMDInstance *mdInstance;
NSSCKFWInstance *fwInstance;
NSSCKFWCryptoOperationType type;
};
/*
* nssCKFWCrytoOperation_Create
*/
NSS_EXTERN NSSCKFWCryptoOperation *
nssCKFWCryptoOperation_Create(
NSSCKMDCryptoOperation *mdOperation,
NSSCKMDSession *mdSession,
NSSCKFWSession *fwSession,
NSSCKMDToken *mdToken,
NSSCKFWToken *fwToken,
NSSCKMDInstance *mdInstance,
NSSCKFWInstance *fwInstance,
NSSCKFWCryptoOperationType type,
CK_RV *pError
)
{
NSSCKFWCryptoOperation *fwOperation;
fwOperation = nss_ZNEW(NULL, NSSCKFWCryptoOperation);
if (!fwOperation) {
*pError = CKR_HOST_MEMORY;
return (NSSCKFWCryptoOperation *)NULL;
}
fwOperation->mdOperation = mdOperation;
fwOperation->mdSession = mdSession;
fwOperation->fwSession = fwSession;
fwOperation->mdToken = mdToken;
fwOperation->fwToken = fwToken;
fwOperation->mdInstance = mdInstance;
fwOperation->fwInstance = fwInstance;
fwOperation->type = type;
return fwOperation;
}
/*
* nssCKFWCryptoOperation_Destroy
*/
NSS_EXTERN void
nssCKFWCryptoOperation_Destroy
(
NSSCKFWCryptoOperation *fwOperation
)
{
if ((NSSCKMDCryptoOperation *) NULL != fwOperation->mdOperation) {
if (fwOperation->mdOperation->Destroy) {
fwOperation->mdOperation->Destroy(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdInstance,
fwOperation->fwInstance);
}
}
nss_ZFreeIf(fwOperation);
}
/*
* nssCKFWCryptoOperation_GetMDCryptoOperation
*/
NSS_EXTERN NSSCKMDCryptoOperation *
nssCKFWCryptoOperation_GetMDCryptoOperation
(
NSSCKFWCryptoOperation *fwOperation
)
{
return fwOperation->mdOperation;
}
/*
* nssCKFWCryptoOperation_GetType
*/
NSS_EXTERN NSSCKFWCryptoOperationType
nssCKFWCryptoOperation_GetType
(
NSSCKFWCryptoOperation *fwOperation
)
{
return fwOperation->type;
}
/*
* nssCKFWCryptoOperation_GetFinalLength
*/
NSS_EXTERN CK_ULONG
nssCKFWCryptoOperation_GetFinalLength
(
NSSCKFWCryptoOperation *fwOperation,
CK_RV *pError
)
{
if (!fwOperation->mdOperation->GetFinalLength) {
*pError = CKR_FUNCTION_FAILED;
return 0;
}
return fwOperation->mdOperation->GetFinalLength(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
pError);
}
/*
* nssCKFWCryptoOperation_GetOperationLength
*/
NSS_EXTERN CK_ULONG
nssCKFWCryptoOperation_GetOperationLength
(
NSSCKFWCryptoOperation *fwOperation,
NSSItem *inputBuffer,
CK_RV *pError
)
{
if (!fwOperation->mdOperation->GetOperationLength) {
*pError = CKR_FUNCTION_FAILED;
return 0;
}
return fwOperation->mdOperation->GetOperationLength(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
inputBuffer,
pError);
}
/*
* nssCKFWCryptoOperation_Final
*/
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_Final
(
NSSCKFWCryptoOperation *fwOperation,
NSSItem *outputBuffer
)
{
if (!fwOperation->mdOperation->Final) {
return CKR_FUNCTION_FAILED;
}
return fwOperation->mdOperation->Final(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
outputBuffer);
}
/*
* nssCKFWCryptoOperation_Update
*/
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_Update
(
NSSCKFWCryptoOperation *fwOperation,
NSSItem *inputBuffer,
NSSItem *outputBuffer
)
{
if (!fwOperation->mdOperation->Update) {
return CKR_FUNCTION_FAILED;
}
return fwOperation->mdOperation->Update(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
inputBuffer,
outputBuffer);
}
/*
* nssCKFWCryptoOperation_DigestUpdate
*/
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_DigestUpdate
(
NSSCKFWCryptoOperation *fwOperation,
NSSItem *inputBuffer
)
{
if (!fwOperation->mdOperation->DigestUpdate) {
return CKR_FUNCTION_FAILED;
}
return fwOperation->mdOperation->DigestUpdate(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
inputBuffer);
}
/*
* nssCKFWCryptoOperation_DigestKey
*/
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_DigestKey
(
NSSCKFWCryptoOperation *fwOperation,
NSSCKFWObject *fwObject /* Key */
)
{
NSSCKMDObject *mdObject;
if (!fwOperation->mdOperation->DigestKey) {
return CKR_FUNCTION_FAILED;
}
mdObject = nssCKFWObject_GetMDObject(fwObject);
return fwOperation->mdOperation->DigestKey(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
mdObject,
fwObject);
}
/*
* nssCKFWCryptoOperation_UpdateFinal
*/
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_UpdateFinal
(
NSSCKFWCryptoOperation *fwOperation,
NSSItem *inputBuffer,
NSSItem *outputBuffer
)
{
if (!fwOperation->mdOperation->UpdateFinal) {
return CKR_FUNCTION_FAILED;
}
return fwOperation->mdOperation->UpdateFinal(
fwOperation->mdOperation,
fwOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
inputBuffer,
outputBuffer);
}
/*
* nssCKFWCryptoOperation_UpdateCombo
*/
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_UpdateCombo
(
NSSCKFWCryptoOperation *fwOperation,
NSSCKFWCryptoOperation *fwPeerOperation,
NSSItem *inputBuffer,
NSSItem *outputBuffer
)
{
if (!fwOperation->mdOperation->UpdateCombo) {
return CKR_FUNCTION_FAILED;
}
return fwOperation->mdOperation->UpdateCombo(
fwOperation->mdOperation,
fwOperation,
fwPeerOperation->mdOperation,
fwPeerOperation,
fwOperation->mdSession,
fwOperation->fwSession,
fwOperation->mdToken,
fwOperation->fwToken,
fwOperation->mdInstance,
fwOperation->fwInstance,
inputBuffer,
outputBuffer);
}