class GostMagma::MagmaOfb
Public Class Methods
new(key, iv, gamma_s)
click to toggle source
# File lib/gost_magma/magma_ofb.rb, line 3 def initialize(key, iv, gamma_s) @key = key.dup.force_encoding('BINARY') @keys = [] (0...8).each do |i| @keys << self.class.uint8ToUint32(@key[i*4...(i+1)*4].reverse) end @gamma_s = gamma_s @ctxR = iv.dup.force_encoding('BINARY') tmp_block = @ctxR[0...BlockLengthInBytes] @gamma_block = self.class.encryptBlock(tmp_block, @keys) @ctxR = @ctxR[BlockLengthInBytes..-1] + @gamma_block @incomplete_block_len = 0 end
Public Instance Methods
decrypt(data)
click to toggle source
# File lib/gost_magma/magma_ofb.rb, line 74 def decrypt(data) encrypt(data) end
encrypt(data)
click to toggle source
# File lib/gost_magma/magma_ofb.rb, line 18 def encrypt(data) data_len = data.length outdata = '' left_data_len = data_len if @incomplete_block_len > 0 then # use old @gamma_block if data_len < @gamma_s - @incomplete_block_len then # incomplete block yet outdata = data.dup (0...data_len).each do |j| outdata[j] = (@gamma_block[@incomplete_block_len + j].ord ^ outdata[j].ord).chr end @incomplete_block_len += data_len return outdata else outdata = data[0...(@gamma_s - @incomplete_block_len)] (0...outdata.length).each do |j| outdata[j] = (@gamma_block[@incomplete_block_len + j].ord ^ outdata[j].ord).chr end # complete block - update gamma block tmp_block = @ctxR[0...BlockLengthInBytes] @gamma_block = self.class.encryptBlock(tmp_block, @keys) @ctxR = @ctxR[BlockLengthInBytes..-1] + @gamma_block left_data_len -= outdata.length end end (0...(left_data_len / @gamma_s)).each do |i| if @incomplete_block_len > 0 then encr_data = data[((i + 1) * @gamma_s - @incomplete_block_len)...((i + 2) * @gamma_s - @incomplete_block_len)] else encr_data = data[(i * @gamma_s)...((i + 1) * @gamma_s)] end (0...@gamma_s).each do |j| encr_data[j] = (@gamma_block[j].ord ^ encr_data[j].ord).chr end outdata += encr_data # complete block - update gamma block tmp_block = @ctxR[0...BlockLengthInBytes] @gamma_block = self.class.encryptBlock(tmp_block, @keys) @ctxR = @ctxR[BlockLengthInBytes..-1] + @gamma_block left_data_len -= @gamma_s end if left_data_len > 0 then # incomplete block start encr_data = data[-left_data_len..-1] (0...left_data_len).each do |j| encr_data[j] = (@gamma_block[j].ord ^ encr_data[j].ord).chr end outdata += encr_data @incomplete_block_len = left_data_len end outdata end