HashBase.swift 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. //
  2. // Hash.swift
  3. // CryptoSwift
  4. //
  5. // Created by Marcin Krzyzanowski on 17/08/14.
  6. // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. import Foundation
  9. protocol _Hash {
  10. var size:Int { get }
  11. func prepare(len:Int) -> NSMutableData;
  12. }
  13. internal class HashBase {
  14. var message: NSData
  15. internal init(_ message: NSData) {
  16. self.message = message
  17. }
  18. /** Common part for hash calculation. Prepare header data. */
  19. internal func prepare(_ len:Int = 64) -> NSMutableData {
  20. var tmpMessage: NSMutableData = NSMutableData(data: self.message)
  21. // Step 1. Append Padding Bits
  22. tmpMessage.appendBytes([0x80]) // append one bit (UInt8 with one bit) to message
  23. // append "0" bit until message length in bits ≡ 448 (mod 512)
  24. var msgLength = tmpMessage.length
  25. var counter = 0
  26. while msgLength % len != (len - 8) {
  27. counter++
  28. msgLength++
  29. }
  30. var bufZeros = UnsafeMutablePointer<UInt8>(calloc(counter, sizeof(UInt8)))
  31. tmpMessage.appendBytes(bufZeros, length: counter)
  32. bufZeros.destroy()
  33. bufZeros.dealloc(1)
  34. return tmpMessage
  35. }
  36. }