public byte[] DigestKey(Mechanism mechanism, ObjectHandle keyHandle)
{
if (this._disposed)
throw new ObjectDisposedException(this.GetType().FullName);
if (mechanism == null)
throw new ArgumentNullException("mechanism");
if (keyHandle == null)
throw new ArgumentNullException("keyHandle");
CK_MECHANISM ckMechanism = mechanism.CkMechanism;
CKR rv = _p11.C_DigestInit(_sessionId, ref ckMechanism);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_DigestInit", rv);
rv = _p11.C_DigestKey(_sessionId, keyHandle.ObjectId);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_DigestKey", rv);
ulong digestLen = 0;
rv = _p11.C_DigestFinal(_sessionId, null, ref digestLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_DigestFinal", rv);
byte[] digest = new byte[digestLen];
rv = _p11.C_DigestFinal(_sessionId, digest, ref digestLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_DigestFinal", rv);
if (digest.Length != Convert.ToInt32(digestLen))
Array.Resize(ref digest, Convert.ToInt32(digestLen));
return digest;
}