class Digest::SipHash::Sip
Constants
- MASK
- V0
- V1
- V2
- V3
Public Class Methods
new(message, compression_rounds, finalization_rounds, key)
click to toggle source
# File lib/digest/sip_hash.rb, line 43 def initialize message, compression_rounds, finalization_rounds, key @message = message @compression_rounds = compression_rounds @finalization_rounds = finalization_rounds k0 = key[0..7].unpack1 'Q<' k1 = key[8..15].unpack1 'Q<' @v0 = V0 ^ k0 @v1 = V1 ^ k1 @v2 = V2 ^ k0 @v3 = V3 ^ k1 end
Public Instance Methods
finalize()
click to toggle source
# File lib/digest/sip_hash.rb, line 62 def finalize @v2 ^= 2 ** 8 - 1 @finalization_rounds.times { compress } [@v0 ^ @v1 ^ @v2 ^ @v3].pack 'Q>' end
transform()
click to toggle source
# File lib/digest/sip_hash.rb, line 57 def transform (@message.size / 8).times { |n| compress_block block n } compress_block last_block end
Private Instance Methods
add(a, b)
click to toggle source
# File lib/digest/sip_hash.rb, line 103 def add a, b a + b & MASK end
block(n)
click to toggle source
# File lib/digest/sip_hash.rb, line 76 def block n @message.slice(n * 8, 8).unpack1 'Q<' end
compress()
click to toggle source
# File lib/digest/sip_hash.rb, line 90 def compress @v0 = add @v0, @v1 @v1 = rotate @v1, 13, @v0 @v0 = rotate @v0, 32 @v2 = add @v2, @v3 @v3 = rotate @v3, 16, @v2 @v0 = add @v0, @v3 @v3 = rotate @v3, 21, @v0 @v2 = add @v2, @v1 @v1 = rotate @v1, 17, @v2 @v2 = rotate @v2, 32 end
compress_block(n)
click to toggle source
# File lib/digest/sip_hash.rb, line 70 def compress_block n @v3 ^= n @compression_rounds.times { compress } @v0 ^= n end
last_block()
click to toggle source
# File lib/digest/sip_hash.rb, line 80 def last_block size = @message.size remainder = size % 8 offset = size - remainder remainder.times.reduce size << 56 & MASK do |last, n| last | @message[n + offset].ord << 8 * n end end
rotate(n, by, xor = 0)
click to toggle source
# File lib/digest/sip_hash.rb, line 107 def rotate n, by, xor = 0 n << by & MASK | n >> 64 - by ^ xor end