HW post-increment of counter in AES for GCM
This commit is contained in:
@@ -151,9 +151,15 @@ struct rdfpga_256bits {
|
||||
#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)
|
||||
#define RDFPGA_AESWK256 _IOW(0, 13, struct rdfpga_256bits)
|
||||
#define RDFPGA_AESGCMF _IOWR(0, 14, struct rdfpga_128bits)
|
||||
#define RDFPGA_AESGCMN _IOR(0, 15, struct rdfpga_128bits)
|
||||
|
||||
#if 0
|
||||
#define RDFPGA_AESRD _IOR(0, 100, struct rdfpga_128bits) /* fixme: remove */
|
||||
#endif
|
||||
|
||||
int
|
||||
rdfpga_ioctl (dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
|
||||
@@ -223,6 +229,50 @@ rdfpga_ioctl (dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
|
||||
for (i = 0 ; i < 2 ; i++)
|
||||
bits->x[i] = bus_space_read_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_OUT + (i*8)));
|
||||
break;
|
||||
case RDFPGA_AESGCMF:
|
||||
if ((err = rdfpga_wait_aes_ready(sc)) != 0)
|
||||
return err;
|
||||
for (i = 0 ; i < 2 ; i++)
|
||||
bus_space_write_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_DATA + (i*8)), bits->x[i] );
|
||||
ctrl = RDFPGA_MASK_AES128_START | RDFPGA_MASK_AES128_GCMPOSTINC;
|
||||
if (sc->aes_key_refresh != 0x8000) {
|
||||
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);
|
||||
if ((err = rdfpga_wait_aes_ready(sc)) != 0)
|
||||
return err;
|
||||
for (i = 0 ; i < 2 ; i++)
|
||||
bits->x[i] = bus_space_read_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_OUT + (i*8)));
|
||||
break;
|
||||
case RDFPGA_AESGCMN:
|
||||
if ((err = rdfpga_wait_aes_ready(sc)) != 0)
|
||||
return err;
|
||||
ctrl = RDFPGA_MASK_AES128_START | RDFPGA_MASK_AES128_GCMPOSTINC;
|
||||
if (sc->aes_key_refresh != 0x8000) {
|
||||
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);
|
||||
if ((err = rdfpga_wait_aes_ready(sc)) != 0)
|
||||
return err;
|
||||
for (i = 0 ; i < 2 ; i++)
|
||||
bits->x[i] = bus_space_read_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_OUT + (i*8)));
|
||||
break;
|
||||
#if 0
|
||||
case RDFPGA_AESRD: /* fixme: disable */
|
||||
if ((err = rdfpga_wait_aes_ready(sc)) != 0)
|
||||
return err;
|
||||
for (i = 0 ; i < 2 ; i++)
|
||||
bits->x[i] = bus_space_read_8(sc->sc_bustag, sc->sc_bhregs, (RDFPGA_REG_AES128_DATA + (i*8)));
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
err = EINVAL;
|
||||
break;
|
||||
|
||||
@@ -99,5 +99,6 @@ struct rdfpga_softc {
|
||||
#define RDFPGA_MASK_AES128_CBCMOD 0x08000000
|
||||
#define RDFPGA_MASK_AES128_AES256 0x04000000
|
||||
#define RDFPGA_MASK_AES128_DEC 0x02000000
|
||||
#define RDFPGA_MASK_AES128_GCMPOSTINC 0x01000000
|
||||
|
||||
#endif /* _RDFPGA_H_ */
|
||||
|
||||
@@ -150,6 +150,7 @@ ENTITY SBusFSM is
|
||||
constant AES128_CTRL_CBCMOD_IDX : integer := 27;
|
||||
constant AES128_CTRL_AES256_IDX : integer := 26;
|
||||
constant AES128_CTRL_DEC_IDX : integer := 25;
|
||||
constant AES128_CTRL_GCMPOSTINC_IDX : integer := 24;
|
||||
|
||||
CONSTANT REG_INDEX_TRNG_DATA : integer := 0;
|
||||
CONSTANT REG_INDEX_TRNG_TIMER : integer := 1;
|
||||
@@ -468,6 +469,7 @@ ARCHITECTURE RTL OF SBusFSM IS
|
||||
(REG_OFFSET_AESDMA_CTRL = value) OR
|
||||
(REG_OFFSET_AESDMAW_CTRL = value) OR
|
||||
(REG_OFFSET_AES128_CTRL = value)
|
||||
-- OR (REG_OFFSET_IS_AESDATA(value))
|
||||
;
|
||||
end function;
|
||||
|
||||
@@ -1720,6 +1722,10 @@ BEGIN
|
||||
REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_AES128_DATA3) & REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_AES128_DATA4);
|
||||
fifo_toaes_wr_en <= '1';
|
||||
AES_State <= AES_CRYPT1;
|
||||
IF (REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_AES128_CTRL)(AES128_CTRL_GCMPOSTINC_IDX) = '1') THEN
|
||||
REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_AES128_DATA4) <=
|
||||
conv_std_logic_vector(conv_integer(REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_AES128_DATA4))+1,32);
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user