module Afsplitter

Constants

DESCRIPTION
SUMMARY
VERSION

Public Class Methods

merge(data,stripes,digest='sha1') click to toggle source
# File lib/afsplitter.rb, line 7
def self.merge(data,stripes,digest='sha1')

  puts "Blocksize mismatch" unless data.size % stripes == 0

  blocksize = data.size / stripes
  bufblock = "\0" * blocksize

  (0...stripes-1).each do |i|
    bufblock = _xor(data[i*blocksize,blocksize], bufblock)
    bufblock = _diffuse(bufblock, blocksize, digest)
  end

  return _xor(data[(stripes-1)*blocksize..-1], bufblock)
end
split(data,stripes,digest='sha1') click to toggle source
# File lib/afsplitter.rb, line 22
def self.split(data,stripes,digest='sha1')

  blocksize = data.size
  rand = Random.new
  bufblock = "\0" * blocksize
 
  ret = ''
  (stripes-1).times do

    # Get some random data
    r = rand.bytes(blocksize)
    ret += r

    bufblock = _xor(r, bufblock)
    bufblock = _diffuse(bufblock, blocksize, digest)
  end

  ret += _xor(bufblock, data)

end

Private Class Methods

_diffuse(block,size,digest) click to toggle source
# File lib/afsplitter.rb, line 49
def self._diffuse(block,size,digest)
  digest = OpenSSL::Digest.new(digest)
  digest_size = digest.digest_length
  full_blocks = block.size / digest_size
  padding = block.size % digest_size

  # hash the full blocks
  ret = ''
  (0..full_blocks-1).each do |i|
    digest.reset
    digest << [i].pack('N')
    digest << block[i*digest_size,digest_size]
    ret+=digest.digest
  end

  # Hash the remaining data
  if padding > 0
    digest.reset
    digest << [full_blocks].pack('N')
    digest << block[full_blocks * digest_size..-1]
    ret += digest.digest[0,padding]
  end

  ret

end
_xor(a,b) click to toggle source
# File lib/afsplitter.rb, line 45
def self._xor(a,b)
  a.unpack('C*').zip(b.unpack('C*')).map{ |a,b| a^b }.pack('C*')
end