INNER CODE UNIT · C
pw3_matches_nonfactory_pw1
polhenarejos/pico-openpgp · src/openpgp/cmd_change_pin.c:24
static bool pw3_matches_nonfactory_pw1(const uint8_t *pin, size_t pin_len) {
file_t *pw1 = file_search_by_fid(EF_PW1, NULL, SPECIFY_EF);
uint8_t verifier[34];
if (!pw1 || !file_has_data(pw1) || file_get_data(pw1)[0] < 8) {
return false;
}
if (file_get_size(pw1) == 33) {
verifier[0] = pin_len;
double_hash_pin(CONST_BYTE_ARRAY(pin, pin_len), verifier + 1);
return mbedtls_ct_memcmp(file_get_data(pw1), verifier, 33) == 0;
}
if (file_get_size(pw1) == 34) {
verifier[0] = pin_len;
verifier[1] = 0x1;
pin_derive_verifier(CONST_BYTE_ARRAY(pin, pin_len), verifier + 2);
return mbedtls_ct_memcmp(file_get_data(pw1), verifier, sizeof(verifier)) == 0;
}