verify() (answer: Bool) { password = dever.crypto.token(16) wrong = dever.crypto.token(32) hash = dever.crypto.passwordHash(password) accepted = dever.crypto.passwordVerify(password, hash) rejected = dever.crypto.passwordVerify(wrong, hash) data = dever.bytes.fromText("message") first = dever.crypto.hmacSha256(password, data) second = dever.crypto.hmacSha256(password, data) digest = dever.crypto.sha256(dever.bytes.fromText("abc")) expected = dever.bytes.fromInts([186, 120, 22, 191, 143, 1, 207, 234, 65, 65, 64, 222, 93, 174, 34, 35, 176, 3, 97, 163, 150, 23, 122, 156, 180, 16, 255, 97, 242, 0, 21, 173]) answer = accepted and not rejected and dever.crypto.constantTimeEq(first, second) and dever.bytes.length(first) == 32 and dever.crypto.constantTimeEq(digest, expected) } asyncVerify() (answer: Bool) { password = dever.crypto.token(16) hash = blocking(dever.crypto.passwordHash(password)) answer = blocking(dever.crypto.passwordVerify(password, hash)) } rejected(value: dever.crypto.VerifyResult.Ready(valid)) (answer: Bool) recover("观察不支持的PHC") { answer = false } rejected(value: dever.crypto.VerifyResult.Failed(message)) (answer: Bool) recover("观察不支持的PHC") { answer = length(message) > 0 } phcVerify() (answer: Bool) { password = dever.crypto.token(16) answer = rejected(result(dever.crypto.passwordVerify(password, "$argon2id$v=19$m=19456,t=2,p=536870912$c29tZXNhbHQ$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"))) } invalid() () { password = dever.crypto.token(0) } leak() (value: Secret?) { value = null } leakList() (values: List) { values = [] }