Skip to content

Latest commit

 

History

History
190 lines (123 loc) · 6.63 KB

File metadata and controls

190 lines (123 loc) · 6.63 KB

Register and Authenticate

To be secure, it is recommended to use a separate implementation for server and client.

Register

  1. create Challenge

Correct implementation is done on the server side.

let challenge = verifier::create_challenge();
  1. create MakeCredentialArgs
  • need rpid(string) and challenge
  • set pin(string)
let make_credential_args = MakeCredentialArgsBuilder::new(&rpid, &challenge)
  .pin(pin)
  .build();
  1. create FidoKeyHid
let device = FidoKeyHidFactory::create(&cfg)?;
  1. get Attestation Object
let attestation = device.make_credential_with_args(&make_credential_args)?;
  1. verify Attestation Object

Correct implementation is done on the server side.

  • need rpid(string) and challenge and Attestation
let verify_result = verifier::verify_attestation(rpid, &challenge, &attestation);
if verify_result.is_success {
  println!("-- Verify Attestation Success");
} else {
  println!("-- ! Verify Attestation Failed");
}
  1. store Credential Id and Publickey

Correct implementation is done on the server side.

let userdata.credential_id = verify_result.credential_id;
let userdata.credential_public_key = verify_result.credential_public_key;

store(&userdata); <- ex.store to database

Authenticate

  1. restore Credential Id and Publickey

Correct implementation is done on the server side.

let userdata = restore(userid); <- ex.restore from database

userdata.credential_id;
userdata.credential_public_key;
  1. create Challenge

Correct implementation is done on the server side.

let challenge = verifier::create_challenge();
  1. create GetAssertionArgs
  • need rpid(string) and challenge
  • set pin(string) and Credential Id
let get_assertion_args = GetAssertionArgsBuilder::new(rpid, &challenge)
  .pin(pin)
  .credential_id(&userdata.credential_id)
  .build();
  1. get Assertion Object
let assertions = device.get_assertion_with_args(&get_assertion_args)?;
  1. verify Assertion Object

Correct implementation is done on the server side.

  • need rpid(string) and PublicKey and challenge and Assertion
let is_success = verifier::verify_assertion(
  rpid,
  &userdata.credential_public_key,
  &challenge,
  &assertions[0],
);
if is_success {
  println!("-- Verify Assertion Success");
} else {
  println!("-- ! Verify Assertion Failed");
}

Examples

non-discoverable credentials/non-resident-key

discoverable credentials/resident-key

  • discoverable credentials/resident-key
    • User data can be stored in the authenticator.
    • user_name and user_display_name are set only when multiple Assertions are acquired.
  • with Credential Blob Extension
    • This extension enables RPs to provide a small amount of extra credential configuration.
    • This extension only works if CTAP 2.1 is implemented.

Legacy Pattern Examples

Legacy patterns are deprecated. They will be removed in a future version.