stribog 0.1.2 → 0.1.3
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/.rubocop.yml +2 -4
- data/README.rdoc +44 -0
- data/lib/stribog.rb +2 -0
- data/lib/stribog/compression.rb +1 -2
- data/lib/stribog/create_hash.rb +67 -14
- data/lib/stribog/digest.rb +29 -0
- data/lib/stribog/hash_params.rb +3 -2
- data/lib/stribog/version.rb +1 -1
- metadata +4 -3
- data/README.md +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc696f1b18cb6ec04fce7cf3cc740be1eed204a6
|
4
|
+
data.tar.gz: ad56184c6dae90af01b9edd83424e7ba1864e2d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e02b4f9c61c008e4d0a4b413c0739d8866d645d12152829fd6fda289c524e2baba94e787ba40c04a1734a80e33d9ad70f8c1df2378e493a6e885792902fadafa
|
7
|
+
data.tar.gz: fde879defcd83fb2fb86910fe2c2b2c3177cde3c3580db70551573d6870073b5dcfeb863cd02a7b8854609adac733b4347f592a839cd9e0b9b20043e9109e8ac
|
data/.rubocop.yml
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
AllCops:
|
2
2
|
Exclude:
|
3
|
-
-
|
3
|
+
- stribog.gemspec
|
4
4
|
- Rakefile
|
5
5
|
- bin/test.rb
|
6
|
-
- lib/
|
7
|
-
- lib/crypto_gost/digital_signature_gost_12/group/**/*
|
6
|
+
- lib/stribog/hash_params.rb
|
8
7
|
- spec/**/*
|
9
|
-
- stribog.gemspec
|
10
8
|
|
11
9
|
Metrics/LineLength:
|
12
10
|
Max: 100
|
data/README.rdoc
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
== Stribog
|
2
|
+
|
3
|
+
{<img src="https://travis-ci.org/WildDima/stribog.svg?branch=master"
|
4
|
+
alt="Build Status" />}[https://travis-ci.org/WildDima/stribog]
|
5
|
+
|
6
|
+
Ruby library implementing GOST 34.11-12 Stribog
|
7
|
+
|
8
|
+
=== Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
|
13
|
+
gem 'stribog'
|
14
|
+
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install stribog
|
23
|
+
|
24
|
+
=== Usage
|
25
|
+
|
26
|
+
require 'stribog'
|
27
|
+
|
28
|
+
hash = Stribog::CreateHash.new('ruby')
|
29
|
+
|
30
|
+
# for 256 bit
|
31
|
+
hash.(256).to_hex #=> "cde7864b760a690f4ec24ffe5c66bd2c00db843e9cf1b82b6c467dba5a7846a7"
|
32
|
+
|
33
|
+
# for 512 bit
|
34
|
+
hash.(512).to_hex #=> "f0dafc0703f801d1ecbe7ff246808d07507f67879eaacf887ba041336fd51e0a964f00470ed0eedb0378a39e019eb308876ea8c84bb89e2c35159fb6dbbdc598"
|
35
|
+
|
36
|
+
=== Contributing
|
37
|
+
|
38
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/wilddima/stribog. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
39
|
+
|
40
|
+
|
41
|
+
=== License
|
42
|
+
|
43
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
44
|
+
|
data/lib/stribog.rb
CHANGED
@@ -4,6 +4,8 @@ require 'stribog/version'
|
|
4
4
|
# @author WildDima
|
5
5
|
module Stribog
|
6
6
|
require_relative './stribog/create_hash'
|
7
|
+
require_relative './stribog/hash_params'
|
7
8
|
require_relative './stribog/compression'
|
8
9
|
require_relative './stribog/binary_vector'
|
10
|
+
require_relative './stribog/digest'
|
9
11
|
end
|
data/lib/stribog/compression.rb
CHANGED
data/lib/stribog/create_hash.rb
CHANGED
@@ -1,22 +1,47 @@
|
|
1
|
-
require 'byebug'
|
2
1
|
module Stribog
|
3
|
-
#
|
2
|
+
# CreateHash
|
4
3
|
#
|
4
|
+
# Class, which creates digests.
|
5
5
|
# @author WildDima
|
6
6
|
class CreateHash
|
7
|
-
|
7
|
+
# Original message
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
# @example
|
11
|
+
# hash.message
|
12
|
+
# @return [String] contains original message
|
13
|
+
attr_reader :message
|
14
|
+
|
15
|
+
# Length of digest. Should be equal to 256 or 512.
|
16
|
+
#
|
17
|
+
# @api public
|
18
|
+
# @example
|
19
|
+
# digest.digest_length
|
20
|
+
# @return [Fixnum] binary representation of digest
|
21
|
+
attr_reader :digest_length
|
22
|
+
|
23
|
+
# Contain message as instance of BinaryVector
|
24
|
+
#
|
25
|
+
# @api public
|
26
|
+
# @example
|
27
|
+
# digest.message_vector
|
28
|
+
# @return [BinaryVector] binary representation of message
|
29
|
+
attr_reader :message_vector
|
8
30
|
|
9
31
|
HASH_LENGTH = 512
|
10
32
|
|
11
|
-
def initialize(message
|
12
|
-
@
|
13
|
-
@message = binary_vector.from_hex(message)
|
14
|
-
@n = binary_vector_field_by
|
15
|
-
@sum = binary_vector_field_by
|
33
|
+
def initialize(message)
|
34
|
+
@message = message
|
16
35
|
end
|
17
36
|
|
37
|
+
# Create digest of {#message}. Default equal to 512.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# Stribog::CreateHash.new('ruby').call(256)
|
41
|
+
# Stribog::CreateHash.new('ruby').call(512)
|
42
|
+
# @author WildDima
|
18
43
|
def call(digest_length = HASH_LENGTH)
|
19
|
-
|
44
|
+
prepare_hash_params!(digest_length: digest_length)
|
20
45
|
|
21
46
|
return_hash(
|
22
47
|
final_compression(
|
@@ -34,12 +59,16 @@ module Stribog
|
|
34
59
|
|
35
60
|
private
|
36
61
|
|
37
|
-
|
62
|
+
# Create instance vars for hashing
|
63
|
+
def prepare_hash_params!(digest_length:)
|
64
|
+
@n = binary_vector_field_by
|
65
|
+
@sum = binary_vector_field_by
|
38
66
|
@digest_length = digest_length
|
39
67
|
@hash_vector = create_hash_vector
|
40
|
-
@message_vector = message
|
68
|
+
@message_vector = binary_vector.from_hex(message)
|
41
69
|
end
|
42
70
|
|
71
|
+
# Create hash_vector for hashing
|
43
72
|
def create_hash_vector
|
44
73
|
case digest_length
|
45
74
|
when 512
|
@@ -52,9 +81,10 @@ module Stribog
|
|
52
81
|
end
|
53
82
|
end
|
54
83
|
|
84
|
+
# Method, which slices longer messages, and hashings them by parts.
|
55
85
|
def compact_message(sum:, n:, message_vector:, hash_vector:, message_head: nil)
|
56
86
|
current_vector = message_head || message_vector
|
57
|
-
if
|
87
|
+
if current_vector.size < HASH_LENGTH
|
58
88
|
return { sum: sum, n: n, message_vector: current_vector,
|
59
89
|
hash_vector: hash_vector }
|
60
90
|
end
|
@@ -69,14 +99,17 @@ module Stribog
|
|
69
99
|
)
|
70
100
|
end
|
71
101
|
|
102
|
+
# Method, which slices head of message
|
72
103
|
def slice_message_head(message_vector)
|
73
104
|
binary_vector_from_array(message_vector.vector[0...-HASH_LENGTH])
|
74
105
|
end
|
75
106
|
|
107
|
+
# Method, which slices head of tail
|
76
108
|
def slice_message_tail(message_vector)
|
77
109
|
binary_vector_from_array(message_vector.vector[-HASH_LENGTH..-1])
|
78
110
|
end
|
79
111
|
|
112
|
+
# Method, which implements main hashing
|
80
113
|
def core_hashing(sum:, n:, message_vector:, hash_vector:)
|
81
114
|
new_sum = addition_in_ring_to_binary(sum.to_dec,
|
82
115
|
message_vector
|
@@ -92,40 +125,60 @@ module Stribog
|
|
92
125
|
{ sum: new_sum, n: new_n, hash_vector: new_hash_vector }
|
93
126
|
end
|
94
127
|
|
128
|
+
# Method, which implements final compression
|
95
129
|
def final_compression(sum:, n:, hash_vector:)
|
96
130
|
compress(message: sum, hash_vector: compress(message: n, hash_vector: hash_vector))
|
97
131
|
end
|
98
132
|
|
133
|
+
# Method, which return digest, dependent on them length
|
99
134
|
def return_hash(final_vector)
|
100
135
|
case digest_length
|
101
136
|
when 512
|
102
|
-
final_vector
|
137
|
+
create_digest(final_vector)
|
103
138
|
when 256
|
104
|
-
binary_vector_from_array(final_vector[0..255])
|
139
|
+
create_digest(binary_vector_from_array(final_vector[0..255]))
|
105
140
|
else
|
106
141
|
raise ArgumentError,
|
107
142
|
"digest length must be equal to 256 or 512, not #{digest_length}"
|
108
143
|
end
|
109
144
|
end
|
110
145
|
|
146
|
+
# Method implements addition in ring
|
111
147
|
def addition_in_ring(first, second, ring)
|
112
148
|
(first + second) % ring
|
113
149
|
end
|
114
150
|
|
151
|
+
# Method implements addition in ring and creates binary vector
|
115
152
|
def addition_in_ring_to_binary(first, second, ring = 2**HASH_LENGTH, size: HASH_LENGTH)
|
116
153
|
binary_vector.from_byte(addition_in_ring(first, second, ring), size: size)
|
117
154
|
end
|
118
155
|
|
156
|
+
# Compression method
|
119
157
|
def compress(message:, hash_vector:, n: binary_vector_field_by)
|
120
158
|
Compression.new(n, message, hash_vector).call
|
121
159
|
end
|
122
160
|
|
161
|
+
# Method creates binary vector from array
|
123
162
|
def binary_vector_from_array(vector)
|
124
163
|
binary_vector.new(vector)
|
125
164
|
end
|
126
165
|
|
166
|
+
# Method creates binary vector and fields it by passed values
|
127
167
|
def binary_vector_field_by(size: HASH_LENGTH, value: 0)
|
128
168
|
binary_vector_from_array(Array.new(size, value))
|
129
169
|
end
|
170
|
+
|
171
|
+
# Create new instance of Digest
|
172
|
+
def create_digest(binary_vector)
|
173
|
+
digest.new(binary_vector: binary_vector)
|
174
|
+
end
|
175
|
+
|
176
|
+
def binary_vector
|
177
|
+
@binary_vector ||= BinaryVector
|
178
|
+
end
|
179
|
+
|
180
|
+
def digest
|
181
|
+
@digest ||= Digest
|
182
|
+
end
|
130
183
|
end
|
131
184
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Stribog
|
2
|
+
# Digest
|
3
|
+
#
|
4
|
+
# Class, returning by CreateHash#call
|
5
|
+
# Contains binary and hex representation of digest.
|
6
|
+
# You can use {#binary} to get array and {#hex} to get digest in hash.
|
7
|
+
# @author WildDima
|
8
|
+
class Digest
|
9
|
+
# Contains binary representation of hash
|
10
|
+
#
|
11
|
+
# @api public
|
12
|
+
# @example
|
13
|
+
# digest.binary
|
14
|
+
# @return [Array] binary representation of digest
|
15
|
+
attr_reader :binary
|
16
|
+
# Contains hex value of hash
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
# @example
|
20
|
+
# digest.hex
|
21
|
+
# @return [String] hex representation of digest
|
22
|
+
attr_reader :hex
|
23
|
+
|
24
|
+
def initialize(binary_vector:)
|
25
|
+
@binary = binary_vector.vector
|
26
|
+
@hex = binary_vector.to_hex
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/stribog/hash_params.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Stribog
|
2
|
-
#
|
2
|
+
# Contains constants for hashing
|
3
|
+
#
|
4
|
+
# @author WildDima
|
3
5
|
module HashParams
|
4
6
|
PI = [252, 238, 221, 17, 207, 110, 49, 22, 251, 196, 250, 218, 35, 197, 4, 77, 233, 119, 240,
|
5
7
|
219, 147, 46, 153, 186, 23, 54, 241, 187, 20, 205, 95, 193, 249, 24, 101, 90, 226, 92, 239,
|
@@ -48,6 +50,5 @@ module Stribog
|
|
48
50
|
abbedea680056f52382ae548b2e4f3f38941e71cff8a78db1fffe18a1b3361039fe76702af69334b7a1e6c303b7652f43698fad1153bb6c374b4c7fb98459ced
|
49
51
|
7bcd9ed0efc889fb3002c6cd635afe94d8fa6bbbebab076120018021148466798a1d71efea48b9caefbacd1d7d476e98dea2594ac06fd85d6bcaa4cd81f32d1b
|
50
52
|
378ee767f11631bad21380b00449b17acda43c32bcdf1d77f82012d430219f9b5d80ef9d1891cc86e71da4aa88e12852faf417d5d9b21b9948bc924af11bd720).freeze
|
51
|
-
# rubocop:enable Metrics/LineLength
|
52
53
|
end
|
53
54
|
end
|
data/lib/stribog/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stribog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- WildDima
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,7 +94,7 @@ files:
|
|
94
94
|
- CODE_OF_CONDUCT.md
|
95
95
|
- Gemfile
|
96
96
|
- LICENSE.txt
|
97
|
-
- README.
|
97
|
+
- README.rdoc
|
98
98
|
- Rakefile
|
99
99
|
- bin/console
|
100
100
|
- bin/setup
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- lib/stribog/binary_vector.rb
|
103
103
|
- lib/stribog/compression.rb
|
104
104
|
- lib/stribog/create_hash.rb
|
105
|
+
- lib/stribog/digest.rb
|
105
106
|
- lib/stribog/hash_params.rb
|
106
107
|
- lib/stribog/version.rb
|
107
108
|
- stribog.gemspec
|
data/README.md
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# Stribog
|
2
|
-
|
3
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/stribog`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
Add this line to your application's Gemfile:
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
gem 'stribog'
|
13
|
-
```
|
14
|
-
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install stribog
|
22
|
-
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
TODO: Write usage instructions here
|
26
|
-
|
27
|
-
## Development
|
28
|
-
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
-
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
-
|
33
|
-
## Contributing
|
34
|
-
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/stribog. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
36
|
-
|
37
|
-
|
38
|
-
## License
|
39
|
-
|
40
|
-
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
-
|