public byte[] VerifyRecover(Mechanism mechanism, ObjectHandle keyHandle, byte[] signature, out bool isValid)
{
if (this._disposed)
throw new ObjectDisposedException(this.GetType().FullName);
if (mechanism == null)
throw new ArgumentNullException("mechanism");
if (keyHandle == null)
throw new ArgumentNullException("keyHandle");
if (signature == null)
throw new ArgumentNullException("signature");
CK_MECHANISM ckMechanism = mechanism.CkMechanism;
CKR rv = _p11.C_VerifyRecoverInit(_sessionId, ref ckMechanism, keyHandle.ObjectId);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_VerifyRecoverInit", rv);
ulong dataLen = 0;
rv = _p11.C_VerifyRecover(_sessionId, signature, Convert.ToUInt64(signature.Length), null, ref dataLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_VerifyRecover", rv);
byte[] data = new byte[dataLen];
rv = _p11.C_VerifyRecover(_sessionId, signature, Convert.ToUInt64(signature.Length), data, ref dataLen);
if (rv == CKR.CKR_OK)
isValid = true;
else if (rv == CKR.CKR_SIGNATURE_INVALID)
isValid = false;
else
throw new Pkcs11Exception("C_VerifyRecover", rv);
if (data.Length != Convert.ToInt32(dataLen))
Array.Resize(ref data, Convert.ToInt32(dataLen));
return data;
}