Path: blob/master/libs/tomcrypt/src/headers/tomcrypt_mac.h
5971 views
/* LibTomCrypt, modular cryptographic library -- Tom St Denis1*2* LibTomCrypt is a library that provides various cryptographic3* algorithms in a highly modular and flexible manner.4*5* The library is free for all purposes without any express6* guarantee it works.7*/89#ifdef LTC_HMAC10typedef struct Hmac_state {11hash_state md;12int hash;13hash_state hashstate;14unsigned char *key;15} hmac_state;1617int hmac_init(hmac_state *hmac, int hash, const unsigned char *key, unsigned long keylen);18int hmac_process(hmac_state *hmac, const unsigned char *in, unsigned long inlen);19int hmac_done(hmac_state *hmac, unsigned char *out, unsigned long *outlen);20int hmac_test(void);21int hmac_memory(int hash,22const unsigned char *key, unsigned long keylen,23const unsigned char *in, unsigned long inlen,24unsigned char *out, unsigned long *outlen);25int hmac_memory_multi(int hash,26const unsigned char *key, unsigned long keylen,27unsigned char *out, unsigned long *outlen,28const unsigned char *in, unsigned long inlen, ...);29int hmac_file(int hash, const char *fname, const unsigned char *key,30unsigned long keylen,31unsigned char *dst, unsigned long *dstlen);32#endif3334#ifdef LTC_OMAC3536typedef struct {37int cipher_idx,38buflen,39blklen;40unsigned char block[MAXBLOCKSIZE],41prev[MAXBLOCKSIZE],42Lu[2][MAXBLOCKSIZE];43symmetric_key key;44} omac_state;4546int omac_init(omac_state *omac, int cipher, const unsigned char *key, unsigned long keylen);47int omac_process(omac_state *omac, const unsigned char *in, unsigned long inlen);48int omac_done(omac_state *omac, unsigned char *out, unsigned long *outlen);49int omac_memory(int cipher,50const unsigned char *key, unsigned long keylen,51const unsigned char *in, unsigned long inlen,52unsigned char *out, unsigned long *outlen);53int omac_memory_multi(int cipher,54const unsigned char *key, unsigned long keylen,55unsigned char *out, unsigned long *outlen,56const unsigned char *in, unsigned long inlen, ...);57int omac_file(int cipher,58const unsigned char *key, unsigned long keylen,59const char *filename,60unsigned char *out, unsigned long *outlen);61int omac_test(void);62#endif /* LTC_OMAC */6364#ifdef LTC_PMAC6566typedef struct {67unsigned char Ls[32][MAXBLOCKSIZE], /* L shifted by i bits to the left */68Li[MAXBLOCKSIZE], /* value of Li [current value, we calc from previous recall] */69Lr[MAXBLOCKSIZE], /* L * x^-1 */70block[MAXBLOCKSIZE], /* currently accumulated block */71checksum[MAXBLOCKSIZE]; /* current checksum */7273symmetric_key key; /* scheduled key for cipher */74unsigned long block_index; /* index # for current block */75int cipher_idx, /* cipher idx */76block_len, /* length of block */77buflen; /* number of bytes in the buffer */78} pmac_state;7980int pmac_init(pmac_state *pmac, int cipher, const unsigned char *key, unsigned long keylen);81int pmac_process(pmac_state *pmac, const unsigned char *in, unsigned long inlen);82int pmac_done(pmac_state *pmac, unsigned char *out, unsigned long *outlen);8384int pmac_memory(int cipher,85const unsigned char *key, unsigned long keylen,86const unsigned char *msg, unsigned long msglen,87unsigned char *out, unsigned long *outlen);8889int pmac_memory_multi(int cipher,90const unsigned char *key, unsigned long keylen,91unsigned char *out, unsigned long *outlen,92const unsigned char *in, unsigned long inlen, ...);9394int pmac_file(int cipher,95const unsigned char *key, unsigned long keylen,96const char *filename,97unsigned char *out, unsigned long *outlen);9899int pmac_test(void);100101/* internal functions */102int pmac_ntz(unsigned long x);103void pmac_shift_xor(pmac_state *pmac);104105#endif /* PMAC */106107#ifdef LTC_POLY1305108typedef struct {109ulong32 r[5];110ulong32 h[5];111ulong32 pad[4];112unsigned long leftover;113unsigned char buffer[16];114int final;115} poly1305_state;116117int poly1305_init(poly1305_state *st, const unsigned char *key, unsigned long keylen);118int poly1305_process(poly1305_state *st, const unsigned char *in, unsigned long inlen);119int poly1305_done(poly1305_state *st, unsigned char *mac, unsigned long *maclen);120int poly1305_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen);121int poly1305_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...);122int poly1305_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen);123int poly1305_test(void);124#endif /* LTC_POLY1305 */125126#ifdef LTC_BLAKE2SMAC127typedef hash_state blake2smac_state;128int blake2smac_init(blake2smac_state *st, unsigned long outlen, const unsigned char *key, unsigned long keylen);129int blake2smac_process(blake2smac_state *st, const unsigned char *in, unsigned long inlen);130int blake2smac_done(blake2smac_state *st, unsigned char *mac, unsigned long *maclen);131int blake2smac_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen);132int blake2smac_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...);133int blake2smac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen);134int blake2smac_test(void);135#endif /* LTC_BLAKE2SMAC */136137#ifdef LTC_BLAKE2BMAC138typedef hash_state blake2bmac_state;139int blake2bmac_init(blake2bmac_state *st, unsigned long outlen, const unsigned char *key, unsigned long keylen);140int blake2bmac_process(blake2bmac_state *st, const unsigned char *in, unsigned long inlen);141int blake2bmac_done(blake2bmac_state *st, unsigned char *mac, unsigned long *maclen);142int blake2bmac_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen);143int blake2bmac_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...);144int blake2bmac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen);145int blake2bmac_test(void);146#endif /* LTC_BLAKE2BMAC */147148#ifdef LTC_EAX_MODE149150#if !(defined(LTC_OMAC) && defined(LTC_CTR_MODE))151#error LTC_EAX_MODE requires LTC_OMAC and CTR152#endif153154typedef struct {155unsigned char N[MAXBLOCKSIZE];156symmetric_CTR ctr;157omac_state headeromac, ctomac;158} eax_state;159160int eax_init(eax_state *eax, int cipher, const unsigned char *key, unsigned long keylen,161const unsigned char *nonce, unsigned long noncelen,162const unsigned char *header, unsigned long headerlen);163164int eax_encrypt(eax_state *eax, const unsigned char *pt, unsigned char *ct, unsigned long length);165int eax_decrypt(eax_state *eax, const unsigned char *ct, unsigned char *pt, unsigned long length);166int eax_addheader(eax_state *eax, const unsigned char *header, unsigned long length);167int eax_done(eax_state *eax, unsigned char *tag, unsigned long *taglen);168169int eax_encrypt_authenticate_memory(int cipher,170const unsigned char *key, unsigned long keylen,171const unsigned char *nonce, unsigned long noncelen,172const unsigned char *header, unsigned long headerlen,173const unsigned char *pt, unsigned long ptlen,174unsigned char *ct,175unsigned char *tag, unsigned long *taglen);176177int eax_decrypt_verify_memory(int cipher,178const unsigned char *key, unsigned long keylen,179const unsigned char *nonce, unsigned long noncelen,180const unsigned char *header, unsigned long headerlen,181const unsigned char *ct, unsigned long ctlen,182unsigned char *pt,183unsigned char *tag, unsigned long taglen,184int *stat);185186int eax_test(void);187#endif /* EAX MODE */188189#ifdef LTC_OCB_MODE190typedef struct {191unsigned char L[MAXBLOCKSIZE], /* L value */192Ls[32][MAXBLOCKSIZE], /* L shifted by i bits to the left */193Li[MAXBLOCKSIZE], /* value of Li [current value, we calc from previous recall] */194Lr[MAXBLOCKSIZE], /* L * x^-1 */195R[MAXBLOCKSIZE], /* R value */196checksum[MAXBLOCKSIZE]; /* current checksum */197198symmetric_key key; /* scheduled key for cipher */199unsigned long block_index; /* index # for current block */200int cipher, /* cipher idx */201block_len; /* length of block */202} ocb_state;203204int ocb_init(ocb_state *ocb, int cipher,205const unsigned char *key, unsigned long keylen, const unsigned char *nonce);206207int ocb_encrypt(ocb_state *ocb, const unsigned char *pt, unsigned char *ct);208int ocb_decrypt(ocb_state *ocb, const unsigned char *ct, unsigned char *pt);209210int ocb_done_encrypt(ocb_state *ocb,211const unsigned char *pt, unsigned long ptlen,212unsigned char *ct,213unsigned char *tag, unsigned long *taglen);214215int ocb_done_decrypt(ocb_state *ocb,216const unsigned char *ct, unsigned long ctlen,217unsigned char *pt,218const unsigned char *tag, unsigned long taglen, int *stat);219220int ocb_encrypt_authenticate_memory(int cipher,221const unsigned char *key, unsigned long keylen,222const unsigned char *nonce,223const unsigned char *pt, unsigned long ptlen,224unsigned char *ct,225unsigned char *tag, unsigned long *taglen);226227int ocb_decrypt_verify_memory(int cipher,228const unsigned char *key, unsigned long keylen,229const unsigned char *nonce,230const unsigned char *ct, unsigned long ctlen,231unsigned char *pt,232const unsigned char *tag, unsigned long taglen,233int *stat);234235int ocb_test(void);236237/* internal functions */238void ocb_shift_xor(ocb_state *ocb, unsigned char *Z);239int ocb_ntz(unsigned long x);240int s_ocb_done(ocb_state *ocb, const unsigned char *pt, unsigned long ptlen,241unsigned char *ct, unsigned char *tag, unsigned long *taglen, int mode);242243#endif /* LTC_OCB_MODE */244245#ifdef LTC_OCB3_MODE246typedef struct {247unsigned char Offset_0[MAXBLOCKSIZE], /* Offset_0 value */248Offset_current[MAXBLOCKSIZE], /* Offset_{current_block_index} value */249L_dollar[MAXBLOCKSIZE], /* L_$ value */250L_star[MAXBLOCKSIZE], /* L_* value */251L_[32][MAXBLOCKSIZE], /* L_{i} values */252tag_part[MAXBLOCKSIZE], /* intermediate result of tag calculation */253checksum[MAXBLOCKSIZE]; /* current checksum */254255/* AAD related members */256unsigned char aSum_current[MAXBLOCKSIZE], /* AAD related helper variable */257aOffset_current[MAXBLOCKSIZE], /* AAD related helper variable */258adata_buffer[MAXBLOCKSIZE]; /* AAD buffer */259int adata_buffer_bytes; /* bytes in AAD buffer */260unsigned long ablock_index; /* index # for current adata (AAD) block */261262symmetric_key key; /* scheduled key for cipher */263unsigned long block_index; /* index # for current data block */264int cipher, /* cipher idx */265tag_len, /* length of tag */266block_len; /* length of block */267} ocb3_state;268269int ocb3_init(ocb3_state *ocb, int cipher,270const unsigned char *key, unsigned long keylen,271const unsigned char *nonce, unsigned long noncelen,272unsigned long taglen);273274int ocb3_encrypt(ocb3_state *ocb, const unsigned char *pt, unsigned long ptlen, unsigned char *ct);275int ocb3_decrypt(ocb3_state *ocb, const unsigned char *ct, unsigned long ctlen, unsigned char *pt);276int ocb3_encrypt_last(ocb3_state *ocb, const unsigned char *pt, unsigned long ptlen, unsigned char *ct);277int ocb3_decrypt_last(ocb3_state *ocb, const unsigned char *ct, unsigned long ctlen, unsigned char *pt);278int ocb3_add_aad(ocb3_state *ocb, const unsigned char *aad, unsigned long aadlen);279int ocb3_done(ocb3_state *ocb, unsigned char *tag, unsigned long *taglen);280281int ocb3_encrypt_authenticate_memory(int cipher,282const unsigned char *key, unsigned long keylen,283const unsigned char *nonce, unsigned long noncelen,284const unsigned char *adata, unsigned long adatalen,285const unsigned char *pt, unsigned long ptlen,286unsigned char *ct,287unsigned char *tag, unsigned long *taglen);288289int ocb3_decrypt_verify_memory(int cipher,290const unsigned char *key, unsigned long keylen,291const unsigned char *nonce, unsigned long noncelen,292const unsigned char *adata, unsigned long adatalen,293const unsigned char *ct, unsigned long ctlen,294unsigned char *pt,295const unsigned char *tag, unsigned long taglen,296int *stat);297298int ocb3_test(void);299300#ifdef LTC_SOURCE301/* internal helper functions */302int ocb3_int_ntz(unsigned long x);303void ocb3_int_xor_blocks(unsigned char *out, const unsigned char *block_a, const unsigned char *block_b, unsigned long block_len);304#endif /* LTC_SOURCE */305306#endif /* LTC_OCB3_MODE */307308#ifdef LTC_CCM_MODE309310#define CCM_ENCRYPT LTC_ENCRYPT311#define CCM_DECRYPT LTC_DECRYPT312313typedef struct {314symmetric_key K;315int cipher, /* which cipher */316taglen, /* length of the tag */317x; /* index in PAD */318319unsigned long L, /* L value */320ptlen, /* length that will be enc / dec */321current_ptlen, /* current processed length */322aadlen, /* length of the aad */323current_aadlen, /* length of the currently provided add */324noncelen; /* length of the nonce */325326unsigned char PAD[16],327ctr[16],328CTRPAD[16],329CTRlen;330} ccm_state;331332int ccm_init(ccm_state *ccm, int cipher,333const unsigned char *key, int keylen, int ptlen, int taglen, int aad_len);334335int ccm_reset(ccm_state *ccm);336337int ccm_add_nonce(ccm_state *ccm,338const unsigned char *nonce, unsigned long noncelen);339340int ccm_add_aad(ccm_state *ccm,341const unsigned char *adata, unsigned long adatalen);342343int ccm_process(ccm_state *ccm,344unsigned char *pt, unsigned long ptlen,345unsigned char *ct,346int direction);347348int ccm_done(ccm_state *ccm,349unsigned char *tag, unsigned long *taglen);350351int ccm_memory(int cipher,352const unsigned char *key, unsigned long keylen,353symmetric_key *uskey,354const unsigned char *nonce, unsigned long noncelen,355const unsigned char *header, unsigned long headerlen,356unsigned char *pt, unsigned long ptlen,357unsigned char *ct,358unsigned char *tag, unsigned long *taglen,359int direction);360361int ccm_test(void);362363#endif /* LTC_CCM_MODE */364365#if defined(LRW_MODE) || defined(LTC_GCM_MODE)366void gcm_gf_mult(const unsigned char *a, const unsigned char *b, unsigned char *c);367#endif368369370/* table shared between GCM and LRW */371#if defined(LTC_GCM_TABLES) || defined(LTC_LRW_TABLES) || ((defined(LTC_GCM_MODE) || defined(LTC_GCM_MODE)) && defined(LTC_FAST))372extern const unsigned char gcm_shift_table[];373#endif374375#ifdef LTC_GCM_MODE376377#define GCM_ENCRYPT LTC_ENCRYPT378#define GCM_DECRYPT LTC_DECRYPT379380#define LTC_GCM_MODE_IV 0381#define LTC_GCM_MODE_AAD 1382#define LTC_GCM_MODE_TEXT 2383384typedef struct {385symmetric_key K;386unsigned char H[16], /* multiplier */387X[16], /* accumulator */388Y[16], /* counter */389Y_0[16], /* initial counter */390buf[16]; /* buffer for stuff */391392int cipher, /* which cipher */393ivmode, /* Which mode is the IV in? */394mode, /* mode the GCM code is in */395buflen; /* length of data in buf */396397ulong64 totlen, /* 64-bit counter used for IV and AAD */398pttotlen; /* 64-bit counter for the PT */399400#ifdef LTC_GCM_TABLES401unsigned char PC[16][256][16] /* 16 tables of 8x128 */402#ifdef LTC_GCM_TABLES_SSE2403__attribute__ ((aligned (16)))404#endif405;406#endif407} gcm_state;408409void gcm_mult_h(gcm_state *gcm, unsigned char *I);410411int gcm_init(gcm_state *gcm, int cipher,412const unsigned char *key, int keylen);413414int gcm_reset(gcm_state *gcm);415416int gcm_add_iv(gcm_state *gcm,417const unsigned char *IV, unsigned long IVlen);418419int gcm_add_aad(gcm_state *gcm,420const unsigned char *adata, unsigned long adatalen);421422int gcm_process(gcm_state *gcm,423unsigned char *pt, unsigned long ptlen,424unsigned char *ct,425int direction);426427int gcm_done(gcm_state *gcm,428unsigned char *tag, unsigned long *taglen);429430int gcm_memory( int cipher,431const unsigned char *key, unsigned long keylen,432const unsigned char *IV, unsigned long IVlen,433const unsigned char *adata, unsigned long adatalen,434unsigned char *pt, unsigned long ptlen,435unsigned char *ct,436unsigned char *tag, unsigned long *taglen,437int direction);438int gcm_test(void);439440#endif /* LTC_GCM_MODE */441442#ifdef LTC_PELICAN443444typedef struct pelican_state445{446symmetric_key K;447unsigned char state[16];448int buflen;449} pelican_state;450451int pelican_init(pelican_state *pelmac, const unsigned char *key, unsigned long keylen);452int pelican_process(pelican_state *pelmac, const unsigned char *in, unsigned long inlen);453int pelican_done(pelican_state *pelmac, unsigned char *out);454int pelican_test(void);455456int pelican_memory(const unsigned char *key, unsigned long keylen,457const unsigned char *in, unsigned long inlen,458unsigned char *out);459460#endif461462#ifdef LTC_XCBC463464/* add this to "keylen" to xcbc_init to use a pure three-key XCBC MAC */465#define LTC_XCBC_PURE 0x8000UL466467typedef struct {468unsigned char K[3][MAXBLOCKSIZE],469IV[MAXBLOCKSIZE];470471symmetric_key key;472473int cipher,474buflen,475blocksize;476} xcbc_state;477478int xcbc_init(xcbc_state *xcbc, int cipher, const unsigned char *key, unsigned long keylen);479int xcbc_process(xcbc_state *xcbc, const unsigned char *in, unsigned long inlen);480int xcbc_done(xcbc_state *xcbc, unsigned char *out, unsigned long *outlen);481int xcbc_memory(int cipher,482const unsigned char *key, unsigned long keylen,483const unsigned char *in, unsigned long inlen,484unsigned char *out, unsigned long *outlen);485int xcbc_memory_multi(int cipher,486const unsigned char *key, unsigned long keylen,487unsigned char *out, unsigned long *outlen,488const unsigned char *in, unsigned long inlen, ...);489int xcbc_file(int cipher,490const unsigned char *key, unsigned long keylen,491const char *filename,492unsigned char *out, unsigned long *outlen);493int xcbc_test(void);494495#endif496497#ifdef LTC_F9_MODE498499typedef struct {500unsigned char akey[MAXBLOCKSIZE],501ACC[MAXBLOCKSIZE],502IV[MAXBLOCKSIZE];503504symmetric_key key;505506int cipher,507buflen,508keylen,509blocksize;510} f9_state;511512int f9_init(f9_state *f9, int cipher, const unsigned char *key, unsigned long keylen);513int f9_process(f9_state *f9, const unsigned char *in, unsigned long inlen);514int f9_done(f9_state *f9, unsigned char *out, unsigned long *outlen);515int f9_memory(int cipher,516const unsigned char *key, unsigned long keylen,517const unsigned char *in, unsigned long inlen,518unsigned char *out, unsigned long *outlen);519int f9_memory_multi(int cipher,520const unsigned char *key, unsigned long keylen,521unsigned char *out, unsigned long *outlen,522const unsigned char *in, unsigned long inlen, ...);523int f9_file(int cipher,524const unsigned char *key, unsigned long keylen,525const char *filename,526unsigned char *out, unsigned long *outlen);527int f9_test(void);528529#endif530531#ifdef LTC_CHACHA20POLY1305_MODE532533typedef struct {534poly1305_state poly;535chacha_state chacha;536ulong64 aadlen;537ulong64 ctlen;538int aadflg;539} chacha20poly1305_state;540541#define CHACHA20POLY1305_ENCRYPT LTC_ENCRYPT542#define CHACHA20POLY1305_DECRYPT LTC_DECRYPT543544int chacha20poly1305_init(chacha20poly1305_state *st, const unsigned char *key, unsigned long keylen);545int chacha20poly1305_setiv(chacha20poly1305_state *st, const unsigned char *iv, unsigned long ivlen);546int chacha20poly1305_setiv_rfc7905(chacha20poly1305_state *st, const unsigned char *iv, unsigned long ivlen, ulong64 sequence_number);547int chacha20poly1305_add_aad(chacha20poly1305_state *st, const unsigned char *in, unsigned long inlen);548int chacha20poly1305_encrypt(chacha20poly1305_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);549int chacha20poly1305_decrypt(chacha20poly1305_state *st, const unsigned char *in, unsigned long inlen, unsigned char *out);550int chacha20poly1305_done(chacha20poly1305_state *st, unsigned char *tag, unsigned long *taglen);551int chacha20poly1305_memory(const unsigned char *key, unsigned long keylen,552const unsigned char *iv, unsigned long ivlen,553const unsigned char *aad, unsigned long aadlen,554const unsigned char *in, unsigned long inlen,555unsigned char *out,556unsigned char *tag, unsigned long *taglen,557int direction);558int chacha20poly1305_test(void);559560#endif /* LTC_CHACHA20POLY1305_MODE */561562563