mirror of
https://onedev.site.tesses.net/crosslang
synced 2026-02-08 17:15:45 +00:00
185 lines
6.1 KiB
C++
185 lines
6.1 KiB
C++
#include "CrossLang.hpp"
|
|
|
|
using namespace Tesses::Framework::Crypto;
|
|
|
|
namespace Tesses::CrossLang
|
|
{
|
|
static TObject Crypto_RandomBytes(GCList& ls, std::vector<TObject> args)
|
|
{
|
|
|
|
int64_t size;
|
|
std::string personalStr;
|
|
if(GetArgument(args,0,size) && GetArgument(args,1,personalStr))
|
|
{
|
|
|
|
std::vector<uint8_t> bytes;
|
|
bytes.resize((size_t)size);
|
|
if(RandomBytes(bytes,personalStr))
|
|
{
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
return nullptr;
|
|
|
|
|
|
}
|
|
return nullptr;
|
|
}
|
|
static TObject Crypto_PBKDF2(GCList& ls, std::vector<TObject> args)
|
|
{
|
|
std::string pass;
|
|
TByteArray* bArraySalt;
|
|
int64_t itterations;
|
|
int64_t keylength;
|
|
int64_t shanum;
|
|
if(GetArgument(args,0,pass) && GetArgumentHeap(args,1, bArraySalt) && GetArgument(args,2, itterations) && GetArgument(args,3,keylength) && GetArgument(args,4,shanum))
|
|
{
|
|
ShaVersion version = VERSION_SHA384;
|
|
|
|
switch(shanum)
|
|
{
|
|
case 1:
|
|
version = VERSION_SHA1;
|
|
break;
|
|
case 224:
|
|
version = VERSION_SHA224;
|
|
break;
|
|
case 256:
|
|
version = VERSION_SHA256;
|
|
break;
|
|
default:
|
|
case 384:
|
|
version = VERSION_SHA384;
|
|
break;
|
|
case 512:
|
|
version = VERSION_SHA512;
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
std::vector<uint8_t> key;
|
|
key.resize((size_t)keylength);
|
|
|
|
if(PBKDF2(key,pass,bArraySalt->data,(long)itterations,version))
|
|
{
|
|
TByteArray* ba = TByteArray::Create(ls);
|
|
ba->data = key;
|
|
return ba;
|
|
}
|
|
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
|
|
static TObject Crypto_Base64Encode(GCList& ls, std::vector<TObject> args)
|
|
{
|
|
TByteArray* byteArray;
|
|
|
|
if(GetArgumentHeap(args,0,byteArray))
|
|
{
|
|
return Tesses::Framework::Crypto::Base64_Encode(byteArray->data);
|
|
|
|
|
|
}
|
|
return "";
|
|
}
|
|
static TObject Crypto_Base64Decode(GCList& ls, std::vector<TObject> args)
|
|
{
|
|
std::string str;
|
|
if(GetArgument(args,0,str))
|
|
{
|
|
TByteArray* bArray = TByteArray::Create(ls);
|
|
bArray->data = Tesses::Framework::Crypto::Base64_Decode(str);
|
|
|
|
return bArray;
|
|
|
|
}
|
|
return nullptr;
|
|
}
|
|
void TStd::RegisterCrypto(GC* gc,TRootEnvironment* env)
|
|
{
|
|
|
|
env->permissions.canRegisterCrypto=true;
|
|
if(!HaveCrypto()) return;
|
|
GCList ls(gc);
|
|
TDictionary* dict = TDictionary::Create(ls);
|
|
dict->DeclareFunction(gc, "PBKDF2","Hash passwords with PBKDF2",{"pass","salt","itterations","keylen","shanum"},Crypto_PBKDF2);
|
|
dict->DeclareFunction(gc, "RandomBytes","Create bytearray but with random bytes in it instead of zeros (this uses mbedtls by the way)",{"byteCount","personalString"},Crypto_RandomBytes);
|
|
|
|
dict->DeclareFunction(gc, "Base64Encode","Base64 encode",{"data"},Crypto_Base64Encode);
|
|
dict->DeclareFunction(gc, "Base64Decode","Base64 decode",{"str"},Crypto_Base64Decode);
|
|
dict->DeclareFunction(gc, "Sha1", "Hash with sha1 algorithm (please don't use sha1 unless you need to)",{"strm"}, [](GCList& ls, std::vector<TObject> args)->TObject {
|
|
TByteArray* baSrc;
|
|
std::shared_ptr<Tesses::Framework::Streams::Stream> sho;
|
|
|
|
if(GetArgument(args, 0, sho))
|
|
{
|
|
auto bytes = Sha1::ComputeHash(sho);
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
if(GetArgumentHeap(args,0,baSrc))
|
|
{
|
|
auto bytes = Sha1::ComputeHash(baSrc->data.data(), baSrc->data.size());
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
return Undefined();
|
|
});
|
|
dict->DeclareFunction(gc, "Sha256", "Hash with sha256 algorithm",{"strm","$is224"}, [](GCList& ls, std::vector<TObject> args)->TObject {
|
|
TByteArray* baSrc;
|
|
std::shared_ptr<Tesses::Framework::Streams::Stream> sho;
|
|
bool is224=false;
|
|
GetArgument(args,1,is224);
|
|
|
|
if(GetArgument(args, 0, sho))
|
|
{
|
|
auto bytes = Sha256::ComputeHash(sho,is224);
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
if(GetArgumentHeap(args,0,baSrc))
|
|
{
|
|
auto bytes = Sha256::ComputeHash(baSrc->data.data(), baSrc->data.size(), is224);
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
return Undefined();
|
|
});
|
|
dict->DeclareFunction(gc, "Sha512", "Hash with sha512 algorithm",{"strm","$is384"}, [](GCList& ls, std::vector<TObject> args)->TObject {
|
|
TByteArray* baSrc;
|
|
std::shared_ptr<Tesses::Framework::Streams::Stream> sho;
|
|
bool is384=false;
|
|
GetArgument(args,1,is384);
|
|
|
|
if(GetArgument(args, 0, sho))
|
|
{
|
|
auto bytes = Sha512::ComputeHash(sho,is384);
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
if(GetArgumentHeap(args,0,baSrc))
|
|
{
|
|
auto bytes = Sha512::ComputeHash(baSrc->data.data(), baSrc->data.size(), is384);
|
|
auto ba = TByteArray::Create(ls);
|
|
ba->data = bytes;
|
|
return ba;
|
|
}
|
|
return Undefined();
|
|
});
|
|
gc->BarrierBegin();
|
|
env->DeclareVariable("Crypto", dict);
|
|
gc->BarrierEnd();
|
|
|
|
|
|
}
|
|
}
|