+ 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;
+}
+
+static DESContext cskeys[3], sckeys[3];
+
+static void des3_cskey(unsigned char *key) {
+ des_key_setup(GET_32BIT_MSB_FIRST(key),
+ GET_32BIT_MSB_FIRST(key+4), &cskeys[0]);
+ des_key_setup(GET_32BIT_MSB_FIRST(key+8),
+ GET_32BIT_MSB_FIRST(key+12), &cskeys[1]);
+ des_key_setup(GET_32BIT_MSB_FIRST(key+16),
+ GET_32BIT_MSB_FIRST(key+20), &cskeys[2]);
+ logevent("Initialised triple-DES client->server encryption");
+}
+
+static void des3_csiv(unsigned char *key) {
+ cskeys[0].eiv0 = GET_32BIT_MSB_FIRST(key);
+ cskeys[0].eiv1 = GET_32BIT_MSB_FIRST(key+4);
+}
+
+static void des3_sciv(unsigned char *key) {
+ sckeys[0].div0 = GET_32BIT_MSB_FIRST(key);
+ sckeys[0].div1 = GET_32BIT_MSB_FIRST(key+4);
+}
+
+static void des3_sckey(unsigned char *key) {