Browse Source

finih funcs

Marcin Krzyżanowski 11 years ago
parent
commit
9287b221af
1 changed files with 31 additions and 0 deletions
  1. 31 0
      CryptoSwift/Poly1305.swift

+ 31 - 0
CryptoSwift/Poly1305.swift

@@ -15,10 +15,12 @@ import Foundation
 class Poly1305 {
     let blockSize = 16
     
+    var buffer:[Byte] = [Byte](count: 16, repeatedValue: 0)
     var r:[Byte] = [Byte](count: 17, repeatedValue: 0)
     var h:[Byte] = [Byte](count: 17, repeatedValue: 0)
     var pad:[Byte] = [Byte](count: 17, repeatedValue: 0)
     var final:Byte = 0
+    var leftover:Int = 0
     
     init (key: [Byte]) {
         if (key.count != 32) {
@@ -38,6 +40,7 @@ class Poly1305 {
         r[16] = 0
         pad[16] = 0
         
+        leftover = 0
         final = 0
     }
     
@@ -148,6 +151,34 @@ class Poly1305 {
         }
     }
     
+    func finish(inout mac:[Byte]) -> Bool {
+        if (h.count != 16) {
+            return false
+        }
+        
+        /* process the remaining block */
+        if (leftover > 0) {
+            var i = leftover
+            buffer[i++] = 1
+            for (; i < blockSize; i++) {
+                buffer[i] = 0
+            }
+            final = 1
+            blocks(buffer)
+        }
+        
+        /* fully reduce h */
+        freeze(&h)
+        
+        /* h = (h + pad) % (1 << 128) */
+        add(&h, c: pad)
+        for i in 0..<16 {
+            mac[i] = h[i]
+        }
+        
+        return true
+    }
+    
     deinit {
         for i in 0...(r.count) {
             r[i] = 0