int crypto_aead_encrypt( unsigned char *c, unsigned long long *clen, const unsigned char *m, unsigned long long mlen, const unsigned char *ad, unsigned long long adlen, const unsigned char *nsec, const unsigned char *npub, const unsigned char *k ) { if(mlen == 0 && adlen == 0) return RETURN_UNSUPPORTED; /* set ciphertext length */ *clen = mlen + CRYPTO_ABYTES; unsigned char tag[CRYPTO_ABYTES]; ae_cxt* cxt = ae_allocate(); if(!cxt) return RETURN_MEMORY_FAIL; /* set key and compute round keys */ if(ae_init(cxt, k, CRYPTO_KEYBYTES)) return RETURN_KEYSIZE_ERR; /* process the associated data */ process_ad(cxt, ad, adlen, npub, CRYPTO_NPUBBYTES); /* encrypt message */ ae_encrypt(cxt, (unsigned char*)m, mlen, c); free(cxt); return RETURN_SUCCESS; }
int crypto_aead_decrypt( unsigned char *m,unsigned long long *mlen, unsigned char *nsec, //not relavent to CLOC const unsigned char *c,unsigned long long clen, const unsigned char *ad,unsigned long long adlen, const unsigned char *npub, const unsigned char *k ) { /* set plaintext length */ *mlen = clen - CRYPTO_ABYTES; unsigned char tag[CRYPTO_ABYTES]; ae_cxt* cxt = ae_allocate(); if(!cxt) return RETURN_MEMORY_FAIL; /* set key and compute round keys */ ae_init(cxt, k, CRYPTO_KEYBYTES * 8); /* process the associated data */ process_ad(cxt, ad, adlen, npub, CRYPTO_NPUBBYTES); /* decrypt ciphertext */ ae_encrypt(cxt, m, *mlen, (unsigned char*)c, tag, CRYPTO_ABYTES, DEC); /* compare the tag */ int i; for(i = 0; i < CRYPTO_ABYTES; i++) if(tag[i] != c[(*mlen) + i]){ return RETURN_TAG_NO_MATCH; } return RETURN_SUCCESS; }
int crypto_aead_encrypt( unsigned char *c, unsigned long long *clen, const unsigned char *m, unsigned long long mlen, const unsigned char *ad, unsigned long long adlen, const unsigned char *nsec, //not relavent to CLOC const unsigned char *npub, const unsigned char *k ) { /* set ciphertext length */ *clen = mlen + CRYPTO_ABYTES; unsigned char tag[CRYPTO_ABYTES]; ae_cxt* cxt = ae_allocate(); if(!cxt) return RETURN_MEMORY_FAIL; /* set key and compute round keys */ ae_init(cxt, k, CRYPTO_KEYBYTES * 8); /* process the associated data */ process_ad(cxt, ad, adlen, npub, CRYPTO_NPUBBYTES); /* encrypt message */ ae_encrypt(cxt, (unsigned char*)m, mlen, c, tag, CRYPTO_ABYTES, ENC); /* copy the tag to the end of ciphertext */ memcpy(c+mlen, tag, CRYPTO_ABYTES); return RETURN_SUCCESS; }
int crypto_aead_decrypt( unsigned char *m,unsigned long long *mlen, unsigned char *nsec, const unsigned char *c,unsigned long long clen, const unsigned char *ad,unsigned long long adlen, const unsigned char *npub, const unsigned char *k ) { /* set plaintext length */ *mlen = clen - CRYPTO_ABYTES; if(mlen == 0 && adlen == 0) return RETURN_UNSUPPORTED; unsigned char tag[CRYPTO_ABYTES*2]; ae_cxt* cxt = ae_allocate(); if(!cxt) return RETURN_MEMORY_FAIL; /* set key and compute round keys */ if(ae_init(cxt, k, CRYPTO_KEYBYTES)) return RETURN_KEYSIZE_ERR; /* process the associated data */ process_ad(cxt, ad, adlen, npub, CRYPTO_NPUBBYTES); /* decrypt ciphertext */ ae_decrypt(cxt, m, clen, (unsigned char*)c, tag); free(cxt); /* compare the tag */ int i; if((*mlen) > SLEN && (*mlen % SLEN)) { for(i = 0; i < CRYPTO_ABYTES; i++) if(tag[i] != tag[SLEN + i]){ return RETURN_TAG_NO_MATCH; } } else for(i = 0; i < CRYPTO_ABYTES; i++) if(tag[i] != c[(*mlen) + i]){ return RETURN_TAG_NO_MATCH; } return RETURN_SUCCESS; }
/* #define NEW_2_SCHEME 0 */ /* #define NEW_3_SCHEME 0 */ /* #define ENCRYPT 0 */ /* #define DECRYPT 0 */ int main(int argc, char **argv) { /* Allocate locals */ ALIGN(16) char pt[8*1024] = {0}; ALIGN(16) char tag[16]; ALIGN(16) unsigned char key[] = "abcdefghijklmnop"; ALIGN(16) unsigned char nonce[] = "abcdefghijklmnop"; char outbuf[MAX_ITER*15+1024]; int iter_list[2048]; /* Populate w/ test lengths, -1 terminated */ ae_ctx* ctx = ae_allocate(NULL); char *outp = outbuf; int i, j, len; double Hz; double ipi=0, tmpd; /* populate iter_list, terminate list with negative number */ for (i=0; i<MAX_ITER; ++i) iter_list[i] = i+1; if (MAX_ITER < 44) iter_list[i++] = 44; if (MAX_ITER < 552) iter_list[i++] = 552; if (MAX_ITER < 576) iter_list[i++] = 576; if (MAX_ITER < 1500) iter_list[i++] = 1500; if (MAX_ITER < 4096) iter_list[i++] = 4096; iter_list[i] = -1;