1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-10 05:13:38 +00:00
Files
MeshAgent/microstack/ILibCrypto.h

206 lines
7.4 KiB
C

/*
Copyright 2006 - 2018 Intel Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#ifndef __ILIB_CRYPTO__
#define __ILIB_CRYPTO__
#include "ILibParsers.h"
#if !defined(WIN32)
#define __fastcall
#endif
void __fastcall util_md5(char* data, int datalen, char* result);
void __fastcall util_md5hex(char* data, int datalen, char *out);
void __fastcall util_sha1(char* data, int datalen, char* result);
char* __fastcall util_tohex(char* data, int len, char* out);
char* __fastcall util_tohex2(char* data, int len, char* out);
char* __fastcall util_tohex_lower(char* data, int len, char* out);
int __fastcall util_hexToint(char *hexString, int hexStringLength);
int __fastcall util_hexToBuf(char *hexString, int hexStringLength, char* output);
void __fastcall util_sha256(char* data, int datalen, char* result);
void __fastcall util_sha384(char* data, int datalen, char* result);
int __fastcall util_sha384file(char* filename, char* result);
// File and data methods
size_t __fastcall util_writefile(char* filename, char* data, int datalen);
size_t __fastcall util_appendfile(char* filename, char* data, int datalen);
size_t __fastcall util_readfile(char* filename, char** data, size_t maxlen);
int __fastcall util_deletefile(char* filename);
#ifdef WIN32
int __fastcall util_crc(unsigned char *buffer, int len, int initial_value);
BOOL util_MoveFile(_In_ LPCSTR lpExistingFileName, _In_ LPCSTR lpNewFileName);
BOOL util_CopyFile(_In_ LPCSTR lpExistingFileName, _In_ LPCSTR lpNewFileName, _In_ BOOL bFailIfExists);
#endif
void __fastcall util_random(int length, char* result);
void __fastcall util_randomtext(int length, char* result);
#define UTIL_MD5_HASHSIZE 16
#define UTIL_SHA1_HASHSIZE 20
#define UTIL_SHA256_HASHSIZE 32
#define UTIL_SHA384_HASHSIZE 48
#define UTIL_SHA512_HASHSIZE 64
#ifdef MICROSTACK_NOTLS
#ifdef WIN32
#include <bcrypt.h>
typedef struct BCRYPT_CTX
{
BCRYPT_ALG_HANDLE hAlg;
BCRYPT_HASH_HANDLE hHash;
DWORD cbData;
DWORD cbHash;
DWORD cbHashObject;
PBYTE pbHashObject;
}BCRYPT_CTX;
#define SHA512_CTX BCRYPT_CTX
#define SHA384_CTX BCRYPT_CTX
#define SHA256_CTX BCRYPT_CTX
#define SHA_CTX BCRYPT_CTX
#define MD5_CTX BCRYPT_CTX
void BCRYPT_INIT(BCRYPT_CTX* ctx, void* alg);
void BCRYPT_UPDATE(BCRYPT_CTX* ctx, void* data, size_t dataLen);
void BCRYPT_FINAL(char *h, BCRYPT_CTX* ctx);
#define SHA512_Init(ctx) BCRYPT_INIT(ctx, BCRYPT_SHA512_ALGORITHM)
#define SHA384_Init(ctx) BCRYPT_INIT(ctx, BCRYPT_SHA384_ALGORITHM)
#define SHA256_Init(ctx) BCRYPT_INIT(ctx, BCRYPT_SHA256_ALGORITHM)
#define SHA1_Init(ctx) BCRYPT_INIT(ctx, BCRYPT_SHA1_ALGORITHM)
#define MD5_Init(ctx) BCRYPT_INIT(ctx, BCRYPT_MD5_ALGORITHM)
#define SHA512_Update(ctx, data, len) BCRYPT_UPDATE(ctx, data, len)
#define SHA384_Update(ctx, data, len) BCRYPT_UPDATE(ctx, data, len)
#define SHA256_Update(ctx, data, len) BCRYPT_UPDATE(ctx, data, len)
#define SHA1_Update(ctx, data, len) BCRYPT_UPDATE(ctx, data, len)
#define MD5_Update(ctx, data, len) BCRYPT_UPDATE(ctx, data, len)
#define SHA512_Final(md, ctx) BCRYPT_FINAL(md, ctx)
#define SHA384_Final(md, ctx) BCRYPT_FINAL(md, ctx)
#define SHA256_Final(md, ctx) BCRYPT_FINAL(md, ctx)
#define SHA1_Final(md, ctx) BCRYPT_FINAL(md, ctx)
#define MD5_Final(md, ctx) BCRYPT_FINAL(md, ctx)
#else
#include "microstack/nossl/md5.h"
#include "microstack/nossl/sha.h"
#include "microstack/nossl/sha1.h"
#define SHA256_CTX SHA256Context
#define SHA512_CTX SHA512Context
#define SHA256_Init(ctx) SHA256Reset (ctx)
#define SHA256_Update(ctx, data, len) SHA256Input(ctx, (uint8_t*)data, len)
#define SHA256_Final(md, ctx) SHA256Result (ctx, md)
#define SHA384_Init(ctx) SHA384Reset (ctx)
#define SHA384_Update(ctx, data, len) SHA384Input(ctx, (uint8_t*)data, len)
#define SHA384_Final(md, ctx) SHA384Result (ctx, md)
#define SHA512_Init(ctx) SHA512Reset (ctx)
#define SHA512_Update(ctx, data, len) SHA512Input(ctx, (uint8_t*)data, len)
#define SHA512_Final(md, ctx) SHA512Result (ctx, md)
#endif
#endif
#ifndef MICROSTACK_NOTLS
#include <openssl/ssl.h>
#include <openssl/md5.h>
#include <openssl/sha.h>
#include <openssl/err.h>
// Certificate structure
typedef struct util_cert
{
X509 *x509;
EVP_PKEY *pkey;
int flags;
} util_cert;
typedef enum CERTIFICATE_TYPES
{
CERTIFICATE_ROOT = 1,
CERTIFICATE_TLS_SERVER = 2,
CERTIFICATE_TLS_CLIENT = 3
} CERTIFICATE_TYPES;
#define ILibCrypto_Cert_Ownership_Other 0x01
void __fastcall util_openssl_init();
void __fastcall util_openssl_uninit();
void __fastcall util_free(char* ptr);
// Certificate & crypto methods
void __fastcall util_freecert(struct util_cert* cert);
int __fastcall util_to_p12(struct util_cert cert, char *password, char** data);
int __fastcall util_from_p12(char* data, int datalen, char* password, struct util_cert* cert);
int __fastcall util_to_cer(struct util_cert cert, char** data);
int __fastcall util_from_cer(char* data, int datalen, struct util_cert* cert);
int __fastcall util_from_pem(char* filename, struct util_cert* cert);
int __fastcall util_from_pem_string(char *data, int datalen, struct util_cert* cert);
int __fastcall util_from_pkcs7b_string(char *data, int datalen, char *out, int outLen);
int __fastcall util_mkCert(struct util_cert *rootcert, struct util_cert* cert, int bits, int days, char* name, enum CERTIFICATE_TYPES certtype, struct util_cert* initialcert);
void __fastcall util_printcert(struct util_cert cert);
void __fastcall util_printcert_pk(struct util_cert cert);
int __fastcall util_certhash(struct util_cert cert, char* result);
int __fastcall util_certhash2(X509* cert, char* result);
int __fastcall util_keyhash(struct util_cert cert, char* result);
int __fastcall util_keyhash2(X509* cert, char* result);
int __fastcall util_sign(struct util_cert cert, char* data, int datalen, char** signature);
int __fastcall util_verify(char* signature, int signlen, struct util_cert* cert, char** data);
int __fastcall util_encrypt(struct util_cert cert, char* data, int datalen, char** encdata);
int __fastcall util_encrypt2(STACK_OF(X509) *certs, char* data, int datalen, char** encdata);
int __fastcall util_decrypt(char* encdata, int encdatalen, struct util_cert cert, char** data);
int __fastcall util_rsaencrypt(X509 *cert, char* data, int datalen, char** encdata);
int __fastcall util_rsadecrypt(struct util_cert cert, char* data, int datalen, char** decdata);
int __fastcall util_rsaverify(X509 *cert, char* data, int datalen, char* sign, int signlen);
#ifdef _SSL_KEYS_EXPORTABLE
int __fastcall util_exportkeys(SSL* ssl, char *buffer, size_t bufferSize);
#endif
#ifdef _DEBUG
void __fastcall util_savekeys(SSL* ssl);
#endif
#endif
#if defined(_DEBUG)
// Display only
#ifdef ANDROID
#include <android/log.h>
#define MSG(...) __android_log_print(ANDROID_LOG_DEBUG, "MeshAgent", __VA_ARGS__);
#elif NACL
#include "chrome/nacl.h"
#define MSG(...) ni_log(__VA_ARGS__);
#else
#define MSG(...) printf(__VA_ARGS__);fflush(NULL)
#endif
#define DEBUGSTATEMENT(x) x
#else
#ifndef MSG
#define MSG(...)
#endif
#define DEBUGSTATEMENT(x)
#endif
#endif