int counter_encrypt_or_decrypt(EVP_CIPHER_CTX *ctx, char *pt, char *ct, int len,
unsigned char *counter)
{
int i, j, where = 0, num, bl = EVP_CIPHER_CTX_block_size(ctx);
char encr_ctrs[len + bl]; /* ÍꂽJE^ */
if (EVP_CIPHER_CTX_mode(ctx) != EVP_CIPH_ECB_MODE)
return -1;
/* i񐮗f[^̂ɁjECB[hǂ */
for (i = 0; i <= len / bl; i++)
{
/* ݂̃JE^lÍ */
EVP_EncryptUpdate(ctx, &encr_ctrs[where], &num, counter, bl);
where += num;
/* JE^CNgB񂩂Ȃzł邱Ƃɒ */
for (j = 0; j < bl / sizeof(char); j++)
{
if (++counter[j])
break;
}
}
/* Xg[ƍŏ̃obt@ XOR
 * ̌ʂ2Ԗڂ̃obt@ɓ
 */
for (i = 0; i < len; i++)
ct[i] = pt[i] ^ encr_ctrs[i];
return 1; /*  */
}
