Piotr Krysik | 9e2e835 | 2018-02-27 12:16:25 +0100 | [diff] [blame] | 1 | /*! \file kasumi.h |
| 2 | * KASUMI header. |
| 3 | * |
| 4 | * See kasumi.c for details |
| 5 | * The parameters are described in TS 135 202. |
| 6 | */ |
| 7 | |
| 8 | #pragma once |
| 9 | |
| 10 | #include <stdint.h> |
| 11 | |
| 12 | /*! Single iteration of KASUMI cipher |
| 13 | * \param[in] P Block, 64 bits to be processed in this round |
| 14 | * \param[in] KLi1 Expanded subkeys |
| 15 | * \param[in] KLi2 Expanded subkeys |
| 16 | * \param[in] KOi1 Expanded subkeys |
| 17 | * \param[in] KOi2 Expanded subkeys |
| 18 | * \param[in] KOi3 Expanded subkeys |
| 19 | * \param[in] KIi1 Expanded subkeys |
| 20 | * \param[in] KIi2 Expanded subkeys |
| 21 | * \param[in] KIi3 Expanded subkeys |
| 22 | * \returns processed block of 64 bits |
| 23 | */ |
| 24 | uint64_t _kasumi(uint64_t P, const uint16_t *KLi1, const uint16_t *KLi2, const uint16_t *KOi1, const uint16_t *KOi2, const uint16_t *KOi3, const uint16_t *KIi1, const uint16_t *KIi2, const uint16_t *KIi3); |
| 25 | |
| 26 | /*! Implementation of the KGCORE algorithm (used by A5/3, A5/4, GEA3, GEA4 and ECSD) |
| 27 | * \param[in] CA |
| 28 | * \param[in] cb |
| 29 | * \param[in] cc |
| 30 | * \param[in] cd |
| 31 | * \param[in] ck 8-bytes long key |
| 32 | * \param[out] co cl-dependent |
| 33 | * \param[in] cl |
| 34 | */ |
| 35 | void _kasumi_kgcore(uint8_t CA, uint8_t cb, uint32_t cc, uint8_t cd, const uint8_t *ck, uint8_t *co, uint16_t cl); |
| 36 | |
| 37 | /*! Expand key into set of subkeys - see TS 135 202 for details |
| 38 | * \param[in] key (128 bits) as array of bytes |
| 39 | * \param[out] KLi1 Expanded subkeys |
| 40 | * \param[out] KLi2 Expanded subkeys |
| 41 | * \param[out] KOi1 Expanded subkeys |
| 42 | * \param[out] KOi2 Expanded subkeys |
| 43 | * \param[out] KOi3 Expanded subkeys |
| 44 | * \param[out] KIi1 Expanded subkeys |
| 45 | * \param[out] KIi2 Expanded subkeys |
| 46 | * \param[out] KIi3 Expanded subkeys |
| 47 | */ |
| 48 | void _kasumi_key_expand(const uint8_t *key, uint16_t *KLi1, uint16_t *KLi2, uint16_t *KOi1, uint16_t *KOi2, uint16_t *KOi3, uint16_t *KIi1, uint16_t *KIi2, uint16_t *KIi3); |