+static void des_cbc3_decrypt(unsigned char *dest, const unsigned char *src,
+ unsigned int len, DESContext *scheds) {
+ word32 out[2], iv0, iv1, xL, xR;
+ unsigned int i;
+
+ assert((len & 7) == 0);
+
+ iv0 = scheds->div0;
+ iv1 = scheds->div1;
+ for (i = 0; i < len; i += 8) {
+ xL = GET_32BIT_MSB_FIRST(src); src += 4;
+ xR = GET_32BIT_MSB_FIRST(src); src += 4;
+ des_decipher(out, xL, xR, &scheds[2]);
+ des_encipher(out, out[0], out[1], &scheds[1]);
+ des_decipher(out, out[0], out[1], &scheds[0]);
+ iv0 ^= out[0];
+ iv1 ^= out[1];
+ PUT_32BIT_MSB_FIRST(dest, iv0); dest += 4;
+ PUT_32BIT_MSB_FIRST(dest, iv1); dest += 4;
+ iv0 = xL;
+ iv1 = xR;
+ }
+ scheds->div0 = iv0;
+ scheds->div1 = iv1;
+}
+