refactor(ios): rework swift part

This commit is contained in:
Hugo Pointcheval 2022-05-25 15:42:56 +02:00
parent a1112b5c80
commit 142dd17ad2
Signed by: hugo
GPG Key ID: A9E8E9615379254F
15 changed files with 108 additions and 236 deletions

View File

@ -1,53 +0,0 @@
/**
* Author: Hugo Pointcheval
* Email: git@pcl.ovh
* -----
* File: Cipher.swift
* Created Date: 25/12/2021 18:31:28
* Last Modified: 25/12/2021 18:38:53
* -----
* Copyright (c) 2021
*/
import Foundation
import CryptoKit
class AESCipher {
/// Encrypts plaintext with key using AES GCM
@available(iOS 13.0, *)
static func encrypt(plaintext: Data, key: Data) -> Data? {
let symmetricKey = SymmetricKey.init(data: key)
let encrypted = try? AES.GCM.seal(plaintext, using: symmetricKey)
return encrypted?.combined
}
/// Decrypts ciphertext with key using AES GCM
@available(iOS 13.0, *)
static func decrypt(ciphertext: Data, key: Data) -> Data? {
let symmetricKey = SymmetricKey.init(data: key)
let sealedBox = try? AES.GCM.SealedBox(combined: ciphertext)
if (sealedBox == nil) { return nil }
let decryptedData = try? AES.GCM.open(sealedBox!, using: symmetricKey)
return decryptedData
}
}
class CHACHACipher {
/// Encrypts plaintext with key using CHACHAPOLY
@available(iOS 13.0, *)
static func encrypt(plaintext: Data, key: Data) -> Data? {
let symmetricKey = SymmetricKey.init(data: key)
let encrypted = try? ChaChaPoly.seal(plaintext, using: symmetricKey)
return encrypted?.combined
}
/// Decrypts ciphertext with key using CHACHAPOLY
@available(iOS 13.0, *)
static func decrypt(ciphertext: Data, key: Data) -> Data? {
let symmetricKey = SymmetricKey.init(data: key)
let sealedBox = try? ChaChaPoly.SealedBox(combined: ciphertext)
if (sealedBox == nil) { return nil }
let decryptedData = try? ChaChaPoly.open(sealedBox!, using: symmetricKey)
return decryptedData
}
}

View File

@ -1,43 +0,0 @@
/**
* Author: Hugo Pointcheval
* Email: git@pcl.ovh
* -----
* File: Hash.swift
* Created Date: 25/12/2021 18:31:11
* Last Modified: 25/12/2021 18:38:20
* -----
* Copyright (c) 2021
*/
import Foundation
import CommonCrypto
import CryptoKit
enum HashAlgorithm: String {
case HashSHA256 = "sha256"
case HashSHA384 = "sha384"
case HashSHA512 = "sha512"
var commonCrypto: UInt32 {
switch self {
case .HashSHA256: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA256)
case .HashSHA384: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA384)
case .HashSHA512: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA512)
}
}
}
@available(iOS 13.0, *)
class Hash {
/// Hash a message with a specified HashAlgorithm
static func digest(data: Data, algorithm: HashAlgorithm) -> Data {
switch algorithm {
case .HashSHA256:
return Data(SHA256.hash(data: data))
case .HashSHA384:
return Data(SHA384.hash(data: data))
case .HashSHA512:
return Data(SHA512.hash(data: data))
}
}
}

View File

