refactor(ios): rework swift part
This commit is contained in:
parent
a1112b5c80
commit
142dd17ad2
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
@ -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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
8
packages/native_crypto_ios/ios/Classes/kdf/Pbkdf2.swift
Normal file
8
packages/native_crypto_ios/ios/Classes/kdf/Pbkdf2.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Pbkdf2.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// SecretKey.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Cipher.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Key.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// KeyDerivation.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// CipherAlgorithm.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// HashAlgorithm.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// KdfAlgorithm.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// NativeCryptoError.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
8
packages/native_crypto_ios/ios/Classes/utils/Task.swift
Normal file
8
packages/native_crypto_ios/ios/Classes/utils/Task.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Task.swift
|
||||||
|
// native_crypto_ios
|
||||||
|
//
|
||||||
|
// Created by Hugo Pointcheval on 25/05/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
Loading…
x
Reference in New Issue
Block a user