home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 81 / IOPROG_81.ISO / soft / Codice / SymmeticEncryption.ZIP / SymmetricEncriptionUnit.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-04-12  |  17.1 KB  |  501 lines

  1. //---------------------------------------------------------------------------
  2. //  C++ Hardware Key Programmer 1.0
  3. //  Copyright 2004 spuntosoft@tiscali.it
  4. //---------------------------------------------------------------------------
  5. #include <vcl.h>
  6. #include <dir.h>
  7.  
  8. #pragma hdrstop
  9.  
  10. #include "SymmetricEncriptionUnit.h"
  11. //---------------------------------------------------------------------------
  12. #pragma package(smart_init)
  13. #pragma link "SpuntoLedComponent"
  14. #pragma link "TSpuntoHardwarePortIO_unit"
  15. #pragma link "CSPIN"
  16. #pragma resource "*.dfm"
  17. unsigned short datain, dataout, bitin, bitout, Contabit, CombaseAddress, MCRAddress, LCRAddress, MSRAddress;
  18. bool WaveFormHigh;
  19. int DefaultDelay;
  20.  
  21. TSpuntoHardwareKeyProgrammerForm *SpuntoHardwareKeyProgrammerForm;
  22.  
  23. //---------------------------------------------------------------------------
  24.  
  25. void TSpuntoHardwareKeyProgrammerForm::HardwareDeviceSerialON(unsigned short HardwareDeviceComPort)
  26. {
  27. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+1,0x00);      //INT OFF
  28. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+3,0x80);      //DLAB ON
  29. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+0,0x80);      //300 BPS  LB
  30. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+1,0x01);      //300 BPS  HB
  31. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+3,0x03);      //8BITS NP 1STOP
  32. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+2,0xC7);      //FIFO REGISTER
  33. SpuntoHardwarePort->WritePort(HardwareDeviceComPort+4,0x0B);      //DTR,RTS OUT2 ON
  34. SpuntoHardwarePort->WritePort(HardwareDeviceComPort,0xFF);        //SENDS FF TO COM PORT
  35. }
  36. //---------------------------------------------------------------------------
  37. byte TSpuntoHardwareKeyProgrammerForm::EEPROMCheck(void) //EEPROM Check
  38. {
  39.  
  40. int  KeyAddress;
  41. byte WrittenData, KeyData;
  42.  
  43.   KeyAddress=KeyAddressSpinEdit->Value;
  44.   KeyData=KeyDataSpinEdit->Value;
  45.  
  46.   WrittenData=Read_data(KeyAddress);         //Reads written data
  47.  
  48.   if (WrittenData==KeyData)                  //Verifies written data
  49.    {
  50.      KeyOKLabel->Caption="OK";               //Verification passed
  51.      AckLabel->Caption="SUCCESSFUL";
  52.      KeyOKLabel->Font->Color=clGreen;
  53.      EEPROMStatusLabel->Caption="READY";
  54.    }
  55.    else
  56.    {
  57.      KeyOKLabel->Caption="FAULT";            //Verification not passed
  58.      AckLabel->Caption="NOT SUCCESSFUL";           
  59.      KeyOKLabel->Font->Color=clRed;
  60.      EEPROMStatusLabel->Caption="NOT PRESENT";
  61.    }
  62.  
  63.    return(WrittenData);
  64. }
  65. //---------------------------------------------------------------------------
  66. void TSpuntoHardwareKeyProgrammerForm::TheDelay(int DelayUnit)         //Delay
  67. {
  68. int I;
  69.   for(I=DelayUnit; I>=0; I--) {}
  70. }
  71.  
  72. //---------------------------------------------------------------------------
  73. void TSpuntoHardwareKeyProgrammerForm::Low_SDA(void)
  74. {                 // Sets SDA LOW
  75.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  76.   datain=(datain & 0xFE);      // SDA=DTR bit to 0
  77.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  78.   TheDelay(DefaultDelay);
  79. }
  80. //---------------------------------------------------------------------------
  81. void TSpuntoHardwareKeyProgrammerForm::High_SDA(void)
  82. {                 // Sets SDA High
  83.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  84.   datain=(datain | 0x01);      // SDA=DTR bit to 1
  85.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  86.   TheDelay(DefaultDelay);
  87. }
  88. //---------------------------------------------------------------------------
  89. void TSpuntoHardwareKeyProgrammerForm::Low_SCL(void)
  90. {                 // Sets SCL LOW
  91.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  92.   datain=(datain & 0xFD);      // SCL=RTS bit to 0
  93.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  94.   TheDelay(DefaultDelay);
  95. }
  96. //---------------------------------------------------------------------------
  97. void TSpuntoHardwareKeyProgrammerForm::High_SCL(void)
  98. {                 // Sets SCL High
  99.   datain=SpuntoHardwarePort->ReadPort(MCRAddress);
  100.   datain=(datain | 0x02);      // SCL=RTS bit to 1
  101.   SpuntoHardwarePort->WritePort(MCRAddress,datain);
  102.   TheDelay(DefaultDelay);
  103. }
  104. //---------------------------------------------------------------------------
  105. void TSpuntoHardwareKeyProgrammerForm::Start(void)
  106. {
  107. // Start condition: SDA Low SCL High
  108.    High_SDA();
  109.    High_SCL();
  110.    Low_SDA();
  111.    Low_SCL();
  112. }
  113. //---------------------------------------------------------------------------
  114. void TSpuntoHardwareKeyProgrammerForm::Stop(void)
  115. {
  116. // Stop condition: SDA High SCL High
  117.    Low_SDA();
  118.    High_SCL();
  119.    High_SDA();
  120.    Low_SCL();
  121.    Low_SDA();
  122. }
  123. //---------------------------------------------------------------------------
  124. void TSpuntoHardwareKeyProgrammerForm::Output_byte(byte Out_byte)
  125. {
  126. //
  127.    int I;
  128.    for(I=7; I>=0; I--)
  129.    {
  130.          bitout=Out_byte >>I;
  131.      if ((bitout & 0x01) == 0)
  132.      {
  133.         Low_SDA();
  134.      }
  135.      else
  136.      {
  137.         High_SDA();
  138.      }
  139.      High_SCL();
  140.      Low_SCL();
  141.    }
  142. }
  143. //---------------------------------------------------------------------------
  144. byte TSpuntoHardwareKeyProgrammerForm::Input_byte(void)
  145. {
  146. //
  147.    byte Inp_byte=0x00;
  148.    int I;
  149.    High_SDA();
  150.    for (I=0; I<8; I++)
  151.    {
  152.      High_SCL();
  153.          TheDelay(1000);
  154.          datain=SpuntoHardwarePort->ReadPort(MSRAddress);
  155.          bitin=(datain & 0x10);
  156.          bitin=bitin>>4;
  157.          Inp_byte=(Inp_byte | bitin);
  158.          if (I<7) {Inp_byte=Inp_byte << 1;}
  159.      Low_SCL();
  160.    }
  161.  
  162.    return(Inp_byte);
  163. }
  164.  
  165. //---------------------------------------------------------------------------
  166. byte TSpuntoHardwareKeyProgrammerForm::Acknowledge(void)
  167. {
  168. //
  169.    High_SDA();
  170.    High_SCL();
  171.    datain=SpuntoHardwarePort->ReadPort(MSRAddress);
  172.    bitin=(datain & 0x10);
  173.    bitin=bitin>>4;
  174.    if (bitin==0)
  175.    {
  176.      bitout=0;
  177.      AckLabel->Caption="SUCCESSFUL";
  178.      EEPROMStatusLabel->Caption="READY";
  179.    }
  180.    else
  181.    {
  182.      bitout=1;
  183.      AckLabel->Caption="NOT SUCCESSFUL";
  184.      EEPROMStatusLabel->Caption="NOT PRESENT";
  185.    }
  186.    Low_SCL();
  187.    return(bitout);
  188. }
  189. //---------------------------------------------------------------------------
  190. void TSpuntoHardwareKeyProgrammerForm::Write_data(int Address, byte Data)
  191. {
  192. //
  193. byte Control_Byte, Memory_Block;
  194.  
  195.    Memory_Block=Address >>8;
  196.    Memory_Block=Memory_Block <<1;
  197.    Control_Byte=0xa0;                             //1010 0000 Control Code 1010
  198.    Control_Byte=(Control_Byte | Memory_Block);    //Sets the control byte
  199.    Start();                                       //Start bit
  200.    Output_byte(Control_Byte);                     //Control Byte
  201.    Acknowledge();
  202.    Output_byte(Address&0xff);                     //Address Byte
  203.    Acknowledge();
  204.    Output_byte(Data);                               //Data Byte
  205.    Acknowledge();                                 //Stop bit
  206.    Stop();
  207. }
  208.  
  209. //---------------------------------------------------------------------------
  210. byte TSpuntoHardwareKeyProgrammerForm::Read_data(int Address)
  211. {
  212. //
  213. byte Control_Byte, Memory_Block, DataValue;
  214.    Memory_Block=Address >>8;
  215.    Memory_Block=Memory_Block <<1;
  216.    Control_Byte=0xa0;                             //1010 0000 Control Code 1010
  217.    Control_Byte=(Control_Byte | Memory_Block);    //Sets the control byte
  218.    Start();
  219.    Output_byte(Control_Byte);
  220.    Acknowledge();
  221.    Output_byte(Address&0xff);
  222.    Acknowledge();
  223.    Start();
  224.    Control_Byte=(Control_Byte | 0x01);          //Sets R-/W bit to 1 (Read)
  225.    Output_byte(Control_Byte);
  226.    Acknowledge();
  227.    DataValue=Input_byte();
  228.    Stop();
  229.  
  230.    return(DataValue);
  231.  }
  232.  
  233. //---------------------------------------------------------------------------
  234. __fastcall TSpuntoHardwareKeyProgrammerForm::TSpuntoHardwareKeyProgrammerForm(TComponent* Owner)
  235.         : TForm(Owner)
  236. {
  237. }
  238.  
  239.  
  240. //---------------------------------------------------------------------------
  241. void __fastcall TSpuntoHardwareKeyProgrammerForm::PeriodTrackBarChange(TObject *Sender)
  242. {                           //PeriodTrackbar management
  243. DefaultDelay=(PeriodTrackBar->Position)*100;
  244. Label1->Caption = IntToStr(PeriodTrackBar->Position);
  245. }
  246. //---------------------------------------------------------------------------
  247. void __fastcall TSpuntoHardwareKeyProgrammerForm::FormCreate(TObject *Sender)
  248. {
  249.   // Sets the labels
  250.   Label1->Caption = IntToStr(PeriodTrackBar->Position);
  251.   EncryptionStatusLabel->Caption="Not Verified";      
  252.   // Default (COM1) Port setup
  253.   CombaseAddress=0x03f8;
  254.   MCRAddress=CombaseAddress+4;
  255.   LCRAddress=CombaseAddress+3;
  256.   MSRAddress=CombaseAddress+6;
  257.   //Ancilliaries
  258.   Contabit=0;
  259.   DefaultDelay=(PeriodTrackBar->Position)*100;
  260.   //EEPROM Check
  261.   EEPROMCheck();
  262.   // String Grid Settings
  263.   StringGrid1->RowCount=2;
  264.   StringGrid1->ColWidths[0] = 40;
  265.   StringGrid1->ColWidths[3] = 90;
  266.   StringGrid1->ColWidths[4] = 90;
  267.   StringGrid1->Cells[1][0]="Clear Text";
  268.   StringGrid1->Cells[2][0]="ASCII Text";
  269.   StringGrid1->Cells[3][0]="Encrypted Text";
  270.   StringGrid1->Cells[4][0]="Encrypted ASCII";
  271.   }
  272. //---------------------------------------------------------------------------
  273. void __fastcall TSpuntoHardwareKeyProgrammerForm::PowerONSpeedButtonClick(TObject *Sender)
  274. {                               //Power ON
  275.  
  276. }
  277. //---------------------------------------------------------------------------
  278. void __fastcall TSpuntoHardwareKeyProgrammerForm::COM1RadioButtonClick(TObject *Sender)
  279. {
  280. // COM1 Port setup
  281.   CombaseAddress=0x03f8;
  282.   MCRAddress=CombaseAddress+4;
  283.   LCRAddress=CombaseAddress+3;
  284.   MSRAddress=CombaseAddress+6;
  285. }
  286. //---------------------------------------------------------------------------
  287.  
  288. void __fastcall TSpuntoHardwareKeyProgrammerForm::COM2RadioButtonClick(TObject *Sender)
  289. {
  290. // COM2 Port setup
  291.   CombaseAddress=0x02f8;
  292.   MCRAddress=CombaseAddress+4;
  293.   LCRAddress=CombaseAddress+3;
  294.   MSRAddress=CombaseAddress+6;
  295. }
  296. //---------------------------------------------------------------------------
  297. void __fastcall TSpuntoHardwareKeyProgrammerForm::WriteEEPROMClick(
  298.       TObject *Sender)
  299. {
  300. int ProgramAddress;
  301. byte ProgramData, WrittenData, IsEEPROMReady;
  302.  
  303.   ProgramAddress=CSpinEditAddress->Value;
  304.   ProgramData=CSpinEditData->Value;
  305.  
  306.   Write_data(ProgramAddress, ProgramData);       //Writes the EEPROM
  307.   WrittenData=Read_data(ProgramAddress);         //Reads written data
  308.  
  309.   if ((WrittenData==ProgramData)& ( WrittenData!=0)) //Verifies written data
  310.    {
  311.      AckLabel->Caption="SUCCESSFUL";
  312.      EEPROMStatusLabel->Caption="READY";
  313.    }
  314.    else
  315.    {
  316.      AckLabel->Caption="NOT SUCCESSFUL";
  317.      EEPROMStatusLabel->Caption="NOT PRESENT";
  318.    }
  319. }
  320. //---------------------------------------------------------------------------
  321.  
  322.  
  323. void __fastcall TSpuntoHardwareKeyProgrammerForm::SCL_LOW_ButtonClick(TObject *Sender)
  324. {
  325.  Low_SCL();
  326. }                   
  327. //---------------------------------------------------------------------------
  328.  
  329. void __fastcall TSpuntoHardwareKeyProgrammerForm::SDA_LOW_ButtonClick(
  330.       TObject *Sender)
  331. {
  332.  Low_SDA();
  333. }
  334. //---------------------------------------------------------------------------
  335.  
  336. void __fastcall TSpuntoHardwareKeyProgrammerForm::SCL_HIGH_ButtonClick(
  337.       TObject *Sender)
  338. {
  339.  High_SCL();        
  340. }
  341. //---------------------------------------------------------------------------
  342.  
  343. void __fastcall TSpuntoHardwareKeyProgrammerForm::SDA_HIGH_ButtonClick(
  344.       TObject *Sender)
  345. {
  346.  High_SDA();        
  347. }
  348. //---------------------------------------------------------------------------
  349.  
  350. void __fastcall TSpuntoHardwareKeyProgrammerForm::HardwareKeyONButtonClick(
  351.       TObject *Sender)
  352. {
  353.    HardwareDeviceSerialON(CombaseAddress);
  354. }
  355. //---------------------------------------------------------------------------
  356.  
  357. void __fastcall TSpuntoHardwareKeyProgrammerForm::ReadEEPROMButtonClick(
  358.       TObject *Sender)
  359. {
  360. int QueryAddress;
  361. Byte FirstByteRead,SecondByteRead;
  362.  
  363. QueryAddress=CSpinEditAddress->Value;
  364. FirstByteRead=Read_data(QueryAddress);              //Reads EEPROM twice
  365. SecondByteRead=Read_data(QueryAddress);
  366.  
  367.   if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0)) //Verifies read data
  368.    {
  369.      AckLabel->Caption="SUCCESSFUL";                //Verification passed
  370.      EEPROMStatusLabel->Caption="READY";
  371.      CSpinEditData->Font->Color=clWindowText;
  372.    }
  373.    else
  374.    {
  375.      AckLabel->Caption="NOT SUCCESSFUL";            //Verification not passed
  376.      EEPROMStatusLabel->Caption="NOT PRESENT";
  377.      CSpinEditData->Font->Color=clRed;
  378.    }
  379.  
  380. CSpinEditData->Value=SecondByteRead;
  381. }
  382. //---------------------------------------------------------------------------
  383.  
  384.  
  385. void __fastcall TSpuntoHardwareKeyProgrammerForm::CheckEEPROMButtonClick(
  386.       TObject *Sender)
  387. {
  388. EEPROMCheck();
  389. }
  390. //---------------------------------------------------------------------------
  391.  
  392. void __fastcall TSpuntoHardwareKeyProgrammerForm::CSpinEditAddressChange(
  393.       TObject *Sender)
  394. {
  395. int QueryAddress;
  396. Byte FirstByteRead,SecondByteRead;
  397.  
  398. QueryAddress=CSpinEditAddress->Value;
  399. FirstByteRead=Read_data(QueryAddress);              //Reads EEPROM twice
  400. SecondByteRead=Read_data(QueryAddress);
  401.  
  402.   if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0)) //Verifies read data
  403.    {
  404.      AckLabel->Caption="SUCCESSFUL";                //Verification passed
  405.      EEPROMStatusLabel->Caption="READY";
  406.      CSpinEditData->Font->Color=clWindowText;
  407.    }
  408.    else
  409.    {
  410.      AckLabel->Caption="NOT SUCCESSFUL";            //Verification not passed
  411.      EEPROMStatusLabel->Caption="NOT PRESENT";
  412.      CSpinEditData->Font->Color=clRed;
  413.    }
  414.  
  415. CSpinEditData->Value=SecondByteRead;
  416. }
  417. //---------------------------------------------------------------------------
  418.  
  419.  
  420. void __fastcall TSpuntoHardwareKeyProgrammerForm::ExecuteEncryptionClick(
  421.       TObject *Sender)
  422. {
  423.   int ClearTextFileHandle, EncryptedFileHandle;    //Clear and Encrypted Buffer Handlers
  424.   int ClearTextFileLenght;
  425.   int ClearTextCharRead;
  426.   int KeyBytePosition;
  427.   char *ClearTextBuffer;                           //Clear Buffer
  428.   char *EncryptedBuffer;                           //Encrypted Buffer
  429.   Byte FirstByteRead,SecondByteRead;               //Hardware Key Temp Bytes
  430.   char AltFileName[MAXFILE+4];                     //Alternate filename extension
  431.     
  432.   if (OpenDialog1->Execute())                      //Opens the file to be encrypted
  433.   {
  434.     try
  435.     {
  436.       ClearTextFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead); //Opens the file
  437.       ClearTextFileLenght = FileSeek(ClearTextFileHandle,0,2);
  438.       FileSeek(ClearTextFileHandle,0,0);
  439.       ClearTextBuffer = new char[ClearTextFileLenght+1];  //Creates the Clear buffer
  440.       EncryptedBuffer = new char[ClearTextFileLenght+1];  //Creates the Encrypted Buffer
  441.       ClearTextCharRead = FileRead(ClearTextFileHandle, ClearTextBuffer, ClearTextFileLenght);
  442.       FileClose(ClearTextFileHandle);                     //Closes the clear text file
  443.  
  444.       StringGrid1->RowCount=2;
  445.       for (int i=0;i<ClearTextCharRead;i++)
  446.       {
  447.         KeyBytePosition =  (i % 2048);                    //Insert your "fancy" KEY algorithm here
  448.         FirstByteRead=Read_data(KeyBytePosition);         //Reads EEPROM twice
  449.         SecondByteRead=Read_data(KeyBytePosition);
  450.  
  451.         if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0))
  452.         {
  453.            EncryptionStatusLabel->Caption="OK";           //Verifies crypto key                                     //Verification passed
  454.         }
  455.         else
  456.         {
  457.            EncryptionStatusLabel->Caption="CRYPTO FAULT";      //Crypto key verification not passed
  458.            Application->MessageBox("No Crypto found: the key might be not present, empty or corrupted", "Crypto code Error", IDOK);
  459.         }
  460.  
  461.         EncryptedBuffer[i] = (ClearTextBuffer[i] ^ FirstByteRead); //Insert your "fancy" CRYPTO algorithm here
  462.         StringGrid1->RowCount += 1;
  463.         StringGrid1->Cells[0][i+1] = IntToStr(KeyBytePosition);         //Row number
  464.         StringGrid1->Cells[1][i+1] = ClearTextBuffer[i];                //Clear Text
  465.         StringGrid1->Cells[2][i+1] = IntToStr((int)ClearTextBuffer[i]); //Clear ASCII
  466.         StringGrid1->Cells[3][i+1] = EncryptedBuffer[i];                //Encrypted text
  467.         StringGrid1->Cells[4][i+1] = IntToStr((int)EncryptedBuffer[i]); //Encrypted ASCII
  468.       }
  469.  
  470.       delete [] ClearTextBuffer;
  471.     }
  472.     catch(...)
  473.     {
  474.       Application->MessageBox("Cannot execute the requested operation", "File Error", IDOK);
  475.     }
  476.   }
  477.  
  478.   if (SaveDialog1->Execute())          //Save the Encrypted file
  479.   {
  480.     try
  481.     {
  482.         if (FileExists(SaveDialog1->FileName))    //If files already exists uses the ext. 'BAK'
  483.         {
  484.         fnsplit(SaveDialog1->FileName.c_str(), 0, 0, AltFileName, 0);
  485.         strcat(AltFileName, ".BAK");
  486.         RenameFile(SaveDialog1->FileName, AltFileName);
  487.         }
  488.          EncryptedFileHandle = FileCreate(SaveDialog1->FileName);               //Creates the file
  489.          FileWrite(EncryptedFileHandle, EncryptedBuffer, ClearTextFileLenght);  //Save
  490.          FileClose(EncryptedFileHandle);                                        //Close
  491.       }
  492.     catch(...)
  493.     {
  494.       Application->MessageBox("Cannot execute the requested operation", "File Error", IDOK);
  495.     }
  496.     delete [] EncryptedBuffer;                   //Deletes the encrypted buffer
  497.   }
  498. }
  499. //---------------------------------------------------------------------------
  500.  
  501.