public override bool Equals(object obj) { if (!(obj is RawRegisterResponse)) { return(false); } if (this == obj) { return(true); } if (GetType() != obj.GetType()) { return(false); } RawRegisterResponse other = (RawRegisterResponse)obj; if (!_attestationCertificate.Equals(other._attestationCertificate)) { return(false); } if (!_keyHandle.SequenceEqual(other._keyHandle)) { return(false); } if (!_signature.SequenceEqual(other._signature)) { return(false); } return(_userPublicKey.SequenceEqual(other._userPublicKey)); }
/// <summary> /// Converts string response into RawRegisterResponse object /// </summary> /// <param name="rawDataBase64">raw string from client</param> /// <returns>RawRegisterResponse object</returns> public static RawRegisterResponse FromBase64(string rawDataBase64) { if (string.IsNullOrWhiteSpace(rawDataBase64)) { throw new ArgumentException("Invalid argument were being passed."); } byte[] bytes = rawDataBase64.Base64StringToByteArray(); Stream stream = new MemoryStream(bytes); BinaryReader binaryReader = new BinaryReader(stream); try { byte reservedByte = binaryReader.ReadByte(); if (reservedByte != RegistrationReservedByteValue) { throw new U2fException($"Incorrect value of reserved byte. Expected: {RegistrationReservedByteValue}. Was: {reservedByte}"); } byte[] publicKey = binaryReader.ReadBytes(65); byte keyHandleLength = binaryReader.ReadByte(); byte[] keyHandle = binaryReader.ReadBytes(keyHandleLength); List <byte> rawCertBytes = new List <byte>(); while (binaryReader.BaseStream.Length - binaryReader.BaseStream.Position > 0) { byte end = binaryReader.ReadByte(); rawCertBytes.Add(end); } X509Certificate2 attestationCertificate = new X509Certificate2(rawCertBytes.ToArray()); // reserved byte + public key length + key handle length + cert data length int size = 1 + 65 + 1 + keyHandle.Length + attestationCertificate.RawData.Length; byte[] signature = bytes.Skip(size).Take(bytes.Length - size).ToArray(); RawRegisterResponse rawRegisterResponse = new RawRegisterResponse( publicKey, keyHandle, attestationCertificate, signature); return(rawRegisterResponse); } catch (Exception exception) { throw new U2fException("Error when parsing attestation certificate", exception); } finally { stream.Dispose(); binaryReader.Dispose(); } }
/// <summary> /// Converts string response into RawRegisterResponse object /// </summary> /// <param name="rawDataBase64">raw string from client</param> /// <returns>RawRegisterResponse object</returns> public static RawRegisterResponse FromBase64(string rawDataBase64) { if (string.IsNullOrWhiteSpace(rawDataBase64)) { throw new ArgumentException("Invalid argument were being passed."); } byte[] bytes = rawDataBase64.Base64StringToByteArray(); Stream stream = new MemoryStream(bytes); BinaryReader binaryReader = new BinaryReader(stream); try { byte reservedByte = binaryReader.ReadByte(); if (reservedByte != RegistrationReservedByteValue) { throw new U2fException(string.Format("Incorrect value of reserved byte. Expected: {0}. Was: {1}", RegistrationReservedByteValue, reservedByte)); } byte[] publicKey = binaryReader.ReadBytes(65); byte[] keyHandle = binaryReader.ReadBytes(binaryReader.ReadByte()); X509CertificateParser x509CertificateParser = new X509CertificateParser(); X509Certificate attestationCertificate = x509CertificateParser.ReadCertificate(stream); int size = (int)(binaryReader.BaseStream.Length - binaryReader.BaseStream.Position); byte[] signature = binaryReader.ReadBytes(size); RawRegisterResponse rawRegisterResponse = new RawRegisterResponse( publicKey, keyHandle, attestationCertificate, signature); return(rawRegisterResponse); } catch (Exception e) { throw new U2fException("Error when parsing attestation certificate", e); } finally { stream.Dispose(); binaryReader.Dispose(); } }