| 1 |
|
| 2 | |
| 3 | * Diffie-Hellman secret to be used with kpp API along with helper functions
|
| 4 | *
|
| 5 | * Copyright (c) 2016, Intel Corporation
|
| 6 | * Authors: Salvatore Benedetto <[email protected]>
|
| 7 |
|
| 8 | #ifndef _CRYPTO_DH_
|
| 9 | #define _CRYPTO_DH_
|
| 10 |
|
| 11 | |
| 12 | * DOC: DH Helper Functions
|
| 13 | *
|
| 14 | * To use DH with the KPP cipher API, the following data structure and
|
| 15 | * functions should be used.
|
| 16 | *
|
| 17 | * To use DH with KPP, the following functions should be used to operate on
|
| 18 | * a DH private key. The packet private key that can be set with
|
| 19 | * the KPP API function call of crypto_kpp_set_secret.
|
| 20 |
|
| 21 |
|
| 22 | |
| 23 | * struct dh - define a DH private key
|
| 24 | *
|
| 25 | * @key: Private DH key
|
| 26 | * @p: Diffie-Hellman parameter P
|
| 27 | * @g: Diffie-Hellman generator G
|
| 28 | * @key_size: Size of the private DH key
|
| 29 | * @p_size: Size of DH parameter P
|
| 30 | * @g_size: Size of DH generator G
|
| 31 |
|
| 32 | struct dh {
|
| 33 | const void *key;
|
| 34 | const void *p;
|
| 35 | const void *g;
|
| 36 | unsigned int key_size;
|
| 37 | unsigned int p_size;
|
| 38 | unsigned int g_size;
|
| 39 | };
|
| 40 |
|
| 41 | |
| 42 | * crypto_dh_key_len() - Obtain the size of the private DH key
|
| 43 | * @params: private DH key
|
| 44 | *
|
| 45 | * This function returns the packet DH key size. A caller can use that
|
| 46 | * with the provided DH private key reference to obtain the required
|
| 47 | * memory size to hold a packet key.
|
| 48 | *
|
| 49 | * Return: size of the key in bytes
|
| 50 |
|
| 51 | unsigned int crypto_dh_key_len(const struct dh *params);
|
| 52 |
|
| 53 | |
| 54 | * crypto_dh_encode_key() - encode the private key
|
| 55 | * @buf: Buffer allocated by the caller to hold the packet DH
|
| 56 | * private key. The buffer should be at least crypto_dh_key_len
|
| 57 | * bytes in size.
|
| 58 | * @len: Length of the packet private key buffer
|
| 59 | * @params: Buffer with the caller-specified private key
|
| 60 | *
|
| 61 | * The DH implementations operate on a packet representation of the private
|
| 62 | * key.
|
| 63 | *
|
| 64 | * Return: -EINVAL if buffer has insufficient size, 0 on success
|
| 65 |
|
| 66 | int crypto_dh_encode_key(char *buf, unsigned int len, const struct dh *params);
|
| 67 |
|
| 68 | |
| 69 | * crypto_dh_decode_key() - decode a private key
|
| 70 | * @buf: Buffer holding a packet key that should be decoded
|
| 71 | * @len: Length of the packet private key buffer
|
| 72 | * @params: Buffer allocated by the caller that is filled with the
|
| 73 | * unpacked DH private key.
|
| 74 | *
|
| 75 | * The unpacking obtains the private key by pointing @p to the correct location
|
| 76 | * in @buf. Thus, both pointers refer to the same memory.
|
| 77 | *
|
| 78 | * Return: -EINVAL if buffer has insufficient size, 0 on success
|
| 79 |
|
| 80 | int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params);
|
| 81 |
|
| 82 | |
| 83 | * __crypto_dh_decode_key() - decode a private key without parameter checks
|
| 84 | * @buf: Buffer holding a packet key that should be decoded
|
| 85 | * @len: Length of the packet private key buffer
|
| 86 | * @params: Buffer allocated by the caller that is filled with the
|
| 87 | * unpacked DH private key.
|
| 88 | *
|
| 89 | * Internal function providing the same services as the exported
|
| 90 | * crypto_dh_decode_key(), but without any of those basic parameter
|
| 91 | * checks conducted by the latter.
|
| 92 | *
|
| 93 | * Return: -EINVAL if buffer has insufficient size, 0 on success
|
| 94 |
|
| 95 | int __crypto_dh_decode_key(const char *buf, unsigned int len,
|
| 96 | struct dh *params);
|
| 97 |
|
| 98 | #endif
|