Support otpauth
This commit is contained in:
parent
a36bb13004
commit
f5875c519c
1 changed files with 22 additions and 6 deletions
|
|
@ -17,7 +17,7 @@ struct AdditionField {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Password {
|
class Password {
|
||||||
static let otpKeywords = ["otp_secret", "otp_type", "otp_algorithm", "otp_period", "otp_digits", "otp_counter"]
|
static let otpKeywords = ["otp_secret", "otp_type", "otp_algorithm", "otp_period", "otp_digits", "otp_counter", "otpauth"]
|
||||||
|
|
||||||
var name = ""
|
var name = ""
|
||||||
var password = ""
|
var password = ""
|
||||||
|
|
@ -158,14 +158,18 @@ class Password {
|
||||||
/*
|
/*
|
||||||
Set otpType and otpToken, if we are able to construct a valid token.
|
Set otpType and otpToken, if we are able to construct a valid token.
|
||||||
|
|
||||||
Example of TOTP fields
|
Example of TOTP otpauth
|
||||||
|
(Key Uri Format: https://github.com/google/google-authenticator/wiki/Key-Uri-Format)
|
||||||
|
otpauth://totp/totp-secret?secret=AAAAAAAAAAAAAAAA&issuer=totp-secret
|
||||||
|
|
||||||
|
Example of TOTP fields [Legacy, lower priority]
|
||||||
otp_secret: secretsecretsecretsecretsecretsecret
|
otp_secret: secretsecretsecretsecretsecretsecret
|
||||||
otp_type: totp
|
otp_type: totp
|
||||||
otp_algorithm: sha1 (default: sha1, optional)
|
otp_algorithm: sha1 (default: sha1, optional)
|
||||||
otp_period: 30 (default: 30, optional)
|
otp_period: 30 (default: 30, optional)
|
||||||
otp_digits: 6 (default: 6, optional)
|
otp_digits: 6 (default: 6, optional)
|
||||||
|
|
||||||
Example of HOTP fields
|
Example of HOTP fields [Legacy, lower priority]
|
||||||
otp_secret: secretsecretsecretsecretsecretsecret
|
otp_secret: secretsecretsecretsecretsecretsecret
|
||||||
otp_type: hotp
|
otp_type: hotp
|
||||||
otp_counter: 1
|
otp_counter: 1
|
||||||
|
|
@ -173,6 +177,18 @@ class Password {
|
||||||
|
|
||||||
*/
|
*/
|
||||||
func updateOtpToken() {
|
func updateOtpToken() {
|
||||||
|
// get otpauth, if we are able to generate a token, return
|
||||||
|
if var otpauthString = getAdditionValue(withKey: "otpauth") {
|
||||||
|
if !otpauthString.hasPrefix("otpauth:") {
|
||||||
|
otpauthString = "otpauth:\(otpauthString)"
|
||||||
|
}
|
||||||
|
if let otpauthUrl = URL(string: otpauthString),
|
||||||
|
let token = Token(url: otpauthUrl) {
|
||||||
|
self.otpToken = token
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get secret data
|
// get secret data
|
||||||
guard let secretString = getAdditionValue(withKey: "otp_secret"),
|
guard let secretString = getAdditionValue(withKey: "otp_secret"),
|
||||||
let secretData = MF_Base32Codec.data(fromBase32String: secretString),
|
let secretData = MF_Base32Codec.data(fromBase32String: secretString),
|
||||||
|
|
@ -193,11 +209,11 @@ class Password {
|
||||||
if let algoString = getAdditionValue(withKey: "otp_algorithm") {
|
if let algoString = getAdditionValue(withKey: "otp_algorithm") {
|
||||||
switch algoString.lowercased() {
|
switch algoString.lowercased() {
|
||||||
case "sha256":
|
case "sha256":
|
||||||
algorithm = Generator.Algorithm.sha256
|
algorithm = .sha256
|
||||||
case "sha512":
|
case "sha512":
|
||||||
algorithm = Generator.Algorithm.sha512
|
algorithm = .sha512
|
||||||
default:
|
default:
|
||||||
algorithm = Generator.Algorithm.sha1
|
algorithm = .sha1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue