public byte[] Sign(Mechanism mechanism, ObjectHandle keyHandle, Stream inputStream, int bufferLength)
{
if (this._disposed)
throw new ObjectDisposedException(this.GetType().FullName);
if (mechanism == null)
throw new ArgumentNullException("mechanism");
if (keyHandle == null)
throw new ArgumentNullException("keyHandle");
if (inputStream == null)
throw new ArgumentNullException("inputStream");
if (bufferLength < 1)
throw new ArgumentException("Value has to be positive number", "bufferLength");
CK_MECHANISM ckMechanism = mechanism.CkMechanism;
CKR rv = _p11.C_SignInit(_sessionId, ref ckMechanism, keyHandle.ObjectId);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_SignInit", rv);
byte[] part = new byte[bufferLength];
int bytesRead = 0;
while ((bytesRead = inputStream.Read(part, 0, part.Length)) > 0)
{
rv = _p11.C_SignUpdate(_sessionId, part, Convert.ToUInt64(bytesRead));
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_SignUpdate", rv);
}
ulong signatureLen = 0;
rv = _p11.C_SignFinal(_sessionId, null, ref signatureLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_SignFinal", rv);
byte[] signature = new byte[signatureLen];
rv = _p11.C_SignFinal(_sessionId, signature, ref signatureLen);
if (rv != CKR.CKR_OK)
throw new Pkcs11Exception("C_SignFinal", rv);
if (signature.Length != Convert.ToInt32(signatureLen))
Array.Resize(ref signature, Convert.ToInt32(signatureLen));
return signature;
}