2019-09-08 23:00:46 +02:00
|
|
|
//
|
2020-04-19 15:41:30 +02:00
|
|
|
// ObjectivePGPInterface.swift
|
2019-09-08 23:00:46 +02:00
|
|
|
// passKit
|
|
|
|
|
//
|
|
|
|
|
// Created by Danny Moesch on 08.09.19.
|
|
|
|
|
// Copyright © 2019 Bob Sun. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import ObjectivePGP
|
|
|
|
|
|
2020-04-19 15:41:30 +02:00
|
|
|
struct ObjectivePGPInterface: PGPInterface {
|
2019-09-08 23:00:46 +02:00
|
|
|
private let keyring = ObjectivePGP.defaultKeyring
|
|
|
|
|
|
|
|
|
|
init(publicArmoredKey: String, privateArmoredKey: String) throws {
|
|
|
|
|
guard let publicKeyData = publicArmoredKey.data(using: .ascii), let privateKeyData = privateArmoredKey.data(using: .ascii) else {
|
2020-09-20 15:07:18 +02:00
|
|
|
throw AppError.keyImport
|
2019-09-08 23:00:46 +02:00
|
|
|
}
|
|
|
|
|
let publicKeys = try ObjectivePGP.readKeys(from: publicKeyData)
|
|
|
|
|
let privateKeys = try ObjectivePGP.readKeys(from: privateKeyData)
|
|
|
|
|
keyring.import(keys: publicKeys)
|
|
|
|
|
keyring.import(keys: privateKeys)
|
2021-12-31 07:35:17 +01:00
|
|
|
guard publicKeys.first != nil, privateKeys.first != nil else {
|
2020-09-20 15:07:18 +02:00
|
|
|
throw AppError.keyImport
|
2019-09-08 23:00:46 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-10 22:16:42 +01:00
|
|
|
func decrypt(encryptedData: Data, keyIDHint _: String?, passPhraseForKey: @escaping (String) -> String) throws -> Data? {
|
2026-03-10 17:14:11 +01:00
|
|
|
try ObjectivePGP.decrypt(encryptedData, andVerifySignature: false, using: keyring.keys) { selectedKey in
|
|
|
|
|
guard let selectedKey else {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return passPhraseForKey(selectedKey.keyID.longIdentifier)
|
|
|
|
|
}
|
2019-09-08 23:00:46 +02:00
|
|
|
}
|
|
|
|
|
|
2026-03-11 00:21:30 +01:00
|
|
|
func encryptWithAllKeys(plainData: Data) throws -> Data {
|
|
|
|
|
try encrypt(plainData: plainData, keyIDs: keyID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func encrypt(plainData: Data, keyIDs: [String]) throws -> Data {
|
|
|
|
|
let keys = try keyIDs.map { keyID in
|
|
|
|
|
guard let key = keyring.findKey(keyID) else {
|
|
|
|
|
throw AppError.pgpPublicKeyNotFound(keyID: keyID)
|
|
|
|
|
}
|
|
|
|
|
return key
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let encryptedData = try ObjectivePGP.encrypt(plainData, addSignature: false, using: keys, passphraseForKey: nil)
|
2020-01-02 00:48:00 +01:00
|
|
|
if Defaults.encryptInArmored {
|
2019-09-08 23:00:46 +02:00
|
|
|
return Armor.armored(encryptedData, as: .message).data(using: .ascii)!
|
|
|
|
|
}
|
|
|
|
|
return encryptedData
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-14 20:20:16 -07:00
|
|
|
func containsPublicKey(with keyID: String) -> Bool {
|
|
|
|
|
keyring.findKey(keyID)?.isPublic ?? false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func containsPrivateKey(with keyID: String) -> Bool {
|
|
|
|
|
keyring.findKey(keyID)?.isSecret ?? false
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-13 19:15:52 -07:00
|
|
|
var keyID: [String] {
|
2020-06-28 21:25:40 +02:00
|
|
|
keyring.keys.map(\.keyID.longIdentifier)
|
2020-04-11 23:23:38 -07:00
|
|
|
}
|
|
|
|
|
|
2020-04-13 19:15:52 -07:00
|
|
|
var shortKeyID: [String] {
|
2020-06-28 21:25:40 +02:00
|
|
|
keyring.keys.map(\.keyID.shortIdentifier)
|
2019-09-08 23:00:46 +02:00
|
|
|
}
|
|
|
|
|
}
|