Explorar o código

Bignum initials

Marcin Krzyżanowski %!s(int64=11) %!d(string=hai) anos
pai
achega
54eee07c87

+ 2 - 0
CryptoSwift-Bridging-Header.h

@@ -17,3 +17,5 @@
 #include <openssl/camellia.h>
 #include <openssl/blowfish.h>
 
+#include <openssl/bn.h>
+

+ 4 - 0
CryptoSwift.xcodeproj/project.pbxproj

@@ -9,6 +9,7 @@
 /* Begin PBXBuildFile section */
 		53EF3745328C4EBAA8FD3C8A /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 230BF7BDFE0F48EB92E8E651 /* libPods.a */; };
 		6CA7485BCB0B449C97D1EE33 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 230BF7BDFE0F48EB92E8E651 /* libPods.a */; };
+		752867B01969528B00E10455 /* Bignum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752867AF1969528B00E10455 /* Bignum.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 */; };
 		754BE45B19693E190098E6F3 /* CryptoSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 754BE45A19693E190098E6F3 /* CryptoSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -36,6 +37,7 @@
 /* Begin PBXFileReference section */
 		230BF7BDFE0F48EB92E8E651 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		3B94B3F6DF034011B9EAC0B8 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = "<group>"; };
+		752867AF1969528B00E10455 /* Bignum.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bignum.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>"; };
 		754BE45519693E190098E6F3 /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -100,6 +102,7 @@
 			isa = PBXGroup;
 			children = (
 				754BE45A19693E190098E6F3 /* CryptoSwift.h */,
+				752867AF1969528B00E10455 /* Bignum.swift */,
 				752DEF7619693EA000E17557 /* NSDataExtension.swift */,
 				754BE45819693E190098E6F3 /* Supporting Files */,
 			);
@@ -309,6 +312,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				752DEF7719693EA000E17557 /* NSDataExtension.swift in Sources */,
+				752867B01969528B00E10455 /* Bignum.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 53 - 0
CryptoSwift/Bignum.swift

@@ -0,0 +1,53 @@
+//
+//  Bignum.swift
+//  CryptoSwift
+//
+//  Created by Marcin Krzyzanowski on 06/07/14.
+//  Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
+//
+
+import Foundation
+
+class Bignum {
+    var bignumPointer:UnsafePointer<BIGNUM>;
+    
+    var numberOfBytes:Int {
+        get {
+            return Int((BN_num_bits(self.bignumPointer)+7)/8);
+        }
+    }
+    
+    init() {
+        self.bignumPointer = UnsafePointer<BIGNUM>.alloc(sizeof(BIGNUM))
+        BN_init(bignumPointer)
+    }
+    
+    convenience init(bignum: Bignum) {
+        self.init();
+        self.bignumPointer = BN_dup(bignum.bignumPointer);
+    }
+    
+    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);
+        self.bignumPointer = bn;
+    }
+    
+    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);
+    }
+    
+    func copy() -> AnyObject! {
+        let copied:Bignum = Bignum(bignum: self)
+        return copied
+    }
+    
+    deinit {
+        BN_clear_free(bignumPointer);
+        bignumPointer.destroy()
+    }
+}

+ 1 - 1
CryptoSwift/NSDataExtension.swift

@@ -172,7 +172,7 @@ extension NSData {
         
         return outData;
     }
-
+    
     func toHexString() -> String {
         let count = self.length / sizeof(Byte)
         var bytesArray = Byte[](count: count, repeatedValue: 0)

+ 4 - 0
CryptoSwiftTests/CryptoSwiftTests.swift

@@ -44,6 +44,10 @@ class CryptoSwiftTests: XCTestCase {
         XCTAssertEqualObjects(md5String, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
     }
     
+    func testBignum {
+        var bignum:Bignum = Bignum();
+    }
+    
 //    func testPerformanceExample() {
 //        self.measureBlock() {
 //        }