/// <summary> /// Gets the signature. /// </summary> /// <param name="key">The key data bytes.</param> /// <returns></returns> public override byte[] GetSignature(IEnumerable<byte> key) { var signature = new RSADigitalSignature(new RSAPrivateKey(this._exponent, this._modulus, this._dValue, this._dpValue, this._qValue, this._dqValue, this._pValue, this._inverseQ)); return new SignatureKeyData { AlgorithmName = this.Name, Signature = signature.CreateSignature(key.ToArray()), }.GetBytes().ToArray(); }
/// <summary> /// Verifies the signature. /// </summary> /// <param name="hash">The hash.</param> /// <param name="signature">The signature.</param> /// <returns> /// true if signature verified; otherwise false. /// </returns> public override bool VerifySignature(IEnumerable<byte> hash, IEnumerable<byte> signature) { long i = 0; long j = 0; byte[] tmp; var sig = signature.ToArray(); if (sig[0] == 0 && sig[1] == 0 && sig[2] == 0) { long i1 = (sig[i++] << 24) & 0xff000000; long i2 = (sig[i++] << 16) & 0x00ff0000; long i3 = (sig[i++] << 8) & 0x0000ff00; long i4 = (sig[i++]) & 0x000000ff; j = i1 | i2 | i3 | i4; i += j; i1 = (sig[i++] << 24) & 0xff000000; i2 = (sig[i++] << 16) & 0x00ff0000; i3 = (sig[i++] << 8) & 0x0000ff00; i4 = (sig[i++]) & 0x000000ff; j = i1 | i2 | i3 | i4; tmp = new byte[j]; Array.Copy(sig, (int)i, tmp, 0, (int)j); sig = tmp; } var sig1 = new RSADigitalSignature(new RSAPublicKey(this._exponent, this._modulus)); return sig1.VerifySignature(hash.ToArray(), sig); }