Browse Source

Bignum update fixing some memory leaks
RSA can't be done yet due to http://j.mp/1qDfnMi

Marcin Krzyżanowski 11 năm trước cách đây
mục cha
commit
fb71abe2e7

+ 3 - 1
CryptoSwift-Bridging-Header.h

@@ -6,7 +6,6 @@
 //  Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
 //
 
-//#import <openssl/rsa.h>
 
 #import <CommonCrypto/CommonCrypto.h>
 
@@ -19,7 +18,10 @@
 #import <openssl/camellia.h>
 #import <openssl/blowfish.h>
 
+
 #import <openssl/bn.h>
 #import <openssl/ossl_typ.h>
 
+//#import <openssl/rsa.h>
+
 

+ 21 - 0
CryptoSwift.xcodeproj/project.pbxproj

@@ -13,9 +13,11 @@
 		752867B21969675900E10455 /* RSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752867B11969675900E10455 /* RSA.swift */; };
 		752DEF7519693E7200E17557 /* CryptoSwift-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = 752DEF7419693E7200E17557 /* CryptoSwift-Bridging-Header.h */; };
 		752DEF7719693EA000E17557 /* NSDataExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752DEF7619693EA000E17557 /* NSDataExtension.swift */; };
+		75445821196AA2A5002FF20E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75445820196AA2A5002FF20E /* Security.framework */; };
 		754BE45B19693E190098E6F3 /* CryptoSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 754BE45A19693E190098E6F3 /* CryptoSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		754BE46119693E190098E6F3 /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; };
 		754BE46819693E190098E6F3 /* CryptoSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754BE46719693E190098E6F3 /* CryptoSwiftTests.swift */; };
+		754ECF50197C59FF00731E1B /* BignumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754ECF4F197C59FF00731E1B /* BignumTests.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -33,6 +35,13 @@
 			remoteGlobalIDString = 754BE45419693E190098E6F3;
 			remoteInfo = CryptoSwift;
 		};
+		754ECF4D197C55C700731E1B /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 754BE44C19693E190098E6F3 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 754BE45419693E190098E6F3;
+			remoteInfo = CryptoSwift;
+		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
@@ -42,12 +51,14 @@
 		752867B11969675900E10455 /* RSA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RSA.swift; sourceTree = "<group>"; };
 		752DEF7419693E7200E17557 /* CryptoSwift-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CryptoSwift-Bridging-Header.h"; sourceTree = "<group>"; };
 		752DEF7619693EA000E17557 /* NSDataExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSDataExtension.swift; sourceTree = "<group>"; };
+		75445820196AA2A5002FF20E /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
 		754BE45519693E190098E6F3 /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		754BE45919693E190098E6F3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		754BE45A19693E190098E6F3 /* CryptoSwift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CryptoSwift.h; sourceTree = "<group>"; };
 		754BE46019693E190098E6F3 /* CryptoSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CryptoSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
 		754BE46619693E190098E6F3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		754BE46719693E190098E6F3 /* CryptoSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoSwiftTests.swift; sourceTree = "<group>"; };
+		754ECF4F197C59FF00731E1B /* BignumTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BignumTests.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -55,6 +66,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				75445821196AA2A5002FF20E /* Security.framework in Frameworks */,
 				6CA7485BCB0B449C97D1EE33 /* libPods.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -74,6 +86,7 @@
 		24B0BBA29D734E62809E53BC /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				75445820196AA2A5002FF20E /* Security.framework */,
 				230BF7BDFE0F48EB92E8E651 /* libPods.a */,
 			);
 			name = Frameworks;
@@ -124,6 +137,7 @@
 			isa = PBXGroup;
 			children = (
 				754BE46719693E190098E6F3 /* CryptoSwiftTests.swift */,
+				754ECF4F197C59FF00731E1B /* BignumTests.swift */,
 				754BE46519693E190098E6F3 /* Supporting Files */,
 			);
 			path = CryptoSwiftTests;
@@ -187,6 +201,7 @@
 			dependencies = (
 				754BE46319693E190098E6F3 /* PBXTargetDependency */,
 				752DEF7919693F3A00E17557 /* PBXTargetDependency */,
+				754ECF4E197C55C700731E1B /* PBXTargetDependency */,
 			);
 			name = CryptoSwiftTests;
 			productName = CryptoSwiftTests;
@@ -325,6 +340,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				754BE46819693E190098E6F3 /* CryptoSwiftTests.swift in Sources */,
+				754ECF50197C59FF00731E1B /* BignumTests.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -341,6 +357,11 @@
 			target = 754BE45419693E190098E6F3 /* CryptoSwift */;
 			targetProxy = 754BE46219693E190098E6F3 /* PBXContainerItemProxy */;
 		};
+		754ECF4E197C55C700731E1B /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 754BE45419693E190098E6F3 /* CryptoSwift */;
+			targetProxy = 754ECF4D197C55C700731E1B /* PBXContainerItemProxy */;
+		};
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */

+ 66 - 20
CryptoSwift/Bignum.swift

