summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormikeb <mikeb@openbsd.org>2010-12-15 23:34:23 +0000
committermikeb <mikeb@openbsd.org>2010-12-15 23:34:23 +0000
commit0c4448d4f521013698164f4dab22f2f76d0d71d2 (patch)
tree86b80412680179286a5221a9af5848a297de6f00 /sys
parentattach the Hercules HWGUn-54 to rsu(4) (diff)
downloadwireguard-openbsd-0c4448d4f521013698164f4dab22f2f76d0d71d2.tar.xz
wireguard-openbsd-0c4448d4f521013698164f4dab22f2f76d0d71d2.zip
Bring CBC oracle attack countermeasure from r1.32 of cryptosoft.c to
the hardware crypto accelerator land. This fixes aes-ni, via xcrypt, glxsb(4), hifn(4), safe(4) and ubsec(4) drivers. Original commit message by angelos: Don't keep the last blocksize-bytes of ciphertext for use as the next plaintext's IV, in CBC mode. Use arc4random() to acquire fresh IVs per message. with and ok deraadt, ok markus, djm
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/amd64/amd64/aesni.c25
-rw-r--r--sys/arch/amd64/amd64/via.c21
-rw-r--r--sys/arch/i386/i386/via.c21
-rw-r--r--sys/arch/i386/pci/glxsb.c35
-rw-r--r--sys/dev/pci/hifn7751.c33
-rw-r--r--sys/dev/pci/hifn7751var.h3
-rw-r--r--sys/dev/pci/safe.c36
-rw-r--r--sys/dev/pci/safevar.h6
-rw-r--r--sys/dev/pci/ubsec.c33
-rw-r--r--sys/dev/pci/ubsecvar.h5
10 files changed, 29 insertions, 189 deletions
diff --git a/sys/arch/amd64/amd64/aesni.c b/sys/arch/amd64/amd64/aesni.c
index 5823e55bb18..a8adc77bcfc 100644
--- a/sys/arch/amd64/amd64/aesni.c
+++ b/sys/arch/amd64/amd64/aesni.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: aesni.c,v 1.16 2010/11/15 14:48:17 mikeb Exp $ */
+/* $OpenBSD: aesni.c,v 1.17 2010/12/15 23:34:23 mikeb Exp $ */
/*-
* Copyright (c) 2003 Jason Wright
* Copyright (c) 2003, 2004 Theo de Raadt
@@ -46,7 +46,6 @@ struct aesni_session {
uint32_t ses_dkey[4 * (AES_MAXROUNDS + 1)];
uint32_t ses_klen;
uint8_t ses_nonce[AESCTR_NONCESIZE];
- uint8_t ses_iv[EALG_MAX_BLOCK_LEN];
int ses_sid;
struct swcr_data *ses_swd;
LIST_ENTRY(aesni_session)
@@ -155,7 +154,6 @@ aesni_newsession(u_int32_t *sidp, struct cryptoini *cri)
switch (c->cri_alg) {
case CRYPTO_AES_CBC:
ses->ses_klen = c->cri_klen / 8;
- arc4random_buf(ses->ses_iv, 16);
fpu_kernel_enter();
aesni_set_key(ses, c->cri_key, ses->ses_klen);
fpu_kernel_exit();
@@ -165,7 +163,6 @@ aesni_newsession(u_int32_t *sidp, struct cryptoini *cri)
ses->ses_klen = c->cri_klen / 8 - AESCTR_NONCESIZE;
bcopy(c->cri_key + ses->ses_klen, ses->ses_nonce,
AESCTR_NONCESIZE);
- arc4random_buf(ses->ses_iv, 8);
fpu_kernel_enter();
aesni_set_key(ses, c->cri_key, ses->ses_klen);
fpu_kernel_exit();
@@ -335,7 +332,7 @@ aesni_encdec(struct cryptop *crp, struct cryptodesc *crd,
if (crd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(crd->crd_iv, iv, ivlen);
else
- bcopy(ses->ses_iv, iv, ivlen);
+ arc4random_buf(iv, ivlen);
/* Do we need to write the IV */
if ((crd->crd_flags & CRD_F_IV_PRESENT) == 0) {
@@ -401,24 +398,6 @@ aesni_encdec(struct cryptop *crp, struct cryptodesc *crd,
cuio_copyback((struct uio *)crp->crp_buf, crd->crd_skip,
crd->crd_len, buf);
- /*
- * Copy out last block for use as next session IV for CBC,
- * generate new IV for CTR.
- */
- if (crd->crd_flags & CRD_F_ENCRYPT) {
- if (crd->crd_alg == CRYPTO_AES_CBC) {
- if (crp->crp_flags & CRYPTO_F_IMBUF)
- m_copydata((struct mbuf *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - ivlen, ivlen,
- ses->ses_iv);
- else
- cuio_copydata((struct uio *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - ivlen, ivlen,
- ses->ses_iv);
- } else if (crd->crd_alg == CRYPTO_AES_CTR)
- arc4random_buf(ses->ses_iv, ivlen);
- }
-
out:
bzero(buf, roundup(crd->crd_len, EALG_MAX_BLOCK_LEN));
return (err);
diff --git a/sys/arch/amd64/amd64/via.c b/sys/arch/amd64/amd64/via.c
index 59ce44ee457..3f1a3985db6 100644
--- a/sys/arch/amd64/amd64/via.c
+++ b/sys/arch/amd64/amd64/via.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: via.c,v 1.7 2010/07/06 09:49:47 blambert Exp $ */
+/* $OpenBSD: via.c,v 1.8 2010/12/15 23:34:23 mikeb Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -64,7 +64,6 @@ void viac3_rnd(void *);
struct viac3_session {
u_int32_t ses_ekey[4 * (AES_MAXROUNDS + 1) + 4]; /* 128 bit aligned */
u_int32_t ses_dkey[4 * (AES_MAXROUNDS + 1) + 4]; /* 128 bit aligned */
- u_int8_t ses_iv[16]; /* 128 bit aligned */
u_int32_t ses_cw0;
struct swcr_data *swd;
int ses_klen;
@@ -194,7 +193,6 @@ viac3_crypto_newsession(u_int32_t *sidp, struct cryptoini *cri)
cw0 |= C3_CRYPT_CWLO_ALG_AES | C3_CRYPT_CWLO_KEYGEN_SW |
C3_CRYPT_CWLO_NORMAL;
- arc4random_buf(ses->ses_iv, sizeof(ses->ses_iv));
ses->ses_klen = c->cri_klen;
ses->ses_cw0 = cw0;
@@ -374,7 +372,7 @@ viac3_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
if (crd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(crd->crd_iv, sc->op_iv, 16);
else
- bcopy(ses->ses_iv, sc->op_iv, 16);
+ arc4random_buf(sc->op_iv, 16);
if ((crd->crd_flags & CRD_F_IV_PRESENT) == 0) {
if (crp->crp_flags & CRYPTO_F_IMBUF)
@@ -428,21 +426,6 @@ viac3_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
bcopy(sc->op_buf, crp->crp_buf + crd->crd_skip,
crd->crd_len);
- /* copy out last block for use as next session IV */
- if (crd->crd_flags & CRD_F_ENCRYPT) {
- if (crp->crp_flags & CRYPTO_F_IMBUF)
- m_copydata((struct mbuf *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - 16, 16,
- ses->ses_iv);
- else if (crp->crp_flags & CRYPTO_F_IOV)
- cuio_copydata((struct uio *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - 16, 16,
- ses->ses_iv);
- else
- bcopy(crp->crp_buf + crd->crd_skip +
- crd->crd_len - 16, ses->ses_iv, 16);
- }
-
if (sc->op_buf != NULL) {
bzero(sc->op_buf, crd->crd_len);
free(sc->op_buf, M_DEVBUF);
diff --git a/sys/arch/i386/i386/via.c b/sys/arch/i386/i386/via.c
index 580003946f2..19650e3b92f 100644
--- a/sys/arch/i386/i386/via.c
+++ b/sys/arch/i386/i386/via.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: via.c,v 1.24 2010/07/06 09:49:47 blambert Exp $ */
+/* $OpenBSD: via.c,v 1.25 2010/12/15 23:34:23 mikeb Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -64,7 +64,6 @@ void viac3_rnd(void *);
struct viac3_session {
u_int32_t ses_ekey[4 * (AES_MAXROUNDS + 1) + 4]; /* 128 bit aligned */
u_int32_t ses_dkey[4 * (AES_MAXROUNDS + 1) + 4]; /* 128 bit aligned */
- u_int8_t ses_iv[16]; /* 128 bit aligned */
u_int32_t ses_cw0;
struct swcr_data *swd;
int ses_klen;
@@ -195,7 +194,6 @@ viac3_crypto_newsession(u_int32_t *sidp, struct cryptoini *cri)
cw0 |= C3_CRYPT_CWLO_ALG_AES | C3_CRYPT_CWLO_KEYGEN_SW |
C3_CRYPT_CWLO_NORMAL;
- arc4random_buf(ses->ses_iv, sizeof(ses->ses_iv));
ses->ses_klen = c->cri_klen;
ses->ses_cw0 = cw0;
@@ -375,7 +373,7 @@ viac3_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
if (crd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(crd->crd_iv, sc->op_iv, 16);
else
- bcopy(ses->ses_iv, sc->op_iv, 16);
+ arc4random_buf(sc->op_iv, 16);
if ((crd->crd_flags & CRD_F_IV_PRESENT) == 0) {
if (crp->crp_flags & CRYPTO_F_IMBUF)
@@ -429,21 +427,6 @@ viac3_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
bcopy(sc->op_buf, crp->crp_buf + crd->crd_skip,
crd->crd_len);
- /* copy out last block for use as next session IV */
- if (crd->crd_flags & CRD_F_ENCRYPT) {
- if (crp->crp_flags & CRYPTO_F_IMBUF)
- m_copydata((struct mbuf *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - 16, 16,
- ses->ses_iv);
- else if (crp->crp_flags & CRYPTO_F_IOV)
- cuio_copydata((struct uio *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - 16, 16,
- ses->ses_iv);
- else
- bcopy(crp->crp_buf + crd->crd_skip +
- crd->crd_len - 16, ses->ses_iv, 16);
- }
-
if (sc->op_buf != NULL) {
bzero(sc->op_buf, crd->crd_len);
free(sc->op_buf, M_DEVBUF);
diff --git a/sys/arch/i386/pci/glxsb.c b/sys/arch/i386/pci/glxsb.c
index c1e52d45cf5..51c5cec9970 100644
--- a/sys/arch/i386/pci/glxsb.c
+++ b/sys/arch/i386/pci/glxsb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: glxsb.c,v 1.20 2010/09/20 02:46:50 deraadt Exp $ */
+/* $OpenBSD: glxsb.c,v 1.21 2010/12/15 23:34:23 mikeb Exp $ */
/*
* Copyright (c) 2006 Tom Cosgrove <tom@openbsd.org>
@@ -150,7 +150,6 @@ struct glxsb_dma_map {
};
struct glxsb_session {
uint32_t ses_key[4];
- uint8_t ses_iv[SB_AES_BLOCK_SIZE];
int ses_klen;
int ses_used;
struct swcr_data *ses_swd_auth;
@@ -417,7 +416,6 @@ glxsb_crypto_newsession(uint32_t *sidp, struct cryptoini *cri)
break;
}
- arc4random_buf(ses->ses_iv, sizeof(ses->ses_iv));
ses->ses_klen = c->cri_klen;
/* Copy the key (Geode LX wants the primary key only) */
@@ -641,7 +639,7 @@ glxsb_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
{
char *op_src, *op_dst;
uint32_t op_psrc, op_pdst;
- uint8_t op_iv[SB_AES_BLOCK_SIZE], *piv;
+ uint8_t op_iv[SB_AES_BLOCK_SIZE];
int err = 0;
int len, tlen, xlen;
int offset;
@@ -671,7 +669,7 @@ glxsb_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
if (crd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(crd->crd_iv, op_iv, sizeof(op_iv));
else
- bcopy(ses->ses_iv, op_iv, sizeof(op_iv));
+ arc4random_buf(op_iv, sizeof(op_iv));
if ((crd->crd_flags & CRD_F_IV_PRESENT) == 0) {
if (crp->crp_flags & CRYPTO_F_IMBUF)
@@ -704,7 +702,6 @@ glxsb_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
offset = 0;
tlen = crd->crd_len;
- piv = op_iv;
/* Process the data in GLXSB_MAX_AES_LEN chunks */
while (tlen > 0) {
@@ -740,26 +737,14 @@ glxsb_crypto_encdec(struct cryptop *crp, struct cryptodesc *crd,
offset += len;
tlen -= len;
- if (tlen <= 0) { /* Ideally, just == 0 */
- /* Finished - put the IV in session IV */
- piv = ses->ses_iv;
- }
-
- /*
- * Copy out last block for use as next iteration/session IV.
- *
- * piv is set to op_iv[] before the loop starts, but is
- * set to ses->ses_iv if we're going to exit the loop this
- * time.
- */
- if (crd->crd_flags & CRD_F_ENCRYPT) {
- bcopy(op_dst + len - sizeof(op_iv), piv, sizeof(op_iv));
- } else {
- /* Decryption, only need this if another iteration */
- if (tlen > 0) {
- bcopy(op_src + len - sizeof(op_iv), piv,
+ if (tlen > 0) {
+ /* Copy out last block for use as next iteration */
+ if (crd->crd_flags & CRD_F_ENCRYPT)
+ bcopy(op_dst + len - sizeof(op_iv), op_iv,
+ sizeof(op_iv));
+ else
+ bcopy(op_src + len - sizeof(op_iv), op_iv,
sizeof(op_iv));
- }
}
}
diff --git a/sys/dev/pci/hifn7751.c b/sys/dev/pci/hifn7751.c
index 34918a52d48..37df7dab6fb 100644
--- a/sys/dev/pci/hifn7751.c
+++ b/sys/dev/pci/hifn7751.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hifn7751.c,v 1.162 2010/07/05 11:07:56 blambert Exp $ */
+/* $OpenBSD: hifn7751.c,v 1.163 2010/12/15 23:34:23 mikeb Exp $ */
/*
* Invertex AEON / Hifn 7751 driver
@@ -1873,10 +1873,6 @@ hifn_newsession(u_int32_t *sidp, struct cryptoini *cri)
case CRYPTO_DES_CBC:
case CRYPTO_3DES_CBC:
case CRYPTO_AES_CBC:
- arc4random_buf(ses->hs_iv,
- (c->cri_alg == CRYPTO_AES_CBC ?
- HIFN_AES_IV_LENGTH : HIFN_IV_LENGTH));
- /*FALLTHROUGH*/
case CRYPTO_ARC4:
if (cry)
return (EINVAL);
@@ -2074,8 +2070,7 @@ hifn_process(struct cryptop *crp)
if (enccrd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(enccrd->crd_iv, cmd->iv, ivlen);
else
- bcopy(sc->sc_sessions[session].hs_iv,
- cmd->iv, ivlen);
+ arc4random_buf(cmd->iv, ivlen);
if ((enccrd->crd_flags & CRD_F_IV_PRESENT)
== 0) {
@@ -2259,7 +2254,7 @@ hifn_callback(struct hifn_softc *sc, struct hifn_command *cmd,
struct cryptop *crp = cmd->crp;
struct cryptodesc *crd;
struct mbuf *m;
- int totlen, i, u, ivlen;
+ int totlen, i, u;
if (cmd->src_map == cmd->dst_map)
bus_dmamap_sync(sc->sc_dmat, cmd->src_map,
@@ -2322,28 +2317,6 @@ hifn_callback(struct hifn_softc *sc, struct hifn_command *cmd,
hifnstats.hst_obytes += cmd->dst_map->dm_mapsize;
- if ((cmd->base_masks & (HIFN_BASE_CMD_CRYPT | HIFN_BASE_CMD_DECODE)) ==
- HIFN_BASE_CMD_CRYPT) {
- for (crd = crp->crp_desc; crd; crd = crd->crd_next) {
- if (crd->crd_alg != CRYPTO_DES_CBC &&
- crd->crd_alg != CRYPTO_3DES_CBC &&
- crd->crd_alg != CRYPTO_AES_CBC)
- continue;
- ivlen = ((crd->crd_alg == CRYPTO_AES_CBC) ?
- HIFN_AES_IV_LENGTH : HIFN_IV_LENGTH);
- if (crp->crp_flags & CRYPTO_F_IMBUF)
- m_copydata((struct mbuf *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - ivlen, ivlen,
- cmd->softc->sc_sessions[cmd->session_num].hs_iv);
- else if (crp->crp_flags & CRYPTO_F_IOV) {
- cuio_copydata((struct uio *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - ivlen, ivlen,
- cmd->softc->sc_sessions[cmd->session_num].hs_iv);
- }
- break;
- }
- }
-
if (cmd->base_masks & HIFN_BASE_CMD_MAC) {
u_int8_t *macbuf;
diff --git a/sys/dev/pci/hifn7751var.h b/sys/dev/pci/hifn7751var.h
index 64918d472db..9497967ea17 100644
--- a/sys/dev/pci/hifn7751var.h
+++ b/sys/dev/pci/hifn7751var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: hifn7751var.h,v 1.52 2004/01/20 21:01:55 jason Exp $ */
+/* $OpenBSD: hifn7751var.h,v 1.53 2010/12/15 23:34:23 mikeb Exp $ */
/*
* Invertex AEON / Hifn 7751 driver
@@ -104,7 +104,6 @@ struct hifn_dma {
struct hifn_session {
int hs_used;
- u_int8_t hs_iv[HIFN_MAX_IV_LENGTH];
};
#define HIFN_RING_SYNC(sc, r, i, f) \
diff --git a/sys/dev/pci/safe.c b/sys/dev/pci/safe.c
index 98111ccf67a..c42994381e2 100644
--- a/sys/dev/pci/safe.c
+++ b/sys/dev/pci/safe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: safe.c,v 1.29 2010/07/02 02:40:16 blambert Exp $ */
+/* $OpenBSD: safe.c,v 1.30 2010/12/15 23:34:23 mikeb Exp $ */
/*-
* Copyright (c) 2003 Sam Leffler, Errno Consulting
@@ -472,7 +472,8 @@ safe_process(struct cryptop *crp)
if (enccrd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(enccrd->crd_iv, iv, ivsize);
else
- bcopy(ses->ses_iv, iv, ivsize);
+ arc4random_buf(iv, ivsize);
+
if ((enccrd->crd_flags & CRD_F_IV_PRESENT) == 0) {
if (crp->crp_flags & CRYPTO_F_IMBUF)
m_copyback(re->re_src_m,
@@ -485,7 +486,6 @@ safe_process(struct cryptop *crp)
for (i = 0; i < ivsize / sizeof(iv[0]); i++)
re->re_sastate.sa_saved_iv[i] = htole32(iv[i]);
cmd0 |= SAFE_SA_CMD0_IVLD_STATE | SAFE_SA_CMD0_SAVEIV;
- re->re_flags |= SAFE_QFLAGS_COPYOUTIV;
} else {
cmd0 |= SAFE_SA_CMD0_INBOUND;
@@ -1362,9 +1362,6 @@ safe_newsession(u_int32_t *sidp, struct cryptoini *cri)
ses->ses_used = 1;
if (encini) {
- /* get an IV */
- arc4random_buf(ses->ses_iv, sizeof(ses->ses_iv));
-
ses->ses_klen = encini->cri_klen;
bcopy(encini->cri_key, ses->ses_key, ses->ses_klen / 8);
@@ -1675,33 +1672,6 @@ safe_callback(struct safe_softc *sc, struct safe_ringentry *re)
crp->crp_buf = (caddr_t)re->re_dst_m;
}
- if (re->re_flags & SAFE_QFLAGS_COPYOUTIV) {
- /* copy out IV for future use */
- for (crd = crp->crp_desc; crd; crd = crd->crd_next) {
- int ivsize;
-
- if (crd->crd_alg == CRYPTO_DES_CBC ||
- crd->crd_alg == CRYPTO_3DES_CBC) {
- ivsize = 2*sizeof(u_int32_t);
- } else if (crd->crd_alg == CRYPTO_AES_CBC) {
- ivsize = 4*sizeof(u_int32_t);
- } else
- continue;
- if (crp->crp_flags & CRYPTO_F_IMBUF) {
- m_copydata((struct mbuf *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - ivsize,
- ivsize,
- (caddr_t) sc->sc_sessions[re->re_sesn].ses_iv);
- } else if (crp->crp_flags & CRYPTO_F_IOV) {
- cuio_copydata((struct uio *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - ivsize,
- ivsize,
- (caddr_t)sc->sc_sessions[re->re_sesn].ses_iv);
- }
- break;
- }
- }
-
if (re->re_flags & SAFE_QFLAGS_COPYOUTICV) {
/* copy out ICV result */
for (crd = crp->crp_desc; crd; crd = crd->crd_next) {
diff --git a/sys/dev/pci/safevar.h b/sys/dev/pci/safevar.h
index ebe859d1dc5..d7a83de438a 100644
--- a/sys/dev/pci/safevar.h
+++ b/sys/dev/pci/safevar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: safevar.h,v 1.7 2010/08/27 15:02:12 deraadt Exp $ */
+/* $OpenBSD: safevar.h,v 1.8 2010/12/15 23:34:23 mikeb Exp $ */
/*-
* Copyright (c) 2003 Sam Leffler, Errno Consulting
@@ -113,8 +113,7 @@ struct safe_ringentry {
int re_sesn; /* crypto session ID */
int re_flags;
-#define SAFE_QFLAGS_COPYOUTIV 0x1 /* copy back on completion */
-#define SAFE_QFLAGS_COPYOUTICV 0x2 /* copy back on completion */
+#define SAFE_QFLAGS_COPYOUTICV 0x1 /* copy back on completion */
};
#define re_src_m re_src.u.m
@@ -139,7 +138,6 @@ struct safe_session {
u_int32_t ses_key[8]; /* DES/3DES/AES key */
u_int32_t ses_hminner[5]; /* hmac inner state */
u_int32_t ses_hmouter[5]; /* hmac outer state */
- u_int32_t ses_iv[4]; /* DES/3DES/AES iv */
};
struct safe_pkq {
diff --git a/sys/dev/pci/ubsec.c b/sys/dev/pci/ubsec.c
index 9a75dc320d4..1311358e826 100644
--- a/sys/dev/pci/ubsec.c
+++ b/sys/dev/pci/ubsec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ubsec.c,v 1.147 2010/07/02 02:40:16 blambert Exp $ */
+/* $OpenBSD: ubsec.c,v 1.148 2010/12/15 23:34:23 mikeb Exp $ */
/*
* Copyright (c) 2000 Jason L. Wright (jason@thought.net)
@@ -711,9 +711,6 @@ ubsec_newsession(u_int32_t *sidp, struct cryptoini *cri)
bzero(ses, sizeof(struct ubsec_session));
ses->ses_used = 1;
if (encini) {
- /* get an IV, network byte order */
- arc4random_buf(ses->ses_iv, sizeof(ses->ses_iv));
-
/* Go ahead and compute key in ubsec's byte order */
if (encini->cri_alg == CRYPTO_AES_CBC) {
bcopy(encini->cri_key, ses->ses_key,
@@ -944,14 +941,10 @@ ubsec_process(struct cryptop *crp)
encoffset = enccrd->crd_skip;
if (enccrd->crd_flags & CRD_F_ENCRYPT) {
- q->q_flags |= UBSEC_QFLAGS_COPYOUTIV;
-
if (enccrd->crd_flags & CRD_F_IV_EXPLICIT)
bcopy(enccrd->crd_iv, key.ses_iv, ivlen);
- else {
- for (i = 0; i < (ivlen / 4); i++)
- key.ses_iv[i] = ses->ses_iv[i];
- }
+ else
+ arc4random_buf(key.ses_iv, ivlen);
if ((enccrd->crd_flags & CRD_F_IV_PRESENT) == 0) {
if (crp->crp_flags & CRYPTO_F_IMBUF)
@@ -1436,26 +1429,6 @@ ubsec_callback(struct ubsec_softc *sc, struct ubsec_q *q)
crp->crp_buf = (caddr_t)q->q_dst_m;
}
- /* copy out IV for future use */
- if (q->q_flags & UBSEC_QFLAGS_COPYOUTIV) {
- for (crd = crp->crp_desc; crd; crd = crd->crd_next) {
- if (crd->crd_alg != CRYPTO_DES_CBC &&
- crd->crd_alg != CRYPTO_3DES_CBC &&
- crd->crd_alg != CRYPTO_AES_CBC)
- continue;
- if (crp->crp_flags & CRYPTO_F_IMBUF)
- m_copydata((struct mbuf *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - 8, 8,
- (caddr_t)sc->sc_sessions[q->q_sesn].ses_iv);
- else if (crp->crp_flags & CRYPTO_F_IOV) {
- cuio_copydata((struct uio *)crp->crp_buf,
- crd->crd_skip + crd->crd_len - 8, 8,
- (caddr_t)sc->sc_sessions[q->q_sesn].ses_iv);
- }
- break;
- }
- }
-
for (crd = crp->crp_desc; crd; crd = crd->crd_next) {
if (crd->crd_alg != CRYPTO_MD5_HMAC &&
crd->crd_alg != CRYPTO_SHA1_HMAC)
diff --git a/sys/dev/pci/ubsecvar.h b/sys/dev/pci/ubsecvar.h
index 6e3ae4c87f7..92871778b9e 100644
--- a/sys/dev/pci/ubsecvar.h
+++ b/sys/dev/pci/ubsecvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ubsecvar.h,v 1.38 2009/03/27 13:31:30 reyk Exp $ */
+/* $OpenBSD: ubsecvar.h,v 1.39 2010/12/15 23:34:23 mikeb Exp $ */
/*
* Copyright (c) 2000 Theo de Raadt
@@ -152,7 +152,6 @@ struct ubsec_q {
bus_dmamap_t q_dst_map;
int q_sesn;
- int q_flags;
};
struct ubsec_softc {
@@ -185,8 +184,6 @@ struct ubsec_softc {
SIMPLEQ_HEAD(,ubsec_q2) sc_q2free; /* free list */
};
-#define UBSEC_QFLAGS_COPYOUTIV 0x1
-
struct ubsec_session {
u_int32_t ses_used;
u_int32_t ses_key[8]; /* 3DES/AES key */