| --- | |
| 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) | |
| ``` | |