ccipher_factory 0.1.0

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.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Gemfile +30 -0
  4. data/Gemfile.lock-java +65 -0
  5. data/Gemfile.lock-ruby +67 -0
  6. data/README.md +80 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +15 -0
  9. data/bin/setup +8 -0
  10. data/ccipher_factory.gemspec +46 -0
  11. data/lib/ccipher_factory/asymkey/asymkey.rb +16 -0
  12. data/lib/ccipher_factory/asymkey/asymkey_generator.rb +87 -0
  13. data/lib/ccipher_factory/asymkey/ecc_keypair.rb +56 -0
  14. data/lib/ccipher_factory/asymkey_cipher/asymkey_cipher.rb +63 -0
  15. data/lib/ccipher_factory/asymkey_cipher/asymkey_signer.rb +44 -0
  16. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_decrypt.rb +55 -0
  17. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_encrypt.rb +70 -0
  18. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_signer.rb +88 -0
  19. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_verifier.rb +100 -0
  20. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_decrypt.rb +80 -0
  21. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_encrypt.rb +101 -0
  22. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_signer.rb +80 -0
  23. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_verifier.rb +56 -0
  24. data/lib/ccipher_factory/composite_cipher/composite_cipher.rb +28 -0
  25. data/lib/ccipher_factory/composite_cipher/decrypt_verifier.rb +116 -0
  26. data/lib/ccipher_factory/composite_cipher/sign_encryptor.rb +100 -0
  27. data/lib/ccipher_factory/compression/compression_helper.rb +103 -0
  28. data/lib/ccipher_factory/compression/compressor.rb +55 -0
  29. data/lib/ccipher_factory/compression/zlib_compressor.rb +48 -0
  30. data/lib/ccipher_factory/compression/zlib_decompressor.rb +67 -0
  31. data/lib/ccipher_factory/digest/digest.rb +180 -0
  32. data/lib/ccipher_factory/digest/supported_digest.rb +47 -0
  33. data/lib/ccipher_factory/encoding/asn1.rb +43 -0
  34. data/lib/ccipher_factory/encoding/bin_struct.rb +207 -0
  35. data/lib/ccipher_factory/encoding/binenc_constant.rb +149 -0
  36. data/lib/ccipher_factory/helpers/common.rb +124 -0
  37. data/lib/ccipher_factory/kcv/kcv.rb +89 -0
  38. data/lib/ccipher_factory/kdf/hkdf.rb +114 -0
  39. data/lib/ccipher_factory/kdf/kdf.rb +73 -0
  40. data/lib/ccipher_factory/kdf/pbkdf2.rb +82 -0
  41. data/lib/ccipher_factory/kdf/scrypt.rb +105 -0
  42. data/lib/ccipher_factory/shamir/shamir_sharing.rb +293 -0
  43. data/lib/ccipher_factory/shamir/shamir_sharing_helper.rb +88 -0
  44. data/lib/ccipher_factory/symkey/derived_symkey.rb +110 -0
  45. data/lib/ccipher_factory/symkey/hardware_symkey.rb +0 -0
  46. data/lib/ccipher_factory/symkey/soft_symkey.rb +63 -0
  47. data/lib/ccipher_factory/symkey/symkey.rb +122 -0
  48. data/lib/ccipher_factory/symkey/symkey_generator.rb +70 -0
  49. data/lib/ccipher_factory/symkey_cipher/symkey_att_decrypt.rb +64 -0
  50. data/lib/ccipher_factory/symkey_cipher/symkey_att_encrypt.rb +65 -0
  51. data/lib/ccipher_factory/symkey_cipher/symkey_att_sign.rb +84 -0
  52. data/lib/ccipher_factory/symkey_cipher/symkey_att_verify.rb +85 -0
  53. data/lib/ccipher_factory/symkey_cipher/symkey_cipher.rb +101 -0
  54. data/lib/ccipher_factory/symkey_cipher/symkey_decrypt.rb +144 -0
  55. data/lib/ccipher_factory/symkey_cipher/symkey_encrypt.rb +164 -0
  56. data/lib/ccipher_factory/symkey_cipher/symkey_sign.rb +70 -0
  57. data/lib/ccipher_factory/symkey_cipher/symkey_signer.rb +59 -0
  58. data/lib/ccipher_factory/symkey_cipher/symkey_verify.rb +76 -0
  59. data/lib/ccipher_factory/version.rb +5 -0
  60. data/lib/ccipher_factory.rb +52 -0
  61. data/run_test.rb +27 -0
  62. metadata +172 -0
