public byte[] Decrypt(Mechanism mechanism, ObjectHandle keyHandle, byte[] encryptedData)
{
if (this._disposed)
throw new ObjectDisposedException(this.GetType().FullName);
if (mechanism == null)
throw new ArgumentNullException("mechanism");
if (keyHandle == null)
throw new ArgumentNullException("keyHandle");
if (encryptedData == null)
throw new ArgumentNullException("encryptedData");
CK_MECHANISM ckMechanism = mechanism.CkMechanism;
CKR rv = _p11.C_DecryptInit(_sessionId, ref ckMechanism, keyHandle.ObjectId);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_DecryptInit", rv);
ulong decryptedDataLen = 0;
rv = _p11.C_Decrypt(_sessionId, encryptedData, Convert.ToUInt64(encryptedData.Length), null, ref decryptedDataLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_Decrypt", rv);
byte[] decryptedData = new byte[decryptedDataLen];
rv = _p11.C_Decrypt(_sessionId, encryptedData, Convert.ToUInt64(encryptedData.Length), decryptedData, ref decryptedDataLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_Decrypt", rv);
if (decryptedData.Length != Convert.ToInt32(decryptedDataLen))
Array.Resize(ref decryptedData, Convert.ToInt32(decryptedDataLen));
return decryptedData;
}