class type transform = object
.. end
A transform is an arbitrary mapping from sequences of characters
to sequences of characters. Examples of transforms include
ciphering, deciphering, compression, decompression, and encoding
of binary data as text. Input data to a transform is provided
by successive calls to the methods put_substring
, put_string
,
put_char
or put_byte
. The result of transforming the input
data is buffered internally, and can be obtained via the
get_string
, get_substring
, get_char
and get_byte
methods.
method put_substring : string -> int -> int -> unit
put_substring str pos len
processes len
characters of
string str
, starting at character number pos
,
through the transform.
method put_string : string -> unit
put_string str
processes all characters of string str
through the transform.
method put_char : char -> unit
put_char c
processes character c
through the transform.
method put_byte : int -> unit
put_byte b
processes the character having code b
through the transform. b
must be between 0
and 255
inclusive.
method finish : unit
Call method
finish
to indicate that no further data will
be processed through the transform. This causes the transform
to flush its internal buffers and perform all appropriate
finalization actions, e.g. add final padding. Raise
Error
Wrong_data_length
if the total length of input data
provided via the
put_*
methods is not an integral number
of the input block size (see
Cryptokit.transform.input_block_size
). After calling
finish
, the transform can no longer accept additional
data. Hence, do not call any of the
put_*
methods nor
flush
after calling
finish
.
method flush : unit
flush
causes the transform to flush its internal buffers
and make all output processed up to this point available through
the
get_*
methods.
Raise
Error Wrong_data_length
if the total length
of input data provided via the
put_*
methods is not
an integral number of the input block size
(see
Cryptokit.transform.input_block_size
).
(For padded block ciphers, the input block size used here
is that of the underlying block cipher, without the padding.)
Unlike method
finish
, method
flush
does not add final
padding and leaves the transform in a state where it can
still accept more input.
method available_output : int
Return the number of characters of output currently available.
The output can be recovered with the get_*
methods.
method get_string : string
Return a character string containing all output characters
available at this point. The internal output buffer is emptied;
in other terms, all currently available output is consumed
(and returned to the caller) by a call to get_string
.
method get_substring : string * int * int
Return a triple (buf,pos,len)
, where buf
is the internal
output buffer for the transform, pos
the position of the
first character of available output, and len
the number of
characters of available output. The string buf
will be
modified later, so the caller must immediately copy
characters pos
to pos+len-1
of buf
to some other
location. The internal output buffer is emptied;
in other terms, all currently available output is consumed
(and returned to the caller) by a call to get_substring
.
method get_char : char
Return the first character of output, and remove it from the
internal output buffer. Raise End_of_file
if no output
is currently available.
method get_byte : int
Return the code of the first character of output,
and remove it from the internal output buffer.
Raise End_of_file
if no output is currently available.
method input_block_size : int
Some transforms (e.g. unpadded block ciphers) process
input data by blocks of several characters. This method
returns the size of input blocks for the current transform.
If input_block_size > 1
, the user of the transform
must ensure that the total length of input data provided
between calls to flush
and finish
is an integral
multiple of input_block_size
.
If input_block_size = 1
, the transform can accept
input data of arbitrary length.
method output_block_size : int
Some transforms (e.g. block ciphers) always produce output
data by blocks of several characters. This method
returns the size of output blocks for the current transform.
If output_block_size > 1
, the total length of output data
produced by the transform is always an integral multiple
of output_block_size
.
If output_block_size = 1
, the transform produces output data
of arbitrary length.
method wipe : unit
Erase all internal buffers and data structures of this transform,
overwriting them with zeroes. A transform may contain sensitive
data such as secret key-derived material, or parts of the
input or output data. Calling wipe
ensures that this sensitive
data will not remain in memory longer than strictly necessary,
thus making invasive attacks more difficult.
It is thus prudent practice to call wipe
on every
transform that the program no longer needs.
After calling wipe
, the transform is no longer in a working
state: do not call any other methods after calling wipe
.