Class: DRM::Unwrapper
- Inherits:
-
Object
- Object
- DRM::Unwrapper
- Defined in:
- lib/drm/unwrapper.rb
Instance Attribute Summary collapse
-
#metadata ⇒ Object
readonly
the DRM metadata for the wrapped file.
Instance Method Summary collapse
-
#initialize(read_proc) ⇒ Unwrapper
constructor
new unwrapper for a DRM-wrapped file read_proc(length, offset) reads length bytes at offset from the DRM-wrapped file.
-
#unwrap(start_byte, end_byte, read_proc, write_proc, subkey_proc) ⇒ Object
unwraps bytes
start_byte
..end_byte
from the content of a DRM-wrapped file read_proc(length, offset) reads length bytes at offset from the file to be wrapped write_proc(data) appends the given data to the file containing the wrapped content subkey_proc(metadata, index) produces the indexth DRM subkey for the contents identified bymetadata
.
Constructor Details
#initialize(read_proc) ⇒ Unwrapper
new unwrapper for a DRM-wrapped file read_proc(length, offset) reads length bytes at offset from the DRM-wrapped file
4 5 6 7 8 9 10 |
# File 'lib/drm/unwrapper.rb', line 4 def initialize(read_proc) @data_offset = [0].pack('N').length = read_proc.call @data_offset, 0 = read_proc.call .unpack('N').first, @data_offset @data_offset += .length @metadata = DRM::Metadata.new_from_yaml_str end |
Instance Attribute Details
#metadata ⇒ Object (readonly)
the DRM metadata for the wrapped file
13 14 15 |
# File 'lib/drm/unwrapper.rb', line 13 def @metadata end |
Instance Method Details
#unwrap(start_byte, end_byte, read_proc, write_proc, subkey_proc) ⇒ Object
unwraps bytes start_byte
..end_byte
from the content of a DRM-wrapped file read_proc(length, offset) reads length bytes at offset from the file to be wrapped write_proc(data) appends the given data to the file containing the wrapped content subkey_proc(metadata, index) produces the indexth DRM subkey for the contents identified by metadata
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/drm/unwrapper.rb', line 19 def unwrap(start_byte, end_byte, read_proc, write_proc, subkey_proc) block_size = @metadata.block_size start_block = start_byte / block_size end_block = end_byte / block_size in_offset = @data_offset + start_block * block_size old_ski = nil subkey = nil start_block.upto(end_block) do |block_index| # read crypted_data = read_proc.call block_size, in_offset in_offset += crypted_data.length # decrypt ski = @metadata.subkey_index(block_index) subkey = subkey_proc.call @metadata, ski unless ski == old_ski old_ski = ski block_data = @metadata.decrypt_block crypted_data, block_index, subkey # write write_proc.call block_data[((block_index == start_block) ? start_byte % block_size : 0)..((block_index == end_block) ? end_byte % block_size : block_size - 1)] end end |