umain.cpp

来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 252 行

CPP
252
字号
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
        : TForm(Owner)
{
  SetLicenseKey((AnsiString)
  "ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76" + 
  "FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C" + 
  "F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47" + 
  "5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9" + 
  "F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A" + 
  "8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43" + 
  "DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8" + 
  "BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
    FKey = new TElSSHKey;
    FKeyGenerated = false;
    cbKeyLen->ItemIndex = 2;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
    delete FKey;
}
//---------------------------------------------------------------------------
bool TfrmMain::GetSaveFileName(AnsiString DialogTitle)
{
    sdKeys->Title = DialogTitle;
    if (!sdKeys->Execute())
        return false;
    return true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbSavePrivateClick(TObject *Sender)
{
    AnsiString Password;
    if(!FKeyGenerated)
        return;
    if(!GetSaveFileName("Select file name for private key"))
        return;
    TfrmGetPassword::GetPassword(Password);
    FKey->SavePrivateKey(sdKeys->FileName,Password);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbSavePublicClick(TObject *Sender)
{
    if(!FKeyGenerated)
        return;
    if(!GetSaveFileName("Select file name for public key"))
        return;
    FKey->SavePublicKey(sdKeys->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbGenerateClick(TObject *Sender)
{
    int Bits,KeySize,Status;
    AnsiString Key;

    // Algorithm
    switch (rgAlgorithm->ItemIndex)
    {
        case 0:
            FKey->Algorithm = ALGORITHM_RSA;
            break;
        case 1:
            FKey->Algorithm = ALGORITHM_DSS;
            break;
    }
    // KeyFormat
    switch(rgKeyFormat->ItemIndex)
    {
        case 0:
            FKey->KeyFormat = kfOpenSSH;
            break;
        case 1:
            FKey->KeyFormat = kfIETF;
            break;
        case 2:
            FKey->KeyFormat = kfPuTTY;
            break;
        case 3:
            FKey->KeyFormat = kfX509;
            break;
    }
    FKey->Comment = edtComment->Text;
    FKey->Subject = edtSubject->Text;
    try
    {
        Bits = StrToInt(cbKeyLen->Text);
    }
    catch(Exception &e)
    {
        SetStatus("Invalid key length");
        return;
    }
    // Generating keys
    SetStatus("Please wait...Generating key...");
    Status = FKey->Generate(FKey->Algorithm,Bits);
    ShowStatus(Status);
    if (Status != 0)
        return;
    SetStatus("Keys generated");
    ShowKeys();
    AllowKeySaving();
}
//---------------------------------------------------------------------------
void TfrmMain::SetStatus(AnsiString AStatus)
{
    sbStatus->SimpleText = AStatus;
    Update();
    Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbExitClick(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------
void TfrmMain::ShowStatus(int Status)
{
    switch(Status)
    {
        case SB_ERROR_SSH_KEYS_INVALID_PUBLIC_KEY:
            SetStatus("SB_ERROR_SSH_KEYS_INVALID_PUBLIC_KEY");
            break;
        case SB_ERROR_SSH_KEYS_INVALID_PRIVATE_KEY:
            SetStatus("SB_ERROR_SSH_KEYS_INVALID_PRIVATE_KEY");
            break;
        case SB_ERROR_SSH_KEYS_FILE_READ_ERROR:
            SetStatus("SB_ERROR_SSH_KEYS_FILE_READ_ERROR");
            break;
        case SB_ERROR_SSH_KEYS_FILE_WRITE_ERROR:
            SetStatus("SB_ERROR_SSH_KEYS_FILE_WRITE_ERROR");
            break;
        case SB_ERROR_SSH_KEYS_UNSUPPORTED_ALGORITHM:
            SetStatus("SB_ERROR_SSH_KEYS_UNSUPPORTED_ALGORITHM");
            break;
        case SB_ERROR_SSH_KEYS_INTERNAL_ERROR:
            SetStatus("SB_ERROR_SSH_KEYS_INTERNAL_ERROR");
            break;
        case SB_ERROR_SSH_KEYS_BUFFER_TOO_SMALL:
            SetStatus("SB_ERROR_SSH_KEYS_BUFFER_TOO_SMALL");
            break;
        case SB_ERROR_SSH_KEYS_NO_PRIVATE_KEY:
            SetStatus("SB_ERROR_SSH_KEYS_NO_PRIVATE_KEY");
            break;
        case SB_ERROR_SSH_KEYS_INVALID_PASSPHRASE:
            SetStatus("SB_ERROR_SSH_KEYS_INVALID_PASSPHRASE");
            break;
        case SB_ERROR_SSH_KEYS_UNSUPPORTED_PEM_ALGORITHM:
            SetStatus("SB_ERROR_SSH_KEYS_UNSUPPORTED_PEM_ALGORITHM");
            break;
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::rgKeyFormatClick(TObject *Sender)
{
    edtSubject->Enabled = rgKeyFormat->ItemIndex == 1;
    if(edtSubject->Enabled)
        edtSubject->Color = clWindow;
    else
        edtSubject->Color = clGrayText;
}
//---------------------------------------------------------------------------
bool TfrmMain::GetOpenFileName(AnsiString DialogTitle)
{
  odKeys->Title = DialogTitle;
  return odKeys->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbLoadPrivateClick(TObject *Sender)
{
    int Status;
    AnsiString Password;

    if(!GetOpenFileName("Select private key"))
        return;
    Status = FKey->LoadPrivateKey(odKeys->FileName,Password);
    if (Status != 0)
    {
        Password = "";
        if(!TfrmGetPassword::GetPassword(Password))
            Password = "";
        Status = FKey->LoadPrivateKey(odKeys->FileName,Password);
    }
    ShowStatus(Status);
    if(Status == 0)
    {
        ShowKeys();
        AllowKeySaving();
        SetStatus("Private key loaded.");
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tbLoadPublicClick(TObject *Sender)
{
    int Status;

    if(!GetOpenFileName("Select public key"))
        return;
    Status = FKey->LoadPublicKey(odKeys->FileName);
    ShowStatus(Status);
    if (Status == 0)
    {
        ShowKeys();
        AllowKeySaving();
        SetStatus("Public key loaded.");
    }
}
//---------------------------------------------------------------------------
void TfrmMain::ShowKeys(void)
{
    int KeySize = 0;

    FKey->SavePrivateKey(NULL,KeySize,"");
    char* Key = new char[KeySize+1];
    memset(Key,0,KeySize+1);
    FKey->SavePrivateKey(Key,KeySize,"");
    memPrivateKey->Lines->Text = AnsiString(Key);
    KeySize = 0;
    delete[] Key;
    FKey->SavePublicKey(NULL,KeySize);
    Key = new char[KeySize+1];
    memset(Key,0,KeySize+1);
    FKey->SavePublicKey(Key,KeySize);
    memPublicKey->Lines->Text = AnsiString(Key);
    delete[] Key;
    edtSubject->Text = FKey->Subject;
    edtComment->Text = FKey->Comment;
}
//---------------------------------------------------------------------------
void TfrmMain::AllowKeySaving(void)
{
    FKeyGenerated = true;
    tbSavePublic->Enabled = true;
    tbSavePrivate->Enabled = true;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?