@@ -9,7 +9,12 @@
 import Foundation
 
 class Bignum {
-    var bignumPointer:UnsafePointer<BIGNUM>;
+    var bignumPointer:UnsafePointer<BIGNUM> {
+        willSet {
+            BN_clear(self.bignumPointer);
+            self.bignumPointer.destroy()
+        }
+    }
     
     var numberOfBytes:Int {
         get {
@@ -22,28 +27,62 @@ class Bignum {
         BN_init(bignumPointer)
     }
     
-    convenience init(_ bignum: Bignum) {
+    convenience init(_ bignum: Bignum?) {
         self.init();
-        self.bignumPointer = BN_dup(bignum.bignumPointer);
+        if (bignum) {
+            self.bignumPointer = BN_dup(bignum!.bignumPointer);
+        }
     }
     
-    convenience init(_ pointer: UnsafePointer<BIGNUM>) {
-        self.init();
-        self.bignumPointer = BN_dup(pointer);
+    class func bignumWithBignum (bignum: Bignum?) -> Bignum? {
+        var newBignum = Bignum();
+        if let bb = bignum {
+            newBignum.bignumPointer = BN_dup(bb.bignumPointer);
+        }
+        return nil;
     }
     
-    convenience init(data: NSData) {
-        self.init();
-        var constPointerToBytes = CConstPointer<CUnsignedChar>(data, data.bytes.value)
-        var bn:UnsafePointer<BIGNUM> = BN_bin2bn(constPointerToBytes, CInt(data.length), nil);
+    class func bignumWithPointer (pointer: UnsafePointer<BIGNUM>) -> Bignum? {
+        var newBignum = Bignum();
+        newBignum.bignumPointer = BN_dup(pointer)
+        return newBignum
+    }
+    
+    class func bignumWithData(data: NSData?) -> Bignum? {
+        var newBignum = Bignum();
+        if let d = data {
+            newBignum.initWithData(d);
+            return newBignum
+        }
+        return nil
+    }
+    
+    func initWithData(data: NSData?) -> Bool {
+        if (!data) {
+            return false;
+        }
+        
+        let constPointerToBytes = ConstUnsafePointer<CUnsignedChar>(data!.bytes)
+        var bn:UnsafePointer<BIGNUM> = BN_bin2bn(constPointerToBytes, CInt(data!.length), nil);
+        if (bn == nil) {
+            return false;
+        }
         self.bignumPointer = bn;
+        return true;
     }
     
-    func data() -> NSData {
+    func data() -> NSData? {
         let len = self.numberOfBytes;
         var buf = UnsafePointer<Byte>.alloc(len);
-        let bytesCount = Int(BN_bn2bin(self.bignumPointer, buf))
-        return NSData(bytes: buf, length: bytesCount);
+        
+        let convertResult = BN_bn2bin(self.bignumPointer, buf);
+        if (convertResult == nil) {
+            return nil;
+        }
+        
+        var returnData:NSData = NSData(bytes: buf, length: Int(convertResult))
+        buf.destroy()
+        return returnData
     }
     
     func copy() -> AnyObject! {
@@ -52,21 +91,25 @@ class Bignum {
     }
     
     deinit {
-        BN_clear_free(bignumPointer);
-        bignumPointer.destroy()
+        BN_clear(self.bignumPointer);
+        self.bignumPointer.destroy()
     }
 }
 
 @infix func + (left: Bignum, right: Bignum) -> Bignum {
     var resultPointer = UnsafePointer<BIGNUM>.alloc(sizeof(BIGNUM))
     BN_add(resultPointer,left.bignumPointer, right.bignumPointer);
-    return Bignum(resultPointer)
+    var result = Bignum.bignumWithPointer(resultPointer)
+    resultPointer.destroy()
+    return result!
 }
 
 @infix func - (left: Bignum, right: Bignum) -> Bignum {
     var resultPointer = UnsafePointer<BIGNUM>.alloc(sizeof(BIGNUM))
     BN_sub(resultPointer,left.bignumPointer, right.bignumPointer);
-    return Bignum(resultPointer)
+    var result = Bignum.bignumWithPointer(resultPointer)
+    resultPointer.destroy()
+    return result!
 }
 
 @infix func * (left: Bignum, right: Bignum) -> Bignum {
@@ -76,8 +119,9 @@ class Bignum {
     
     BN_mul(resultPointer,left.bignumPointer, right.bignumPointer, ctx);
     BN_CTX_free(ctx)
-    
-    return Bignum(resultPointer)
+    var result:Bignum! = Bignum.bignumWithPointer(resultPointer)
+    resultPointer.destroy()
+    return result
 }
 
 @infix func / (left: Bignum, right: Bignum) -> Bignum {
@@ -88,5 +132,7 @@ class Bignum {
     BN_div(resultPointer, nil, left.bignumPointer, right.bignumPointer, ctx);
     BN_CTX_free(ctx)
     
-    return Bignum(resultPointer)
+    var result:Bignum! = Bignum.bignumWithPointer(resultPointer)
+    resultPointer.destroy()
+    return result
 }

+ 11 - 3
CryptoSwift/RSA.swift

@@ -8,14 +8,22 @@
 
 import Foundation
 
-struct RSA {
+class SwiftRSA {
     var n: Bignum;
     var e: Bignum;
     var d: Bignum;
     var p: Bignum;
     var q: Bignum;
     
-//    func privateEncrypt(data: NSData) {
+    init(n: Bignum? = nil, e: Bignum? = nil, d: Bignum? = nil, p: Bignum? = nil, q: Bignum? = nil) {
+        self.n = n!;
+        self.e = e!;
+        self.d = d!;
+        self.p = p!;
+        self.q = q!;
+    }
+    
+    func privateEncrypt(data: NSData) {
 //        var rsa:UnsafePointer<RSA> = RSA_new();
-//    }
+    }
 }

+ 46 - 0
CryptoSwiftTests/BignumTests.swift

@@ -0,0 +1,46 @@
+//
+//  BignumTests.swift
+//  CryptoSwift
+//
+//  Created by Marcin Krzyzanowski on 20/07/14.
+//  Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
+//
+
+import XCTest
+import CryptoSwift
+
+class BignumTests: XCTestCase {
+
+    override func setUp() {
+        super.setUp()
+    }
+    
+    override func tearDown() {
+        super.tearDown()
+    }
+
+
+    func testBignum() {
+        var bignum1:Bignum = Bignum();
+        var bignum2:Bignum = Bignum();
+        
+        var add = bignum1 + bignum2;
+        XCTAssertNotNil(add, "Add failed");
+        
+        var sub = bignum1 - bignum2;
+        XCTAssertNotNil(sub, "Substract failed");
+    }
+    
+    func testBignumFromData() {
+        let testString:String = "ABCDE"
+        let data:NSData = testString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
+        let bignum1:Bignum! = Bignum.bignumWithData(data)
+        XCTAssertNotNil(bignum1, "Bignum failed1")
+        
+        let dataRet:NSData! = bignum1.data()
+        XCTAssertNotNil(dataRet, "Bignum failed2")
+        let resultString:String! = String.stringWithBytes(dataRet.arrayOfBytes(), length: dataRet.length, encoding: NSUTF8StringEncoding)
+        XCTAssertEqual(testString, resultString, "Bignum to data failed")
+    }
+
+}

+ 4 - 16
CryptoSwiftTests/CryptoSwiftTests.swift

@@ -20,7 +20,7 @@ class CryptoSwiftTests: XCTestCase {
     }
     
     func testMD5() {
-        var data:NSData = NSData(bytes: [49, 50, 51] as Byte[], length: 3)
+        var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
         var md5:NSData = data.md5()
         XCTAssertNotNil(md5, "MD5 calculation failed")
         
@@ -29,7 +29,7 @@ class CryptoSwiftTests: XCTestCase {
     }
     
     func testSHA1() {
-        var data:NSData = NSData(bytes: [49, 50, 51] as Byte[], length: 3)
+        var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
         var sha1:NSData = data.sha1()
         XCTAssertNotNil(sha1, "SHA1 calculation failed")
         
@@ -38,7 +38,7 @@ class CryptoSwiftTests: XCTestCase {
     }
 
     func testSHA512() {
-        var data:NSData = NSData(bytes: [49, 50, 51] as Byte[], length: 3)
+        var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
         var sha512:NSData = data.sha512()
         XCTAssertNotNil(sha512, "SHA512 calculation failed")
         
@@ -47,22 +47,10 @@ class CryptoSwiftTests: XCTestCase {
     }
 
     func testHashEnum() {
-        var data:NSData = NSData(bytes: [49, 50, 51] as Byte[], length: 3)
+        var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
         let md5 = CryptoHash.md5.hash(data);
         var md5String:String = md5.toHexString();
         XCTAssertEqualObjects(md5String, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
     }
-    
-    func testBignum() {
-        var bignum1:Bignum = Bignum();
-        var bignum2:Bignum = Bignum();
-        
-        var add = bignum1 + bignum2;
-        XCTAssertNotNil(add, "Add failed");
-        
-        var sub = bignum1 - bignum2;
-        XCTAssertNotNil(sub, "Substract failed");
-
-    }
         
 }

+ 1 - 1
Podfile.lock

@@ -5,6 +5,6 @@ DEPENDENCIES:
   - OpenSSL-Universal
 
 SPEC CHECKSUMS:
-  OpenSSL-Universal: c109d62ff4632cfa306e98d2159365266b3f44c3
+  OpenSSL-Universal: 9c112508615ed33bb35f730eed820e93175a9dec
 
 COCOAPODS: 0.33.1

+ 1 - 1
Pods/Manifest.lock

@@ -5,6 +5,6 @@ DEPENDENCIES:
   - OpenSSL-Universal
 
 SPEC CHECKSUMS:
-  OpenSSL-Universal: c109d62ff4632cfa306e98d2159365266b3f44c3
+  OpenSSL-Universal: 9c112508615ed33bb35f730eed820e93175a9dec
 
 COCOAPODS: 0.33.1

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 466 - 386
Pods/Pods.xcodeproj/project.pbxproj


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác