- 
          
 - 
                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