private void VerifyAssert(ReadOnlySpan <byte> authData, ReadOnlySpan <byte> signature, FidoExtensions extensions) { byte[] keyBytes = null; using (var fin = new StreamReader(File.OpenRead(PublicKey))) { var reader = new PemReader(fin); if (Type == KeyType.ECDSA) { ECPublicKeyParameters parameters = (ECPublicKeyParameters)reader.ReadObject(); var x = parameters.Q.XCoord.ToBigInteger().ToByteArray(); var y = parameters.Q.YCoord.ToBigInteger().ToByteArray(); keyBytes = new byte[64]; // Why? There seems to be an extra byte at the beginning sometimes Array.Copy(x, x.Length - 32, keyBytes, 0, 32); Array.Copy(y, y.Length - 32, keyBytes, 32, 32); } else if (Type == KeyType.RSA) { RsaKeyParameters parameters = (RsaKeyParameters)reader.ReadObject(); var mod = parameters.Modulus.ToByteArray(); var e = parameters.Exponent.ToByteArray(); keyBytes = new byte[mod.Length + e.Length]; mod.CopyTo(keyBytes, 0); e.CopyTo(keyBytes, mod.Length); } else if (Type == KeyType.EDDSA) { throw new NotSupportedException("Original example includes this but not sure why, it doesn't seem supported"); } else { throw new NotSupportedException("Unsupported key type"); } } using (var assert = new FidoAssertion()) { assert.SetClientData(Cd); assert.Rp = "localhost"; assert.Count = 1; assert.SetAuthData(authData, 0); assert.SetExtensions(extensions); if (UserPresenceRequired) { assert.SetUserPresenceRequired(true); } if (UserVerificationRequired) { assert.SetUserVerificationRequired(true); } assert.SetSignature(signature, 0); assert.Verify(0, FromKeyType(Type), keyBytes); } }
private void VerifyAssert(ReadOnlySpan <byte> authData, ReadOnlySpan <byte> signature, FidoExtensions extensions) { var ext = HMACSalt != null ? FidoExtensions.HmacSecret : FidoExtensions.None; byte[] keyBytes = null; using (var fin = new StreamReader(File.OpenRead(PublicKey))) { var reader = new PemReader(fin); if (Type == KeyType.ECDSA) { ECPublicKeyParameters parameters = (ECPublicKeyParameters)reader.ReadObject(); var x = parameters.Q.XCoord.ToBigInteger().ToByteArray(); var y = parameters.Q.YCoord.ToBigInteger().ToByteArray(); keyBytes = new byte[x.Length + y.Length - 1]; x.CopyTo(keyBytes, 0); // Why? There seems to be an extra byte at the beginning Array.Copy(y, 1, keyBytes, x.Length, y.Length - 1); } else { RsaKeyParameters parameters = (RsaKeyParameters)reader.ReadObject(); var mod = parameters.Modulus.ToByteArray(); var e = parameters.Exponent.ToByteArray(); keyBytes = new byte[mod.Length + e.Length]; mod.CopyTo(keyBytes, 0); e.CopyTo(keyBytes, mod.Length); } } using (var assert = new FidoAssertion()) { assert.ClientDataHash = Cdh; assert.Rp = "localhost"; assert.Count = 1; assert.SetAuthData(authData, 0); assert.SetExtensions(ext); assert.SetOptions(UserPresenceRequired, UserVerificationRequired); assert.SetSignature(signature, 0); assert.Verify(0, FromKeyType(Type), keyBytes); } }