Przeglądaj źródła

Add external library

Marino Faggiana 7 lat temu
rodzic
commit
78d02632f7

+ 122 - 0
Libraries external/CKMnemonic/CKMnemonic.swift

@@ -0,0 +1,122 @@
+//
+//  CKMnemonic.swift
+//  Pods
+//
+//  Created by 仇弘扬 on 2017/7/24.
+//
+//
+
+import UIKit
+import CryptoSwift
+import Security
+
+public enum CKMnemonicLanguageType {
+	case english
+	
+	case chinese
+	
+	func words() -> [String] {
+		switch self {
+		case .english:
+			return String.englishMnemonics
+		case .chinese:
+			return String.chineseMnemonics
+		}
+	}
+}
+
+enum CKMnemonicError: Error
+{
+	case invalidStrength
+	case unableToGetRandomData
+	case unableToCreateSeedData
+}
+
+public class CKMnemonic: NSObject {
+	public static func mnemonicString(from hexString: String, language: CKMnemonicLanguageType) throws -> String {
+		let seedData = hexString.ck_mnemonicData()
+		// print("\(hexString.characters.count)\t\(seedData.count)")
+		let hashData = seedData.sha256()
+		// print(hashData.toHexString())
+		let checkSum = hashData.ck_toBitArray()
+		// print(checkSum)
+		var seedBits = seedData.ck_toBitArray()
+		
+		for i in 0..<seedBits.count / 32 {
+			seedBits.append(checkSum[i])
+		}
+		
+		let words = language.words()
+		
+		let mnemonicCount = seedBits.count / 11
+		var mnemonic = [String]()
+		for i in 0..<mnemonicCount {
+			let length = 11
+			let startIndex = i * length
+			let subArray = seedBits[startIndex..<startIndex + length]
+			let subString = subArray.joined(separator: "")
+			// print(subString)
+			
+			let index = Int(strtoul(subString, nil, 2))
+			mnemonic.append(words[index])
+		}
+		return mnemonic.joined(separator: " ")
+	}
+	
+	public static func deterministicSeedString(from mnemonic: String, passphrase: String = "", language: CKMnemonicLanguageType) throws -> String {
+		
+		func normalized(string: String) -> Data? {
+			guard let data = string.data(using: .utf8, allowLossyConversion: true) else {
+				return nil
+			}
+			
+			guard let dataString = String(data: data, encoding: .utf8) else {
+				return nil
+			}
+			
+			guard let normalizedData = dataString.data(using: .utf8, allowLossyConversion: false) else {
+				return nil
+			}
+			return normalizedData
+		}
+		
+		guard let normalizedData = normalized(string: mnemonic) else {
+			return ""
+		}
+		
+		guard let saltData = normalized(string: "mnemonic" + passphrase) else {
+			return ""
+		}
+		
+		let password = normalizedData.bytes
+		let salt = saltData.bytes
+		
+		do {
+			let bytes = try PKCS5.PBKDF2(password: password, salt: salt, iterations: 2048, variant: .sha512).calculate()
+			
+			return bytes.toHexString()
+		} catch {
+			// print(error)
+			throw error
+		}
+	}
+	
+	public static func generateMnemonic(strength: Int, language: CKMnemonicLanguageType) throws -> String {
+		guard strength % 32 == 0 else {
+			throw CKMnemonicError.invalidStrength
+		}
+		
+		let count = strength / 8
+		let bytes = Array<UInt8>(repeating: 0, count: count)
+		let status = SecRandomCopyBytes(kSecRandomDefault, count, UnsafeMutablePointer<UInt8>(mutating: bytes))
+		// print(status)
+		if status != -1 {
+			let data = Data(bytes: bytes)
+			let hexString = data.toHexString()
+			// print(hexString)
+			
+			return try mnemonicString(from: hexString, language: language)
+		}
+		throw CKMnemonicError.unableToGetRandomData
+	}
+}

+ 39 - 0
Libraries external/CKMnemonic/Data+CKBitArray.swift

@@ -0,0 +1,39 @@
+//
+//  Data+CKBitArray.swift
+//  CKMnemonic
+//
+//  Created by 仇弘扬 on 2017/7/25.
+//  Copyright © 2017年 askcoin. All rights reserved.
+//
+
+import Foundation
+import CryptoSwift
+
+public extension UInt8 {
+	public func ck_bits() -> [String] {
+		let totalBitsCount = MemoryLayout<UInt8>.size * 8
+		
+		var bitsArray = [String](repeating: "0", count: totalBitsCount)
+		
+		for j in 0 ..< totalBitsCount {
+			let bitVal: UInt8 = 1 << UInt8(totalBitsCount - 1 - j)
+			let check = self & bitVal
+			
+			if (check != 0) {
+				bitsArray[j] = "1"
+			}
+		}
+		return bitsArray
+	}
+}
+
+public extension Data {
+	public func ck_toBitArray() -> [String] {
+		var toReturn = [String]()
+		for num: UInt8 in bytes {
+			
+			toReturn.append(contentsOf: num.ck_bits())
+		}
+		return toReturn
+	}
+}

