Class: SipHash::State

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

Constant Summary collapse

MASK_64 =
0xffffffffffffffff

Instance Method Summary collapse

Constructor Details

#initialize(key) ⇒ State

Returns a new instance of State.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 42

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



57
58
59
60
61
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 57

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

#compressObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 67

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



89
90
91
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 89

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

#finalizeObject



84
85
86
87
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 84

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

#rotl64(num, shift) ⇒ Object



63
64
65
# File 'lib/opendns-dnsdb/dnsdb/siphash.rb', line 63

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