加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xcode – OSStatus Code -1009,com.apple.LocalAuthentication

发布时间:2020-12-14 19:05:45 所属栏目:百科 来源:网络整理
导读:我正在尝试使用iOS钥匙串测试加密. Domain=com.apple.LocalAuthentication Code=-1009 "ACL operation is not allowed: 'od'" UserInfo={NSLocalizedDescription=ACL operation is not allowed: 'od'} 这是我的测试代码: func testEncrpytKeychain() { let
我正在尝试使用iOS钥匙串测试加密.

Domain=com.apple.LocalAuthentication Code=-1009 "ACL operation is not allowed: 'od'" UserInfo={NSLocalizedDescription=ACL operation is not allowed: 'od'}

这是我的测试代码:

func testEncrpytKeychain() {

    let promise = expectation(description: "Unlock")
    let data: Data! = self.sampleData
    let text: String! = self.sampleText
    wait(for: [promise],timeout: 30)
    let chain = Keychain(account: "tester",serviceName: "testing2",access: .whenPasscodeSetThisDeviceOnly,accessGroup: nil)
    chain.unlockChain { reply,error in
        defer {
            promise.fulfill()
        }
        guard error == nil else {
            // ** FAILS ON THIS LINE WITH OSSTATUS ERROR **
            XCTAssert(false,"Error: (String(describing: error))")
            return
        }

        guard let cipherData = try? chain.encrypt(data) else {
            XCTAssert(false,"Cipher Data not created")
            return
        }
        XCTAssertNotEqual(cipherData,data)

        guard let clearData = try? chain.decrypt(cipherData) else {
            XCTAssert(false,"Clear Data not decrypted")
            return
        }
        XCTAssertEqual(clearData,data)

        let clearText = String(data: clearData,encoding: .utf8)
        XCTAssertEqual(clearText,text)
    }
}

这是底层的异步unlockChain代码:

// context is a LAContext
func unlockChain(_ callback: @escaping (Bool,Error?) -> Void) {
    var error: NSError? = nil
    guard context.canEvaluatePolicy(.deviceOwnerAuthentication,error: &error) else {
        callback(false,error)
        return
    }

    context.evaluateAccessControl(control,operation: .createItem,localizedReason: "Access your Account") { (reply,error) in
        self.context.evaluateAccessControl(self.control,operation: .useItem,error) in
            self.unlocked = reply
            callback(reply,error)
        }
    }
}

以下是上下文和控件对象的制作方法

init(account: String,serviceName: String = (Bundle.main.bundleIdentifier ?? ""),access: Accessibility = .whenUnlocked,accessGroup: String? = nil) {
    self.account = account
    self.serviceName = serviceName
    self.accessGroup = accessGroup
    self.access = access
    var error: Unmanaged<CFError>? = nil
    self.control = SecAccessControlCreateWithFlags(kCFAllocatorDefault,access.attrValue,[.privateKeyUsage],&error)
    if let e: Error = error?.takeRetainedValue() {
        Log.error(e)
    }
    self.context = LAContext()
}

我找不到有关此错误的一点信息:

Domain=com.apple.LocalAuthentication Code=-1009

OSStatus Code site doesn’t contain anything for it either

任何帮助表示赞赏,谢谢.

解决方法

我在创建新私钥之前删除了以前的私钥,解决了同样的问题.

我猜想在iOS10上(11没有显示错误),当你使用相同的标签/大小而不是相同的访问设置的SecKeyCreateRandomKey(…)时,它只会返回true而是使用旧的(感觉很奇怪)但谁知道)?

这是一个懒惰的C函数我刚刚删除它(只记得设置你的ApplicationPrivateKeyTag:

void deletePrivateKey()
{
    CFStringRef ApplicationPrivateKeyTag = CFSTR("your tag here");

    const void* keys[] = {
        kSecAttrApplicationTag,kSecClass,kSecAttrKeyClass,kSecReturnRef,};

    const void* values[] = {
        ApplicationPrivateKeyTag,kSecClassKey,kSecAttrKeyClassPrivate,kCFBooleanTrue,};

    CFDictionaryRef params = CFDictionaryCreate(kCFAllocatorDefault,keys,values,(sizeof(keys)/sizeof(void*)),NULL,NULL);

    OSStatus status = SecItemDelete(params);

    if (params) CFRelease(params);
    if (ApplicationPrivateKeyTag) CFRelease(ApplicationPrivateKeyTag);

    if (status == errSecSuccess)
        return true;
    return false;
}

FWIW:看起来苹果更新了their doc about the Security Framework and the SecureEnclave,现在更容易理解了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读