Utils.swift 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 sliceToUInt32Array(_ slice: ArraySlice<UInt8>) -> Array<UInt32> {
  46. var result = Array<UInt32>()
  47. result.reserveCapacity(16)
  48. for idx in stride(from: slice.startIndex, to: slice.endIndex, by: sizeof(UInt32.self)) {
  49. let val1:UInt32 = (UInt32(slice[idx.advanced(by: 3)]) << 24)
  50. let val2:UInt32 = (UInt32(slice[idx.advanced(by: 2)]) << 16)
  51. let val3:UInt32 = (UInt32(slice[idx.advanced(by: 1)]) << 8)
  52. let val4:UInt32 = UInt32(slice[idx])
  53. let val:UInt32 = val1 | val2 | val3 | val4
  54. result.append(val)
  55. }
  56. return result
  57. }
  58. func sliceToUInt64Array(_ slice: ArraySlice<UInt8>) -> Array<UInt64> {
  59. var result = Array<UInt64>()
  60. result.reserveCapacity(32)
  61. for idx in stride(from: slice.startIndex, to: slice.endIndex, by: sizeof(UInt64.self)) {
  62. var val:UInt64 = 0
  63. val |= UInt64(slice[idx.advanced(by: 7)]) << 56
  64. val |= UInt64(slice[idx.advanced(by: 6)]) << 48
  65. val |= UInt64(slice[idx.advanced(by: 5)]) << 40
  66. val |= UInt64(slice[idx.advanced(by: 4)]) << 32
  67. val |= UInt64(slice[idx.advanced(by: 3)]) << 24
  68. val |= UInt64(slice[idx.advanced(by: 2)]) << 16
  69. val |= UInt64(slice[idx.advanced(by: 1)]) << 8
  70. val |= UInt64(slice[idx.advanced(by: 0)]) << 0
  71. result.append(val)
  72. }
  73. return result
  74. }
  75. func xor(_ a: Array<UInt8>, _ b:Array<UInt8>) -> Array<UInt8> {
  76. var xored = Array<UInt8>(repeating: 0, count: min(a.count, b.count))
  77. for i in 0..<xored.count {
  78. xored[i] = a[i] ^ b[i]
  79. }
  80. return xored
  81. }