mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
2.1 KiB
Swift
50 lines
2.1 KiB
Swift
5 years ago
|
import CryptoSwift
|
||
|
import Curve25519Kit
|
||
|
|
||
|
public final class DiffieHellman : NSObject {
|
||
|
public static let ivSize: UInt = 16
|
||
|
|
||
|
public enum Error : LocalizedError {
|
||
|
case decryptionFailed
|
||
|
case sharedSecretGenerationFailed
|
||
|
|
||
|
public var errorDescription: String {
|
||
|
switch self {
|
||
|
case .decryptionFailed: return "Couldn't decrypt data"
|
||
|
case .sharedSecretGenerationFailed: return "Couldn't generate a shared secret."
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private override init() { }
|
||
|
|
||
|
public static func encrypt(_ plaintext: Data, using symmetricKey: Data) throws -> Data {
|
||
|
let iv = Data.getSecureRandomData(ofSize: ivSize)!
|
||
|
let cbc = CBC(iv: iv.bytes)
|
||
|
let aes = try AES(key: symmetricKey.bytes, blockMode: cbc)
|
||
|
let ciphertext = try aes.encrypt(plaintext.bytes)
|
||
|
let ivAndCiphertext = iv.bytes + ciphertext
|
||
|
return Data(ivAndCiphertext)
|
||
|
}
|
||
|
|
||
|
public static func encrypt(_ plaintext: Data, publicKey: Data, privateKey: Data) throws -> Data {
|
||
5 years ago
|
guard let symmetricKey = try? Curve25519.generateSharedSecret(fromPublicKey: publicKey, privateKey: privateKey) else { throw Error.sharedSecretGenerationFailed }
|
||
5 years ago
|
return try encrypt(plaintext, using: symmetricKey)
|
||
|
}
|
||
|
|
||
|
public static func decrypt(_ ivAndCiphertext: Data, using symmetricKey: Data) throws -> Data {
|
||
|
guard ivAndCiphertext.count >= ivSize else { throw Error.decryptionFailed }
|
||
|
let iv = ivAndCiphertext[..<ivSize]
|
||
|
let ciphertext = ivAndCiphertext[ivSize...]
|
||
|
let cbc = CBC(iv: iv.bytes)
|
||
|
let aes = try AES(key: symmetricKey.bytes, blockMode: cbc)
|
||
|
let plaintext = try aes.decrypt(ciphertext.bytes)
|
||
|
return Data(plaintext)
|
||
|
}
|
||
|
|
||
|
public static func decrypt(_ ivAndCiphertext: Data, publicKey: Data, privateKey: Data) throws -> Data {
|
||
5 years ago
|
guard let symmetricKey = try? Curve25519.generateSharedSecret(fromPublicKey: publicKey, privateKey: privateKey) else { throw Error.sharedSecretGenerationFailed }
|
||
5 years ago
|
return try decrypt(ivAndCiphertext, using: symmetricKey)
|
||
|
}
|
||
|
}
|