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