aboutsummaryrefslogtreecommitdiffstats
path: root/SoftHSMv2/src/lib/session_mgr/Session.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SoftHSMv2/src/lib/session_mgr/Session.cpp')
-rw-r--r--SoftHSMv2/src/lib/session_mgr/Session.cpp454
1 files changed, 454 insertions, 0 deletions
diff --git a/SoftHSMv2/src/lib/session_mgr/Session.cpp b/SoftHSMv2/src/lib/session_mgr/Session.cpp
new file mode 100644
index 0000000..5db36fd
--- /dev/null
+++ b/SoftHSMv2/src/lib/session_mgr/Session.cpp
@@ -0,0 +1,454 @@
+/*
+ * Copyright (c) 2010 .SE (The Internet Infrastructure Foundation)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*****************************************************************************
+ Session.h
+
+ This class represents a single session
+ *****************************************************************************/
+
+#include "CryptoFactory.h"
+#include "Session.h"
+
+// Constructor
+Session::Session(Slot* inSlot, bool inIsReadWrite, CK_VOID_PTR inPApplication, CK_NOTIFY inNotify)
+{
+ slot = inSlot;
+ token = slot->getToken();
+ isReadWrite = inIsReadWrite;
+ hSession = CK_INVALID_HANDLE;
+ pApplication = inPApplication;
+ notify = inNotify;
+ operation = SESSION_OP_NONE;
+ findOp = NULL;
+ digestOp = NULL;
+ hashAlgo = HashAlgo::Unknown;
+ macOp = NULL;
+ asymmetricCryptoOp = NULL;
+ symmetricCryptoOp = NULL;
+ mechanism = AsymMech::Unknown;
+ reAuthentication = false;
+ allowSinglePartOp = false;
+ allowMultiPartOp = false;
+ publicKey = NULL;
+ privateKey = NULL;
+ symmetricKey = NULL;
+ param = NULL;
+ paramLen = 0;
+}
+
+// Constructor
+Session::Session()
+{
+ slot = NULL;
+ token = NULL;
+ isReadWrite = false;
+ hSession = CK_INVALID_HANDLE;
+ pApplication = NULL;
+ notify = NULL;
+ operation = SESSION_OP_NONE;
+ findOp = NULL;
+ digestOp = NULL;
+ hashAlgo = HashAlgo::Unknown;
+ macOp = NULL;
+ asymmetricCryptoOp = NULL;
+ symmetricCryptoOp = NULL;
+ mechanism = AsymMech::Unknown;
+ reAuthentication = false;
+ allowSinglePartOp = false;
+ allowMultiPartOp = false;
+ publicKey = NULL;
+ privateKey = NULL;
+ symmetricKey = NULL;
+ param = NULL;
+ paramLen = 0;
+}
+
+// Destructor
+Session::~Session()
+{
+ resetOp();
+}
+
+// Get session info
+CK_RV Session::getInfo(CK_SESSION_INFO_PTR pInfo)
+{
+ if (pInfo == NULL_PTR) return CKR_ARGUMENTS_BAD;
+
+ pInfo->slotID = slot->getSlotID();
+
+ pInfo->state = getState();
+ pInfo->flags = CKF_SERIAL_SESSION;
+ if (isRW())
+ {
+ pInfo->flags |= CKF_RW_SESSION;
+ }
+ pInfo->ulDeviceError = 0;
+
+ return CKR_OK;
+}
+
+// Is a read and write session
+bool Session::isRW()
+{
+ return isReadWrite;
+}
+
+// Get session state
+CK_STATE Session::getState()
+{
+ if (token->isSOLoggedIn())
+ {
+ return CKS_RW_SO_FUNCTIONS;
+ }
+
+ if (token->isUserLoggedIn())
+ {
+ if (isRW())
+ {
+ return CKS_RW_USER_FUNCTIONS;
+ }
+ else
+ {
+ return CKS_RO_USER_FUNCTIONS;
+ }
+ }
+
+ if (isRW())
+ {
+ return CKS_RW_PUBLIC_SESSION;
+ }
+ else
+ {
+ return CKS_RO_PUBLIC_SESSION;
+ }
+}
+
+void Session::setHandle(CK_SESSION_HANDLE inHSession)
+{
+ hSession = inHSession;
+}
+
+CK_SESSION_HANDLE Session::getHandle()
+{
+ return hSession;
+}
+
+// Return the slot that the session is connected to
+Slot* Session::getSlot()
+{
+ return slot;
+}
+
+// Return the token that the session is connected to
+Token* Session::getToken()
+{
+ return token;
+}
+
+// Set the operation type
+void Session::setOpType(int inOperation)
+{
+ operation = inOperation;
+}
+
+// Get the operation type
+int Session::getOpType()
+{
+ return operation;
+}
+
+// Reset the operations
+void Session::resetOp()
+{
+ if (param != NULL)
+ {
+ free(param);
+ param = NULL;
+ paramLen = 0;
+ }
+
+ if (digestOp != NULL)
+ {
+ CryptoFactory::i()->recycleHashAlgorithm(digestOp);
+ digestOp = NULL;
+ }
+ else if (findOp != NULL)
+ {
+ findOp->recycle();
+ findOp = NULL;
+ }
+ else if (asymmetricCryptoOp != NULL)
+ {
+ if (publicKey != NULL)
+ {
+ asymmetricCryptoOp->recyclePublicKey(publicKey);
+ publicKey = NULL;
+ }
+ if (privateKey != NULL)
+ {
+ asymmetricCryptoOp->recyclePrivateKey(privateKey);
+ privateKey = NULL;
+ }
+ CryptoFactory::i()->recycleAsymmetricAlgorithm(asymmetricCryptoOp);
+ asymmetricCryptoOp = NULL;
+ }
+ else if (symmetricCryptoOp != NULL)
+ {
+ if (symmetricKey != NULL)
+ {
+ symmetricCryptoOp->recycleKey(symmetricKey);
+ symmetricKey = NULL;
+ }
+ CryptoFactory::i()->recycleSymmetricAlgorithm(symmetricCryptoOp);
+ symmetricCryptoOp = NULL;
+ }
+ else if (macOp != NULL)
+ {
+ if (symmetricKey != NULL)
+ {
+ macOp->recycleKey(symmetricKey);
+ symmetricKey = NULL;
+ }
+ CryptoFactory::i()->recycleMacAlgorithm(macOp);
+ macOp = NULL;
+ }
+
+ operation = SESSION_OP_NONE;
+ reAuthentication = false;
+}
+
+void Session::setFindOp(FindOperation *inFindOp)
+{
+ if (findOp != NULL) {
+ delete findOp;
+ }
+ findOp = inFindOp;
+}
+
+FindOperation *Session::getFindOp()
+{
+ return findOp;
+}
+
+// Set the digesting operator
+void Session::setDigestOp(HashAlgorithm* inDigestOp)
+{
+ if (digestOp != NULL)
+ {
+ CryptoFactory::i()->recycleHashAlgorithm(digestOp);
+ }
+
+ digestOp = inDigestOp;
+}
+
+// Get the digesting operator
+HashAlgorithm* Session::getDigestOp()
+{
+ return digestOp;
+}
+
+void Session::setHashAlgo(HashAlgo::Type inHashAlgo)
+{
+ hashAlgo = inHashAlgo;
+}
+
+HashAlgo::Type Session::getHashAlgo()
+{
+ return hashAlgo;
+}
+
+// Set the MACing operator
+void Session::setMacOp(MacAlgorithm *inMacOp)
+{
+ if (macOp != NULL)
+ {
+ setSymmetricKey(NULL);
+ CryptoFactory::i()->recycleMacAlgorithm(macOp);
+ }
+
+ macOp = inMacOp;
+}
+
+// Get the MACing operator
+MacAlgorithm *Session::getMacOp()
+{
+ return macOp;
+}
+
+void Session::setAsymmetricCryptoOp(AsymmetricAlgorithm *inAsymmetricCryptoOp)
+{
+ if (asymmetricCryptoOp != NULL)
+ {
+ setPublicKey(NULL);
+ setPrivateKey(NULL);
+ CryptoFactory::i()->recycleAsymmetricAlgorithm(asymmetricCryptoOp);
+ }
+
+ asymmetricCryptoOp = inAsymmetricCryptoOp;
+}
+
+AsymmetricAlgorithm *Session::getAsymmetricCryptoOp()
+{
+ return asymmetricCryptoOp;
+}
+
+void Session::setSymmetricCryptoOp(SymmetricAlgorithm *inSymmetricCryptoOp)
+{
+ if (symmetricCryptoOp != NULL)
+ {
+ setSymmetricKey(NULL);
+ CryptoFactory::i()->recycleSymmetricAlgorithm(symmetricCryptoOp);
+ }
+
+ symmetricCryptoOp = inSymmetricCryptoOp;
+}
+
+SymmetricAlgorithm *Session::getSymmetricCryptoOp()
+{
+ return symmetricCryptoOp;
+}
+
+void Session::setMechanism(AsymMech::Type inMechanism)
+{
+ mechanism = inMechanism;
+}
+
+AsymMech::Type Session::getMechanism()
+{
+ return mechanism;
+}
+
+void Session::setParameters(void* inParam, size_t inParamLen)
+{
+ if (inParam == NULL || inParamLen == 0) return;
+
+ if (param != NULL)
+ {
+ free(param);
+ paramLen = 0;
+ }
+
+ param = malloc(inParamLen);
+ if (param != NULL)
+ {
+ memcpy(param, inParam, inParamLen);
+ paramLen = inParamLen;
+ }
+}
+
+void* Session::getParameters(size_t& inParamLen)
+{
+ inParamLen = paramLen;
+ return param;
+}
+
+void Session::setReAuthentication(bool inReAuthentication)
+{
+ reAuthentication = inReAuthentication;
+}
+
+bool Session::getReAuthentication()
+{
+ return reAuthentication;
+}
+
+void Session::setAllowMultiPartOp(bool inAllowMultiPartOp)
+{
+ allowMultiPartOp = inAllowMultiPartOp;
+}
+
+bool Session::getAllowMultiPartOp()
+{
+ return allowMultiPartOp;
+}
+
+void Session::setAllowSinglePartOp(bool inAllowSinglePartOp)
+{
+ allowSinglePartOp = inAllowSinglePartOp;
+}
+
+bool Session::getAllowSinglePartOp()
+{
+ return allowSinglePartOp;
+}
+
+void Session::setPublicKey(PublicKey* inPublicKey)
+{
+ if (asymmetricCryptoOp == NULL)
+ return;
+
+ if (publicKey != NULL)
+ {
+ asymmetricCryptoOp->recyclePublicKey(publicKey);
+ }
+
+ publicKey = inPublicKey;
+}
+
+PublicKey* Session::getPublicKey()
+{
+ return publicKey;
+}
+
+void Session::setPrivateKey(PrivateKey* inPrivateKey)
+{
+ if (asymmetricCryptoOp == NULL)
+ return;
+
+ if (privateKey != NULL)
+ {
+ asymmetricCryptoOp->recyclePrivateKey(privateKey);
+ }
+
+ privateKey = inPrivateKey;
+}
+
+PrivateKey* Session::getPrivateKey()
+{
+ return privateKey;
+}
+
+void Session::setSymmetricKey(SymmetricKey* inSymmetricKey)
+{
+ if (symmetricKey != NULL)
+ {
+ if (macOp) {
+ macOp->recycleKey(symmetricKey);
+ } else if (symmetricCryptoOp) {
+ symmetricCryptoOp->recycleKey(symmetricKey);
+ } else {
+ return;
+ }
+ }
+
+ symmetricKey = inSymmetricKey;
+}
+
+SymmetricKey* Session::getSymmetricKey()
+{
+ return symmetricKey;
+}