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.



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

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



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

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

#compressObject



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

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



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

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

#finalizeObject



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

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

#rotl64(num, shift) ⇒ Object



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

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