Browse Source

Hash results as optionals

Marcin Krzyżanowski 10 years ago
parent
commit
03e5332ceb

+ 1 - 1
CryptoSwift/Hash.swift

@@ -14,7 +14,7 @@ public enum Hash {
     case sha224(NSData), sha256(NSData), sha384(NSData), sha512(NSData)
     case crc32(NSData)
     
-    public func calculate() -> NSData! {
+    public func calculate() -> NSData? {
         switch self {
         case md5(let data):
             return MD5(data)?.calculate()

+ 7 - 7
CryptoSwift/NSDataExtension.swift

@@ -32,31 +32,31 @@ extension NSData {
         return UInt16(s);
     }
     
-    public func md5() -> NSData {
+    public func md5() -> NSData? {
         return Hash.md5(self).calculate()
     }
 
-    public func sha1() -> NSData {
+    public func sha1() -> NSData? {
         return Hash.sha1(self).calculate()
     }
 
-    public func sha224() -> NSData {
+    public func sha224() -> NSData? {
         return Hash.sha224(self).calculate()
     }
 
-    public func sha256() -> NSData {
+    public func sha256() -> NSData? {
         return Hash.sha256(self).calculate()
     }
 
-    public func sha384() -> NSData {
+    public func sha384() -> NSData? {
         return Hash.sha384(self).calculate()
     }
 
-    public func sha512() -> NSData {
+    public func sha512() -> NSData? {
         return Hash.sha512(self).calculate()
     }
 
-    public func crc32() -> NSData {
+    public func crc32() -> NSData? {
         return Hash.crc32(self).calculate()
     }
 

+ 2 - 22
CryptoSwift/Playground/MyPlayground.playground/section-1.swift

@@ -2,26 +2,6 @@
 
 import Foundation
 
-protocol Initiable  {
-    init(_ v: Int)
-}
+var str:String? = ""
+var data = str?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
 
-func integerFromBitsArray<T: IntegerLiteralConvertible where T: UnsignedIntegerType, T: Initiable>(bits: [Bit]) -> T
-{
-    var bitPattern:T = 0
-    for (idx,b) in enumerate(bits) {
-        if (b == Bit.One) {
-            let bit = T(1 << idx)
-            bitPattern = bitPattern | bit
-        }
-    }
-    return bitPattern
-}
-
-extension UInt:Initiable {}
-extension UInt8:Initiable {}
-extension UInt16:Initiable {}
-extension UInt32:Initiable {}
-extension UInt64:Initiable {}
-
-let i = integerFromBitsArray([Bit.One, Bit.Zero]) as UInt8

+ 7 - 7
CryptoSwift/StringExtension.swift

@@ -13,31 +13,31 @@ extension String {
     
     /** Calculate MD5 hash */
     public func md5() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.md5().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.md5()?.toHexString()
     }
     
     public func sha1() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha1().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha1()?.toHexString()
     }
 
     public func sha224() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha224().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha224()?.toHexString()
     }
 
     public func sha256() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha256().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha256()?.toHexString()
     }
 
     public func sha384() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha384().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha384()?.toHexString()
     }
 
     public func sha512() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha512().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.sha512()?.toHexString()
     }
 
     public func crc32() -> String? {
-        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.crc32().toHexString()
+        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)?.crc32()?.toHexString()
     }
 
     public func encrypt(cipher: Cipher) -> String? {

+ 23 - 14
CryptoSwiftTests/HashTests.swift

@@ -21,8 +21,9 @@ class CryptoSwiftTests: XCTestCase {
     
     func testMD5() {
         let data1:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [Byte], length: 3) // "1", "2", "3"
-        var hash:NSData = data1.md5()
-        XCTAssertEqual(hash.hexString, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
+        if let hash = data1.md5() {
+            XCTAssertEqual(hash.hexString, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
+        }
         
         if let hash = "123".md5() {
             XCTAssertEqual(hash, "202CB962AC59075B964B07152D234B70", "MD5 calculation failed");
@@ -30,6 +31,8 @@ class CryptoSwiftTests: XCTestCase {
         
         if let hash = "".md5() {
             XCTAssertEqual(hash, "D41D8CD98F00B204E9800998ECF8427E", "MD5 calculation failed")
+        } else {
+            XCTAssert(false, "Hash for empty string is missing")
         }
         
         if let hash = "a".md5() {
@@ -59,8 +62,9 @@ class CryptoSwiftTests: XCTestCase {
     
     func testSHA1() {
         var data:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [Byte], length: 3)
-        var hash:NSData = data.sha1()
-        XCTAssertEqual(hash.hexString, "40BD001563085FC35165329EA1FF5C5ECBDBBEEF", "SHA1 calculation failed");
+        if let hash = data.sha1() {
+            XCTAssertEqual(hash.hexString, "40BD001563085FC35165329EA1FF5C5ECBDBBEEF", "SHA1 calculation failed");
+        }
         
         if let hash = "abc".sha1() {
             XCTAssertEqual(hash, "A9993E364706816ABA3E25717850C26C9CD0D89D", "SHA1 calculation failed")
@@ -73,14 +77,16 @@ class CryptoSwiftTests: XCTestCase {
     
     func testSHA224() {
         var data:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [Byte], length: 3)
-        var hash:NSData = data.sha224();
-        XCTAssertEqual(hash.hexString, "78D8045D684ABD2EECE923758F3CD781489DF3A48E1278982466017F", "SHA224 calculation failed");
+        if let hash = data.sha224() {
+            XCTAssertEqual(hash.hexString, "78D8045D684ABD2EECE923758F3CD781489DF3A48E1278982466017F", "SHA224 calculation failed");
+        }
     }
 
     func testSHA256() {
         var data:NSData = NSData(bytes: [0x31, 0x32, 0x33] as [Byte], length: 3)
-        var hash:NSData = data.sha256()
-        XCTAssertEqual(hash.hexString, "A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3", "SHA256 calculation failed");
+        if let hash = data.sha256() {
+            XCTAssertEqual(hash.hexString, "A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3", "SHA256 calculation failed");
+        }
         
         if let hash = "Rosetta code".sha256() {
             XCTAssertEqual(hash, "764FAF5C61AC315F1497F9DFA542713965B785E5CC2F707D6468D7D1124CDFCF", "SHA256 calculation failed")
@@ -89,8 +95,9 @@ class CryptoSwiftTests: XCTestCase {
 
     func testSHA384() {
         var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
-        var hash = data.sha384()
-        XCTAssertEqual(hash.hexString, "9A0A82F0C0CF31470D7AFFEDE3406CC9AA8410671520B727044EDA15B4C25532A9B5CD8AAF9CEC4919D76255B6BFB00F", "SHA384 calculation failed");
+        if let hash = data.sha384() {
+            XCTAssertEqual(hash.hexString, "9A0A82F0C0CF31470D7AFFEDE3406CC9AA8410671520B727044EDA15B4C25532A9B5CD8AAF9CEC4919D76255B6BFB00F", "SHA384 calculation failed");
+        }
         
         if let hash = "The quick brown fox jumps over the lazy dog.".sha384() {
             XCTAssertEqual(hash, "ED892481D8272CA6DF370BF706E4D7BC1B5739FA2177AAE6C50E946678718FC67A7AF2819A021C2FC34E91BDB63409D7", "SHA384 calculation failed");
@@ -99,8 +106,9 @@ class CryptoSwiftTests: XCTestCase {
 
     func testSHA512() {
         var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
-        var hash = data.sha512()
-        XCTAssertEqual(hash.hexString, "3C9909AFEC25354D551DAE21590BB26E38D53F2173B8D3DC3EEE4C047E7AB1C1EB8B85103E3BE7BA613B31BB5C9C36214DC9F14A42FD7A2FDB84856BCA5C44C2", "SHA512 calculation failed");
+        if let hash = data.sha512() {
+            XCTAssertEqual(hash.hexString, "3C9909AFEC25354D551DAE21590BB26E38D53F2173B8D3DC3EEE4C047E7AB1C1EB8B85103E3BE7BA613B31BB5C9C36214DC9F14A42FD7A2FDB84856BCA5C44C2", "SHA512 calculation failed");
+        }
         
         if let hash = "The quick brown fox jumps over the lazy dog.".sha512() {
             XCTAssertEqual(hash, "91EA1245F20D46AE9A037A989F54F1F790F0A47607EEB8A14D12890CEA77A1BBC6C7ED9CF205E67B7F2B8FD4C7DFD3A7A8617E45F3C463D481C7E586C39AC1ED", "SHA512 calculation failed");
@@ -110,7 +118,8 @@ class CryptoSwiftTests: XCTestCase {
     
     func testCRC32() {
         var data:NSData = NSData(bytes: [49, 50, 51] as [Byte], length: 3)
-        var crc = data.crc32()
-        XCTAssertEqual(crc.hexString, "884863D2", "CRC32 calculation failed");
+        if let crc = data.crc32() {
+            XCTAssertEqual(crc.hexString, "884863D2", "CRC32 calculation failed");
+        }
     }
 }