2
0
Эх сурвалжийг харах

refactor. No public init, static initializer for Poly1305

Marcin Krzyżanowski 11 жил өмнө
parent
commit
e37aa97afa

+ 59 - 57
CryptoSwift/Poly1305.swift

@@ -14,8 +14,7 @@ import Foundation
 
 public class Poly1305 {
     let blockSize = 16
-
-    private var ctx = Context()
+    private var ctx:Context
     
     private class Context {
         var r            = [Byte](count: 17, repeatedValue: 0)
@@ -25,61 +24,70 @@ public class Poly1305 {
         
         var final:Byte   = 0
         var leftover:Int = 0
+        
+        init (_ key: [Byte]) {
+            assert(key.count == 32,"Invalid key length");
+            if (key.count != 32) {
+                return;
+            }
+            
+            for i in 0..<17 {
+                h[i] = 0
+            }
+            
+            r[0] = key[0] & 0xff;
+            r[1] = key[1] & 0xff;
+            r[2] = key[2] & 0xff;
+            r[3] = key[3] & 0x0f;
+            r[4] = key[4] & 0xfc;
+            r[5] = key[5] & 0xff;
+            r[6] = key[6] & 0xff;
+            r[7] = key[7] & 0x0f;
+            r[8] = key[8] & 0xfc;
+            r[9] = key[9] & 0xff;
+            r[10] = key[10] & 0xff;
+            r[11] = key[11] & 0x0f;
+            r[12] = key[12] & 0xfc;
+            r[13] = key[13] & 0xff;
+            r[14] = key[14] & 0xff;
+            r[15] = key[15] & 0x0f;
+            r[16] = 0
+            
+            for i in 0..<16 {
+                pad[i] = key[i + 16]
+            }
+            pad[16] = 0
+            
+            leftover = 0
+            final = 0
+        }
+        
+        deinit {
+            for i in 0..<buffer.count {
+                buffer[i] = 0
+            }
+            
+            for i in 0..<r.count {
+                r[i] = 0
+                h[i] = 0
+                pad[i] = 0
+                final = 0
+                leftover = 0
+            }
+        }
     }
     
-    public init (key: [Byte]) {
-        setupKey(ctx, key: key)
+    class public func withKey(key: [Byte]) -> Poly1305 {
+        return Poly1305(key)
     }
     
-    deinit {
-        for i in 0..<ctx.buffer.count {
-            ctx.buffer[i] = 0
-        }
-        
-        for i in 0..<ctx.r.count {
-            ctx.r[i] = 0
-            ctx.h[i] = 0
-            ctx.pad[i] = 0
-            ctx.final = 0
-            ctx.leftover = 0
-        }
+    private init (_ key: [Byte]) {
+        ctx = Context(key)
     }
     
-    private func setupKey(context:Context, key:[Byte]) {
-        assert(key.count == 32,"Invalid key length");
-        if (key.count != 32) {
-            return;
-        }
-        
-        for i in 0..<17 {
-            context.h[i] = 0
-        }
-        
-        context.r[0] = key[0] & 0xff;
-        context.r[1] = key[1] & 0xff;
-        context.r[2] = key[2] & 0xff;
-        context.r[3] = key[3] & 0x0f;
-        context.r[4] = key[4] & 0xfc;
-        context.r[5] = key[5] & 0xff;
-        context.r[6] = key[6] & 0xff;
-        context.r[7] = key[7] & 0x0f;
-        context.r[8] = key[8] & 0xfc;
-        context.r[9] = key[9] & 0xff;
-        context.r[10] = key[10] & 0xff;
-        context.r[11] = key[11] & 0x0f;
-        context.r[12] = key[12] & 0xfc;
-        context.r[13] = key[13] & 0xff;
-        context.r[14] = key[14] & 0xff;
-        context.r[15] = key[15] & 0x0f;
-        context.r[16] = 0
-        
-        for i in 0..<16 {
-            context.pad[i] = key[i + 16]
-        }
-        context.pad[16] = 0
-        
-        context.leftover = 0
-        context.final = 0
+    public func auth(mac:[Byte], message:[Byte]) -> [Byte]? {
+        update(ctx, m: message)
+        return finish(ctx, mac: mac)
     }
     
     private func add(context:Context, c:[Byte]) -> Bool {
@@ -270,11 +278,5 @@ public class Poly1305 {
             
             context.leftover += bytes
         }
-        
-    }
-    
-    public func auth(mac:[Byte], m:[Byte]) -> [Byte]? {
-        update(ctx, m: m)
-        return finish(ctx, mac: mac)
     }
 }

+ 2 - 2
CryptoSwiftTests/CipherTests.swift

@@ -26,8 +26,8 @@ class CipherTests: XCTestCase {
         let mac:[Byte] = [0xe0,0xa8,0x7d,0x58,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
         let expectedMac:[Byte] = [0xdd,0xb9,0xda,0x7d,0xdd,0x5e,0x52,0x79,0x27,0x30,0xed,0x5c,0xda,0x5f,0x90,0xa4]
         
-        let poly = Poly1305(key: key);
-        var resultMac = poly.auth(mac, m: msg)
+        let poly = Poly1305.withKey(key)
+        var resultMac = poly.auth(mac, message: msg)
         XCTAssertEqual(resultMac!, expectedMac, "Invalid auth mac")
     }