///////////////////////////////////////////////////////////////////////////// // FILE : des3.c // // DESCRIPTION : Crypto CP interfaces: // // CPEncrypt // // CPDecrypt // // AUTHOR : // // HISTORY : // // Sep 13 1996 jeffspel Created // // // // Copyright (C) 1993 Microsoft Corporation All Rights Reserved // ///////////////////////////////////////////////////////////////////////////// //#include #include "precomp.h" #include "nt_rsa.h" #include "des3.h" static BYTE l_ParityTable[] = {0x00,0x01,0x01,0x02,0x01,0x02,0x02,0x03, 0x01,0x02,0x02,0x03,0x02,0x03,0x03,0x04}; // In des2key.c: // // Fill in the DES3Table structs with the decrypt and encrypt // key expansions. // // Assumes that the second parameter points to 2 * DES_BLOCKLEN // bytes of key. // // void des2key( PDES3TABLE pDES3Table, PBYTE pbKey) { deskey(&pDES3Table->keytab1, pbKey); deskey(&pDES3Table->keytab2, pbKey+DES_KEYSIZE); CopyMemory(&pDES3Table->keytab3, &pDES3Table->keytab1, DES_TABLESIZE); } // In des3key.c: // // Fill in the DES3Table structs with the decrypt and encrypt // key expansions. // // Assumes that the second parameter points to 3 * DES_BLOCKLEN // bytes of key. // // void des3key( PDES3TABLE pDES3Table, PBYTE pbKey) { deskey(&pDES3Table->keytab1, pbKey); deskey(&pDES3Table->keytab2, pbKey+DES_KEYSIZE); deskey(&pDES3Table->keytab3, pbKey+2*DES_KEYSIZE); } // // Encrypt or decrypt with the key in DES3Table // void des3( PBYTE pbOut, PBYTE pbIn, void *pKey, int op) { PDES3TABLE pDES3Table = (PDES3TABLE)pKey; BYTE rgbEnc1[DES_BLOCKLEN]; BYTE rgbEnc2[DES_BLOCKLEN]; if (ENCRYPT == op) // encrypt case { des(rgbEnc1, pbIn, &pDES3Table->keytab1, ENCRYPT); des(rgbEnc2, rgbEnc1, &pDES3Table->keytab2, DECRYPT); memset(rgbEnc1, 0xFF, DES_BLOCKLEN); des(pbOut, rgbEnc2, &pDES3Table->keytab3, ENCRYPT); memset(rgbEnc2, 0xFF, DES_BLOCKLEN); } else // decrypt case { des(rgbEnc1, pbIn, &pDES3Table->keytab3, DECRYPT); des(rgbEnc2, rgbEnc1, &pDES3Table->keytab2, ENCRYPT); memset(rgbEnc1, 0xFF, DES_BLOCKLEN); des(pbOut, rgbEnc2, &pDES3Table->keytab1, DECRYPT); memset(rgbEnc2, 0xFF, DES_BLOCKLEN); } } // // set the parity on the DES key to be odd // void desparity( PBYTE pbKey, DWORD cbKey) { DWORD i; for (i=0;i>4] + l_ParityTable[pbKey[i]&0x0F]) % 2)) pbKey[i] = (BYTE)(pbKey[i] ^ 0x01); } }