@ -1,78 +0,0 @@
/**
* Author: Hugo Pointcheval
* Email: git@pcl.ovh
* -----
* File: KEM.swift
* Created Date: 25/12/2021 18:31:48
* Last Modified: 25/12/2021 18:40:00
* -----
* Copyright (c) 2021
*/
import Foundation
import CryptoKit
class KeyPair {
/// Generate a keypair.
@available(iOS 13.0, *)
static func fromCurve() -> Data {
let sk = P256.KeyAgreement.PrivateKey()
var kp = sk.rawRepresentation
kp.append(contentsOf: sk.publicKey.rawRepresentation)
return kp;
}
/// Import private key from Data
@available(iOS 13.0, *)
static func importPrivateKey(privateKey: Data) throws -> P256.KeyAgreement.PrivateKey {
let sk = try P256.KeyAgreement.PrivateKey(rawRepresentation: privateKey)
return sk;
}
/// Import public key from Data
@available(iOS 13.0, *)
static func importPublicKey(publicKey: Data) throws -> P256.KeyAgreement.PublicKey {
let pk = try P256.KeyAgreement.PublicKey(rawRepresentation: publicKey)
return pk;
}
}
class ECDH {
/// Generate a shared secret with your private key and other party public key.
@available(iOS 13.0, *)
static func generateSharedSecretKey(salt: Data, hash: HashAlgorithm, keyBytesCount: Int ,privateKey: Data, publicKey: Data) -> Data? {
let sk = try? KeyPair.importPrivateKey(privateKey: privateKey)
if (sk == nil) {return nil}
let pk = try? KeyPair.importPublicKey(publicKey: publicKey)
if (pk == nil) {return nil}
let secret = try? sk!.sharedSecretFromKeyAgreement(with: pk!)
switch hash {
case .HashSHA256:
let key = secret?.hkdfDerivedSymmetricKey(using: SHA256.self, salt: salt, sharedInfo: Data(), outputByteCount: keyBytesCount)
if (key == nil) {
return nil
} else {
return Key.toBytes(key: key!)
}
case .HashSHA384:
let key = secret?.hkdfDerivedSymmetricKey(using: SHA384.self, salt: salt, sharedInfo: Data(), outputByteCount: keyBytesCount)
if (key == nil) {
return nil
} else {
return Key.toBytes(key: key!)
}
case .HashSHA512:
let key = secret?.hkdfDerivedSymmetricKey(using: SHA512.self, salt: salt, sharedInfo: Data(), outputByteCount: keyBytesCount)
if (key == nil) {
return nil
} else {
return Key.toBytes(key: key!)
}
}
}
}

View File

@ -1,62 +0,0 @@
/**
* Author: Hugo Pointcheval
* Email: git@pcl.ovh
* -----
* File: KDF.swift
* Created Date: 25/12/2021 17:45:28
* Last Modified: 25/12/2021 17:45:38
* -----
* Copyright (c) 2021
*/
import Foundation
import CryptoKit
import CommonCrypto
class Key {
/// Generate secret key of a specified length
@available(iOS 13.0, *)
static func fromSecureRandom(bitsCount : Int) -> Data {
let symmetricKey = SymmetricKey.init(size: SymmetricKeySize(bitCount: bitsCount))
return toBytes(key: symmetricKey)
}
/// Encode key as Data
@available(iOS 13.0, *)
static func toBytes(key: SymmetricKey) -> Data {
let keyBytes = key.withUnsafeBytes
{
return Data(Array($0))
}
return keyBytes
}
/// Derive a new secret key with PBKDF2 algorithm
static func fromPBKDF2(password: String, salt: String, keyBytesCount: Int, iterations: Int, algorithm: HashAlgorithm) -> Data? {
let passwordData = password.data(using: .utf8)!
let saltData = salt.data(using: .utf8)!
var derivedKeyData = Data(repeating: 0, count: keyBytesCount)
let localDerivedKeyData = derivedKeyData
let status = derivedKeyData.withUnsafeMutableBytes { (derivedKeyBytes: UnsafeMutableRawBufferPointer) in
saltData.withUnsafeBytes { (saltBytes: UnsafeRawBufferPointer) in
CCKeyDerivationPBKDF(
CCPBKDFAlgorithm(kCCPBKDF2),
password,
passwordData.count,
saltBytes.bindMemory(to: UInt8.self).baseAddress,
saltData.count,
algorithm.commonCrypto,
UInt32(iterations),
derivedKeyBytes.bindMemory(to: UInt8.self).baseAddress,
localDerivedKeyData.count)
}
}
if (status != kCCSuccess) {
return nil;
}
return derivedKeyData
}
}

View File

@ -0,0 +1,28 @@
//
// AES.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation
class AES : Cipher {
/// Encrypts plaintext with key using AES GCM
@available(iOS 13.0, *)
static func encrypt(plaintext: Data, key: Data) -> Data? {
let symmetricKey = SymmetricKey.init(data: key)
let encrypted = try? AES.GCM.seal(plaintext, using: symmetricKey)
return encrypted?.combined
}
/// Decrypts ciphertext with key using AES GCM
@available(iOS 13.0, *)
static func decrypt(ciphertext: Data, key: Data) -> Data? {
let symmetricKey = SymmetricKey.init(data: key)
let sealedBox = try? AES.GCM.SealedBox(combined: ciphertext)
if (sealedBox == nil) { return nil }
let decryptedData = try? AES.GCM.open(sealedBox!, using: symmetricKey)
return decryptedData
}
}

View File

@ -0,0 +1,8 @@
//
// Pbkdf2.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// SecretKey.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// Cipher.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// Key.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// KeyDerivation.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// CipherAlgorithm.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// HashAlgorithm.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// KdfAlgorithm.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// NativeCryptoError.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation

View File

@ -0,0 +1,8 @@
//
// Task.swift
// native_crypto_ios
//
// Created by Hugo Pointcheval on 25/05/2022.
//
import Foundation