void vndencrypt(struct vnd_softc *sc, caddr_t addr, size_t size, daddr_t off, int encrypt) { int i, bsize; u_char iv[8]; bsize = dbtob(1); for (i = 0; i < size/bsize; i++) { memset(iv, 0, sizeof(iv)); memcpy(iv, &off, sizeof(off)); blf_ecb_encrypt(sc->sc_keyctx, iv, sizeof(iv)); if (encrypt) blf_cbc_encrypt(sc->sc_keyctx, iv, addr, bsize); else blf_cbc_decrypt(sc->sc_keyctx, iv, addr, bsize); addr += bsize; off++; } }
static int bf_encrypt(PX_Cipher * c, const uint8 *data, unsigned dlen, uint8 *res) { struct int_ctx *cx = (struct int_ctx *) c->ptr; if (dlen == 0) return 0; if (dlen & 7) return PXE_NOTBLOCKSIZE; memcpy(res, data, dlen); switch (cx->mode) { case MODE_ECB: blf_ecb_encrypt(&cx->ctx.bf, res, dlen); break; case MODE_CBC: blf_cbc_encrypt(&cx->ctx.bf, cx->iv, res, dlen); memcpy(cx->iv, res + dlen - 8, 8); } return 0; }