sha3-pure-ruby 0.0.1
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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +14 -0
- data/README.md +32 -0
- data/Rakefile +5 -0
- data/lib/sha3-pure-ruby.rb +103 -0
- data/lib/sha3-pure-ruby/version.rb +3 -0
- data/sha3-pure-ruby.gemspec +20 -0
- data/test/test_sha3-pure-ruby.rb +11 -0
- data/travis.yml +7 -0
- metadata +70 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 454ede6b3b6a58124b12318611d00bc4590a52a4
|
4
|
+
data.tar.gz: 3f00505cc75d45c90759f258a1d1bdb73cc6b4f5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d68106a9854cff672c1131d6e07e623ae794b19ffd146fc05b497e5f3b47d3cbacca1ac8fe5add04af8b229a9816502fb81cba1992aaecc5c4c606435ce7ed1e
|
7
|
+
data.tar.gz: 2888bad8a3ca3f787580747b299877b5293ae0a1b99b7479e645ea52767b6cc3ceeae8708e2d1ab133720cbe2e87d6496d4e0a290f624c0eb08d71dbfa39f5b7
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Pure Ruby SHA3 Gem
|
2
|
+
|
3
|
+
A pure Ruby implementation of SHA3.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install it yourself:
|
8
|
+
|
9
|
+
$ gem install sha3-pure-ruby
|
10
|
+
|
11
|
+
Or add this line to your app's Gemfile:
|
12
|
+
|
13
|
+
gem 'sha3-pure-ruby'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
Digest::SHA3.new.hexdigest ''
|
23
|
+
#=> "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"
|
24
|
+
```
|
25
|
+
|
26
|
+
## License
|
27
|
+
|
28
|
+
To the extent possible under law, Christian Neukirchen has waived all copyright and related or neighboring rights to the source code in this file.
|
29
|
+
Minor changes by Clemens Gruber.
|
30
|
+
Refactored, tests added, and cut into a gem by Shannon Skipper.
|
31
|
+
|
32
|
+
[https://creativecommons.org/publicdomain/zero/1.0/](https://creativecommons.org/publicdomain/zero/1.0/)
|
data/Rakefile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'digest'
|
2
|
+
require_relative 'sha3-pure-ruby/version'
|
3
|
+
|
4
|
+
module Digest
|
5
|
+
class SHA3 < Digest::Class
|
6
|
+
PILN = [10, 7, 11, 17, 18, 3, 5, 16,
|
7
|
+
8, 21, 24, 4, 15, 23, 19, 13,
|
8
|
+
12, 2, 20, 14, 22, 9, 6, 1]
|
9
|
+
|
10
|
+
ROTC = [ 1, 3, 6, 10, 15, 21, 28, 36,
|
11
|
+
45, 55, 2, 14, 27, 41, 56, 8,
|
12
|
+
25, 43, 62, 18, 39, 61, 20, 44]
|
13
|
+
|
14
|
+
RNDC = [0x0000000000000001, 0x0000000000008082, 0x800000000000808a,
|
15
|
+
0x8000000080008000, 0x000000000000808b, 0x0000000080000001,
|
16
|
+
0x8000000080008081, 0x8000000000008009, 0x000000000000008a,
|
17
|
+
0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
|
18
|
+
0x000000008000808b, 0x800000000000008b, 0x8000000000008089,
|
19
|
+
0x8000000000008003, 0x8000000000008002, 0x8000000000000080,
|
20
|
+
0x000000000000800a, 0x800000008000000a, 0x8000000080008081,
|
21
|
+
0x8000000000008080, 0x0000000080000001, 0x8000000080008008]
|
22
|
+
|
23
|
+
def initialize hash_size = 512
|
24
|
+
@size = hash_size / 8
|
25
|
+
@buffer = ''
|
26
|
+
end
|
27
|
+
|
28
|
+
def << s
|
29
|
+
@buffer << s
|
30
|
+
self
|
31
|
+
end
|
32
|
+
alias update <<
|
33
|
+
|
34
|
+
def reset
|
35
|
+
@buffer.clear
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def finish
|
40
|
+
s = Array.new 25, 0
|
41
|
+
width = 200 - @size * 2
|
42
|
+
|
43
|
+
buffer = @buffer
|
44
|
+
buffer << "\x01" << "\0" * (width - buffer.size % width)
|
45
|
+
buffer[-1] = (buffer[-1].ord | 0x80).chr
|
46
|
+
|
47
|
+
0.step buffer.size - 1, width do |j|
|
48
|
+
quads = buffer[j, width].unpack 'Q*'
|
49
|
+
(width / 8).times do |i|
|
50
|
+
s[i] ^= quads[i]
|
51
|
+
end
|
52
|
+
|
53
|
+
keccak s
|
54
|
+
end
|
55
|
+
|
56
|
+
s.pack('Q*')[0, @size]
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def keccak s
|
61
|
+
24.times.each_with_object [] do |round, a|
|
62
|
+
# Theta
|
63
|
+
5.times do |i|
|
64
|
+
a[i] = s[i] ^ s[i + 5] ^ s[i + 10] ^ s[i + 15] ^ s[i + 20]
|
65
|
+
end
|
66
|
+
|
67
|
+
5.times do |i|
|
68
|
+
t = a[(i + 4) % 5] ^ rotate(a[(i + 1) % 5], 1)
|
69
|
+
0.step 24, 5 do |j|
|
70
|
+
s[j + i] ^= t
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Rho Pi
|
75
|
+
t = s[1]
|
76
|
+
24.times do |i|
|
77
|
+
j = PILN[i]
|
78
|
+
a[0] = s[j]
|
79
|
+
s[j] = rotate t, ROTC[i]
|
80
|
+
t = a[0]
|
81
|
+
end
|
82
|
+
|
83
|
+
# Chi
|
84
|
+
0.step 24, 5 do |j|
|
85
|
+
5.times do |i|
|
86
|
+
a[i] = s[j + i]
|
87
|
+
end
|
88
|
+
|
89
|
+
5.times do |i|
|
90
|
+
s[j + i] ^= ~a[(i + 1) % 5] & a[(i + 2) % 5]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Iota
|
95
|
+
s[0] ^= RNDC[round]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def rotate x, y
|
100
|
+
(x << y | x >> 64 - y) & (1 << 64) - 1
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path '../lib', __FILE__
|
3
|
+
$:.unshift lib unless $:.include? lib
|
4
|
+
require 'sha3-pure-ruby/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'sha3-pure-ruby'
|
8
|
+
spec.version = SHA3::VERSION
|
9
|
+
spec.authors = ['havenwood']
|
10
|
+
spec.email = ['shannonskipper@gmail.com']
|
11
|
+
spec.description = 'An implementation of SHA3 in pure Ruby.'
|
12
|
+
spec.summary = 'Pure Ruby SHA3.'
|
13
|
+
spec.homepage = 'https://github.com/havenwood/sha3-pure-ruby'
|
14
|
+
spec.license = 'https://creativecommons.org/publicdomain/zero/1.0/'
|
15
|
+
spec.files = `git ls-files`.split $/
|
16
|
+
# spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename f }
|
17
|
+
spec.test_files = spec.files.grep %r{^(test)/}
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
spec.add_development_dependency 'rake'
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path '../../lib/sha3-pure-ruby', __FILE__
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'minitest/pride'
|
4
|
+
|
5
|
+
describe Digest::SHA3 do
|
6
|
+
it 'should work' do
|
7
|
+
empty_string_sha3 = '0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e'
|
8
|
+
assert_equal Digest::SHA3.new.hexdigest(''), empty_string_sha3
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
data/travis.yml
ADDED
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sha3-pure-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- havenwood
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: An implementation of SHA3 in pure Ruby.
|
28
|
+
email:
|
29
|
+
- shannonskipper@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- Gemfile
|
36
|
+
- Gemfile.lock
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- lib/sha3-pure-ruby.rb
|
40
|
+
- lib/sha3-pure-ruby/version.rb
|
41
|
+
- sha3-pure-ruby.gemspec
|
42
|
+
- test/test_sha3-pure-ruby.rb
|
43
|
+
- travis.yml
|
44
|
+
homepage: https://github.com/havenwood/sha3-pure-ruby
|
45
|
+
licenses:
|
46
|
+
- https://creativecommons.org/publicdomain/zero/1.0/
|
47
|
+
metadata: {}
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 2.0.3
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Pure Ruby SHA3.
|
68
|
+
test_files:
|
69
|
+
- test/test_sha3-pure-ruby.rb
|
70
|
+
has_rdoc:
|