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