Forráskód Böngészése

Simplified MD5/SHA1/SHA256 digest concatenation.
Added a util method for building UInt8 array from String.

Damian Kołakowski 9 éve
szülő
commit
af4a433e27
4 módosított fájl, 43 hozzáadás és 74 törlés
  1. 28 0
      Sources/TLS/HEX.swift
  2. 5 16
      Sources/TLS/MD5.swift
  3. 5 21
      Sources/TLS/SHA1.swift
  4. 5 37
      Sources/TLS/SHA256.swift

+ 28 - 0
Sources/TLS/HEX.swift

@@ -13,3 +13,31 @@ extension Sequence where Iterator.Element == UInt8 {
         return self.reduce("") { $0 + String(format: "%02x", $1) }
     }
 }
+
+extension String {
+    
+    public func asHexArray() -> [UInt8] {
+        var result = [UInt8]()
+        var iterator = self.unicodeScalars.makeIterator()
+        while let scalar = iterator.next(), let nextScalar = iterator.next() {
+            let value = ( (hexToDecimal(scalar)) * 16 ) + (hexToDecimal(nextScalar))
+            if value < UInt32(UINT8_MAX) {
+                result.append(UInt8(value))
+            }
+        }
+        return result
+    }
+    
+    private func hexToDecimal(_ input: UnicodeScalar) -> UInt32 {
+        switch input {
+            case "0"..."9":
+                return input.value - 48
+            case "A"..."F":
+                return input.value - 65 + 10
+            case "a"..."f":
+                return input.value - 97 + 10
+            default:
+                return 0
+        }
+    }
+}

+ 5 - 16
Sources/TLS/MD5.swift

@@ -77,22 +77,11 @@ public struct MD5 {
         
         var digest = [UInt8]()
         
-        a0 = a0.littleEndian
-        b0 = b0.littleEndian
-        c0 = c0.littleEndian
-        d0 = d0.littleEndian
-        
-        withUnsafePointer(&a0) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&b0) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&c0) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&d0) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
+        [a0, b0, c0, d0].forEach { value in
+            var littleEndianVersion = value.littleEndian
+            withUnsafePointer(&littleEndianVersion) {
+                digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
+            }
         }
         
         return digest

+ 5 - 21
Sources/TLS/SHA1.swift

@@ -114,29 +114,13 @@ public struct SHA1 {
         
         var digest = [UInt8]()
         
-        h0 = h0.bigEndian
-        h1 = h1.bigEndian
-        h2 = h2.bigEndian
-        h3 = h3.bigEndian
-        h4 = h4.bigEndian
-        
-        withUnsafePointer(&h0) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h1) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h2) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h3) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h4) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
+        [h0, h1, h2, h3, h4].forEach { value in
+            var bigEndianVersion = value.bigEndian
+            withUnsafePointer(&bigEndianVersion) {
+                digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
+            }
         }
         
-        
         return digest
     }
     

+ 5 - 37
Sources/TLS/SHA256.swift

@@ -83,7 +83,6 @@ public struct SHA256 {
             var g = h6
             var h = h7
             
-
             for i in 0...63 {
                 
                 let S0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22)
@@ -115,50 +114,19 @@ public struct SHA256 {
             h5 = ( h5 &+ f )
             h6 = ( h6 &+ g )
             h7 = ( h7 &+ h )
-            
-            
-            
         }
         
         // Produce the final hash value (big-endian):
         
         var digest = [UInt8]()
         
-        h0 = h0.bigEndian
-        h1 = h1.bigEndian
-        h2 = h2.bigEndian
-        h3 = h3.bigEndian
-        h4 = h4.bigEndian
-        h5 = h5.bigEndian
-        h6 = h6.bigEndian
-        h7 = h7.bigEndian
-        
-        withUnsafePointer(&h0) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h1) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h2) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h3) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h4) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h5) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h6) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
-        }
-        withUnsafePointer(&h7) {
-            digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
+        [h0, h1, h2, h3, h4, h5, h6, h7].forEach { value in
+            var bigEndianVersion = value.bigEndian
+            withUnsafePointer(&bigEndianVersion) {
+                digest.append(contentsOf: Array(UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: 4)))
+            }
         }
         
-        
         return digest
     }