Plik diff jest za duży
+ 10 - 0
Libraries external/CKMnemonic/Language/Chinese.swift


Plik diff jest za duży
+ 10 - 0
Libraries external/CKMnemonic/Language/English.swift


+ 32 - 0
Libraries external/CKMnemonic/String+MnemonicData.swift

@@ -0,0 +1,32 @@
+//
+//  String+MnemonicData.swift
+//  CKMnemonic
+//
+//  Created by 仇弘扬 on 2017/7/25.
+//  Copyright © 2017年 askcoin. All rights reserved.
+//
+
+import Foundation
+
+public extension String
+{
+	public func ck_mnemonicData() -> Data {
+		let length = characters.count
+		let dataLength = length / 2
+		var dataToReturn = Data(capacity: dataLength)
+		
+		var index = 0
+		var chars = ""
+		for char in characters {
+			chars += String(char)
+			if index % 2 == 1 {
+				let i: UInt8 = UInt8(strtoul(chars, nil, 16))
+				dataToReturn.append(i)
+				chars = ""
+			}
+			index += 1
+		}
+		
+		return dataToReturn
+	}
+}

+ 26 - 0
Nextcloud.xcodeproj/project.pbxproj

@@ -1219,6 +1219,11 @@
 		F7B1FBC11E72E3D1001781FE /* SwiftWebVCActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVCActivity.swift; sourceTree = "<group>"; };
 		F7B1FBC21E72E3D1001781FE /* SwiftWebVCActivityChrome.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVCActivityChrome.swift; sourceTree = "<group>"; };
 		F7B1FBC31E72E3D1001781FE /* SwiftWebVCActivitySafari.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftWebVCActivitySafari.swift; sourceTree = "<group>"; };
+		F7B2DEDE1F97464E007CF4D2 /* CKMnemonic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CKMnemonic.swift; sourceTree = "<group>"; };
+		F7B2DEDF1F97464E007CF4D2 /* Data+CKBitArray.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+CKBitArray.swift"; sourceTree = "<group>"; };
+		F7B2DEE11F97464E007CF4D2 /* Chinese.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Chinese.swift; sourceTree = "<group>"; };
+		F7B2DEE21F97464E007CF4D2 /* English.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = English.swift; sourceTree = "<group>"; };
+		F7B2DEE31F97464E007CF4D2 /* String+MnemonicData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+MnemonicData.swift"; sourceTree = "<group>"; };
 		F7B3A4ED1E97818A000DACE8 /* CCLoginWeb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CCLoginWeb.swift; sourceTree = "<group>"; };
 		F7B4F1C71F44356F00B53B42 /* NCUchardet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NCUchardet.h; sourceTree = "<group>"; };
 		F7B4F1C81F44356F00B53B42 /* NCUchardet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NCUchardet.m; sourceTree = "<group>"; };
@@ -1720,6 +1725,7 @@
 			isa = PBXGroup;
 			children = (
 				F70F02B21C889183008DAB36 /* AFViewShaker */,
+				F7B2DEDD1F97464E007CF4D2 /* CKMnemonic */,
 				F73CCE221DC13788007E38D8 /* DZNEmptyDataSet */,
 				F7659A211DC0B726004860C4 /* EAIntroView */,
 				F7659A2A1DC0B72F004860C4 /* EARestrictedScrollView */,
@@ -2475,6 +2481,26 @@
 			path = Resources;
 			sourceTree = "<group>";
 		};
+		F7B2DEDD1F97464E007CF4D2 /* CKMnemonic */ = {
+			isa = PBXGroup;
+			children = (
+				F7B2DEDE1F97464E007CF4D2 /* CKMnemonic.swift */,
+				F7B2DEDF1F97464E007CF4D2 /* Data+CKBitArray.swift */,
+				F7B2DEE01F97464E007CF4D2 /* Language */,
+				F7B2DEE31F97464E007CF4D2 /* String+MnemonicData.swift */,
+			);
+			path = CKMnemonic;
+			sourceTree = "<group>";
+		};
+		F7B2DEE01F97464E007CF4D2 /* Language */ = {
+			isa = PBXGroup;
+			children = (
+				F7B2DEE11F97464E007CF4D2 /* Chinese.swift */,
+				F7B2DEE21F97464E007CF4D2 /* English.swift */,
+			);
+			path = Language;
+			sourceTree = "<group>";
+		};
 		F7B4F1C51F44356F00B53B42 /* NCUchardet */ = {
 			isa = PBXGroup;
 			children = (

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików