TrustCore SDK NanoCrypto API reference  version 7.0
gcm.h
Go to the documentation of this file.
1 /*
2  * gcm.h
3  *
4  * GCM Implementation
5  *
6  * Copyright 2019-2024 DigiCert, Inc. All Rights Reserved.
7  * Proprietary and Confidential Material.
8  *
9  * Code derived from public domain code on www.zork.org
10  */
20 /*------------------------------------------------------------------*/
21 
22 #ifndef __GCM_HEADER__
23 #define __GCM_HEADER__
24 
25 #include "../cap/capdecl.h"
26 
27 #if defined(__ENABLE_MOCANA_CRYPTO_INTERFACE__)
28 #include "../crypto_interface/crypto_interface_aes_gcm_priv.h"
29 #endif
30 
31 #if defined(__ENABLE_MOCANA_GCM__)
32 #if !defined(__ENABLE_MOCANA_GCM_64K__) && !defined(__ENABLE_MOCANA_GCM_4K__) && !defined(__ENABLE_MOCANA_GCM_256B__)
33 #define __ENABLE_MOCANA_GCM_256B__ /*default implementation*/
34 #endif
35 #endif
36 
37 #if defined(__ENABLE_MOCANA_GCM_64K__) || defined(__ENABLE_MOCANA_GCM_4K__) || defined(__ENABLE_MOCANA_GCM_256B__)
38 
39 #ifndef __ENABLE_MOCANA_GCM__
40 #define __ENABLE_MOCANA_GCM__
41 #endif
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 #ifdef __ENABLE_MOCANA_GCM_64K__
48 
49 /* 64K -> fastest with big memory usage */
50 
51 #define GCM_I_LIMIT (16)
52 #define GCM_J_LIMIT (0x100)
53 
54 typedef struct gcm_ctx_64k {
55  ubyte4 table[GCM_I_LIMIT][GCM_J_LIMIT][4];
56  ubyte4 tag4[4];
57  ubyte4 s[4];
58  sbyte4 hashBufferIndex;
59  ubyte hashBuffer[AES_BLOCK_SIZE];
60  ubyte4 alen;
61  ubyte4 dlen;
62  AES_CTR_Ctx *pCtx;
63  sbyte4 encrypt;
64  sbyte4 initialized;
65  sbyte4 aadFinalized;
66  MocSymCtx pMocSymCtx;
67  ubyte4 enabled;
68 } gcm_ctx_64k;
69 
120 MOC_EXTERN BulkCtx GCM_createCtx_64k(MOC_SYM(hwAccelDescr hwAccelCtx) ubyte* key, sbyte4 keylen, sbyte4 encrypt);
121 
148 MOC_EXTERN MSTATUS GCM_update_nonce_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pNonce, ubyte4 nonceLen);
149 
176 MOC_EXTERN MSTATUS GCM_update_aad_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pAadData, ubyte4 aadDataLen);
177 
207 MOC_EXTERN MSTATUS GCM_update_data_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pData, ubyte4 dataLen);
208 
239 MOC_EXTERN MSTATUS GCM_final_ex_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pTag, ubyte4 tagLen);
240 
276 MOC_EXTERN MSTATUS GCM_deleteCtx_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx *ctx);
277 
316 MOC_EXTERN MSTATUS GCM_init_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx,
317  ubyte* nonce, ubyte4 nlen,
318  ubyte* adata, ubyte4 alen);
319 
320 
360 MOC_EXTERN MSTATUS GCM_update_encrypt_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *data, ubyte4 dlen);
361 
402 MOC_EXTERN MSTATUS GCM_update_decrypt_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *ct, ubyte4 ctlen);
403 
439 MOC_EXTERN MSTATUS GCM_final_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte tag[/*AES_BLOCK_SIZE*/]);
440 
486 MOC_EXTERN MSTATUS GCM_cipher_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx,
487  ubyte* nonce, ubyte4 nlen,
488  ubyte* adata, ubyte4 alen,
489  ubyte* data, ubyte4 dlen, ubyte4 verifyLen, sbyte4 encrypt);
490 
491 
502 MOC_EXTERN MSTATUS GCM_clone_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, BulkCtx *ppNewCtx);
503 #endif /* __ENABLE_MOCANA_GCM_64K__ */
504 
505 #ifdef __ENABLE_MOCANA_GCM_4K__
506 
507 /* 4K -> intermediate */
508 typedef struct gcm_ctx_4k {
509  ubyte4 table[256][4];
510  ubyte4 tag4[4];
511  ubyte4 s[4];
512  sbyte4 hashBufferIndex;
513  ubyte hashBuffer[AES_BLOCK_SIZE];
514  ubyte4 alen;
515  ubyte4 dlen;
516  AES_CTR_Ctx *pCtx;
517  sbyte4 encrypt;
518  sbyte4 initialized;
519  sbyte4 aadFinalized;
520  MocSymCtx pMocSymCtx;
521  ubyte4 enabled;
522 } gcm_ctx_4k;
523 
574 MOC_EXTERN BulkCtx GCM_createCtx_4k(MOC_SYM(hwAccelDescr hwAccelCtx) ubyte* key, sbyte4 keylen, sbyte4 encrypt);
575 
602 MOC_EXTERN MSTATUS GCM_update_nonce_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pNonce, ubyte4 nonceLen);
603 
630 MOC_EXTERN MSTATUS GCM_update_aad_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pAadData, ubyte4 aadDataLen);
631 
662 MOC_EXTERN MSTATUS GCM_update_data_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pData, ubyte4 dataLen);
663 
694 MOC_EXTERN MSTATUS GCM_final_ex_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pTag, ubyte4 tagLen);
695 
732 MOC_EXTERN MSTATUS GCM_deleteCtx_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx *ctx);
733 
772 MOC_EXTERN MSTATUS GCM_init_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx,
773  ubyte* nonce, ubyte4 nlen,
774  ubyte* adata, ubyte4 alen);
775 
815 MOC_EXTERN MSTATUS GCM_update_encrypt_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *data, ubyte4 dlen);
816 
857 MOC_EXTERN MSTATUS GCM_update_decrypt_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *ct, ubyte4 ctlen);
858 
894 MOC_EXTERN MSTATUS GCM_final_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte tag[/*AES_BLOCK_SIZE*/]);
895 
941 MOC_EXTERN MSTATUS GCM_cipher_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx,
942  ubyte* nonce, ubyte4 nlen,
943  ubyte* adata, ubyte4 alen,
944  ubyte* data, ubyte4 dlen, ubyte4 verifyLen, sbyte4 encrypt);
945 
956 MOC_EXTERN MSTATUS GCM_clone_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, BulkCtx *ppNewCtx);
957 
958 #endif /* __ENABLE_MOCANA_GCM_4K__ */
959 
960 #ifdef __ENABLE_MOCANA_GCM_256B__
961 
962 /* 256b -> slowest, less memory usage */
963 
964 typedef struct gcm_ctx_256b {
965  ubyte4 table[16][4];
966  ubyte4 tag4[4];
967  ubyte4 s[4];
968  sbyte4 hashBufferIndex;
969  ubyte hashBuffer[AES_BLOCK_SIZE];
970  ubyte4 alen;
971  ubyte4 dlen;
972  AES_CTR_Ctx *pCtx;
973  sbyte4 encrypt;
974  sbyte4 initialized;
975  sbyte4 aadFinalized;
976  MocSymCtx pMocSymCtx;
977  ubyte4 enabled;
978 } gcm_ctx_256b;
979 
980 
1031 MOC_EXTERN BulkCtx GCM_createCtx_256b(MOC_SYM(hwAccelDescr hwAccelCtx) ubyte* key, sbyte4 keylen, sbyte4 encrypt);
1032 
1059 MOC_EXTERN MSTATUS GCM_update_nonce_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pNonce, ubyte4 nonceLen);
1060 
1087 MOC_EXTERN MSTATUS GCM_update_aad_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pAadData, ubyte4 aadDataLen);
1088 
1119 MOC_EXTERN MSTATUS GCM_update_data_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pData, ubyte4 dataLen);
1120 
1151 MOC_EXTERN MSTATUS GCM_final_ex_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pTag, ubyte4 tagLen);
1152 
1189 MOC_EXTERN MSTATUS GCM_deleteCtx_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx *ctx);
1190 
1229 MOC_EXTERN MSTATUS GCM_init_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx,
1230  ubyte* nonce, ubyte4 nlen,
1231  ubyte* adata, ubyte4 alen);
1232 
1272 MOC_EXTERN MSTATUS GCM_update_encrypt_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *data, ubyte4 dlen);
1273 
1314 MOC_EXTERN MSTATUS GCM_update_decrypt_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *ct, ubyte4 ctlen);
1315 
1351 MOC_EXTERN MSTATUS GCM_final_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte tag[/*AES_BLOCK_SIZE*/]);
1352 
1399 MOC_EXTERN MSTATUS GCM_cipher_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx,
1400  ubyte* nonce, ubyte4 nlen,
1401  ubyte* adata, ubyte4 alen,
1402  ubyte* data, ubyte4 dlen, ubyte4 verifyLen, sbyte4 encrypt);
1403 
1414 MOC_EXTERN MSTATUS GCM_clone_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, BulkCtx *ppNewCtx);
1415 
1416 #endif /* __ENABLE_MOCANA_GCM_256B__ */
1417 
1418 #ifdef __cplusplus
1419 }
1420 #endif
1421 
1422 #endif /* defined(__ENABLE_MOCANA_GCM_64K__) || defined(__ENABLE_MOCANA_GCM_4K__) || defined(__ENABLE_MOCANA_GCM_256B__) */
1423 
1424 #endif /* __GCM_HEADER__ */
1425 
MOC_EXTERN MSTATUS GCM_deleteCtx_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx *ctx)
Delete an AES-GCM context.
MOC_EXTERN MSTATUS GCM_final_ex_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pTag, ubyte4 tagLen)
Finalizes an AES-GCM context and verifies or outputs the tag.
MOC_EXTERN MSTATUS GCM_init_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *nonce, ubyte4 nlen, ubyte *adata, ubyte4 alen)
Initialize nonce and authentication data for AES-GCM context.
MOC_EXTERN MSTATUS GCM_final_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte tag[])
Write authentication tag after message encryption.
MOC_EXTERN MSTATUS GCM_update_nonce_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pNonce, ubyte4 nonceLen)
Sets the nonce in a previously created AES-GCM Context.
MOC_EXTERN MSTATUS GCM_update_decrypt_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *ct, ubyte4 ctlen)
Decrypt data buffer and perform authentication.
MOC_EXTERN MSTATUS GCM_clone_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, BulkCtx *ppNewCtx)
Clone a AES-GCM context.
MOC_EXTERN MSTATUS GCM_update_decrypt_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *ct, ubyte4 ctlen)
Decrypt data buffer and perform authentication.
MOC_EXTERN MSTATUS GCM_final_ex_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pTag, ubyte4 tagLen)
Finalizes an AES-GCM context and verifies or outputs the tag.
MOC_EXTERN MSTATUS GCM_update_data_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pData, ubyte4 dataLen)
Finalizes an AES-GCM context and verifies or outputs the tag.
MOC_EXTERN MSTATUS GCM_update_encrypt_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *data, ubyte4 dlen)
Encrypt a data buffer and perform authentication.
MOC_EXTERN MSTATUS GCM_update_encrypt_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *data, ubyte4 dlen)
Encrypt a data buffer and perform authentication.
MOC_EXTERN MSTATUS GCM_update_data_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pData, ubyte4 dataLen)
Updates an AES-GCM context with data to be encrypted or decrypted.
MOC_EXTERN MSTATUS GCM_cipher_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *nonce, ubyte4 nlen, ubyte *adata, ubyte4 alen, ubyte *data, ubyte4 dlen, ubyte4 verifyLen, sbyte4 encrypt)
AES-GCM encrypt or decrypt a data buffer.
MOC_EXTERN MSTATUS GCM_final_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte tag[])
Write authentication tag after message encryption.
MOC_EXTERN MSTATUS GCM_update_data_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pData, ubyte4 dataLen)
Finalizes an AES-GCM context and verifies or outputs the tag.
MOC_EXTERN BulkCtx GCM_createCtx_64k(MOC_SYM(hwAccelDescr hwAccelCtx) ubyte *key, sbyte4 keylen, sbyte4 encrypt)
Create and return a context data structure for AES-GCM operations.
MOC_EXTERN MSTATUS GCM_cipher_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *nonce, ubyte4 nlen, ubyte *adata, ubyte4 alen, ubyte *data, ubyte4 dlen, ubyte4 verifyLen, sbyte4 encrypt)
AES-GCM encrypt or decrypt a data buffer.
MOC_EXTERN BulkCtx GCM_createCtx_256b(MOC_SYM(hwAccelDescr hwAccelCtx) ubyte *key, sbyte4 keylen, sbyte4 encrypt)
Create and return a context data structure for AES-GCM operations.
MOC_EXTERN MSTATUS GCM_update_encrypt_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *data, ubyte4 dlen)
Encrypt a data buffer and perform authentication.
MOC_EXTERN MSTATUS GCM_update_aad_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pAadData, ubyte4 aadDataLen)
Updates an AES-GCM context with additional authenticated data.
MOC_EXTERN MSTATUS GCM_init_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *nonce, ubyte4 nlen, ubyte *adata, ubyte4 alen)
Initialize nonce and authentication data for AES-GCM context.
MOC_EXTERN MSTATUS GCM_final_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte tag[])
Write authentication tag after message encryption.
MOC_EXTERN MSTATUS GCM_update_nonce_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pNonce, ubyte4 nonceLen)
Sets the nonce in a previously created AES-GCM Context.
MOC_EXTERN MSTATUS GCM_update_nonce_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pNonce, ubyte4 nonceLen)
Sets the nonce in a previously created AES-GCM Context.
MOC_EXTERN MSTATUS GCM_update_aad_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pAadData, ubyte4 aadDataLen)
Updates an AES-GCM context with additional authenticated data.
MOC_EXTERN BulkCtx GCM_createCtx_4k(MOC_SYM(hwAccelDescr hwAccelCtx) ubyte *key, sbyte4 keylen, sbyte4 encrypt)
Create and return a context data structure for AES-GCM operations.
MOC_EXTERN MSTATUS GCM_clone_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, BulkCtx *ppNewCtx)
Clone a AES-GCM context.
MOC_EXTERN MSTATUS GCM_cipher_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *nonce, ubyte4 nlen, ubyte *adata, ubyte4 alen, ubyte *data, ubyte4 dlen, ubyte4 verifyLen, sbyte4 encrypt)
AES-GCM encrypt or decrypt a data buffer.
MOC_EXTERN MSTATUS GCM_update_aad_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pAadData, ubyte4 aadDataLen)
Updates an AES-GCM context with additional authenticated data.
MOC_EXTERN MSTATUS GCM_update_decrypt_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *ct, ubyte4 ctlen)
Decrypt data buffer and perform authentication.
MOC_EXTERN MSTATUS GCM_deleteCtx_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx *ctx)
Delete an AES-GCM context.
MOC_EXTERN MSTATUS GCM_init_64k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx ctx, ubyte *nonce, ubyte4 nlen, ubyte *adata, ubyte4 alen)
Initialize nonce and authentication data for AES-GCM context.
MOC_EXTERN MSTATUS GCM_final_ex_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, ubyte *pTag, ubyte4 tagLen)
Finalizes an AES-GCM context and verifies or outputs the tag.
MOC_EXTERN MSTATUS GCM_clone_256b(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx pCtx, BulkCtx *ppNewCtx)
Clone a AES-GCM context.
MOC_EXTERN MSTATUS GCM_deleteCtx_4k(MOC_SYM(hwAccelDescr hwAccelCtx) BulkCtx *ctx)
Delete an AES-GCM context.