CryptoByLeo/Src/Padding/PKCS1v15/Main.mqh
2026-08-23 19:36:33 -05:00

94 lines
3.2 KiB
MQL5

//+------------------------------------------------------------------+
//| Main.mqh |
//| Copyright 2026, Niquel Mendoza |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, Niquel Mendoza"
#property link "https://www.mql5.com"
#property strict
#ifndef CRYPTOBYLEO_SRC_PADDING_PKCS1V15_MAIN_MQH
#define CRYPTOBYLEO_SRC_PADDING_PKCS1V15_MAIN_MQH
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\\..\\Hash\\All.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CPKCS1v15
{
public:
CPKCS1v15(void) {}
~CPKCS1v15(void) {}
//---
// msg= mensaje a firmar
// longitud_k= ceil(longitud_k/8)... logintud de la clave en bytes
// f=funcion de hash
// out=salida
static int FirmarEncode(const uchar& msg[], int longitud_k, TSN::CCryptoHashMeta::ENUM_TSN_CRYPTO_HASH f, uchar& out[]);
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
static int CPKCS1v15::FirmarEncode(const uchar &msg[], int longitud_k, TSN::CCryptoHashMeta::ENUM_TSN_CRYPTO_HASH f, uchar& out[])
{
//---
const int hlen = TSN::CCryptoHashMeta::g_crytpo_hash_meta[f].outl; // tamañao de salida
const int tsize = (hlen + CRYPTOBYLEO_HASFUNC_FIXED_MAX_SIZE_DIGINFO);
if(longitud_k < tsize + 11)
return -1;
//---
// final_size = 2 + ps + 1 + dig_info + hlen
// final_size = 2 + (longitud_k - (dig_info + hlen) - 3) + 1 + dig_info + hlen
// final_size = 2 + longitud_k - dig_info - hlen - 3 + 1 + dig_info + hlen
// final_size = 2 + longitud_k - 3 + 1
// final_size = longitud_k
//---
if(longitud_k > ArraySize(out))
ArrayResize(out, longitud_k);
//---
out[0] = 0x0;
out[1] = 0x1;
//---
// -1 = -3 + 2 = -1 (por el start)
// es como haces esto ps += start para poder apuntar al fin
const int ps = longitud_k - tsize - 1;
int i = 2;
for(; i < ps; i++)
{
out[i] = 0xff;
}
//---
out[i++] = 0x0;
//--- agregamos digest info
for(int k = 0; k < CRYPTOBYLEO_HASFUNC_FIXED_MAX_SIZE_DIGINFO; k++)
out[i++] = TSN::CCryptoHashMeta::g_crytpo_diges_info[f].bytes[k];
//--- ahora agregamos el hash del mensaje
// empeiza a esceibri desde i
TSN::CCryptoHashMeta::g_crypto_fhash_fixed[f](msg, ArraySize(msg), out, i);
i += hlen;
//---
return i; // apunta al tamaño final
}
}
//---
#endif // CRYPTOBYLEO_SRC_PADDING_PKCS1V15_MAIN_MQH