Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}