예제 #1
0
파일: aes.c 프로젝트: TomMD/cipher-aes128
void tmd_aes_generic_gcm_decrypt(uint8_t *output, const aes_gcm *gcm, const aes_ctx *ctx, const aes_key *key, const uint8_t *input, uint32_t length, aes_ctx *newCTX)
{
    aes_block out;

    memcpy(newCTX, ctx, sizeof(aes_ctx));
    newCTX->length_input += length;
    for (; length >= 16; input += 16, output += 16, length -= 16) {
        block128_inc_be(&newCTX->civ);

        aes_encrypt_block(&out, key, &newCTX->civ);
        gcm_ghash_add(gcm, newCTX, (block128 *) input);
        block128_xor(&out, (block128 *) input);
        block128_copy((block128 *) output, &out);
    }
    if (length > 0) {
        aes_block tmp;
        int i;

        block128_inc_be(&newCTX->civ);

        block128_zero(&tmp);
        block128_copy_bytes(&tmp, input, length);
        gcm_ghash_add(gcm, newCTX, &tmp);

        aes_encrypt_block(&out, key, &newCTX->civ);
        block128_xor_bytes(&tmp, out.b, length);

        for (i = 0; i < length; i++) {
            output[i] = tmp.b[i];
        }
    }
}
예제 #2
0
void aes_gcm_decrypt(uint8_t *output, aes_gcm *gcm, uint8_t *input, uint32_t length)
{
	aes_block out;

	gcm->length_input += length;
	for (; length >= 16; input += 16, output += 16, length -= 16) {
		block128_inc_be(&gcm->civ);

		aes_encrypt_block(&out, &gcm->key, &gcm->civ);
		gcm_ghash_add(gcm, (block128 *) input);
		block128_xor(&out, (block128 *) input);
		block128_copy((block128 *) output, &out);
	}
	if (length > 0) {
		aes_block tmp;
		int i;

		block128_inc_be(&gcm->civ);

		block128_zero(&tmp);
		block128_copy_bytes(&tmp, input, length);
		gcm_ghash_add(gcm, &tmp);

		aes_encrypt_block(&out, &gcm->key, &gcm->civ);
		block128_xor_bytes(&tmp, out.b, length); 

		for (i = 0; i < length; i++) {
			output[i] = tmp.b[i];
		}
	}
}
예제 #3
0
파일: aes.c 프로젝트: TomMD/cipher-aes128
void tmd_aes_generic_encrypt_ctr(uint8_t *output, const aes_key *key, const aes_block *iv, aes_block *newIV, const uint8_t *input, uint32_t len)
{
    aes_block block, o;
    uint32_t nb_blocks = len / 16;
    int i;

    /* preload IV in block */
    block128_copy(&block, iv);

    for ( ; nb_blocks-- > 0; block128_inc_be(&block), output += 16, input += 16) {
        aes_encrypt_block(&o, key, &block);
        block128_vxor((block128 *) output, &o, (block128 *) input);
    }

    if ((len % 16) != 0) {
        aes_encrypt_block(&o, key, &block);
        for (i = 0; i < (len % 16); i++) {
            *output = ((uint8_t *) &o)[i] ^ *input;
            output++;
            input++;
        }
    }
    if(NULL != newIV)
        block128_copy(newIV, &block);
}
예제 #4
0
파일: aes.c 프로젝트: TomMD/cipher-aes128
void tmd_aes_gen_ctr(aes_block *output, const aes_key *key, aes_block *iv, uint32_t nb_blocks)
{
    aes_block block;

    /* preload IV in block */
    block128_copy(&block, iv);

    for ( ; nb_blocks-- > 0; output++, block128_inc_be(&block)) {
        aes_encrypt_block(output, key, &block);
    }
}
예제 #5
0
void aes_gen_ctr(uint8_t *output, aes_key *key, aes_block *iv, uint32_t nb_blocks)
{
	aes_block block;

	if (!nb_blocks)
		return;
	/* preload IV in block */
	block128_copy(&block, iv);

	for ( ; nb_blocks-- > 0; output += 16, block128_inc_be(&block)) {
		aes_encrypt_block((block128 *) output, key, &block);
	}
}
예제 #6
0
void aes_encrypt_ctr(uint8_t *output, aes_key *key, aes_block *iv, uint8_t *input, uint32_t len)
{
	aes_block block, o;
	uint32_t nb_blocks = len / 16;
	int i;

	/* preload IV in block */
	block128_copy(&block, iv);

	for ( ; nb_blocks-- > 0; block128_inc_be(&block), output += 16, input += 16) {
		aes_encrypt_block(&o, key, &block);
		block128_vxor((block128 *) output, &o, (block128 *) input);
	}

	if ((len % 16) != 0) {
		aes_encrypt_block(&o, key, &block);
		for (i = 0; i < (len % 16); i++) {
			*output = ((uint8_t *) &o)[i] ^ *input;
			output += 1;
			input += 1;
		}
	}
}