Skip to content

WebAuthnError(reason: PassDemo.WebAuthnError.Reason.invalidAttestationObject) #67

@jaydipdeveloper

Description

@jaydipdeveloper

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions