home *** CD-ROM | disk | FTP | other *** search
- //---------------------------------------------------------------------------
- // C++ Hardware Key Programmer 1.0
- // Copyright 2004 spuntosoft@tiscali.it
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #include <dir.h>
-
- #pragma hdrstop
-
- #include "SymmetricEncriptionUnit.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "SpuntoLedComponent"
- #pragma link "TSpuntoHardwarePortIO_unit"
- #pragma link "CSPIN"
- #pragma resource "*.dfm"
- unsigned short datain, dataout, bitin, bitout, Contabit, CombaseAddress, MCRAddress, LCRAddress, MSRAddress;
- bool WaveFormHigh;
- int DefaultDelay;
-
- TSpuntoHardwareKeyProgrammerForm *SpuntoHardwareKeyProgrammerForm;
-
- //---------------------------------------------------------------------------
-
- void TSpuntoHardwareKeyProgrammerForm::HardwareDeviceSerialON(unsigned short HardwareDeviceComPort)
- {
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+1,0x00); //INT OFF
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+3,0x80); //DLAB ON
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+0,0x80); //300 BPS LB
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+1,0x01); //300 BPS HB
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+3,0x03); //8BITS NP 1STOP
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+2,0xC7); //FIFO REGISTER
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort+4,0x0B); //DTR,RTS OUT2 ON
- SpuntoHardwarePort->WritePort(HardwareDeviceComPort,0xFF); //SENDS FF TO COM PORT
- }
- //---------------------------------------------------------------------------
- byte TSpuntoHardwareKeyProgrammerForm::EEPROMCheck(void) //EEPROM Check
- {
-
- int KeyAddress;
- byte WrittenData, KeyData;
-
- KeyAddress=KeyAddressSpinEdit->Value;
- KeyData=KeyDataSpinEdit->Value;
-
- WrittenData=Read_data(KeyAddress); //Reads written data
-
- if (WrittenData==KeyData) //Verifies written data
- {
- KeyOKLabel->Caption="OK"; //Verification passed
- AckLabel->Caption="SUCCESSFUL";
- KeyOKLabel->Font->Color=clGreen;
- EEPROMStatusLabel->Caption="READY";
- }
- else
- {
- KeyOKLabel->Caption="FAULT"; //Verification not passed
- AckLabel->Caption="NOT SUCCESSFUL";
- KeyOKLabel->Font->Color=clRed;
- EEPROMStatusLabel->Caption="NOT PRESENT";
- }
-
- return(WrittenData);
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::TheDelay(int DelayUnit) //Delay
- {
- int I;
- for(I=DelayUnit; I>=0; I--) {}
- }
-
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::Low_SDA(void)
- { // Sets SDA LOW
- datain=SpuntoHardwarePort->ReadPort(MCRAddress);
- datain=(datain & 0xFE); // SDA=DTR bit to 0
- SpuntoHardwarePort->WritePort(MCRAddress,datain);
- TheDelay(DefaultDelay);
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::High_SDA(void)
- { // Sets SDA High
- datain=SpuntoHardwarePort->ReadPort(MCRAddress);
- datain=(datain | 0x01); // SDA=DTR bit to 1
- SpuntoHardwarePort->WritePort(MCRAddress,datain);
- TheDelay(DefaultDelay);
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::Low_SCL(void)
- { // Sets SCL LOW
- datain=SpuntoHardwarePort->ReadPort(MCRAddress);
- datain=(datain & 0xFD); // SCL=RTS bit to 0
- SpuntoHardwarePort->WritePort(MCRAddress,datain);
- TheDelay(DefaultDelay);
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::High_SCL(void)
- { // Sets SCL High
- datain=SpuntoHardwarePort->ReadPort(MCRAddress);
- datain=(datain | 0x02); // SCL=RTS bit to 1
- SpuntoHardwarePort->WritePort(MCRAddress,datain);
- TheDelay(DefaultDelay);
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::Start(void)
- {
- // Start condition: SDA Low SCL High
- High_SDA();
- High_SCL();
- Low_SDA();
- Low_SCL();
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::Stop(void)
- {
- // Stop condition: SDA High SCL High
- Low_SDA();
- High_SCL();
- High_SDA();
- Low_SCL();
- Low_SDA();
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::Output_byte(byte Out_byte)
- {
- //
- int I;
- for(I=7; I>=0; I--)
- {
- bitout=Out_byte >>I;
- if ((bitout & 0x01) == 0)
- {
- Low_SDA();
- }
- else
- {
- High_SDA();
- }
- High_SCL();
- Low_SCL();
- }
- }
- //---------------------------------------------------------------------------
- byte TSpuntoHardwareKeyProgrammerForm::Input_byte(void)
- {
- //
- byte Inp_byte=0x00;
- int I;
- High_SDA();
- for (I=0; I<8; I++)
- {
- High_SCL();
- TheDelay(1000);
- datain=SpuntoHardwarePort->ReadPort(MSRAddress);
- bitin=(datain & 0x10);
- bitin=bitin>>4;
- Inp_byte=(Inp_byte | bitin);
- if (I<7) {Inp_byte=Inp_byte << 1;}
- Low_SCL();
- }
-
- return(Inp_byte);
- }
-
- //---------------------------------------------------------------------------
- byte TSpuntoHardwareKeyProgrammerForm::Acknowledge(void)
- {
- //
- High_SDA();
- High_SCL();
- datain=SpuntoHardwarePort->ReadPort(MSRAddress);
- bitin=(datain & 0x10);
- bitin=bitin>>4;
- if (bitin==0)
- {
- bitout=0;
- AckLabel->Caption="SUCCESSFUL";
- EEPROMStatusLabel->Caption="READY";
- }
- else
- {
- bitout=1;
- AckLabel->Caption="NOT SUCCESSFUL";
- EEPROMStatusLabel->Caption="NOT PRESENT";
- }
- Low_SCL();
- return(bitout);
- }
- //---------------------------------------------------------------------------
- void TSpuntoHardwareKeyProgrammerForm::Write_data(int Address, byte Data)
- {
- //
- byte Control_Byte, Memory_Block;
-
- Memory_Block=Address >>8;
- Memory_Block=Memory_Block <<1;
- Control_Byte=0xa0; //1010 0000 Control Code 1010
- Control_Byte=(Control_Byte | Memory_Block); //Sets the control byte
- Start(); //Start bit
- Output_byte(Control_Byte); //Control Byte
- Acknowledge();
- Output_byte(Address&0xff); //Address Byte
- Acknowledge();
- Output_byte(Data); //Data Byte
- Acknowledge(); //Stop bit
- Stop();
- }
-
- //---------------------------------------------------------------------------
- byte TSpuntoHardwareKeyProgrammerForm::Read_data(int Address)
- {
- //
- byte Control_Byte, Memory_Block, DataValue;
- Memory_Block=Address >>8;
- Memory_Block=Memory_Block <<1;
- Control_Byte=0xa0; //1010 0000 Control Code 1010
- Control_Byte=(Control_Byte | Memory_Block); //Sets the control byte
- Start();
- Output_byte(Control_Byte);
- Acknowledge();
- Output_byte(Address&0xff);
- Acknowledge();
- Start();
- Control_Byte=(Control_Byte | 0x01); //Sets R-/W bit to 1 (Read)
- Output_byte(Control_Byte);
- Acknowledge();
- DataValue=Input_byte();
- Stop();
-
- return(DataValue);
- }
-
- //---------------------------------------------------------------------------
- __fastcall TSpuntoHardwareKeyProgrammerForm::TSpuntoHardwareKeyProgrammerForm(TComponent* Owner)
- : TForm(Owner)
- {
- }
-
-
- //---------------------------------------------------------------------------
- void __fastcall TSpuntoHardwareKeyProgrammerForm::PeriodTrackBarChange(TObject *Sender)
- { //PeriodTrackbar management
- DefaultDelay=(PeriodTrackBar->Position)*100;
- Label1->Caption = IntToStr(PeriodTrackBar->Position);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSpuntoHardwareKeyProgrammerForm::FormCreate(TObject *Sender)
- {
- // Sets the labels
- Label1->Caption = IntToStr(PeriodTrackBar->Position);
- EncryptionStatusLabel->Caption="Not Verified";
- // Default (COM1) Port setup
- CombaseAddress=0x03f8;
- MCRAddress=CombaseAddress+4;
- LCRAddress=CombaseAddress+3;
- MSRAddress=CombaseAddress+6;
- //Ancilliaries
- Contabit=0;
- DefaultDelay=(PeriodTrackBar->Position)*100;
- //EEPROM Check
- EEPROMCheck();
- // String Grid Settings
- StringGrid1->RowCount=2;
- StringGrid1->ColWidths[0] = 40;
- StringGrid1->ColWidths[3] = 90;
- StringGrid1->ColWidths[4] = 90;
- StringGrid1->Cells[1][0]="Clear Text";
- StringGrid1->Cells[2][0]="ASCII Text";
- StringGrid1->Cells[3][0]="Encrypted Text";
- StringGrid1->Cells[4][0]="Encrypted ASCII";
- }
- //---------------------------------------------------------------------------
- void __fastcall TSpuntoHardwareKeyProgrammerForm::PowerONSpeedButtonClick(TObject *Sender)
- { //Power ON
-
- }
- //---------------------------------------------------------------------------
- void __fastcall TSpuntoHardwareKeyProgrammerForm::COM1RadioButtonClick(TObject *Sender)
- {
- // COM1 Port setup
- CombaseAddress=0x03f8;
- MCRAddress=CombaseAddress+4;
- LCRAddress=CombaseAddress+3;
- MSRAddress=CombaseAddress+6;
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::COM2RadioButtonClick(TObject *Sender)
- {
- // COM2 Port setup
- CombaseAddress=0x02f8;
- MCRAddress=CombaseAddress+4;
- LCRAddress=CombaseAddress+3;
- MSRAddress=CombaseAddress+6;
- }
- //---------------------------------------------------------------------------
- void __fastcall TSpuntoHardwareKeyProgrammerForm::WriteEEPROMClick(
- TObject *Sender)
- {
- int ProgramAddress;
- byte ProgramData, WrittenData, IsEEPROMReady;
-
- ProgramAddress=CSpinEditAddress->Value;
- ProgramData=CSpinEditData->Value;
-
- Write_data(ProgramAddress, ProgramData); //Writes the EEPROM
- WrittenData=Read_data(ProgramAddress); //Reads written data
-
- if ((WrittenData==ProgramData)& ( WrittenData!=0)) //Verifies written data
- {
- AckLabel->Caption="SUCCESSFUL";
- EEPROMStatusLabel->Caption="READY";
- }
- else
- {
- AckLabel->Caption="NOT SUCCESSFUL";
- EEPROMStatusLabel->Caption="NOT PRESENT";
- }
- }
- //---------------------------------------------------------------------------
-
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::SCL_LOW_ButtonClick(TObject *Sender)
- {
- Low_SCL();
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::SDA_LOW_ButtonClick(
- TObject *Sender)
- {
- Low_SDA();
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::SCL_HIGH_ButtonClick(
- TObject *Sender)
- {
- High_SCL();
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::SDA_HIGH_ButtonClick(
- TObject *Sender)
- {
- High_SDA();
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::HardwareKeyONButtonClick(
- TObject *Sender)
- {
- HardwareDeviceSerialON(CombaseAddress);
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::ReadEEPROMButtonClick(
- TObject *Sender)
- {
- int QueryAddress;
- Byte FirstByteRead,SecondByteRead;
-
- QueryAddress=CSpinEditAddress->Value;
- FirstByteRead=Read_data(QueryAddress); //Reads EEPROM twice
- SecondByteRead=Read_data(QueryAddress);
-
- if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0)) //Verifies read data
- {
- AckLabel->Caption="SUCCESSFUL"; //Verification passed
- EEPROMStatusLabel->Caption="READY";
- CSpinEditData->Font->Color=clWindowText;
- }
- else
- {
- AckLabel->Caption="NOT SUCCESSFUL"; //Verification not passed
- EEPROMStatusLabel->Caption="NOT PRESENT";
- CSpinEditData->Font->Color=clRed;
- }
-
- CSpinEditData->Value=SecondByteRead;
- }
- //---------------------------------------------------------------------------
-
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::CheckEEPROMButtonClick(
- TObject *Sender)
- {
- EEPROMCheck();
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::CSpinEditAddressChange(
- TObject *Sender)
- {
- int QueryAddress;
- Byte FirstByteRead,SecondByteRead;
-
- QueryAddress=CSpinEditAddress->Value;
- FirstByteRead=Read_data(QueryAddress); //Reads EEPROM twice
- SecondByteRead=Read_data(QueryAddress);
-
- if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0)) //Verifies read data
- {
- AckLabel->Caption="SUCCESSFUL"; //Verification passed
- EEPROMStatusLabel->Caption="READY";
- CSpinEditData->Font->Color=clWindowText;
- }
- else
- {
- AckLabel->Caption="NOT SUCCESSFUL"; //Verification not passed
- EEPROMStatusLabel->Caption="NOT PRESENT";
- CSpinEditData->Font->Color=clRed;
- }
-
- CSpinEditData->Value=SecondByteRead;
- }
- //---------------------------------------------------------------------------
-
-
- void __fastcall TSpuntoHardwareKeyProgrammerForm::ExecuteEncryptionClick(
- TObject *Sender)
- {
- int ClearTextFileHandle, EncryptedFileHandle; //Clear and Encrypted Buffer Handlers
- int ClearTextFileLenght;
- int ClearTextCharRead;
- int KeyBytePosition;
- char *ClearTextBuffer; //Clear Buffer
- char *EncryptedBuffer; //Encrypted Buffer
- Byte FirstByteRead,SecondByteRead; //Hardware Key Temp Bytes
- char AltFileName[MAXFILE+4]; //Alternate filename extension
-
- if (OpenDialog1->Execute()) //Opens the file to be encrypted
- {
- try
- {
- ClearTextFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead); //Opens the file
- ClearTextFileLenght = FileSeek(ClearTextFileHandle,0,2);
- FileSeek(ClearTextFileHandle,0,0);
- ClearTextBuffer = new char[ClearTextFileLenght+1]; //Creates the Clear buffer
- EncryptedBuffer = new char[ClearTextFileLenght+1]; //Creates the Encrypted Buffer
- ClearTextCharRead = FileRead(ClearTextFileHandle, ClearTextBuffer, ClearTextFileLenght);
- FileClose(ClearTextFileHandle); //Closes the clear text file
-
- StringGrid1->RowCount=2;
- for (int i=0;i<ClearTextCharRead;i++)
- {
- KeyBytePosition = (i % 2048); //Insert your "fancy" KEY algorithm here
- FirstByteRead=Read_data(KeyBytePosition); //Reads EEPROM twice
- SecondByteRead=Read_data(KeyBytePosition);
-
- if ((FirstByteRead==SecondByteRead)& ( SecondByteRead!=0))
- {
- EncryptionStatusLabel->Caption="OK"; //Verifies crypto key //Verification passed
- }
- else
- {
- EncryptionStatusLabel->Caption="CRYPTO FAULT"; //Crypto key verification not passed
- Application->MessageBox("No Crypto found: the key might be not present, empty or corrupted", "Crypto code Error", IDOK);
- }
-
- EncryptedBuffer[i] = (ClearTextBuffer[i] ^ FirstByteRead); //Insert your "fancy" CRYPTO algorithm here
- StringGrid1->RowCount += 1;
- StringGrid1->Cells[0][i+1] = IntToStr(KeyBytePosition); //Row number
- StringGrid1->Cells[1][i+1] = ClearTextBuffer[i]; //Clear Text
- StringGrid1->Cells[2][i+1] = IntToStr((int)ClearTextBuffer[i]); //Clear ASCII
- StringGrid1->Cells[3][i+1] = EncryptedBuffer[i]; //Encrypted text
- StringGrid1->Cells[4][i+1] = IntToStr((int)EncryptedBuffer[i]); //Encrypted ASCII
- }
-
- delete [] ClearTextBuffer;
- }
- catch(...)
- {
- Application->MessageBox("Cannot execute the requested operation", "File Error", IDOK);
- }
- }
-
- if (SaveDialog1->Execute()) //Save the Encrypted file
- {
- try
- {
- if (FileExists(SaveDialog1->FileName)) //If files already exists uses the ext. 'BAK'
- {
- fnsplit(SaveDialog1->FileName.c_str(), 0, 0, AltFileName, 0);
- strcat(AltFileName, ".BAK");
- RenameFile(SaveDialog1->FileName, AltFileName);
- }
- EncryptedFileHandle = FileCreate(SaveDialog1->FileName); //Creates the file
- FileWrite(EncryptedFileHandle, EncryptedBuffer, ClearTextFileLenght); //Save
- FileClose(EncryptedFileHandle); //Close
- }
- catch(...)
- {
- Application->MessageBox("Cannot execute the requested operation", "File Error", IDOK);
- }
- delete [] EncryptedBuffer; //Deletes the encrypted buffer
- }
- }
- //---------------------------------------------------------------------------
-
-