blob: 154046508f19760bcfc767b88737da1d5a52521a [file] [view]
---
layout: doc
title: "Starboard Module Reference: cryptography.h"
---
Hardware-accelerated cryptography. Platforms should **only** only implement this
when there are **hardware-accelerated** hardware-accelerated cryptography
facilities. Applications must fall back to platform-independent CPU-based
algorithms if the cipher algorithm isn't supported in hardware.
## Tips for Porters ##
You should implement cipher algorithms in this descending order of priority to
maximize usage for SSL.
1. GCM - The preferred block cipher mode for OpenSSL, mainly due to speed.
1. CTR - This can be used internally with GCM, as long as the CTR
implementation only uses the last 4 bytes of the IV for the counter. (i.e.
96-bit IV, 32-bit counter)
1. ECB - This can be used (with a null IV) with any of the other cipher block
modes to accelerate the core AES algorithm if none of the streaming modes
can be accelerated.
1. CBC - GCM is always preferred if the server and client both support it. If
not, they will generally negotiate down to AES-CBC. If this happens, and CBC
is supported by SbCryptography, then it will be accelerated appropriately.
But, most servers should support GCM, so it is not likely to come up much,
which is why it is the lowest priority.
Further reading on block cipher modes:
[https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
[https://crbug.com/442572](https://crbug.com/442572)
[https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption](https://crypto.stackexchange.com/questions/10775/practical-disadvantages-of-gcm-mode-encryption)
## Macros ##
### kSbCryptographyAlgorithmAes ###
String literal for the AES symmetric block cipher. [https://en.wikipedia.org/wiki/Advanced_Encryption_Standard](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
### kSbCryptographyInvalidTransformer ###
Well-defined value for an invalid transformer.
## Enums ##
### SbCryptographyBlockCipherMode ###
The method of chaining encrypted blocks in a sequence. [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)
#### Values ####
* `kSbCryptographyBlockCipherModeCbc`
Cipher Block Chaining mode.
* `kSbCryptographyBlockCipherModeCfb`
Cipher Feedback mode.
* `kSbCryptographyBlockCipherModeCtr`
Counter mode: A nonce is combined with an increasing counter.
* `kSbCryptographyBlockCipherModeEcb`
Electronic Code Book mode: No chaining.
* `kSbCryptographyBlockCipherModeOfb`
Output Feedback mode.
* `kSbCryptographyBlockCipherModeGcm`
Galois/Counter Mode.
### SbCryptographyDirection ###
The direction of a cryptographic transformation.
#### Values ####
* `kSbCryptographyDirectionEncode`
Cryptographic transformations that encode/encrypt data into a target format.
* `kSbCryptographyDirectionDecode`
Cryptographic transformations that decode/decrypt data into its original
form.
## Typedefs ##
### SbCryptographyTransformer ###
A handle to a cryptographic transformer.
#### Definition ####
```
typedef SbCryptographyTransformerPrivate* SbCryptographyTransformer
```
## Functions ##
### SbCryptographyCreateTransformer ###
Creates an SbCryptographyTransformer with the given initialization data. It can
then be used to transform a series of data blocks. Returns
kSbCryptographyInvalidTransformer if the algorithm isn't supported, or if the
parameters are not compatible with the algorithm.
An SbCryptographyTransformer contains all state to start decrypting a sequence
of cipher blocks according to the cipher block mode. It is not thread-safe, but
implementations must allow different SbCryptographyTransformer instances to
operate on different threads.
All parameters must not be assumed to live longer than the call to this
function. They must be copied by the implementation to be retained.
This function determines success mainly based on whether the combination of
`algorithm`, `direction`, `block_size_bits`, and `mode` is supported and whether
all the sizes passed in are sufficient for the selected parameters. In
particular, this function cannot verify that the key and IV used were correct
for the ciphertext, were it to be used in the decode direction. The caller must
make that verification.
For example, to decrypt AES-128-CTR:
SbCryptographyCreateTransformer(kSbCryptographyAlgorithmAes, 128,
kSbCryptographyDirectionDecode, kSbCryptographyBlockCipherModeCtr, ...);
`algorithm`: A string that represents the cipher algorithm. `block_size_bits`:
The block size variant of the algorithm to use, in bits. `direction`: The
direction in which to transform the data. `mode`: The block cipher mode to use.
`initialization_vector`: The Initialization Vector (IV) to use. May be NULL for
block cipher modes that don't use it, or don't set it at init time.
`initialization_vector_size`: The size, in bytes, of the IV. `key`: The key to
use for this transformation. `key_size`: The size, in bytes, of the key.
#### Declaration ####
```
SbCryptographyTransformer SbCryptographyCreateTransformer(const char *algorithm, int block_size_bits, SbCryptographyDirection direction, SbCryptographyBlockCipherMode mode, const void *initialization_vector, int initialization_vector_size, const void *key, int key_size)
```
### SbCryptographyDestroyTransformer ###
Destroys the given `transformer` instance.
#### Declaration ####
```
void SbCryptographyDestroyTransformer(SbCryptographyTransformer transformer)
```
### SbCryptographyGetTag ###
Calculates the authenticator tag for a transformer and places up to
`out_tag_size` bytes of it in `out_tag`. Returns whether it was able to get the
tag, which mainly has to do with whether it is compatible with the current block
cipher mode.
#### Declaration ####
```
bool SbCryptographyGetTag(SbCryptographyTransformer transformer, void *out_tag, int out_tag_size)
```
### SbCryptographyIsTransformerValid ###
Returns whether the given transformer handle is valid.
#### Declaration ####
```
static bool SbCryptographyIsTransformerValid(SbCryptographyTransformer transformer)
```
### SbCryptographySetAuthenticatedData ###
Sets additional authenticated data (AAD) for a transformer, for chaining modes
that support it (GCM). Returns whether the data was successfully set. This can
fail if the chaining mode doesn't support AAD, if the parameters are invalid, or
if the internal state is invalid for setting AAD.
#### Declaration ####
```
bool SbCryptographySetAuthenticatedData(SbCryptographyTransformer transformer, const void *data, int data_size)
```
### SbCryptographySetInitializationVector ###
Sets the initialization vector (IV) for a transformer, replacing the internally-
set IV. The block cipher mode algorithm will update the IV appropriately after
every block, so this is not necessary unless the stream is discontiguous in some
way. This happens with AES-GCM in TLS.
#### Declaration ####
```
void SbCryptographySetInitializationVector(SbCryptographyTransformer transformer, const void *initialization_vector, int initialization_vector_size)
```
### SbCryptographyTransform ###
Transforms one or more `block_size_bits`-sized blocks of `in_data`, with the
given `transformer`, placing the result in `out_data`. Returns the number of
bytes that were written to `out_data`, unless there was an error, in which case
it will return a negative number.
`transformer`: A transformer initialized with an algorithm, IV, cipherkey, and
so on. `in_data`: The data to be transformed. `in_data_size`: The size of the
data to be transformed, in bytes. Must be a multiple of the transformer's
`block-size_bits`, or an error will be returned. `out_data`: A buffer where the
transformed data should be placed. Must have at least capacity for
`in_data_size` bytes. May point to the same memory as `in_data`.
#### Declaration ####
```
int SbCryptographyTransform(SbCryptographyTransformer transformer, const void *in_data, int in_data_size, void *out_data)
```