JOSESwift jwe шифрование не удалось декодировать на сервере Nimbus - PullRequest
0 голосов
/ 04 октября 2018

Кто-нибудь успешно использовал JOSESwift?В моем случае расшифровка на сервере не удалась, возможно, не удалось найти соответствующий закрытый ключ или неправильно с шифрованием.Ошибка 500.

Мой код - получение открытых ключей с сервера.

keys?.keys?.forEach({ (key) in
                BPLogger.debug("\(key)")
                do {
                    let jwkData = key.toJSONString()?.data(using: .utf8)
                    let rsaKey = try RSAPublicKey(data: jwkData!)
                    BPLogger.log("key components: \(rsaKey.parameters)")
                    BpidCache.shared.joseRsaKey = rsaKey
                    self?.generateParametersJose()
                    completion()                        
                    return
                } catch  {
                    BPLogger.debug("Error: \(error)")
                }
            })

Сервер ожидал наличие поля 'kid' в заголовке jose, которое отсутствовало в платформе.Итак, я добавил это ... Внутренний сервер Java использует библиотеку nimbus .

 func generateParametersJose() {
        let rsa = BpidCache.shared.joseRsaKey
        var publicKey: SecKey? = nil
        do {
            publicKey = try rsa?.converted(to: SecKey.self)
        } catch {
            BPLogger.log("\(error)")
        }
        var header = JWEHeader(algorithm: .RSA1_5, encryptionAlgorithm: .A256CBCHS512)
//      header.parameters["kid"] = "1"
        let jwk = MidApi.Model.JWTKey(key: cek);
        let jwkData = try! JSONEncoder().encode(jwk)
        BPLogger.debug("jwkData = \(String(data: jwkData, encoding: .utf8)!)")
        let payload = Payload(jwkData)
        // Encrypter algorithms must match header algorithms.
        guard let encrypter = Encrypter<SecKey>(keyEncryptionAlgorithm: .RSA1_5, encryptionKey: publicKey!, contentEncyptionAlgorithm: .A256CBCHS512) else {
            return
        }
        guard let jwe = try? JWE(header: header, payload: payload, encrypter: encrypter) else {
            BPLogger.error("Falied jwe creation.")
            return
        }

        var comps = jwe.compactSerializedString.components(separatedBy: ".")
        var jweHeader = comps.first
        let data = jweHeader?.base64URLDecode()
        var orgH = try! JSONDecoder().decode(BPJweHeader.self, from: data!)
        orgH.kid = "1"
        let newJson = try! JSONEncoder().encode(orgH).base64URLEncodedString()
        comps[0] = newJson
        let newHeader = comps.joined(separator: ".")
        BPLogger.log("jwe.compactSerializedString = \(newHeader)")
        headers = ["X-Encrypted-Key": newHeader]
//      headers = ["X-Encrypted-Key": jwe.compactSerializedString] // this also fails
    }

Что я делаю не так?

1 Ответ

0 голосов
/ 08 октября 2018

Последняя версия JOSESwift ( 1.3.0 ) содержит исправление для проблемы, которая помешала установить дополнительные параметры заголовка.

Теперь вы можете установить дополнительныепараметры заголовка указаны в RFC-7516 .Установка параметра "kid", как вы пытались сделать в своем вопросе, работает следующим образом:

var header = JWEHeader(algorithm: .RSA1_5, encryptionAlgorithm: .A256CBCHS512)

header.kid = "1"

Если вы используете платформу через CocoaPods, обязательно запустите pod repo update, чтобы убедиться, что вы устанавливаете последнюю версиюкоторый содержит исправление.

...