# Module Pdfcryptprimitives

    module Pdfcryptprimitives: sig .. end

Generic encryption primitives for ARC4, AES and the SHA family of digests

    val crypt : int array -> Pdfio.bytes -> Pdfio.bytes

ARC4 encryption (40 bit and 128 bit) given a key and some data

    val aes_decrypt_data : ?remove_padding:bool -> int -> int array -> Pdfio.bytes -> Pdfio.bytes

`aes_decrypt_data nk key data` decrypts AES data for the given key length, key, and data. If `remove_padding` is `true` (which it is by default), padding wil be removed from the output

    val aes_decrypt_data_ecb : ?remove_padding:bool -> int -> int array -> Pdfio.bytes -> Pdfio.bytes

As `aes_decrypt_data` above, but in ECB instead of CBC mode

    val aes_encrypt_data : ?firstblock:int array -> int -> int array -> Pdfio.bytes -> Pdfio.bytes

`aes_encrypt_data nk key data` encryptes with AES, given a key length, key and data. The first block (by default a random one) can be overridden by specifying `firstblock`, an array of length 16.

    val aes_encrypt_data_ecb : int -> int array -> Pdfio.bytes -> Pdfio.bytes

As `aes_encrypt_data`, but in ECB instead of CBC mode

    val sha256 : Pdfio.input -> string

SHA256 digest

    val sha384 : Pdfio.input -> string

SHA344 digest

    val sha512 : Pdfio.input -> string

SHA512 digest

    type encryption =

`|` | `ARC4 of `int * int``
`|` | `AESV2`
`|` | `AESV3 of `bool`` | `(*` | true = iso, false = old algorithm | `*)`

Types of encryption

    val find_hash : encryption ->
           int32 -> int32 -> int array -> int -> int array

Given an object number, generation number, input key and key length in bits, apply Algorithm 3.1 from the PDF Reference manual to obtain the hash to be used by the encryption function.

    val decrypt_stream_data : encryption ->
           bool ->
           string option ->
           int -> int -> int array -> int -> int -> Pdfio.bytes -> Pdfio.bytes

Calling `decrypt_stream_data crypt_type encrypt file_encryption_key obj gen key keylength r data` decrypts data.