cry.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /**
  2. * \file cry.h
  3. *
  4. * Platform header file for cryptographic functions that will be used from
  5. * other IP modules.
  6. */
  7. /*
  8. * Copyright (C) 2016. Mindtree Limited.
  9. * All rights reserved.
  10. */
  11. /* --------------------------------------------- Header File Inclusion */
  12. #include "EM_os.h"
  13. //#define CRY_ECDH_TIMESLICE
  14. #define PHYPLUS_ECDH_ENABLE
  15. /* --------------------------------------------- Global Definitions */
  16. /* Size definitions */
  17. #define CRY_AES128_DATALEN 16
  18. #define CRY_AES128_KEYLEN 16
  19. #define CRY_AES128CCM_DATALEN_MAX 150
  20. #define CRY_AES128CMAC_DATALEN_MAX 150
  21. #define CRY_AES128CMAC_MACLEN 16
  22. #define CRY_ECDH_PUBKEY_SIZE 64
  23. #define CRY_ECDH_PVTKEY_SIZE 32
  24. #define CRY_ECDH_SECRET_SIZE 32
  25. /* AES-CMAC operations */
  26. #define CRY_AES_128_CMAC_SIGN 0x00
  27. #define CRY_AES_128_CMAC_VERIFY 0x01
  28. /* --------------------------------------------- Structures/Data Types */
  29. /* --------------------------------------------- Macros */
  30. #define CRY_LE2BE(s,d,l) cry_reverse_bytestream_endianness((s),(d),(l))
  31. #define CRY_BE2LE(s,d,l) cry_reverse_bytestream_endianness((s),(d),(l))
  32. /* --------------------------------------------- Internal Functions */
  33. /* --------------------------------------------- API Declarations */
  34. #define cry_aes_128_encrypt_be(p, k, c, r) \
  35. (r) = cry_aes_128_encrypt((p), (k), (c))
  36. #define cry_aes_128_decrypt_be(c, k, p, r) \
  37. (r) = cry_aes_128_decrypt((c), (k), (p))
  38. #define cry_aes_128_ccm_encrypt_be(k, n, nl, p, pl, a, al, c, m, ml, r) \
  39. (r) = cry_aes_128_ccm_encrypt((k), (n), (nl), (p), (pl), (a), (al), (c), (m), (ml))
  40. #define cry_aes_128_ccm_decrypt_be(k, n, nl, c, cl, a, al, p, m, ml, r) \
  41. (r) = cry_aes_128_ccm_decrypt((k), (n), (nl), (c), (cl), (a), (al), (p), (m), (ml))
  42. #define cry_aes_128_cmac_sign_be(p, pl, k, m, ml, r) \
  43. (r) = cry_aes_128_cmac(CRY_AES_128_CMAC_SIGN, (p), (pl), (k), (m), (ml))
  44. #define cry_aes_128_cmac_verify_be(p, pl, k, m, ml, r) \
  45. (r) = cry_aes_128_cmac(CRY_AES_128_CMAC_VERIFY, (p), (pl), (k), (m), (ml))
  46. #define cry_ecdh_get_public_key_be(p, r) \
  47. (r) = cry_ecdh_get_public_key((p))
  48. #define cry_ecdh_generate_secret_be(p, s, sl, r, cb) \
  49. (r) = cry_ecdh_generate_secret((p), (s), (sl), (cb)); \
  50. #define cry_aes_128_encrypt_le(p, k, c, r) \
  51. { \
  52. UCHAR cry_plain[CRY_AES128_DATALEN]; \
  53. UCHAR cry_key[CRY_AES128_KEYLEN]; \
  54. UCHAR cry_cipher[CRY_AES128_DATALEN]; \
  55. \
  56. CRY_LE2BE((p), cry_plain, CRY_AES128_DATALEN); \
  57. CRY_LE2BE((k), cry_key, CRY_AES128_KEYLEN); \
  58. \
  59. (r) = cry_aes_128_encrypt(cry_plain, cry_key, cry_cipher); \
  60. \
  61. CRY_BE2LE(cry_cipher, (c), CRY_AES128_DATALEN); \
  62. }
  63. #define cry_aes_128_decrypt_le(c, k, p, r) \
  64. { \
  65. UCHAR cry_plain[CRY_AES128_DATALEN]; \
  66. UCHAR cry_key[CRY_AES128_KEYLEN]; \
  67. UCHAR cry_cipher[CRY_AES128_DATALEN]; \
  68. \
  69. CRY_LE2BE((c), cry_cipher, CRY_AES128_DATALEN); \
  70. CRY_LE2BE((k), cry_key, CRY_AES128_KEYLEN); \
  71. \
  72. (r) = cry_aes_128_decrypt(cry_cipher, cry_key, cry_plain); \
  73. \
  74. CRY_BE2LE(cry_plain, (p), CRY_AES128_DATALEN); \
  75. }
  76. #define cry_aes_128_ccm_encrypt_le(k, n, nl, p, pl, a, al, c, m, ml, r) \
  77. { \
  78. UCHAR cry_plain[CRY_AES128CCM_DATALEN_MAX]; \
  79. UCHAR cry_nonce[CRY_AES128CCM_DATALEN_MAX]; \
  80. UCHAR cry_addl[CRY_AES128CCM_DATALEN_MAX]; \
  81. UCHAR cry_cipher[CRY_AES128CCM_DATALEN_MAX]; \
  82. UCHAR cry_mac[CRY_AES128CCM_DATALEN_MAX]; \
  83. UCHAR cry_key[CRY_AES128_KEYLEN]; \
  84. \
  85. CRY_LE2BE((p), cry_plain, (pl)); \
  86. CRY_LE2BE((n), cry_nonce, (nl)); \
  87. CRY_LE2BE((a), cry_addl, (al)); \
  88. CRY_LE2BE((k), cry_key, CRY_AES128_KEYLEN); \
  89. \
  90. (r) = cry_aes_128_ccm_encrypt(cry_key, cry_nonce, (nl), cry_plain, (pl), cry_addl, (al), cry_cipher, cry_mac, (ml)); \
  91. \
  92. CRY_BE2LE(cry_cipher, (c), (pl)); \
  93. CRY_BE2LE(cry_mac, (m), (ml)); \
  94. }
  95. #define cry_aes_128_ccm_decrypt_le(k, n, nl, c, cl, a, al, p, m, ml, r) \
  96. { \
  97. UCHAR cry_plain[CRY_AES128CCM_DATALEN_MAX]; \
  98. UCHAR cry_nonce[CRY_AES128CCM_DATALEN_MAX]; \
  99. UCHAR cry_addl[CRY_AES128CCM_DATALEN_MAX]; \
  100. UCHAR cry_cipher[CRY_AES128CCM_DATALEN_MAX]; \
  101. UCHAR cry_mac[CRY_AES128CCM_DATALEN_MAX]; \
  102. UCHAR cry_key[CRY_AES128_KEYLEN]; \
  103. \
  104. CRY_LE2BE((c), cry_cipher, (cl)); \
  105. CRY_LE2BE((n), cry_nonce, (nl)); \
  106. CRY_LE2BE((a), cry_addl, (al)); \
  107. CRY_LE2BE((m), cry_mac, (ml)); \
  108. CRY_LE2BE((k), cry_key, CRY_AES128_KEYLEN); \
  109. \
  110. (r) = cry_aes_128_ccm_decrypt(cry_key, cry_nonce, (nl), cry_cipher, (cl), cry_addl, (al), cry_plain, cry_mac, (ml)); \
  111. \
  112. CRY_BE2LE(cry_plain, (p), (cl)); \
  113. }
  114. #define cry_aes_128_cmac_sign_le(p, pl, k, m, ml, r) \
  115. { \
  116. UCHAR cry_plain[CRY_AES128CMAC_DATALEN_MAX]; \
  117. UCHAR cry_key[CRY_AES128_KEYLEN]; \
  118. UCHAR cry_mac[CRY_AES128CMAC_MACLEN]; \
  119. \
  120. CRY_LE2BE((p), cry_plain, (pl)); \
  121. CRY_LE2BE((k), cry_key, CRY_AES128_KEYLEN); \
  122. \
  123. (r) = cry_aes_128_cmac(CRY_AES_128_CMAC_SIGN, cry_plain, (pl), cry_key, cry_mac, (ml)); \
  124. \
  125. CRY_BE2LE(cry_mac, (m), (ml)); \
  126. }
  127. #define cry_aes_128_cmac_verify_le(p, pl, k, m, ml, r) \
  128. { \
  129. UCHAR cry_plain[CRY_AES128CMAC_DATALEN_MAX]; \
  130. UCHAR cry_key[CRY_AES128_KEYLEN]; \
  131. UCHAR cry_mac[CRY_AES128CMAC_MACLEN]; \
  132. \
  133. CRY_LE2BE((p), cry_plain, (pl)); \
  134. CRY_LE2BE((k), cry_key, CRY_AES128_KEYLEN); \
  135. CRY_LE2BE((m), cry_mac, (ml)); \
  136. \
  137. (r) = cry_aes_128_cmac(CRY_AES_128_CMAC_VERIFY, cry_plain, (pl), cry_key, cry_mac, (ml)); \
  138. }
  139. #define cry_ecdh_get_public_key_le(p, r) \
  140. { \
  141. UCHAR cry_pub[CRY_ECDH_PUBKEY_SIZE]; \
  142. \
  143. (r) = cry_ecdh_get_public_key(cry_pub); \
  144. \
  145. CRY_BE2LE(cry_pub, (p), CRY_ECDH_PUBKEY_SIZE); \
  146. \
  147. }
  148. #define cry_ecdh_generate_secret_le(p, s, sl, r, cb) \
  149. { \
  150. UCHAR cry_pub[CRY_ECDH_PUBKEY_SIZE]; \
  151. UCHAR cry_skey[CRY_ECDH_SECRET_SIZE]; \
  152. \
  153. CRY_LE2BE((p), cry_pub, CRY_ECDH_PUBKEY_SIZE); \
  154. \
  155. (r) = cry_ecdh_generate_secret(cry_pub, cry_skey, (sl), (cb)); \
  156. \
  157. CRY_BE2LE(cry_skey, (s), (sl)); \
  158. \
  159. }
  160. void cry_reverse_bytestream_endianness(UCHAR * src, UCHAR * dst, UINT16 len);
  161. void cry_reverse_bytestream_in_place(UCHAR * src, UINT16 len);
  162. INT32 cry_rand_generate(UCHAR * prand, UINT16 randlen);
  163. INT32 cry_aes_128_encrypt
  164. (
  165. UCHAR * pdata,
  166. UCHAR * pkey,
  167. UCHAR * pencdata
  168. );
  169. INT32 cry_aes_128_decrypt
  170. (
  171. UCHAR * pencdata,
  172. UCHAR * pkey,
  173. UCHAR * pdata
  174. );
  175. INT32 cry_aes_128_ccm_encrypt
  176. (
  177. UCHAR * pkey,
  178. UCHAR * pnonce,
  179. UINT16 noncelen,
  180. UCHAR * pdata,
  181. UINT16 datalen,
  182. UCHAR * paddata,
  183. UINT16 addatalen,
  184. UCHAR * pencdata,
  185. UCHAR * pmac,
  186. UINT16 maclen
  187. );
  188. INT32 cry_aes_128_ccm_decrypt
  189. (
  190. UCHAR * pkey,
  191. UCHAR * pnonce,
  192. UINT16 noncelen,
  193. UCHAR * pencdata,
  194. UINT16 encdatalen,
  195. UCHAR * paddata,
  196. UINT16 addatalen,
  197. UCHAR * pdata,
  198. UCHAR * pmac,
  199. UINT16 maclen
  200. );
  201. INT32 cry_aes_128_cmac
  202. (
  203. UCHAR op,
  204. UCHAR * pdata,
  205. UINT16 datalen,
  206. UCHAR * pkey,
  207. UCHAR * pmac,
  208. UINT16 maclen
  209. );
  210. INT32 cry_ecdh_init(void);
  211. INT32 cry_ecdh_get_public_key(UCHAR * pubkey);
  212. INT32 cry_ecdh_generate_secret
  213. (
  214. UCHAR * peer_pubkey,
  215. UCHAR * secret,
  216. UINT16 secret_len,
  217. void (*ecdh_cb)(UCHAR *)
  218. );
  219. INT32 cry_set_ecdh_debug_keypair(UCHAR * pvtkey, UCHAR * pubkey);
  220. #ifdef CRY_ECDH_TIMESLICE
  221. INT32 cry_ecdh_process_secret(void);
  222. #endif /* CRY_ECDH_TIMESLICE */
  223. typedef int(*uCrypto_RNG_Function)(uint8_t *dest, uint32_t size);
  224. void uCrypto_set_rng(uCrypto_RNG_Function rng_function);
  225. uCrypto_RNG_Function uCrypto_get_rng(void);
  226. INT32 phyplus_ecdh_init(void);
  227. INT32 phyplus_ecdh_generate_secret(UCHAR * peer_pubkey, UCHAR * secret, UINT16 secret_len);
  228. INT32 phyplus_ecdh_get_public_key(UCHAR * pubkey);
  229. void test_verify_phyplus_ecdh(void);