summaryrefslogtreecommitdiff
path: root/sys/dev/pci
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2000-04-05 16:34:08 +0000
committerJason Wright <jason@cvs.openbsd.org>2000-04-05 16:34:08 +0000
commit8f2da8a800d4339fa29c8cd1aac32da1012c9228 (patch)
treed1b1bb04a839471e9ee46a33731b20e49bbf1bf1 /sys/dev/pci
parentff6504cc05bc3899c1cad8c267968b23b00f3672 (diff)
maintain state about keys, upload them to context ram once (and avoid the
300 clock penalty on key upload) XXX hifn_freesession should probably zot the keys from context ram but XXX does not yet.
Diffstat (limited to 'sys/dev/pci')
-rw-r--r--sys/dev/pci/hifn7751.c64
-rw-r--r--sys/dev/pci/hifn7751reg.h3
2 files changed, 54 insertions, 13 deletions
diff --git a/sys/dev/pci/hifn7751.c b/sys/dev/pci/hifn7751.c
index c6748a02862..d997a338bda 100644
--- a/sys/dev/pci/hifn7751.c
+++ b/sys/dev/pci/hifn7751.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hifn7751.c,v 1.24 2000/04/04 20:16:33 jason Exp $ */
+/* $OpenBSD: hifn7751.c,v 1.25 2000/04/05 16:34:07 jason Exp $ */
/*
* Invertex AEON / Hi/fn 7751 driver
@@ -1265,7 +1265,22 @@ hifn_newsession(sidp, cri)
if (sc == NULL)
return (EINVAL);
- for (c = cri, i = 0; c != NULL; c = c->cri_next) {
+ if (sc->sc_sessions == NULL) {
+ sc->sc_sessions = (u_int8_t *)malloc(sc->sc_maxses,
+ M_DEVBUF, M_NOWAIT);
+ if (sc->sc_sessions == NULL)
+ return (ENOMEM);
+ bzero(sc->sc_sessions, sc->sc_maxses);
+ }
+
+ for (i = 0; i < sc->sc_maxses; i++) {
+ if (sc->sc_sessions[i] == 0)
+ break;
+ }
+ if (i == sc->sc_maxses)
+ return (ENOMEM);
+
+ for (c = cri; c != NULL; c = c->cri_next) {
if (c->cri_alg == CRYPTO_MD5_HMAC96 ||
c->cri_alg == CRYPTO_SHA1_HMAC96) {
if (mac)
@@ -1281,11 +1296,12 @@ hifn_newsession(sidp, cri)
else
return (EINVAL);
}
-
if (mac == 0 && cry == 0)
return (EINVAL);
- *sidp = HIFN_SID(sc->sc_dv.dv_unit, 1);
+ *sidp = HIFN_SID(sc->sc_dv.dv_unit, i);
+ sc->sc_sessions[i] = 1;
+
return (0);
}
@@ -1298,6 +1314,19 @@ int
hifn_freesession(sid)
u_int32_t sid;
{
+ struct hifn_softc *sc;
+ int card, session;
+
+ card = HIFN_CARD(sid);
+ if (card >= hifn_cd.cd_ndevs || hifn_cd.cd_devs[card] == NULL)
+ return (EINVAL);
+
+ sc = hifn_cd.cd_devs[card];
+ session = HIFN_SESSION(sid);
+ if (session >= sc->sc_maxses || sc->sc_sessions == NULL)
+ return (EINVAL);
+
+ sc->sc_sessions[session] = 0;
return (0);
}
@@ -1357,15 +1386,22 @@ hifn_process(crp)
crd1->crd_alg == CRYPTO_SHA1_HMAC96) {
maccrd = crd1;
enccrd = NULL;
- cmd->flags |= HIFN_ENCODE | HIFN_MAC_TRUNC |
- HIFN_MAC_NEW_KEY;
+ cmd->flags |= HIFN_ENCODE | HIFN_MAC_TRUNC;
+ if (sc->sc_sessions[session] == 1) {
+ cmd->flags |= HIFN_MAC_NEW_KEY;
+ sc->sc_sessions[session] = 2;
+ }
}
else if (crd1->crd_alg == CRYPTO_DES_CBC ||
crd1->crd_alg == CRYPTO_3DES_CBC) {
if (crd1->crd_flags & CRD_F_ENCRYPT)
- cmd->flags |= HIFN_ENCODE | HIFN_CRYPT_NEW_KEY;
+ cmd->flags |= HIFN_ENCODE;
else
- cmd->flags |= HIFN_DECODE | HIFN_CRYPT_NEW_KEY;
+ cmd->flags |= HIFN_DECODE;
+ if (sc->sc_sessions[session] == 1) {
+ cmd->flags |= HIFN_CRYPT_NEW_KEY;
+ sc->sc_sessions[session] = 2;
+ }
maccrd = NULL;
enccrd = crd1;
}
@@ -1380,8 +1416,7 @@ hifn_process(crp)
(crd2->crd_alg == CRYPTO_DES_CBC ||
crd2->crd_alg == CRYPTO_3DES_CBC) &&
((crd2->crd_flags & CRD_F_ENCRYPT) == 0)) {
- cmd->flags |= HIFN_DECODE | HIFN_MAC_TRUNC |
- HIFN_MAC_NEW_KEY | HIFN_CRYPT_NEW_KEY;
+ cmd->flags |= HIFN_DECODE | HIFN_MAC_TRUNC;
maccrd = crd1;
enccrd = crd2;
}
@@ -1390,8 +1425,7 @@ hifn_process(crp)
(crd2->crd_alg == CRYPTO_MD5_HMAC96 ||
crd2->crd_alg == CRYPTO_SHA1_HMAC96) &&
(crd1->crd_flags & CRD_F_ENCRYPT)) {
- cmd->flags |= HIFN_ENCODE | HIFN_MAC_TRUNC |
- HIFN_MAC_NEW_KEY | HIFN_CRYPT_NEW_KEY;
+ cmd->flags |= HIFN_ENCODE | HIFN_MAC_TRUNC;
enccrd = crd1;
maccrd = crd2;
}
@@ -1402,6 +1436,11 @@ hifn_process(crp)
err = EINVAL;
goto errout;
}
+
+ if (sc->sc_sessions[session] == 1) {
+ cmd->flags |= HIFN_MAC_NEW_KEY | HIFN_CRYPT_NEW_KEY;
+ sc->sc_sessions[session] = 2;
+ }
}
if (enccrd) {
@@ -1439,6 +1478,7 @@ hifn_process(crp)
cmd->dest_ready_callback = hifn_callback;
cmd->private_data = (u_long)crp;
+ cmd->session_num = session;
if (hifn_crypto(sc, cmd) == 0)
return (0);
diff --git a/sys/dev/pci/hifn7751reg.h b/sys/dev/pci/hifn7751reg.h
index d8e2102afb6..6bb8a161039 100644
--- a/sys/dev/pci/hifn7751reg.h
+++ b/sys/dev/pci/hifn7751reg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: hifn7751reg.h,v 1.11 2000/04/04 20:10:27 jason Exp $ */
+/* $OpenBSD: hifn7751reg.h,v 1.12 2000/04/05 16:34:07 jason Exp $ */
/*
* Invertex AEON / Hi/fn 7751 driver
@@ -135,6 +135,7 @@ struct hifn_softc {
int32_t sc_cid;
int sc_maxses;
int sc_ramsize;
+ u_int8_t *sc_sessions;
};
/*