|
Actually I found a C code that do what i want but i
still would like to use cryptopp to keep my code clean. Here is the code
:
static int
gpk_compute_crycks(struct sc_card *card, struct sc_apdu *apdu, u8 *crycks1) { struct gpk_private_data *priv = DRVDATA(card); des_key_schedule k1, k2; u8 in[8], out[8], block[64]; unsigned int len = 0, i, j; /* Set the key schedule
*/
DES_set_key_unchecked((des_cblock *) priv->key, &k1); DES_set_key_unchecked((des_cblock *) (priv->key+8), &k2); /* Fill block with 0x00 and then with the
data. */
memset(block, 0x00, sizeof(block)); block[len++] = apdu->cla; block[len++] = apdu->ins; block[len++] = apdu->p1; block[len++] = apdu->p2; block[len++] = apdu->lc + 3; if ((i = apdu->datalen) + len > sizeof(block)) i = sizeof(block) - len; memcpy(block+len, apdu->data, i); len += i; /* Set IV */
memset(in, 0x00, 8); for (j = 0; j < len; )
{
for (i = 0; i < 8; i++, j++) in[i] ^= block[j]; DES_ecb3_encrypt((des_cblock *)in, (des_cblock *)out, &k1, &k2, &k1, DES_ENCRYPT); memcpy(in, out, 8); } memcpy((u8 *) (apdu->data +
apdu->datalen), out + 5, 3);
apdu->datalen += 3; apdu->lc += 3; apdu->le += 3; if (crycks1) memcpy(crycks1, out, 3); des_cleanse(k1); des_cleanse(k2); memset(in, 0, sizeof(in)); memset(out, 0, sizeof(out)); memset(block, 0, sizeof(block)); return 0; } How can I do the same with
cryptopp
|
