wolfssl-examples/SGX_Windows/Enclave/Enclave.cpp

120 lines
3.1 KiB
C++
Executable File

/* Enclave.cpp
*
* Copyright (C) 2006-2020 wolfSSL Inc.
*
* This file is part of wolfSSL.
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/
#include "Enclave_t.h" /* includes header files from wolfSSL */
#include "wolfssl/certs_test.h"
#include "sgx_trts.h"
static volatile byte RNG_unset = 1;
static WC_RNG rng;
int wc_sha256_init(Sha256* sha256) {
return wc_InitSha256(sha256);
}
int wc_sha256_update(Sha256* sha256, byte* buf, int bufSz)
{
return wc_Sha256Update(sha256, buf, bufSz);
}
int wc_sha256_final(Sha256* sha256, byte* digest)
{
return wc_Sha256Final(sha256, digest);
}
int wc_aesgcm_setKey(Aes* aes, const byte* key, word32 sz)
{
return wc_AesGcmSetKey(aes, key, sz);
}
int wc_aesgcm_encrypt(Aes* aes, byte* c, const byte*p, word32 pSz, const byte* iv, word32 ivSz, byte* tag, word32 tagSz, const byte* ad, word32 adSz)
{
return wc_AesGcmEncrypt(aes, c, p, pSz, iv, ivSz, tag, tagSz, ad, adSz);
}
int wc_aesgcm_decrypt(Aes* aes, byte* p, const byte* c, word32 cSz, const byte* iv, word32 ivSz, const byte* tag, word32 tagSz, const byte* ad, word32 adSz)
{
return wc_AesGcmDecrypt(aes, p, c, cSz, iv, 12, tag, 16, ad, 13);
}
/* return size of encrypted data */
int wc_rsa_encrypt(const byte* m, word32 mSz, byte* out, word32 outSz, RsaKey* rsaKey)
{
return wc_RsaPublicEncrypt(m, mSz, out, outSz, rsaKey, &rng);
}
int wc_rsa_decrypt(const byte* in, word32 inSz, byte* m, word32 mSz, RsaKey* rsaKey)
{
return wc_RsaPrivateDecrypt(in, inSz, m, mSz, rsaKey);
}
int wc_rsa_free(RsaKey* rsaKey)
{
return wc_FreeRsaKey(rsaKey);
}
/* RSA key is set from wolfSSL certs_test.h */
int wc_rsa_init(RsaKey* rsaKey)
{
int ret;
word32 bytes;
word32 idx = 0;
const byte* tmp;
#ifdef USE_CERT_BUFFERS_1024
tmp = rsa_key_der_1024;
bytes = sizeof_rsa_key_der_1024;
#elif defined(USE_CERT_BUFFERS_2048)
tmp = rsa_key_der_2048;
bytes = sizeof_rsa_key_der_2048;
#else
#error "need a cert buffer size"
#endif /* USE_CERT_BUFFERS */
ret = wc_InitRsaKey(rsaKey, 0);
if (ret < 0) {
return -1;
}
ret = wc_RsaPrivateKeyDecode(tmp, &idx, rsaKey, bytes);
if (ret != 0) {
return -1;
}
if (RNG_unset) { /* not atomic, for demo only. RNG could be moved to user APP and passed by reference */
RNG_unset = 0;
ret = wc_InitRng(&rng);
if (ret < 0) {
return -1;
}
}
#ifdef WC_RSA_BLINDING
wc_RsaSetRNG(rsaKey, &rng);
#endif
return 0;
}