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

Reply via email to