class WebAuthn::U2fMigrator
def attestation_trust_path
def attestation_trust_path @attestation_trust_path ||= [OpenSSL::X509::Certificate.new(Base64.strict_decode64(@certificate))] end
def attestation_type
def attestation_type WebAuthn::AttestationStatement::ATTESTATION_TYPE_BASIC_OR_ATTCA end
def authenticator_data
def authenticator_data @authenticator_data ||= WebAuthn::FakeAuthenticator::AuthenticatorData.new( rp_id_hash: OpenSSL::Digest::SHA256.digest(@app_id.to_s), credential: { id: credential_id, public_key: credential_cose_key }, sign_count: @counter, user_present: true, user_verified: false, aaguid: WebAuthn::AuthenticatorData::AttestedCredentialData::ZEROED_AAGUID ) end
def credential
def credential @credential ||= begin hash = authenticator_data.send(:credential) WebAuthn::AuthenticatorData::AttestedCredentialData::Credential.new( id: hash[:id], public_key: hash[:public_key].serialize ) end end
def credential_cose_key
Let coseEncodedCredentialPublicKey be the result of converting x9encodedUserPublicKey’s value from ANS X9.62 /
Let x9encodedUserPublicKey be the user public key returned in the U2F registration response message [U2FRawMsgs].
def credential_cose_key decoded_public_key = Base64.strict_decode64(@public_key) if WebAuthn::AttestationStatement::FidoU2f::PublicKey.uncompressed_point?(decoded_public_key) COSE::Key::EC2.new( alg: COSE::Algorithm.by_name("ES256").id, crv: 1, x: decoded_public_key[1..32], y: decoded_public_key[33..-1] ) else raise "expected U2F public key to be in uncompressed point format" end end
def credential_id
https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-client-to-authenticator-protocol-v2.0-rd-20180702.html#u2f-authenticatorMakeCredential-interoperability
def credential_id Base64.urlsafe_decode64(@key_handle) end
def initialize(app_id:, certificate:, key_handle:, public_key:, counter:)
def initialize(app_id:, certificate:, key_handle:, public_key:, counter:) @app_id = app_id @certificate = certificate @key_handle = key_handle @public_key = public_key @counter = counter end