Class: SipHash::State

Inherits:
Object
  • Object
show all
Defined in:
lib/siphash.rb

Constant Summary collapse

MASK_64 =
0xffffffffffffffff

Instance Method Summary collapse

Constructor Details

#initialize(key) ⇒ State

Returns a new instance of State.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/siphash.rb', line 65

def initialize(key)
  @v0 = 0x736f6d6570736575
  @v1 = 0x646f72616e646f6d
  @v2 = 0x6c7967656e657261
  @v3 = 0x7465646279746573

  k0 = key.slice(0, 8).unpack("Q<")[0]
  k1 = key.slice(8, 8).unpack("Q<")[0]

  @v0 ^= k0
  @v1 ^= k1
  @v2 ^= k0
  @v3 ^= k1
end

Instance Method Details

#apply_block(m) ⇒ Object



80
81
82
83
84
# File 'lib/siphash.rb', line 80

def apply_block(m)
  @v3 ^= m
  2.times { compress }
  @v0 ^= m
end

#compressObject



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/siphash.rb', line 90

def compress
  @v0 = (@v0 + @v1) & MASK_64
  @v2 = (@v2 + @v3) & MASK_64 
  @v1 = rotl64(@v1, 13)
  @v3 = rotl64(@v3, 16)
  @v1 ^= @v0
  @v3 ^= @v2
  @v0 = rotl64(@v0, 32)
  @v2 = (@v2 + @v1) & MASK_64
  @v0 = (@v0 + @v3) & MASK_64
  @v1 = rotl64(@v1, 17)
  @v3 = rotl64(@v3, 21)
  @v1 ^= @v2
  @v3 ^= @v0
  @v2 = rotl64(@v2, 32)
end

#digestObject



112
113
114
# File 'lib/siphash.rb', line 112

def digest
  @v0 ^ @v1 ^ @v2 ^ @v3
end

#finalizeObject



107
108
109
110
# File 'lib/siphash.rb', line 107

def finalize
  @v2 ^= 0xff
  4.times { compress }
end

#rotl64(num, shift) ⇒ Object



86
87
88
# File 'lib/siphash.rb', line 86

def rotl64(num, shift)
  ((num << shift) & MASK_64) | (num >> (64 - shift))
end