vmprotect-3.5.1/VMProtect/export_key_pair_dialog.cc

169 lines
5.8 KiB
C++

#ifdef ULTIMATE
#include "../core/objects.h"
#include "../core/core.h"
#include "../core/lang.h"
#include "export_key_pair_dialog.h"
#include "widgets.h"
#include "moc/moc_export_key_pair_dialog.cc"
#include "help_browser.h"
/**
* ExportKeyPairDialog
*/
ExportKeyPairDialog::ExportKeyPairDialog(QWidget *parent, LicensingManager *manager)
: QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint)
{
bits_ = manager->bits();
private_exp_ = manager->private_exp();
public_exp_ = manager->public_exp();
modulus_ = manager->modulus();
uint64_t product_code = manager->product_code();
product_code_.insert(product_code_.end(), reinterpret_cast<uint8_t *>(&product_code), reinterpret_cast<uint8_t *>(&product_code) + sizeof(product_code));
setWindowTitle(QString::fromUtf8(language[lsExportKeyPair].c_str()));
QLabel *labelFormat = new QLabel(this);
labelFormat->setObjectName("header");
labelFormat->setText(QString::fromUtf8(language[lsKeyPairExportTarget].c_str()));
QComboBox *format = new QComboBox(this);
format->addItems(QStringList() << QString::fromUtf8(language[lsParametersForMSVC].c_str())
<< QString::fromUtf8(language[lsParametersForDelphi].c_str())
<< QString::fromUtf8(language[lsParametersForNET].c_str())
<< QString::fromUtf8(language[lsParametersForPHP].c_str()));
format->setCurrentIndex(0);
connect(format, SIGNAL(currentIndexChanged(int)), this, SLOT(formatChanged(int)));
QLabel *labelResults = new QLabel(this);
labelResults->setObjectName("header");
labelResults->setText(QString::fromUtf8(language[lsKeyPairExportResult].c_str()));
edit_ = new QPlainTextEdit(this);
QFont font = edit_->font();
font.setFamily(MONOSPACE_FONT_FAMILY);
edit_->setFont(font);
QToolButton *helpButton = new QToolButton(this);
helpButton->setShortcut(HelpContentsKeySequence());
helpButton->setIconSize(QSize(20, 20));
helpButton->setIcon(QIcon(":/images/help_gray.png"));
helpButton->setToolTip(QString::fromUtf8(language[lsHelp].c_str()));
connect(helpButton, SIGNAL(clicked(bool)), this, SLOT(helpClicked()));
QPushButton *closeButton = new PushButton(QString::fromUtf8(language[lsClose].c_str()));
connect(closeButton, SIGNAL(clicked()), this, SLOT(reject()));
QPushButton *copyButton = new PushButton(QString::fromUtf8(language[lsCopy].c_str()));
connect(copyButton, SIGNAL(clicked()), this, SLOT(copyClicked()));
QHBoxLayout *buttonLayout = new QHBoxLayout();
buttonLayout->addWidget(helpButton);
buttonLayout->addStretch();
#ifdef __APPLE__
buttonLayout->addWidget(closeButton);
buttonLayout->addWidget(copyButton);
#else
buttonLayout->addWidget(copyButton);
buttonLayout->addWidget(closeButton);
#endif
QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(10, 10, 10, 10);
layout->setSpacing(10);
layout->addWidget(labelFormat);
layout->addWidget(format);
layout->addWidget(labelResults);
layout->addWidget(edit_);
layout->addLayout(buttonLayout);
setLayout(layout);
resize(610, 300);
formatChanged(format->currentIndex());
}
QString VectorToString(const std::vector<uint8_t> &value)
{
QString res;
for (size_t i = 0; i < value.size(); i++) {
if (i > 0)
res.append(',').append((i & 0xf) ? ' ' : '\n');
res.append(QString("%1").arg(value[i], 3, 10, QChar(' ')));
}
return res;
}
QString _VectorToBase64(const std::vector<uint8_t> &value)
{
QByteArray res = QByteArray(reinterpret_cast<const char *>(&value[0]), (int)value.size());
return res.toBase64();
}
QString StringToBase64(const QString &value)
{
QByteArray res;
res.append(value);
return res.toBase64();
}
void ExportKeyPairDialog::formatChanged(int format)
{
QStringList lines;
switch (format) {
case 0:
lines.append("VMProtectAlgorithms g_Algorithm = ALGORITHM_RSA;");
lines.append(QString("size_t g_nBits = %1;").arg(bits_));
lines.append(QString("byte g_vPrivate[%1] = {").arg(private_exp_.size()));
lines.append(VectorToString(private_exp_) + "};");
lines.append("");
lines.append(QString("byte g_vModulus[%1] = {").arg(modulus_.size()));
lines.append(VectorToString(modulus_) + "};");
lines.append("");
lines.append(QString("byte g_vProductCode[%1] = {%2};").arg(product_code_.size()).arg(VectorToString(product_code_)));
break;
case 1:
lines.append("g_Algorithm: Longword = ALGORITHM_RSA;");
lines.append(QString("g_nBits: Longword = %1;").arg(bits_));
lines.append(QString("g_vPrivate: array [0..%1] of Byte = (").arg(private_exp_.size() - 1));
lines.append(VectorToString(private_exp_) + ");");
lines.append("");
lines.append(QString("g_vModulus: array [0..%1] of Byte = (").arg(modulus_.size() - 1));
lines.append(VectorToString(modulus_) + ");");
lines.append("");
lines.append(QString("g_vProductCode: array [0..%1] of Byte = (%2);").arg(product_code_.size() - 1).arg(VectorToString(product_code_)));
break;
case 2:
{
QString str = StringToBase64(QString("<vmp-lm-product algorithm=\"RSA\" bits=\"%1\" exp=\"%2\" mod=\"%3\" product=\"%4\"/>").arg(bits_).arg(_VectorToBase64(private_exp_)).arg(_VectorToBase64(modulus_)).arg(_VectorToBase64(product_code_)));
while (!str.isEmpty()) {
lines.append(str.left(76));
str.remove(0, 76);
}
}
break;
case 3:
lines.append("$exported_algorithm = \"RSA\";");
lines.append(QString("$exported_bits = %1;").arg(bits_));
lines.append(QString("$exported_private = \"%1\";").arg(_VectorToBase64(private_exp_)));
lines.append(QString("$exported_modulus = \"%1\";").arg(_VectorToBase64(modulus_)));
lines.append(QString("$exported_product_code = \"%1\";").arg(_VectorToBase64(product_code_)));
break;
}
edit_->setPlainText(lines.join("\n"));
}
void ExportKeyPairDialog::copyClicked()
{
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(edit_->toPlainText());
}
void ExportKeyPairDialog::helpClicked()
{
HelpBrowser::showTopic("project::licenses");
}
#endif