}
bail:
if (error) {
- if (crie.cri_key)
+ if (crie.cri_key) {
+ bzero(crie.cri_key, crie.cri_klen / 8);
kfree(crie.cri_key, M_XDATA);
- if (cria.cri_key)
+ }
+ if (cria.cri_key) {
+ bzero(crie.cri_key, crie.cri_klen / 8);
kfree(cria.cri_key, M_XDATA);
+ }
}
break;
case CIOCFSESSION:
if (krp) {
kop->crk_status = krp->krp_status;
for (i = 0; i < CRK_MAXPARAM; i++) {
- if (krp->krp_param[i].crp_p)
+ if (krp->krp_param[i].crp_p) {
+ bzero(krp->krp_param[i].crp_p,
+ (krp->krp_param[i].crp_nbits + 7) / 8);
kfree(krp->krp_param[i].crp_p, M_XDATA);
+ }
}
kfree(krp, M_XDATA);
}
int flags)
{
unsigned char iv[EALG_MAX_BLOCK_LEN], blk[EALG_MAX_BLOCK_LEN], *idat;
- unsigned char *ivp, piv[EALG_MAX_BLOCK_LEN];
+ unsigned char *ivp, *nivp, iv2[EALG_MAX_BLOCK_LEN];
u_int8_t *kschedule;
u_int8_t *okschedule;
struct enc_xform *exf;
* Keep encrypted block for XOR'ing
* with next block
*/
- if (ivp == iv)
- bcopy(blk, piv, blks);
- else
- bcopy(blk, iv, blks);
+ nivp = (ivp == iv) ? iv2 : iv;
+ bcopy(blk, nivp, blks);
exf->decrypt(kschedule, blk, iv);
for (j = 0; j < blks; j++)
blk[j] ^= ivp[j];
- if (ivp == iv)
- bcopy(piv, iv, blks);
- else
- ivp = iv;
+ ivp = nivp;
}
/* Copy back decrypted block */
* Keep encrypted block to be used
* in next block's processing.
*/
- if (ivp == iv)
- bcopy(idat, piv, blks);
- else
- bcopy(idat, iv, blks);
+ nivp = (ivp == iv) ? iv2 : iv;
+ bcopy(idat, nivp, blks);
exf->decrypt(kschedule, idat, iv);
for (j = 0; j < blks; j++)
idat[j] ^= ivp[j];
- if (ivp == iv)
- bcopy(piv, iv, blks);
- else
- ivp = iv;
+ ivp = nivp;
}
idat += blks;
* Keep encrypted block for XOR'ing
* with next block
*/
- if (ivp == iv)
- bcopy(blk, piv, blks);
- else
- bcopy(blk, iv, blks);
+ nivp = (ivp == iv) ? iv2 : iv;
+ bcopy(blk, nivp, blks);
exf->decrypt(kschedule, blk, iv);
for (j = 0; j < blks; j++)
blk[j] ^= ivp[j];
- if (ivp == iv)
- bcopy(piv, iv, blks);
- else
- ivp = iv;
+ ivp = nivp;
}
/* Copy back decrypted block */
* Keep encrypted block to be used
* in next block's processing.
*/
- if (ivp == iv)
- bcopy(idat, piv, blks);
- else
- bcopy(idat, iv, blks);
+ nivp = (ivp == iv) ? iv2 : iv;
+ bcopy(idat, nivp, blks);
exf->decrypt(kschedule, idat, iv);
for (j = 0; j < blks; j++)
idat[j] ^= ivp[j];
- if (ivp == iv)
- bcopy(piv, iv, blks);
- else
- ivp = iv;
+ ivp = nivp;
}
idat += blks;