Commit 34af0b6b by NitefullWind

1. 整合onedatabase分支 [2c878b37] 代码。

parent cad561ff
#ifndef CRETOPT
#ifndef CRETOPT
#define CRETOPT
#include "dataprocess.h"
......@@ -13,7 +13,7 @@
class CretOperate
{
public:
static bool GetDES3MAC(QJsonObject &json, QString &mac = QString())
static bool GetDES3MAC(QJsonObject &json, QString iv, QString &mac = QString())
{
std::string tmpmac;
......@@ -23,11 +23,24 @@ public:
return false;
}
QLOG_INFO() << tmpmac.data();
char tmpiv[16] = {0};
memcpy(tmpiv, iv.toUtf8().data(), iv.toUtf8().size() > 16 ? 16 : iv.toUtf8().size());
char outmsg[4096] = {0};
if(DataProcess::DES3Encode((const unsigned char *)DES3_KEY, tmpmac.data(), strlen(tmpmac.data()), (unsigned char *)outmsg, 4096) == 0)
// if(DataProcess::DES3Encode((const unsigned char *)DES3_KEY, tmpmac.data(), strlen(tmpmac.data()), (unsigned char *)outmsg, 4096) == 0)
// {
// QLOG_ERROR() << "DES3 MAC failed";
// return false;
// }
if(DataProcess::AESEncode((const unsigned char *)AES_KEY, (unsigned char *)tmpiv, (const unsigned char *)tmpmac.data(), strlen(tmpmac.data()), (unsigned char *)outmsg, 4096) == 0)
{
QLOG_ERROR() << "DES3 MAC failed";
QLOG_ERROR() << "AES MAC failed";
return false;
}
......@@ -64,11 +77,11 @@ public:
return true;
}
static bool GetSign(QJsonObject &json, QString &sign = QString())
static bool GetSign(QJsonObject &json, QString iv, QString &sign = QString())
{
QString serpbk, clipbk;
if(!GetCret(serpbk, clipbk))
if(!GetCret(iv, serpbk, clipbk))
return false;
QStringList list;
......@@ -96,7 +109,7 @@ public:
return true;
}
static bool SetRSACret(QByteArray &des3text)
static bool SetRSACret(QByteArray &des3text, QString iv)
{
QByteArray array = des3text;
......@@ -104,9 +117,21 @@ public:
char *buf = (char *)calloc(array.size() + 100, sizeof(char));
strcpy(buf, array.data());
if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY, buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
// if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY, buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
// {
// QLOG_ERROR() << "DES3Decode des3text Failed";
// return false;
// }
char tmpiv[16] = {0};
char tmpiv1[16] = {0};
memcpy(tmpiv, iv.toUtf8().data(), iv.toUtf8().size() > 16 ? 16 : iv.toUtf8().size());
memcpy(tmpiv1, iv.toUtf8().data(), iv.toUtf8().size() > 16 ? 16 : iv.toUtf8().size());
if(DataProcess::AESDecode((const unsigned char *)AES_KEY, (unsigned char *)tmpiv, (const unsigned char *)buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
{
QLOG_ERROR() << "DES3Decode des3text Failed";
QLOG_ERROR() << "AESDecode AEStext Failed";
return false;
}
......@@ -114,7 +139,7 @@ public:
if( jsonDocument.isNull() )
{
QLOG_ERROR() << "DES3Decode not json:" << rps;
QLOG_ERROR() << "AESDecode not json:" << rps;
return false;
}
......@@ -133,9 +158,15 @@ public:
char prtrps[MAX_BUF_LEN] = {0};
if(DataProcess::DES3Encode((const unsigned char *)DES3_KEY_PRT, data.data(), strlen(data.data()), (unsigned char *)prtrps, MAX_BUF_LEN) == 0)
// if(DataProcess::DES3Encode((const unsigned char *)DES3_KEY_PRT, data.data(), strlen(data.data()), (unsigned char *)prtrps, MAX_BUF_LEN) == 0)
// {
// QLOG_ERROR() << "3des private client.p12 file:" << json;
// return false;
// }
if(DataProcess::AESEncode((const unsigned char *)AES_KEY_PRT, (unsigned char *)tmpiv1, (const unsigned char *)data.data(), strlen(data.data()), (unsigned char *)prtrps, MAX_BUF_LEN) == 0)
{
QLOG_ERROR() << "3des private client.p12 file:" << json;
QLOG_ERROR() << "AES private client.p12 filed:" << json;
return false;
}
......@@ -165,8 +196,14 @@ public:
}
private:
static bool GetCret(QString &serpublickey, QString &cleprivatekey)
static bool GetCret(QString iv, QString &serpublickey, QString &cleprivatekey)
{
if(iv.isEmpty())
{
QLOG_ERROR() << "AES cbc iv is empty";
return false;
}
char path[MAX_PATH] = { 0 };
ToolS::GetProcPath(path);
......@@ -191,9 +228,19 @@ private:
strcpy(buf, array.data());
if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY_PRT, buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
// if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY_PRT, buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
// {
// QLOG_ERROR() << "DES3Decode Client.p12 Failed";
// return false;
// }
char tmpiv[16] = {0};
memcpy(tmpiv, iv.toUtf8().data(), iv.toUtf8().size() > 16 ? 16 : iv.toUtf8().size());
if(DataProcess::AESDecode((const unsigned char *)AES_KEY_PRT, (unsigned char *)tmpiv, (const unsigned char *)buf, strlen(buf), (unsigned char *)rps, MAX_BUF_LEN) == 0)
{
QLOG_ERROR() << "DES3Decode Client.p12 Failed";
QLOG_ERROR() << "AESDecode AEStext Failed";
return false;
}
......@@ -201,7 +248,7 @@ private:
if( jsonDocument.isNull() )
{
QLOG_ERROR() << "DES3Decode not json:" << rps;
QLOG_ERROR() << "AESDecode not json:" << rps;
return false;
}
......
......@@ -3,7 +3,7 @@
#include <string>
#include <openssl/evp.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/rsa.h>
......@@ -189,6 +189,123 @@ public:
return 1;
}
static int AESDecode(const unsigned char *key, unsigned char *iv,const unsigned char *in, int inlen, unsigned char *out, int outmaxlen)
{
int iOutLen = 0;
int iTmpLen = 0;
int length = 0;
char tmpiv[16] = { 0 };
memcpy(tmpiv, iv, 16);
unsigned char *tmp = (unsigned char *)malloc(outmaxlen * sizeof(unsigned char));
memset(tmp, 0, outmaxlen);
char sha1[32] = { '\0' };
SHA256((const unsigned char *)key, strlen((const char *)key), (unsigned char *)sha1);
qDebug() << sha1;
if((length = debase64((const char *)in, inlen, (char *)tmp, outmaxlen)) == 0)
{
perror("debase64 failed");
return 0;
}
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL,(const unsigned char *)sha1, (const unsigned char *)tmpiv);
if(!EVP_DecryptUpdate(&ctx, (unsigned char*)out, &iOutLen, (const unsigned char *)tmp, length))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
if(!EVP_DecryptFinal_ex(&ctx, (unsigned char *)(out + iOutLen), &iTmpLen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
iOutLen += iTmpLen;
EVP_CIPHER_CTX_cleanup(&ctx);
out[iOutLen] = 0;
return iOutLen;
}
static int AESEncode(const unsigned char *key, unsigned char *iv,const unsigned char *in, int inlen, unsigned char *out, int outmaxlen)
{
int iOutLen = 0;
int iTmpLen = 0;
int len;
char tmpiv[16] = { 0 };
memcpy(tmpiv, iv, 16);
unsigned char *tmp = (unsigned char *)malloc(outmaxlen * sizeof(unsigned char));
memset(tmp, 0, outmaxlen);
EVP_CIPHER_CTX ctx;
char sha1[32] = { '\0' };
SHA256((const unsigned char *)key, strlen((const char *)key), (unsigned char *)sha1);
qDebug() << sha1;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, (const unsigned char *)sha1, (const unsigned char *)tmpiv);
if(!EVP_EncryptUpdate(&ctx, (unsigned char*)tmp, &iOutLen, (const unsigned char *)in, inlen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
if(!EVP_EncryptFinal_ex(&ctx, (unsigned char *)(tmp + iOutLen), &iTmpLen))
{
EVP_CIPHER_CTX_cleanup(&ctx);
return 0;
}
iOutLen += iTmpLen;
EVP_CIPHER_CTX_cleanup(&ctx);
len = base64((char *)tmp, iOutLen, (char *)out, outmaxlen);
qDebug() << (char *)out;
free(tmp);
return len;
// AES_KEY aes;
// int len = 0;
// char sha1[32] = { '\0' };
// SHA256((const unsigned char *)key, strlen((const char *)key), (unsigned char *)sha1);
// unsigned char *tmp = (unsigned char *)malloc(outmaxlen * sizeof(unsigned char));
// memset(tmp, 0, outmaxlen);
// qDebug() << (char *)key;
// qDebug() << (char *)iv;
// QByteArray array((char *)sha1);
// qDebug() << array.toBase64();
// qDebug() << array.data();
// if(AES_set_encrypt_key((unsigned char *)sha1, 256, &aes) < 0)
// return 0;
// AES_cbc_encrypt(in, tmp, inlen, &aes, iv, AES_ENCRYPT);
// len = base64((char *)tmp, strlen((char *)tmp), (char *)out, outmaxlen);
// free(tmp);
// return len;
}
static int DES3Encode(const unsigned char *key,const char *in, int inlen, unsigned char *out, int outmaxlen)
{
int iOutLen = 0;
......
......@@ -13,6 +13,8 @@
#define DES3_KEY "ABCD@#9876DFSAAWKLDEOPDD"
//#define DES3_KEY "DDDDEEEE45LPODDCXZZLKDDO"
#define AES_KEY "ABCD@#9876DFSAAWKLDEOPDD"
#define AES_KEY_PRT "1JG23G12Y12V123G123F1DI1"
#define DES3_KEY_PRT "1JG23G12Y12V123G123F1DI1"
#define CRET_FILE_NAME "client.p12"
#define JSON_KEY_ONLY "partnerOrderId"
......@@ -23,6 +25,9 @@
#define JSON_KEY_SERPBLICKEY "serverPublicKey"
#define JSON_KEY_CLIENTPRIKEY "clientPrivateKey"
#define JSON_KEY_REQTYPE "reqType"
#define JSON_KEY_RPARTNERID "partnerId"
#define JSON_KEY_RSTOREID "storeId"
#define JSON_KEY_RSTATIONID "stationId"
#define VALUE_URL "all/url"
#define VALUE_URL_CRET "all/creturl"
......
......@@ -58,7 +58,9 @@ void RollBack::RollWiteQuery(QSqlDatabase &_db, QSqlQuery &query)
json[JSON_KEY_REQTYPE] = 3;
json[JSON_KEY_VER] = DEFAULT_JSON_VER_VALUE;
if(!CretOperate::GetSign(json))
QString iv = json[JSON_KEY_RPARTNERID].toString() + json[JSON_KEY_RSTOREID].toString() + json[JSON_KEY_RSTATIONID].toString();
if(!CretOperate::GetSign(json, iv))
{
QLOG_ERROR() << "rollback : " << "get sign error";
continue;
......
......@@ -187,10 +187,11 @@ void Control::InitModel()
bool Control::SendMessageToServer(const QJsonObject &json, QByteArray &outdata, QString &error)
{
QString iv = json[JSON_KEY_PARTNERID].toString() + json[JSON_KEY_STOREID].toString() + json[JSON_KEY_STATIONID].toString();
QJsonObject tmpjson = json;
tmpjson[JSON_KEY_VER] = DEFAULT_JSON_VER_VALUE;
CretOperate::GetMAC(tmpjson);
CretOperate::GetSign(tmpjson);
CretOperate::GetSign(tmpjson, iv);
QLOG_INFO() << "send json to server: " << tmpjson;
......@@ -465,6 +466,7 @@ bool Control::SendMessageToSBKAPI(const QJsonObject &json, QByteArray &outdata,
bool Control::GetRSA(QString &error)
{
QJsonObject json;
QString iv;
json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
json.insert(JSON_KEY_REQTYPE, sign);
......@@ -472,7 +474,11 @@ bool Control::GetRSA(QString &error)
json.insert(JSON_KEY_STATIONID, FMTool::GetJsonValue(_posReqJsonObj, JSON_KEY_STATIONID).toString());
json.insert(JSON_KEY_PARTNERID, FMTool::GetJsonValue(_posReqJsonObj, JSON_KEY_PARTNERID).toInt());
CretOperate::GetDES3MAC(json);
iv = FMTool::GetString(_request.PlatNo, 4) + FMTool::GetString(_request.StoreNo, 20) + FMTool::GetString(_request.DeviceNo, 6);
QLOG_INFO() << "get iv : " << iv;
CretOperate::GetDES3MAC(json, iv);
QByteArray array;
QLOG_INFO() << "get mac sign request : " << json;
......@@ -495,7 +501,7 @@ bool Control::GetRSA(QString &error)
}
}
if(CretOperate::SetRSACret(array) == 0)
if(CretOperate::SetRSACret(array, iv) == 0)
{
error = QString::fromLocal8Bit("签名失败,请重新获取签名");
return false;
......@@ -600,10 +606,12 @@ void Control::Request(ReqType type, QStringList list)
QByteArray tmparray;
QString tmperror;
QString iv = json[JSON_KEY_PARTNERID].toString() + json[JSON_KEY_STOREID].toString() + json[JSON_KEY_STATIONID].toString();
QJsonObject tmpjson = json;
tmpjson[JSON_KEY_VER] = DEFAULT_JSON_VER_VALUE;
tmpjson[JSON_KEY_REQTYPE] = 3;
CretOperate::GetSign(tmpjson);
CretOperate::GetSign(tmpjson, iv);
QLOG_INFO() << "Send reversal json: " << tmpjson;
......
......@@ -81,7 +81,7 @@
#define JSON_KEY_BEGINTIME "beginTime"
#define JSON_KEY_ENDTIME "endTime"
#define DEFAULT_JSON_VER_VALUE 2
#define DEFAULT_JSON_VER_VALUE 3
#define DEFAULT_JSON_PRODUCTS_NORMAL "NORMAL"
#define DEFAULT_JSON_PRODUCTS_FREE "FREE"
......
......@@ -194,8 +194,9 @@ void TestSimphony::test_GetSign()
json[JSON_KEY_REQTYPE] = 3;
json[JSON_KEY_VER] = DEFAULT_JSON_VER_VALUE;
QString iv = json[JSON_KEY_RPARTNERID].toString() + json[JSON_KEY_RSTOREID].toString() + json[JSON_KEY_RSTATIONID].toString();
QCOMPARE(CretOperate::GetSign(json), true);
QCOMPARE(CretOperate::GetSign(json, iv), true);
}
void TestSimphony::test_POSRequest_data()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment