Utils.swift 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //
  2. // Utils.swift
  3. // CryptoSwift
  4. //
  5. // Created by Marcin Krzyzanowski on 26/08/14.
  6. // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. func rotateLeft(_ value:UInt8, by:UInt8) -> UInt8 {
  9. return ((value << by) & 0xFF) | (value >> (8 - by))
  10. }
  11. func rotateLeft(_ value:UInt16, by:UInt16) -> UInt16 {
  12. return ((value << by) & 0xFFFF) | (value >> (16 - by))
  13. }
  14. func rotateLeft(_ value:UInt32, by:UInt32) -> UInt32 {
  15. return ((value << by) & 0xFFFFFFFF) | (value >> (32 - by))
  16. }
  17. func rotateLeft(_ value:UInt64, by:UInt64) -> UInt64 {
  18. return (value << by) | (value >> (64 - by))
  19. }
  20. func rotateRight(_ value:UInt16, by:UInt16) -> UInt16 {
  21. return (value >> by) | (value << (16 - by))
  22. }
  23. func rotateRight(_ value:UInt32, by:UInt32) -> UInt32 {
  24. return (value >> by) | (value << (32 - by))
  25. }
  26. func rotateRight(_ value:UInt64, by:UInt64) -> UInt64 {
  27. return ((value >> by) | (value << (64 - by)))
  28. }
  29. func reversed(_ uint8 : UInt8) -> UInt8 {
  30. var v = uint8
  31. v = (v & 0xF0) >> 4 | (v & 0x0F) << 4
  32. v = (v & 0xCC) >> 2 | (v & 0x33) << 2
  33. v = (v & 0xAA) >> 1 | (v & 0x55) << 1
  34. return v
  35. }
  36. func reversed(_ uint32 : UInt32) -> UInt32 {
  37. var v = uint32
  38. v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1)
  39. v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2)
  40. v = ((v >> 4) & 0x0f0f0f0f) | ((v & 0x0f0f0f0f) << 4)
  41. v = ((v >> 8) & 0x00ff00ff) | ((v & 0x00ff00ff) << 8)
  42. v = ((v >> 16) & 0xffff) | ((v & 0xffff) << 16)
  43. return v
  44. }
  45. func xor(_ a: Array<UInt8>, _ b:Array<UInt8>) -> Array<UInt8> {
  46. var xored = Array<UInt8>(repeating: 0, count: min(a.count, b.count))
  47. for i in 0..<xored.count {
  48. xored[i] = a[i] ^ b[i]
  49. }
  50. return xored
  51. }
  52. /**
  53. ISO/IEC 9797-1 Padding method 2.
  54. Add a single bit with value 1 to the end of the data.
  55. If necessary add bits with value 0 to the end of the data until the padded data is a multiple of blockSize.
  56. - parameters:
  57. - blockSize: Padding size in bytes.
  58. - allowance: Excluded trailing number of bytes.
  59. */
  60. func bitPadding(to data: Array<UInt8>, blockSize: Int, allowance: Int = 0) -> Array<UInt8> {
  61. var tmp = data
  62. // Step 1. Append Padding Bits
  63. tmp.append(0x80) // append one bit (UInt8 with one bit) to message
  64. // append "0" bit until message length in bits ≡ 448 (mod 512)
  65. var msgLength = tmp.count
  66. var counter = 0
  67. while msgLength % blockSize != (blockSize - allowance) {
  68. counter += 1
  69. msgLength += 1
  70. }
  71. tmp += Array<UInt8>(repeating: 0, count: counter)
  72. return tmp
  73. }