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