@@ -0,0 +1,114 @@
1
+
2
+
3
+
4
+ require_relative '../digest/digest'
5
+ require_relative '../digest/supported_digest'
6
+
7
+ module CcipherFactory
8
+ module KDF
9
+ module HKDF
10
+ include TR::CondUtils
11
+ include Common
12
+ include TR::DataConvUtils
13
+
14
+ attr_accessor :outByteLength, :salt
15
+ attr_accessor :digestAlgo
16
+ attr_reader :derivedVal
17
+ def derive_init(*args, &block)
18
+
19
+ len = args.first
20
+ @outByteLength = len/8 if not_empty?(len)
21
+
22
+ @salt = SecureRandom.random_bytes(@outByteLength) if is_empty?(@salt)
23
+
24
+ if block
25
+ instance_eval(&block)
26
+ derive_final
27
+ else
28
+ self
29
+ end
30
+
31
+ end
32
+
33
+ def derive_update(val)
34
+ intOutputBuf.write(val)
35
+ end
36
+
37
+ def derive_final
38
+
39
+ raise KDFError, "outByteLength is required" if is_empty?(@outByteLength)
40
+
41
+ digest = nil
42
+ digestId = nil
43
+ #if not_empty?(@digest)
44
+
45
+ # case @digest
46
+ # when String, Symbol
47
+ # logger.tdebug :hkdf_derive_final, "Given digest object is a string/symbol #{@digest}"
48
+ # @digestAlgo = @digest
49
+
50
+ # #when OpenSSL::Digest
51
+ # # digestId = Digest.to_digest_string(@digest.name)
52
+ # # logger.tdebug :hkdf_derive_final, "Using user given OpenSSL digest object #{@digest}"
53
+ # # digest = @digest
54
+
55
+ # #when CcipherFactory::Digest
56
+ # # digestId = @digest.algo
57
+
58
+ # # logger.tdebug :hkdf_derive_final, "Using user given CipherFactory digest #{@digest}"
59
+ # # digest = OpenSSL::Digest.new(digestId)
60
+
61
+ # else
62
+ # raise KDFError, "Digest object #{@digest.class} is not supported"
63
+ # end
64
+
65
+ #end
66
+
67
+ if is_empty?(@digestAlgo)
68
+ digestVal = CcipherFactory::Digest::SupportedDigest.instance.default_digest
69
+ digestId = digestVal
70
+
71
+ logger.tdebug :hkdf_derive_final, "digest algo is nil. Using default digest #{digestVal}"
72
+
73
+ else
74
+ raise KDFError, "Given digest algo '#{@digestAlgo}' is not supported" if not Digest::SupportedDigest.instance.is_supported?(@digestAlgo)
75
+
76
+ logger.tdebug :hkdf_derive_final, "Using user given digest algo #{@digestAlgo}"
77
+
78
+ digestId = @digestAlgo
79
+ end
80
+
81
+ @info = "" if @info.nil?
82
+
83
+ hconf = Ccrypto::HKDFConfig.new
84
+ hconf.digest = digestId
85
+ hconf.salt = @salt
86
+ hconf.info = @info
87
+ hconf.outBitLength = @outByteLength*8
88
+
89
+ hkdf = Ccrypto::AlgoFactory.engine(hconf)
90
+
91
+ @derivedVal = hkdf.derive(intOutputBuf.bytes)
92
+
93
+ write_to_output(@derivedVal) if is_output_given?
94
+
95
+ ts = BinStruct.instance.struct(:kdf_hkdf)
96
+ ts.digest = BTag.constant_value(digestId)
97
+ ts.salt = @salt
98
+ ts.outByteLength = @outByteLength
99
+ ts.encoded
100
+
101
+ end
102
+
103
+ private
104
+ def logger
105
+ if @logger.nil?
106
+ @logger = Tlogger.new
107
+ @logger.tag = :hkdf
108
+ end
109
+ @logger
110
+ end
111
+
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,73 @@
1
+
2
+ require_relative 'scrypt'
3
+ require_relative 'hkdf'
4
+ require_relative 'pbkdf2'
5
+
6
+ module CcipherFactory
7
+ module KDF
8
+
9
+ class KDFError < StandardError; end
10
+
11
+ class KDFEngine; end
12
+
13
+ def KDF.instance(eng = :scrypt, &block)
14
+ kdf = KDFEngine.new
15
+
16
+ case eng
17
+ when :scrypt
18
+ kdf.extend(Scrypt)
19
+ when :hkdf
20
+ kdf.extend(HKDF)
21
+ when :pbkdf2
22
+ kdf.extend(PBKDF2)
23
+ else
24
+ raise KDFError, "Unknown KDF engine '#{eng}'"
25
+ end
26
+
27
+ kdf
28
+ end
29
+
30
+ def self.supported_kdf_algo
31
+ [:scrypt, :hkdf, :pbkdf2].freeze
32
+ end
33
+
34
+ def self.from_encoded(bin, &block)
35
+ ts = BinStruct.instance.struct_from_bin(bin)
36
+ from_tspec(ts, &block)
37
+ end
38
+
39
+ def self.from_tspec(ts, &block)
40
+ case BTag.value_constant(ts.oid)
41
+ when :kdf_scrypt
42
+ kdf = KDFEngine.new
43
+ kdf.extend(Scrypt)
44
+ kdf.cost = ts.cost
45
+ kdf.parallel = ts.parallel
46
+ kdf.blocksize = ts.blocksize
47
+ kdf.salt = ts.salt
48
+ kdf.outByteLength = ts.outByteLength
49
+ kdf.digest = Digest.from_encoded(ts.digest)
50
+ kdf.derive_init
51
+ kdf
52
+ when :kdf_hkdf
53
+ kdf = KDFEngine.new
54
+ kdf.extend(HKDF)
55
+ kdf.digestAlgo = BTag.value_constant(ts.digest)
56
+ kdf.salt = ts.salt
57
+ kdf.outByteLength = ts.outByteLength
58
+ kdf.derive_init
59
+ when :kdf_pbkdf2
60
+ kdf = KDFEngine.new
61
+ kdf.extend(PBKDF2)
62
+ kdf.digestAlgo = BTag.value_constant(ts.digest)
63
+ kdf.salt = ts.salt
64
+ kdf.iter = ts.iterations
65
+ kdf.outByteLength = ts.outByteLength
66
+ kdf.derive_init
67
+ else
68
+ raise KDFError, "Unknown KDF envelope ID '#{ts.oid}'"
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,82 @@
1
+
2
+
3
+ module CcipherFactory
4
+ module KDF
5
+ module PBKDF2
6
+ include TR::CondUtils
7
+ include Common
8
+
9
+ attr_accessor :salt, :iter, :outByteLength, :digestAlgo
10
+
11
+ def derive_init(*args, &block)
12
+
13
+ len = args.first
14
+ @outByteLength = len/8 if not_empty?(len)
15
+
16
+ @salt = SecureRandom.random_bytes(@outByteLength) if is_empty?(@salt)
17
+
18
+ if block
19
+ instance_eval(&block)
20
+ derive_final
21
+ else
22
+ self
23
+ end
24
+
25
+ end
26
+
27
+ def derive_update(val)
28
+ intOutputBuf.write(val)
29
+ end
30
+
31
+ def derive_final
32
+
33
+ raise KDFError, "outByteLength is required" if is_empty?(@outByteLength)
34
+
35
+ #if is_empty?(@digestAlgo)
36
+ # digestVal = CcipherFactory::Digest::SupportedDigest.instance.default_digest
37
+ # digestId = digestVal
38
+
39
+ # logger.tdebug :pbkdf2_derive_final, "digest algo is nil. Using default digest #{digestVal}"
40
+
41
+ #else
42
+ # raise KDFError, "Given digest algo '#{@digestAlgo}' is not supported" if not Digest::SupportedDigest.instance.is_supported?(@digestAlgo)
43
+
44
+ # logger.tdebug :pbkdf2_derive_final, "Using user given digest algo #{@digestAlgo}"
45
+
46
+ # digestId = @digestAlgo
47
+ #end
48
+
49
+ hconf = Ccrypto::PBKDF2Config.new
50
+ #hconf.digest = digestId
51
+ hconf.digest = @digestAlgo
52
+ hconf.salt = @salt if not_empty?(@salt)
53
+ hconf.iter = @iter if not_empty?(@iter)
54
+ hconf.outBitLength = @outByteLength*8
55
+
56
+ hkdf = Ccrypto::AlgoFactory.engine(hconf)
57
+
58
+ @derivedVal = hkdf.derive(intOutputBuf.bytes)
59
+
60
+ write_to_output(@derivedVal) if is_output_given?
61
+
62
+ ts = BinStruct.instance.struct(:kdf_pbkdf2)
63
+ #ts.digest = BTag.constant_value(digestId)
64
+ ts.digest = BTag.constant_value(hconf.digest)
65
+ ts.salt = @salt
66
+ ts.outByteLength = @outByteLength
67
+ ts.iterations = hconf.iter
68
+ ts.encoded
69
+
70
+ end
71
+
72
+ def logger
73
+ if @logger.nil?
74
+ @logger = TeLogger::Tlogger.new
75
+ @logger.tag = :pbkdf2
76
+ end
77
+ @logger
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,105 @@
1
+
2
+
3
+ require_relative '../digest/digest'
4
+ require_relative '../digest/supported_digest'
5
+
6
+ module CcipherFactory
7
+ module KDF
8
+ module Scrypt
9
+ include TR::CondUtils
10
+ include Common
11
+
12
+ ##
13
+ # Mixin methods
14
+ ##
15
+ attr_accessor :cost, :parallel, :blocksize, :salt, :outByteLength
16
+ attr_accessor :digestAlgo, :digest
17
+ attr_reader :derivedVal
18
+ def derive_init(*args, &block)
19
+
20
+ len = args.first
21
+ @outByteLength = len/8 if not_empty?(len)
22
+
23
+ @cost = 65536 if is_empty?(@cost)
24
+ @parallel = 1 if is_empty?(@parallel)
25
+ @blocksize = 8 if is_empty?(@blocksize)
26
+ @salt = SecureRandom.random_bytes(16) if is_empty?(@salt)
27
+
28
+ logger.debug "Cost : #{@cost}"
29
+ logger.debug "Parallel : #{@parallel}"
30
+ logger.debug "Blocksize : #{@blocksize}"
31
+ logger.debug "Salt : #{@salt.inspect}"
32
+ logger.debug "Digest Algo : #{@digestAlgo}"
33
+ logger.debug "Digest : #{@digest}"
34
+
35
+ if @digest.nil?
36
+ logger.debug "Initializing digest with algo #{@digestAlgo}"
37
+ @digestAlgo = Digest::SupportedDigest.instance.default_digest if is_empty?(@digestAlgo)
38
+ @digest = Digest.instance
39
+ @digest.digest_init(@digestAlgo)
40
+ else
41
+ logger.debug "Setting digest algo value from digest #{@digest}"
42
+ @digestAlgo = @digest.algo
43
+ end
44
+
45
+ @digest.output(intOutputBuf)
46
+
47
+ if block
48
+ instance_eval(&block)
49
+ derive_final
50
+ else
51
+ self
52
+ end
53
+
54
+ end
55
+
56
+ def derive_update(val)
57
+ @digest.digest_update(val)
58
+ end
59
+
60
+ def derive_final(&block)
61
+
62
+ raise KDFError, "outByteLength is required" if is_empty?(@outByteLength)
63
+
64
+ digMeta = @digest.digest_final
65
+
66
+ sconf = Ccrypto::ScryptConfig.new
67
+ sconf.outBitLength = @outByteLength*8
68
+ sconf.salt = @salt
69
+ sconf.cost = @cost
70
+ sconf.parallel = @parallel
71
+ sconf.blockSize = @blocksize
72
+
73
+ scrypt = Ccrypto::AlgoFactory.engine(sconf)
74
+
75
+ @derivedVal = scrypt.derive(intOutputBuf.bytes)
76
+
77
+ if is_output_given?
78
+ write_to_output(@derivedVal)
79
+ end
80
+
81
+ ts = BinStruct.instance.struct(:kdf_scrypt)
82
+ ts.digest = digMeta
83
+ ts.salt = @salt
84
+ ts.cost = @cost
85
+ ts.blocksize = @blocksize
86
+ ts.parallel = @parallel
87
+ ts.outByteLength = @outByteLength
88
+ ts.encoded
89
+
90
+ end
91
+
92
+ private
93
+ def logger
94
+ if @logger.nil?
95
+ @logger = TeLogger::Tlogger.new
96
+ @logger.tag = :scrypt
97
+ end
98
+
99
+ @logger
100
+ end
101
+
102
+
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,293 @@
1
+
2
+ #
3
+ # This code is borrowed from PolyPasswordHasher-Ruby project at https://github.com/PolyPasswordHasher/PolyPasswordHasher-Ruby
4
+ #
5
+
6
+
7
+ #require "openssl"
8
+
9
+ module CcipherFactory
10
+
11
+ class ShamirSharing
12
+ attr_reader :_coefficients
13
+ attr_reader :secretdata
14
+
15
+ def initialize(threshold, secretdata=nil)
16
+ @threshold = threshold
17
+ @secretdata = secretdata
18
+ @_coefficients = []
19
+
20
+ if secretdata
21
+ secretdata.each_char do |secretbyte|
22
+ rand = Ccrypto::AlgoFactory.engine(Ccrypto::SecureRandomConfig)
23
+ randVal = rand.random_bytes(@threshold-1)
24
+ thesecoefficients = secretbyte+randVal
25
+ #thesecoefficients = secretbyte+OpenSSL::Random.random_bytes(@threshold-1)
26
+ @_coefficients << thesecoefficients
27
+ end
28
+ end
29
+ end
30
+
31
+ def is_valid_share?(share)
32
+ raise "Share is of incorrect length: #{share.size}" if share.size !=2
33
+ raise "Must initialize coefficient before checking is_valid_share?" unless @_coefficients
34
+ raise "Must initialize coefficient before checking is_valid_share?" if @_coefficients.size != share[1].size
35
+
36
+ x = share[0]
37
+ fx = share[1]
38
+
39
+ correctshare = compute_share(x)
40
+
41
+ correctshare == share
42
+ end
43
+
44
+ def compute_share(x)
45
+ raise "x should be integer" unless x.class == Fixnum
46
+ raise "x must be between 1 and 255" if x <= 0 || x >256
47
+ raise "@_coefficient must be initialized" if @_coefficients.empty?
48
+
49
+ sharebytes = []
50
+
51
+ @_coefficients.each do |thiscoefficient|
52
+ thisshare = _f(x,thiscoefficient)
53
+ sharebytes << thisshare
54
+ end
55
+
56
+ return x, sharebytes
57
+ end
58
+
59
+ def recover_secretdata(shares)
60
+ newshares = []
61
+
62
+ shares.each do |share|
63
+ newshares << share unless newshares.include?(share)
64
+ end
65
+
66
+ shares = newshares
67
+
68
+ if @threshold > shares.size
69
+ raise "Threshold: #{@threshold} is smaller than the number of uniquie shares: #{shares.size}"
70
+ end
71
+
72
+ if @secretdata
73
+ raise "Recovoring secretdata when some is stored. Use check_share instead"
74
+ end
75
+
76
+ xs = []
77
+
78
+ shares.each do |share|
79
+ if xs.include?(share[0])
80
+ raise "Different shares with the same first byte: #{share[0]}"
81
+ end
82
+
83
+ if share[1].size != shares[0][1].size
84
+ raise "Shares have different lengths!"
85
+ end
86
+
87
+ xs << share[0]
88
+ end
89
+
90
+ mycoefficients = []
91
+ mysecretdata = ''
92
+
93
+ shares[0][1].size.times.each do |byte_to_use|
94
+ fxs = []
95
+ shares.each do |share|
96
+ fxs << share[1][byte_to_use]
97
+ end
98
+
99
+ resulting_poly = _full_lagrange(xs,fxs)
100
+
101
+ if resulting_poly[0..@threshold-1] + [0]*(shares.size - @threshold) != resulting_poly
102
+ raise "Share do not match. Cannot decode"
103
+ end
104
+
105
+ mycoefficients << resulting_poly.map{|p| p.chr}.join
106
+
107
+ mysecretdata += resulting_poly[0].chr
108
+ end
109
+
110
+ @_coefficients = mycoefficients
111
+ @secretdata = mysecretdata
112
+ end
113
+
114
+ private
115
+ def _f(x, coefs_bytes)
116
+ raise "invalid share index value. cannot be 0" if x == 0
117
+
118
+ accumulator = 0
119
+
120
+ x_i = 1
121
+
122
+ coefs_bytes.each_byte do |c|
123
+ accumulator = _gf256_add(accumulator, _gf256_mul(c, x_i))
124
+ x_i = _gf256_mul(x_i, x)
125
+ end
126
+
127
+ return accumulator
128
+ end
129
+
130
+ def _multiply_polynomials(a,b)
131
+ resultterms = []
132
+
133
+ termpadding = []
134
+
135
+ b.each do |bterm|
136
+ thisvalue = termpadding.clone
137
+
138
+ a.each do |aterm|
139
+ val = _gf256_mul(aterm, bterm)
140
+ thisvalue << _gf256_mul(aterm, bterm)
141
+ end
142
+
143
+ resultterms = _add_polynomials(resultterms, thisvalue)
144
+
145
+ termpadding << 0
146
+ end
147
+
148
+ return resultterms
149
+ end
150
+
151
+ def _add_polynomials(a,b)
152
+ if a.size < b.size
153
+ a = a + [0]*(b.size - a.size)
154
+ elsif a.size > b.size
155
+ b = b + [0]*(a.size - b.size)
156
+ end
157
+
158
+ result = []
159
+
160
+ a.size.times do |pos|
161
+ result << _gf256_add(a[pos], b[pos])
162
+ end
163
+
164
+ return result
165
+ end
166
+
167
+ def _full_lagrange(xs, fxs)
168
+ returnedcoefficients = []
169
+
170
+ fxs.size.times do |i|
171
+ this_polynomial = [1]
172
+
173
+ fxs.size.times do |j|
174
+ next if i == j
175
+
176
+ denominator = _gf256_sub(xs[i], xs[j])
177
+
178
+ this_term = [_gf256_div(xs[j], denominator), _gf256_div(1, denominator)]
179
+
180
+ this_polynomial = _multiply_polynomials(this_polynomial, this_term)
181
+ end
182
+
183
+ this_polynomial = _multiply_polynomials(this_polynomial, [fxs[i]]) if fxs[i]
184
+
185
+ returnedcoefficients = _add_polynomials(returnedcoefficients, this_polynomial)
186
+ end
187
+
188
+ return returnedcoefficients
189
+
190
+ end
191
+
192
+ GF256_EXP = [
193
+ 0x01, 0x03, 0x05, 0x0f, 0x11, 0x33, 0x55, 0xff,
194
+ 0x1a, 0x2e, 0x72, 0x96, 0xa1, 0xf8, 0x13, 0x35,
195
+ 0x5f, 0xe1, 0x38, 0x48, 0xd8, 0x73, 0x95, 0xa4,
196
+ 0xf7, 0x02, 0x06, 0x0a, 0x1e, 0x22, 0x66, 0xaa,
197
+ 0xe5, 0x34, 0x5c, 0xe4, 0x37, 0x59, 0xeb, 0x26,
198
+ 0x6a, 0xbe, 0xd9, 0x70, 0x90, 0xab, 0xe6, 0x31,
199
+ 0x53, 0xf5, 0x04, 0x0c, 0x14, 0x3c, 0x44, 0xcc,
200
+ 0x4f, 0xd1, 0x68, 0xb8, 0xd3, 0x6e, 0xb2, 0xcd,
201
+ 0x4c, 0xd4, 0x67, 0xa9, 0xe0, 0x3b, 0x4d, 0xd7,
202
+ 0x62, 0xa6, 0xf1, 0x08, 0x18, 0x28, 0x78, 0x88,
203
+ 0x83, 0x9e, 0xb9, 0xd0, 0x6b, 0xbd, 0xdc, 0x7f,
204
+ 0x81, 0x98, 0xb3, 0xce, 0x49, 0xdb, 0x76, 0x9a,
205
+ 0xb5, 0xc4, 0x57, 0xf9, 0x10, 0x30, 0x50, 0xf0,
206
+ 0x0b, 0x1d, 0x27, 0x69, 0xbb, 0xd6, 0x61, 0xa3,
207
+ 0xfe, 0x19, 0x2b, 0x7d, 0x87, 0x92, 0xad, 0xec,
208
+ 0x2f, 0x71, 0x93, 0xae, 0xe9, 0x20, 0x60, 0xa0,
209
+ 0xfb, 0x16, 0x3a, 0x4e, 0xd2, 0x6d, 0xb7, 0xc2,
210
+ 0x5d, 0xe7, 0x32, 0x56, 0xfa, 0x15, 0x3f, 0x41,
211
+ 0xc3, 0x5e, 0xe2, 0x3d, 0x47, 0xc9, 0x40, 0xc0,
212
+ 0x5b, 0xed, 0x2c, 0x74, 0x9c, 0xbf, 0xda, 0x75,
213
+ 0x9f, 0xba, 0xd5, 0x64, 0xac, 0xef, 0x2a, 0x7e,
214
+ 0x82, 0x9d, 0xbc, 0xdf, 0x7a, 0x8e, 0x89, 0x80,
215
+ 0x9b, 0xb6, 0xc1, 0x58, 0xe8, 0x23, 0x65, 0xaf,
216
+ 0xea, 0x25, 0x6f, 0xb1, 0xc8, 0x43, 0xc5, 0x54,
217
+ 0xfc, 0x1f, 0x21, 0x63, 0xa5, 0xf4, 0x07, 0x09,
218
+ 0x1b, 0x2d, 0x77, 0x99, 0xb0, 0xcb, 0x46, 0xca,
219
+ 0x45, 0xcf, 0x4a, 0xde, 0x79, 0x8b, 0x86, 0x91,
220
+ 0xa8, 0xe3, 0x3e, 0x42, 0xc6, 0x51, 0xf3, 0x0e,
221
+ 0x12, 0x36, 0x5a, 0xee, 0x29, 0x7b, 0x8d, 0x8c,
222
+ 0x8f, 0x8a, 0x85, 0x94, 0xa7, 0xf2, 0x0d, 0x17,
223
+ 0x39, 0x4b, 0xdd, 0x7c, 0x84, 0x97, 0xa2, 0xfd,
224
+ 0x1c, 0x24, 0x6c, 0xb4, 0xc7, 0x52, 0xf6, 0x01]
225
+
226
+ GF256_LOG = [
227
+ 0x00, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1a, 0xc6,
228
+ 0x4b, 0xc7, 0x1b, 0x68, 0x33, 0xee, 0xdf, 0x03,
229
+ 0x64, 0x04, 0xe0, 0x0e, 0x34, 0x8d, 0x81, 0xef,
230
+ 0x4c, 0x71, 0x08, 0xc8, 0xf8, 0x69, 0x1c, 0xc1,
231
+ 0x7d, 0xc2, 0x1d, 0xb5, 0xf9, 0xb9, 0x27, 0x6a,
232
+ 0x4d, 0xe4, 0xa6, 0x72, 0x9a, 0xc9, 0x09, 0x78,
233
+ 0x65, 0x2f, 0x8a, 0x05, 0x21, 0x0f, 0xe1, 0x24,
234
+ 0x12, 0xf0, 0x82, 0x45, 0x35, 0x93, 0xda, 0x8e,
235
+ 0x96, 0x8f, 0xdb, 0xbd, 0x36, 0xd0, 0xce, 0x94,
236
+ 0x13, 0x5c, 0xd2, 0xf1, 0x40, 0x46, 0x83, 0x38,
237
+ 0x66, 0xdd, 0xfd, 0x30, 0xbf, 0x06, 0x8b, 0x62,
238
+ 0xb3, 0x25, 0xe2, 0x98, 0x22, 0x88, 0x91, 0x10,
239
+ 0x7e, 0x6e, 0x48, 0xc3, 0xa3, 0xb6, 0x1e, 0x42,
240
+ 0x3a, 0x6b, 0x28, 0x54, 0xfa, 0x85, 0x3d, 0xba,
241
+ 0x2b, 0x79, 0x0a, 0x15, 0x9b, 0x9f, 0x5e, 0xca,
242
+ 0x4e, 0xd4, 0xac, 0xe5, 0xf3, 0x73, 0xa7, 0x57,
243
+ 0xaf, 0x58, 0xa8, 0x50, 0xf4, 0xea, 0xd6, 0x74,
244
+ 0x4f, 0xae, 0xe9, 0xd5, 0xe7, 0xe6, 0xad, 0xe8,
245
+ 0x2c, 0xd7, 0x75, 0x7a, 0xeb, 0x16, 0x0b, 0xf5,
246
+ 0x59, 0xcb, 0x5f, 0xb0, 0x9c, 0xa9, 0x51, 0xa0,
247
+ 0x7f, 0x0c, 0xf6, 0x6f, 0x17, 0xc4, 0x49, 0xec,
248
+ 0xd8, 0x43, 0x1f, 0x2d, 0xa4, 0x76, 0x7b, 0xb7,
249
+ 0xcc, 0xbb, 0x3e, 0x5a, 0xfb, 0x60, 0xb1, 0x86,
250
+ 0x3b, 0x52, 0xa1, 0x6c, 0xaa, 0x55, 0x29, 0x9d,
251
+ 0x97, 0xb2, 0x87, 0x90, 0x61, 0xbe, 0xdc, 0xfc,
252
+ 0xbc, 0x95, 0xcf, 0xcd, 0x37, 0x3f, 0x5b, 0xd1,
253
+ 0x53, 0x39, 0x84, 0x3c, 0x41, 0xa2, 0x6d, 0x47,
254
+ 0x14, 0x2a, 0x9e, 0x5d, 0x56, 0xf2, 0xd3, 0xab,
255
+ 0x44, 0x11, 0x92, 0xd9, 0x23, 0x20, 0x2e, 0x89,
256
+ 0xb4, 0x7c, 0xb8, 0x26, 0x77, 0x99, 0xe3, 0xa5,
257
+ 0x67, 0x4a, 0xed, 0xde, 0xc5, 0x31, 0xfe, 0x18,
258
+ 0x0d, 0x63, 0x8c, 0x80, 0xc0, 0xf7, 0x70, 0x07]
259
+
260
+
261
+ def _gf256_add(a, b)
262
+ val = a ^ b
263
+ val
264
+ end
265
+
266
+ def _gf256_sub(a,b)
267
+ _gf256_add(a,b)
268
+ end
269
+
270
+ def _gf256_mul(a,b)
271
+ a = a.to_i
272
+ b = b.to_i
273
+ if a == 0 || b == 0
274
+ return 0
275
+ else
276
+ GF256_EXP[(GF256_LOG[a] + GF256_LOG[b]) % 255]
277
+ end
278
+ end
279
+
280
+ def _gf256_div(a,b)
281
+ if a == 0
282
+ return 0
283
+ elsif b == 0
284
+ raise ZeroDivisionError
285
+ else
286
+ GF256_EXP[(GF256_LOG[a] - GF256_LOG[b]) % 255]
287
+ end
288
+ end
289
+ end
290
+
291
+
292
+
293
+ end