-
-
Notifications
You must be signed in to change notification settings - Fork 32
Open
Description
import UIKit
import CryptoKit
import SafariServices
import AuthenticationServices
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let webAuthnManager = WebAuthnManager(
configuration: WebAuthnManager.Configuration(
relyingPartyID: "domain.ai",
relyingPartyName: "My Fancy Web App",
relyingPartyOrigin: "https://domain.ai"
)
)
Task {
let result = webAuthnManager.beginRegistration(user: PublicKeyCredentialUserEntity(id: self.generateRandomBytes(count: 10), name: "Jaydip", displayName: "Jaydip Finava"))
print(result)
let id = result.user.id.base64URLEncodedString()
let data = generateClientDataJSON(challenge: Data(result.challenge)
, origin: "https://domia.ai", type: "webauthn.create", tokenBinding: nil)
print(data!)
let byteArray: [UInt8] = Array(data!)
let newData = generateDataJSON()!
let byteArray1: [UInt8] = Array(newData)
let request = RegistrationCredential(id: id, type: .publicKey, rawID: result.challenge, attestationResponse: AuthenticatorAttestationResponse(clientDataJSON: byteArray, attestationObject: byteArray1))
//RegistrationCredential(id: id, type: CredentialType.publicKey, rawID: result.user.id, attestationResponse: AuthenticatorAttestationResponse(clientDataJSON: [UInt8].random(count: 32), attestationObject: [UInt8].random(count: 32)))
let confirmCredentialIDNotRegisteredYet: (String) async throws -> Bool = { credentialID in
return true
}
do {
let credential = try await webAuthnManager.finishRegistration(
challenge: result.challenge,
credentialCreationData: request,
confirmCredentialIDNotRegisteredYet: confirmCredentialIDNotRegisteredYet
)
print(credential)
} catch {
print(error)
}
}
}
func generateRandomBytes(count: Int) -> [UInt8] {
var randomBytes = [UInt8]()
for _ in 0..<count {
let randomByte = UInt8(arc4random_uniform(UInt32(UInt8.max)))
randomBytes.append(randomByte)
}
return randomBytes
}
func generateClientDataJSON(challenge: Data, origin: String, type: String, tokenBinding: String?) -> Data? {
var clientData: [String: Any] = [
"challenge": challenge.base64EncodedString(),
"origin": origin,
"type": type
]
if let tokenBinding = tokenBinding {
clientData["tokenBinding"] = tokenBinding
}
do {
let jsonData = try JSONSerialization.data(withJSONObject: clientData)
return jsonData
} catch {
print("Error serializing client data JSON: \(error)")
return nil
}
}
func generateDataJSON() -> Data? {
let clientData: [String: Any] = [
"rpIdHash": sha256("domain.ai"),
"signCount": 0
]
do {
let jsonData = try JSONSerialization.data(withJSONObject: clientData)
return jsonData
} catch {
print("Error serializing client data JSON: \(error)")
return nil
}
}
func sha256(_ input: String) -> String {
// Convert the input string to data using UTF-8 encoding
guard let inputData = input.data(using: .utf8) else {
return ""
}
let hashedData = SHA256.hash(data: inputData)
// Convert the hash to a hexadecimal string
let hashString = hashedData.compactMap { String(format: "%02x", $0) }.joined()
return hashString
}
}
Metadata
Metadata
Assignees
Labels
No labels