/// <summary> /// Computes the hash of certain parameters used in RSA certificates and keys. /// </summary> /// <param name="rsaParameters">The cryptographic RSA parameters.</param> /// <param name="includePrivateParameters">true to include cryptographic RSA private parameters, /// false to include only public ones.</param> /// <param name="embeddedData">The embedded data to consider for computing /// the hash.</param> /// <returns>The hash.</returns> public static IHash ComputeRsaHash(RSAParameters rsaParameters, bool includePrivateParameters, IEnumerable <byte> embeddedData) { using (var stream = new MemoryStream()) { var data = new List <byte[]>(); data.Add(rsaParameters.Exponent); data.Add(rsaParameters.Modulus); if (includePrivateParameters) { data.Add(new byte[] { 0x01 }); data.Add(rsaParameters.D); data.Add(rsaParameters.DP); data.Add(rsaParameters.DQ); data.Add(rsaParameters.InverseQ); data.Add(rsaParameters.P); data.Add(rsaParameters.Q); } else { data.Add(new byte[] { 0x00 }); } if (embeddedData != null) { data.Add(new byte[] { 0x01 }); data.Add(Sha512Hash.Compute(embeddedData.ToArray()).Hash.ToArray()); } else { data.Add(new byte[] { 0x00 }); } int i = 0; foreach (var d in data) { var iBytes = BitConverter.GetBytes(i); if (!BitConverter.IsLittleEndian) { iBytes = iBytes.Reverse().ToArray(); } stream.Write(iBytes, 0, iBytes.Length); var info = d; if (!BitConverter.IsLittleEndian) { info = info.Reverse().ToArray(); } stream.Write(info, 0, info.Length); } stream.Position = 0; return(Sha512Hash.Compute(stream)); } }
private IHash computeHash() { using (var stream = new MemoryStream()) { var signerCertificateHashCountBytes = BitConverter.GetBytes(this.SignerCertificateHash.Hash.Count); if (!BitConverter.IsLittleEndian) { signerCertificateHashCountBytes = signerCertificateHashCountBytes.Reverse().ToArray(); } stream.Write(signerCertificateHashCountBytes, 0, signerCertificateHashCountBytes.Length); stream.Write(this.SignerCertificateHash.Hash.ToArray(), 0, this.SignerCertificateHash.Hash.Count); var signatureCountBytes = BitConverter.GetBytes(this.Signature.Count); if (!BitConverter.IsLittleEndian) { signatureCountBytes = signatureCountBytes.Reverse().ToArray(); } stream.Write(signatureCountBytes, 0, signatureCountBytes.Length); stream.Write(this.Signature.ToArray(), 0, this.Signature.Count); stream.Position = 0; return(Sha512Hash.Compute(stream)); } }