private protected PgpKey(KeyPacket keyPacket) { this.keyPacket = keyPacket; this.keyCertifications = new List <PgpCertification>(); this.ids = new List <PgpUser>(); this.fingerprint = CalculateFingerprint(); if (keyPacket.Version <= 3) { var rsaParameters = RsaKey.ReadOpenPgpPublicKey(keyPacket.KeyBytes, out var _); var modulus = rsaParameters.Modulus !; this.keyId = (long)(((ulong)modulus[modulus.Length - 8] << 56) | ((ulong)modulus[modulus.Length - 7] << 48) | ((ulong)modulus[modulus.Length - 6] << 40) | ((ulong)modulus[modulus.Length - 5] << 32) | ((ulong)modulus[modulus.Length - 4] << 24) | ((ulong)modulus[modulus.Length - 3] << 16) | ((ulong)modulus[modulus.Length - 2] << 8) | (ulong)modulus[modulus.Length - 1]); } else { this.keyId = (long)(((ulong)fingerprint[fingerprint.Length - 8] << 56) | ((ulong)fingerprint[fingerprint.Length - 7] << 48) | ((ulong)fingerprint[fingerprint.Length - 6] << 40) | ((ulong)fingerprint[fingerprint.Length - 5] << 32) | ((ulong)fingerprint[fingerprint.Length - 4] << 24) | ((ulong)fingerprint[fingerprint.Length - 3] << 16) | ((ulong)fingerprint[fingerprint.Length - 2] << 8) | (ulong)fingerprint[fingerprint.Length - 1]); } }
private byte[] CalculateFingerprint() { HashAlgorithm digest; if (Version <= 3) { var rsaParameters = RsaKey.ReadOpenPgpPublicKey(keyPacket.KeyBytes, out var _); digest = MD5.Create(); digest.TransformBlock(rsaParameters.Modulus !, 0, rsaParameters.Modulus !.Length, null, 0); digest.TransformBlock(rsaParameters.Exponent !, 0, rsaParameters.Exponent !.Length, null, 0); } else { byte[] kBytes = keyPacket.GetEncodedContents(); digest = SHA1.Create(); digest.TransformBlock(new byte[] { 0x99, (byte)(kBytes.Length >> 8), (byte)kBytes.Length }, 0, 3, null, 0); digest.TransformBlock(kBytes, 0, kBytes.Length, null, 0); } digest.TransformFinalBlock(Array.Empty <byte>(), 0, 0); return(digest.Hash !); }