# 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
…
- 77
- 78
- 79
- 80
- 81
…
- 119
- 120

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_GCM_COUNTER_EXPIRED - The requesting call has caused the counter number to run out
of unique combinations.
Description
Encrypts/authenticates plain text using Galois/counter mode. This function accepts a combination of data that must be
authenticated but not encrypted, and data that must be authenticated and encrypted. The user should initialize a GCM
context using BLOCK_CIPHER_GCM_Initialize, then pass all authenticated-but-not-encrypted data into this function with the
BLOCK_CIPHER_OPTION_AUTHENTICATE_ONLY option, and then pass any authenticated-and-encrypted data in using
the BLOCK_CIPHER_OPTION_STREAM_CONTINUE option. When calling this function for the final time, the user must use
the BLOCK_CIPHER_OPTION_STREAM_COMPLETE option to generate padding required to compute the authentication
tag successfully. Note that BLOCK_CIPHER_OPTION_STREAM_COMPLETE must always be specified at the end of a
stream, even if no encryption is being done.
The GMAC (Galois Message Authentication Code) mode can be used by using GCM without providing any data to encrypt
(e.g. by only using BLOCK_CIPHER_OPTION_AUTHENTICATE_ONLY and
BLOCK_CIPHER_OPTION_STREAM_COMPLETE options).
Preconditions
The GCM 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 initializationVector parameter in the BLOCK_CIPHER_GCM_CONTEXT structure should be initialized. See section 8.2
of the GCM specification for more information.
Example
// ***************************************************************
// Encrypt data in GCM 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;
// GCM mode context
BLOCK_CIPHER_GCM_CONTEXT context;
// Initialization vector for GCM mode
static uint8_t ivValue[12] = {0xca,0xfe,0xba,0xbe,0xfa,0xce,0xdb,0xad,0xde,0xca,0xf8,0x88};
// Data that will be authenticated, but not encrypted.
uint8_t authData[20] =
{0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,0xfe,0xed,0xfa,0xce,0xde,0xad,0xbe,0xef,0xab,0xad,0
xda,0xd2,};
// Plain text to encrypt
static uint8_t plain_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 encryption key
static uint8_t AESKey128[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7,
0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
1.7 Library Interface MLA - Crypto Library Help Block Cipher Modes
79

- 1
- 2
…
- 77
- 78
- 79
- 80
- 81
…
- 119
- 120