digest-sip_hash 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/bin/siphash +1 -1
- data/lib/digest/sip_hash.rb +19 -20
- data/lib/digest/sip_hash/version.rb +1 -1
- data/spec/runner.rb +18 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a821cc359081b3b9c8184db677719fce137d35f3a190839b99dbe2e05b3bc9a8
|
4
|
+
data.tar.gz: bc743f50abfe70fff01e3c7b9f438bfbb8e73e884928118a75dff76f72e1f314
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e0c910c3e8e2b0131ccaef872e39e39767563655ef66b3ed48336125a1d17d7881b19aad12b98f5515327f175e44a7c256b1df1cd231cf3a5b42a0a6068bc80
|
7
|
+
data.tar.gz: 63743fce636a8dcd204f04d72edd1259f031d9b07e453d43783616c9341e7a0e16082598ddf5fff44d5bf0e92b0c53e162810a077a8b831d0ef69f8e3e9ac552
|
data/Gemfile
CHANGED
data/bin/siphash
CHANGED
@@ -23,7 +23,7 @@ options = ARGV.options do |x|
|
|
23
23
|
|
24
24
|
x.on '-c=ROUNDS', UnsignedInteger, "Number of c rounds. Default: #{config.c}"
|
25
25
|
x.on '-d=ROUNDS', UnsignedInteger, "Number of d rounds. Default: #{config.d}"
|
26
|
-
x.on '-k', '--key=KEY', HexOctets, "
|
26
|
+
x.on '-k', '--key=KEY', HexOctets, "16-octet hex key. Default: \"#{hex_key}\""
|
27
27
|
end.freeze
|
28
28
|
|
29
29
|
begin
|
data/lib/digest/sip_hash.rb
CHANGED
@@ -28,7 +28,7 @@ module Digest
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def finish
|
31
|
-
sip = Sip.new @buffer, @
|
31
|
+
sip = Sip.new @buffer, @c_rounds, @d_rounds, @key
|
32
32
|
sip.transform
|
33
33
|
sip.finalize
|
34
34
|
end
|
@@ -40,11 +40,10 @@ module Digest
|
|
40
40
|
V2 = 'lygenera'.unpack1 'Q>'
|
41
41
|
V3 = 'tedbytes'.unpack1 'Q>'
|
42
42
|
|
43
|
-
def initialize
|
44
|
-
@
|
45
|
-
@
|
46
|
-
@
|
47
|
-
@d_rounds = d_rounds
|
43
|
+
def initialize message, compression_rounds, finalization_rounds, key
|
44
|
+
@message = message
|
45
|
+
@compression_rounds = compression_rounds
|
46
|
+
@finalization_rounds = finalization_rounds
|
48
47
|
|
49
48
|
k0 = key[0..7].unpack1 'Q<'
|
50
49
|
k1 = key[8..15].unpack1 'Q<'
|
@@ -56,14 +55,13 @@ module Digest
|
|
56
55
|
end
|
57
56
|
|
58
57
|
def transform
|
59
|
-
|
60
|
-
(@size / 8).times { |n| compress_block block n }
|
58
|
+
(@message.size / 8).times { |n| compress_block block n }
|
61
59
|
compress_block last_block
|
62
60
|
end
|
63
61
|
|
64
62
|
def finalize
|
65
63
|
@v2 ^= 2 ** 8 - 1
|
66
|
-
@
|
64
|
+
@finalization_rounds.times { compress }
|
67
65
|
[@v0 ^ @v1 ^ @v2 ^ @v3].pack 'Q>'
|
68
66
|
end
|
69
67
|
|
@@ -71,33 +69,34 @@ module Digest
|
|
71
69
|
|
72
70
|
def compress_block n
|
73
71
|
@v3 ^= n
|
74
|
-
@
|
72
|
+
@compression_rounds.times { compress }
|
75
73
|
@v0 ^= n
|
76
74
|
end
|
77
75
|
|
78
76
|
def block n
|
79
|
-
@
|
77
|
+
@message.slice(n * 8, 8).unpack1 'Q<'
|
80
78
|
end
|
81
79
|
|
82
80
|
def last_block
|
83
|
-
|
84
|
-
|
81
|
+
size = @message.size
|
82
|
+
remainder = size % 8
|
83
|
+
offset = size - remainder
|
85
84
|
|
86
|
-
remainder.times.
|
87
|
-
last | @
|
85
|
+
remainder.times.reduce size << 56 & MASK do |last, n|
|
86
|
+
last | @message[n + offset].ord << 8 * n
|
88
87
|
end
|
89
88
|
end
|
90
89
|
|
91
90
|
def compress
|
92
91
|
@v0 = add @v0, @v1
|
93
|
-
@v1 = rotate @v1, 13, @v0
|
92
|
+
@v1 = rotate @v1, 13, xor: @v0
|
94
93
|
@v0 = rotate @v0, 32
|
95
94
|
@v2 = add @v2, @v3
|
96
|
-
@v3 = rotate @v3, 16, @v2
|
95
|
+
@v3 = rotate @v3, 16, xor: @v2
|
97
96
|
@v0 = add @v0, @v3
|
98
|
-
@v3 = rotate @v3, 21, @v0
|
97
|
+
@v3 = rotate @v3, 21, xor: @v0
|
99
98
|
@v2 = add @v2, @v1
|
100
|
-
@v1 = rotate @v1, 17, @v2
|
99
|
+
@v1 = rotate @v1, 17, xor: @v2
|
101
100
|
@v2 = rotate @v2, 32
|
102
101
|
end
|
103
102
|
|
@@ -105,7 +104,7 @@ module Digest
|
|
105
104
|
a + b & MASK
|
106
105
|
end
|
107
106
|
|
108
|
-
def rotate n, by, xor
|
107
|
+
def rotate n, by, xor: 0
|
109
108
|
n << by & MASK | n >> 64 - by ^ xor
|
110
109
|
end
|
111
110
|
end
|
data/spec/runner.rb
CHANGED
@@ -13,6 +13,10 @@ describe Digest::SipHash do
|
|
13
13
|
assert_equal '8264ceeccb16bcbe', Digest::SipHash13.hexdigest('siphash')
|
14
14
|
assert_equal 'ce31007e34130c0a', Digest::SipHash13.hexdigest('digest-sip_hash')
|
15
15
|
assert_equal '1b47c0cc4dd21f05', Digest::SipHash13.hexdigest('x' * 1_000)
|
16
|
+
assert_equal '136ea6cf74ee7506', Digest::SipHash13.hexdigest('abc' * 10_000)
|
17
|
+
assert_equal '8421ff50252ef54c', Digest::SipHash13.hexdigest('bulldozer')
|
18
|
+
assert_equal '1ad2b299abf672fd', Digest::SipHash13.hexdigest('ishmael')
|
19
|
+
assert_equal '1403853b32c9a3d7', Digest::SipHash13.hexdigest('latour')
|
16
20
|
end
|
17
21
|
|
18
22
|
describe 'with a key' do
|
@@ -25,6 +29,10 @@ describe Digest::SipHash do
|
|
25
29
|
assert_equal 'd5518fe19f28c745', Digest::SipHash13.hexdigest('siphash', key: key)
|
26
30
|
assert_equal '71783f159400d4b5', Digest::SipHash13.hexdigest('digest-sip_hash', key: key)
|
27
31
|
assert_equal '2a82bb3e74675b16', Digest::SipHash13.hexdigest('x' * 1_000, key: key)
|
32
|
+
assert_equal '13152caa40a6671a', Digest::SipHash13.hexdigest('abc' * 10_000, key: key)
|
33
|
+
assert_equal '503567849e7ff802', Digest::SipHash13.hexdigest('bulldozer', key: key)
|
34
|
+
assert_equal '39b0f77e620b9655', Digest::SipHash13.hexdigest('ishmael', key: key)
|
35
|
+
assert_equal '6aafa6fdaf07577a', Digest::SipHash13.hexdigest('latour', key: key)
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|
@@ -35,6 +43,10 @@ describe Digest::SipHash do
|
|
35
43
|
assert_equal '59caaeb90d542464', Digest::SipHash24.hexdigest('siphash')
|
36
44
|
assert_equal '4b5cd6bb2500bc8f', Digest::SipHash24.hexdigest('digest-sip_hash')
|
37
45
|
assert_equal 'a07a230346e2656b', Digest::SipHash24.hexdigest('x' * 1_000)
|
46
|
+
assert_equal '2e05ad971738666e', Digest::SipHash24.hexdigest('abc' * 10_000)
|
47
|
+
assert_equal '35e35e884f56688f', Digest::SipHash24.hexdigest('bulldozer')
|
48
|
+
assert_equal '98585807dafda42b', Digest::SipHash24.hexdigest('ishmael')
|
49
|
+
assert_equal '3802759a0e659a96', Digest::SipHash24.hexdigest('latour')
|
38
50
|
end
|
39
51
|
|
40
52
|
describe 'with a key' do
|
@@ -45,8 +57,12 @@ describe Digest::SipHash do
|
|
45
57
|
it 'is the correct hexdigest' do
|
46
58
|
assert_equal '726fdb47dd0e0e31', Digest::SipHash24.hexdigest('', key: key)
|
47
59
|
assert_equal '882768570dc71c92', Digest::SipHash24.hexdigest('siphash', key: key)
|
48
|
-
assert_equal '
|
49
|
-
assert_equal '
|
60
|
+
assert_equal '064ced3bea4abf32', Digest::SipHash24.hexdigest('digest-sip_hash', key: key)
|
61
|
+
assert_equal '3d1ce6276d329229', Digest::SipHash24.hexdigest('x' * 1_000, key: key)
|
62
|
+
assert_equal 'd0da1f6b4e838b97', Digest::SipHash24.hexdigest('abc' * 10_000, key: key)
|
63
|
+
assert_equal 'dae7cd2313f56d73', Digest::SipHash24.hexdigest('bulldozer', key: key)
|
64
|
+
assert_equal 'd1ce681ecf6810e4', Digest::SipHash24.hexdigest('ishmael', key: key)
|
65
|
+
assert_equal '383e7b1932947fd0', Digest::SipHash24.hexdigest('latour', key: key)
|
50
66
|
end
|
51
67
|
end
|
52
68
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: digest-sip_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shannon Skipper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|