DMA for cbc decrypt
This commit is contained in:
parent
20fbac086c
commit
753ddd3106
@ -1083,7 +1083,7 @@ rdfpga_encdec_aes128cbc(struct rdfpga_softc *sw, const u_int8_t thesid, struct c
|
||||
*/
|
||||
idat = ((char *)uio->uio_iov[ind].iov_base) + k;
|
||||
|
||||
if (!ctx->cbc) {
|
||||
if (!ctx->cbc && (crd->crd_flags & CRD_F_ENCRYPT)) {
|
||||
if (rdfpga_rijndael128_writeivforcbc(sw->sessions[thesid].sw_kschedule, ivp)) {
|
||||
aprint_error_dev(sw->sc_dev, "rdfpga_rijndael128_crypt: stuck\n");
|
||||
} else {
|
||||
@ -1146,6 +1146,94 @@ rdfpga_encdec_aes128cbc(struct rdfpga_softc *sw, const u_int8_t thesid, struct c
|
||||
bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ);
|
||||
bus_dmamem_free(sw->sc_dmatag, &segs, 1);
|
||||
|
||||
idat += tocopy;
|
||||
count += tocopy;
|
||||
k += tocopy;
|
||||
i -= tocopy;
|
||||
}
|
||||
/* ********************************************************************************** */
|
||||
if (!(crd->crd_flags & CRD_F_ENCRYPT) && ((uio->uio_iov[ind].iov_len - k) >= 32)) {
|
||||
bus_dma_segment_t segs;
|
||||
int rsegs;
|
||||
size_t tocopy = uio->uio_iov[ind].iov_len - k;
|
||||
uint64_t ctrl;
|
||||
/* int error; */
|
||||
|
||||
tocopy &= ~(size_t)0x0F;
|
||||
if (tocopy > RDFPGA_VAL_DMA_MAX_SZ)
|
||||
tocopy = RDFPGA_VAL_DMA_MAX_SZ;
|
||||
|
||||
/* aprint_normal_dev(sw->sc_dev, "AES DMA: %zd @ %p (%d) [from %d]\n", tocopy, idat, ind, k); */
|
||||
|
||||
if (bus_dmamem_alloc(sw->sc_dmatag, RDFPGA_VAL_DMA_MAX_SZ, 64, 64, &segs, 1, &rsegs, BUS_DMA_NOWAIT | BUS_DMA_STREAMING)) {
|
||||
aprint_error_dev(sw->sc_dev, "cannot allocate DVMA memory");
|
||||
goto afterdma;
|
||||
}
|
||||
void* kvap;
|
||||
if (bus_dmamem_map(sw->sc_dmatag, &segs, 1, RDFPGA_VAL_DMA_MAX_SZ, &kvap, BUS_DMA_NOWAIT)) {
|
||||
aprint_error_dev(sw->sc_dev, "cannot allocate DVMA address");
|
||||
bus_dmamem_free(sw->sc_dmatag, &segs, 1);
|
||||
goto afterdma;
|
||||
}
|
||||
if (bus_dmamap_load(sw->sc_dmatag, sw->sc_dmamap, kvap, RDFPGA_VAL_DMA_MAX_SZ, /* kernel space */ NULL,
|
||||
BUS_DMA_NOWAIT | BUS_DMA_STREAMING | BUS_DMA_WRITE | BUS_DMA_READ)) {
|
||||
aprint_error_dev(sw->sc_dev, "cannot load dma map");
|
||||
bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ);
|
||||
bus_dmamem_free(sw->sc_dmatag, &segs, 1);
|
||||
goto afterdma;
|
||||
}
|
||||
/* if ((error = uiomove(kvap, tocopy, uio)) != 0) { */
|
||||
/* aprint_error_dev(sw->sc_dev, "cannot copy from uio space"); */
|
||||
/* bus_dmamap_unload(sw->sc_dmatag, sw->sc_dmamap); */
|
||||
/* bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ); */
|
||||
/* bus_dmamem_free(sw->sc_dmatag, &segs, 1); */
|
||||
/* goto afterdma; */
|
||||
/* } */
|
||||
memcpy(kvap, idat, tocopy);
|
||||
|
||||
bus_dmamap_sync(sw->sc_dmatag, sw->sc_dmamap, 0, tocopy, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
|
||||
/* start write */
|
||||
ctrl = ((uint64_t)(RDFPGA_MASK_DMA_CTRL_START | RDFPGA_MASK_DMA_CTRL_AES | RDFPGA_MASK_DMA_CTRL_DEC | ((tocopy/16)-1))) | ((uint64_t)(uint32_t)(sw->sc_dmamap->dm_segs[0].ds_addr)) << 32;
|
||||
bus_space_write_8(sw->sc_bustag, sw->sc_bhregs, (RDFPGA_REG_DMAW_ADDR), ctrl);
|
||||
/* start read */
|
||||
ctrl = ((uint64_t)(RDFPGA_MASK_DMA_CTRL_START | RDFPGA_MASK_DMA_CTRL_AES | RDFPGA_MASK_DMA_CTRL_DEC | ((tocopy/16)-1))) | ((uint64_t)(uint32_t)(sw->sc_dmamap->dm_segs[0].ds_addr)) << 32;
|
||||
bus_space_write_8(sw->sc_bustag, sw->sc_bhregs, (RDFPGA_REG_DMA_ADDR), ctrl);
|
||||
rdfpga_wait_dma_ready(sw, 50000);
|
||||
bus_dmamap_sync(sw->sc_dmatag, sw->sc_dmamap, 0, tocopy, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
|
||||
|
||||
//memcpy(idat, kvap, tocopy);
|
||||
#if 0
|
||||
for (j = 0 ; j < blks ; j++) {
|
||||
piv[j] = idat[(tocopy-1)-blks];
|
||||
}
|
||||
for (j = tocopy-1 ; j >= blks ; j --) {
|
||||
idat[j] = kvap[j] ^ idat[j - blks];
|
||||
}
|
||||
for (j = 0 ; j < blks ; j++) {
|
||||
idat[j] = kvap[j] ^ ivp[j];
|
||||
ivp[j] = piv[j];
|
||||
}
|
||||
#else
|
||||
#define u32blks ((blks)/sizeof(u_int32_t))
|
||||
#define p32(x) ((u_int32_t*)x)
|
||||
for (j = 0 ; j < blks/sizeof(u_int32_t) ; j++) {
|
||||
p32(piv)[j] = p32(idat)[(tocopy/sizeof(u_int32_t))-1-u32blks];
|
||||
}
|
||||
for (j = (tocopy/sizeof(u_int32_t))-1 ; j >= u32blks ; j --) {
|
||||
p32(idat)[j] = p32(kvap)[j] ^ p32(idat)[j - u32blks];
|
||||
}
|
||||
for (j = 0 ; j < u32blks ; j++) {
|
||||
p32(idat)[j] = p32(kvap)[j] ^ p32(ivp)[j];
|
||||
p32(ivp)[j] = p32(piv)[j];
|
||||
}
|
||||
#undef p32
|
||||
#undef u32blks
|
||||
#endif
|
||||
|
||||
bus_dmamap_unload(sw->sc_dmatag, sw->sc_dmamap);
|
||||
bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ);
|
||||
bus_dmamem_free(sw->sc_dmatag, &segs, 1);
|
||||
|
||||
idat += tocopy;
|
||||
count += tocopy;
|
||||
k += tocopy;
|
||||
|
||||
@ -80,6 +80,7 @@ struct rdfpga_softc {
|
||||
#define RDFPGA_MASK_DMA_CTRL_GCM 0x08000000
|
||||
#define RDFPGA_MASK_DMA_CTRL_AES 0x04000000
|
||||
#define RDFPGA_MASK_DMA_CTRL_CBC 0x02000000
|
||||
#define RDFPGA_MASK_DMA_CTRL_DEC 0x01000000
|
||||
#define RDFPGA_MASK_DMA_CTRL_BLKCNT 0x00000FFF
|
||||
#define RDFPGA_VAL_DMA_MAX_BLKCNT 4096
|
||||
#define RDFPGA_VAL_DMA_MAX_SZ (RDFPGA_VAL_DMA_MAX_BLKCNT*16)
|
||||
|
||||
@ -120,6 +120,7 @@ ENTITY SBusFSM is
|
||||
constant DMA_CTRL_GCM_IDX : integer := 27;
|
||||
constant DMA_CTRL_AES_IDX : integer := 26;
|
||||
constant DMA_CTRL_CBC_IDX : integer := 25;
|
||||
constant DMA_CTRL_DEC_IDX : integer := 24;
|
||||
|
||||
constant AES128_CTRL_START_IDX : integer := 31;
|
||||
constant AES128_CTRL_BUSY_IDX : integer := 30;
|
||||
@ -1134,9 +1135,9 @@ BEGIN
|
||||
fifo_toaes_din <=
|
||||
'0' & -- !iskey
|
||||
'0' & -- keylen, ignored
|
||||
'1' & -- encdec, enc for now
|
||||
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec
|
||||
'0' & -- cbc
|
||||
'1' & -- internal cbc
|
||||
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- internal cbc; HACKISH - enable for encrypt
|
||||
x"00000000000000000000000000000000" &
|
||||
REGISTERS(REG_INDEX_AES128_DATA1) & REGISTERS(REG_INDEX_AES128_DATA2) &
|
||||
REGISTERS(REG_INDEX_AES128_DATA3) & BUF_DATA_I;
|
||||
@ -1145,7 +1146,7 @@ BEGIN
|
||||
fifo_toaes_din <=
|
||||
'0' & -- !iskey
|
||||
'0' & -- keylen, ignored
|
||||
'1' & -- encdec, enc for now
|
||||
(NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec
|
||||
'0' & -- cbc
|
||||
'0' & -- internal cbc
|
||||
x"00000000000000000000000000000000" &
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user