diff --git a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c index f721b10..c07d44d 100644 --- a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c +++ b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c @@ -140,6 +140,9 @@ struct rdfpga_128bits { struct rdfpga_128bits_alt { uint64_t x[2]; }; +struct rdfpga_256bits { + uint64_t x[4]; +}; #define RDFPGA_WC _IOW(0, 1, struct rdfpga_128bits) #define RDFPGA_WH _IOW(0, 2, struct rdfpga_128bits) @@ -148,6 +151,7 @@ struct rdfpga_128bits_alt { #define RDFPGA_WL _IOW(0, 5, uint32_t) #define RDFPGA_AESWK _IOW(0, 10, struct rdfpga_128bits) +#define RDFPGA_AESWK256 _IOW(0, 13, struct rdfpga_256bits) #define RDFPGA_AESWD _IOW(0, 11, struct rdfpga_128bits) #define RDFPGA_AESRO _IOR(0, 12, struct rdfpga_128bits) @@ -156,6 +160,7 @@ rdfpga_ioctl (dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { struct rdfpga_softc *sc = device_lookup_private(&rdfpga_cd, minor(dev)); struct rdfpga_128bits_alt *bits = (struct rdfpga_128bits_alt*)data; + struct rdfpga_256bits *bits256 = (struct rdfpga_256bits*)data; int err = 0, i; uint32_t ctrl; @@ -187,6 +192,15 @@ rdfpga_ioctl (dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) for (i = 0 ; i < 2 ; i++) bus_space_write_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_KEY + (i*8)), bits->x[i] ); sc->aes_key_refresh = 0xFFFF; + sc->aes_key_bits = 0; + break; + case RDFPGA_AESWK256: + if ((err = rdfpga_wait_aes_ready(sc)) != 0) + return err; + for (i = 0 ; i < 4 ; i++) + bus_space_write_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_KEY + (i*8)), bits256->x[i] ); + sc->aes_key_refresh = 0xFFFF; + sc->aes_key_bits = 1; break; case RDFPGA_AESWD: if ((err = rdfpga_wait_aes_ready(sc)) != 0) @@ -198,6 +212,9 @@ rdfpga_ioctl (dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) ctrl |= RDFPGA_MASK_AES128_NEWKEY; sc->aes_key_refresh = 0x8000; } + if (sc->aes_key_bits == 1) { + ctrl |= RDFPGA_MASK_AES128_AES256; + } bus_space_write_4(sc->sc_bustag, sc->sc_bhregs, RDFPGA_REG_AES128_CTRL, ctrl); break; case RDFPGA_AESRO: diff --git a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h index f327feb..c019035 100644 --- a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h +++ b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h @@ -50,6 +50,7 @@ struct rdfpga_softc { u_int32_t cr_id; u_int16_t sid; u_int16_t aes_key_refresh; + u_int8_t aes_key_bits; struct rdfpga_cryptosession sessions[16]; };