# Vault 7: Projects

This publication series is about specific projects related to the Vault 7 main publication.

### Protego

# MLA -- Crypto Library

1 January, 2012

- 1
- 2
…
- 69
- 70
- 71
- 72
- 73
…
- 119
- 120

Syntax
BLOCK_CIPHER_ERRORS BLOCK_CIPHER_CTR_Decrypt(DRV_HANDLE handle, uint8_t * plainText,
uint8_t * cipherText, uint32_t numBytes, void * key, BLOCK_CIPHER_CTR_CONTEXT * context,
uint32_t options);
Module
CTR
Returns
Returns a member of the BLOCK_CIPHER_ERRORS enumeration:
• BLOCK_CIPHER_ERROR_NONE - no error.
• BLOCK_CIPHER_ERROR_KEY_STREAM_GEN_OUT_OF_SPACE - There was not enough room remaining in the
context->keyStream buffer to fit the key data requested by the numBlocks parameter.
• BLOCK_CIPHER_ERROR_CTR_COUNTER_EXPIRED - The requesting call has caused the counter number to run out
of unique combinations.
Description
Decrypts cipher text using counter mode.
Preconditions
The CTR context must be initialized with the block cipher encrypt/decrypt functions and the block cipher algorithm's block
size. The block cipher module must be initialized, if necessary.
The noncePlusCounter parameter in the BLOCK_CIPHER_CTR_CONTEXT structure should be initialized. The size of this
vector is the same as the block size of the cipher you are using.
Example
// ***************************************************************
// Decrypt data in CTR mode with the AES algorithm.
// ***************************************************************
// System module object variable (for initializing AES)
SYS_MODULE_OBJ sysObject;
// Drive handle variable, to describe which AES module to use
DRV_HANDLE handle;
// CTR mode context
BLOCK_CIPHER_CTR_CONTEXT context;
// Initialization vector for CTR mode
static uint8_t initialization_vector[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
// Cipher text to decrypt
static uint8_t cipher_text[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9,
0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7,
0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb,
0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b,
0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10};
// The decryption key
static uint8_t AESKey128[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7,
0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
// Structure to contain the created AES round keys
AES_ROUND_KEYS_128_BIT round_keys;
// Buffer to contain decrypted ciphertext
uint8_t plain_text[sizeof(cipher_text)];
//keyStream could also be allocated memory instead of fixed memory
uint8_t keyStream[AES_BLOCK_SIZE*4];
// Initialization call for the AES module
sysObject = DRV_AES_Initialize (DRV_AES_INDEX, NULL);
1.7 Library Interface MLA - Crypto Library Help Block Cipher Modes
71

- 1
- 2
…
- 69
- 70
- 71
- 72
- 73
…
- 119
- 120