<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic About SGX ECALLs in Intel Confidential Computing</title>
    <link>https://community.intel.com/t5/Intel-Confidential-Computing/About-SGX-ECALLs/m-p/1163913#M2969</link>
    <description>&lt;P&gt;In the edl file,&lt;/P&gt;&lt;P&gt;enclave {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; from "sgx_tstdc.edl" import *;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;ippcp.h&amp;gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; trusted {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* define ECALLs here. */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void foo([out]IppsBigNumState* C, [out]IppsBigNumState* Z, [out]IppsRSAPrivateKeyState* pPrv, [out]Ipp8u * scratchBuffer);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; };&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; untrusted {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* define OCALLs here. */&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; };&lt;BR /&gt;};&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is Enclave.cpp&lt;/P&gt;&lt;P&gt;#include "EnclaveT_t.h"&lt;BR /&gt;#include "sgx_trts.h"&lt;BR /&gt;#include &amp;lt;ostream&amp;gt;&lt;BR /&gt;#include &amp;lt;string.h&amp;gt;&lt;BR /&gt;#include &amp;lt;ippcp.h&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;void foo(IppsBigNumState* C, IppsBigNumState* Z, IppsRSAPrivateKeyState* pPrv, Ipp8u * scratchBuffer)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// de-crypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppStatus status2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;status2 = ippsRSA_Decrypt(C, Z, pPrv, scratchBuffer);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is App.ccp&lt;/P&gt;&lt;P&gt;// NewencT.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。&lt;BR /&gt;//&lt;BR /&gt;#include "pch.h"&lt;BR /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR /&gt;#include &amp;lt;tchar.h&amp;gt;&lt;BR /&gt;#include "sgx_urts.h"&lt;BR /&gt;#include &amp;lt;string.h&amp;gt;&lt;BR /&gt;#include "EnclaveT_u.h"&lt;BR /&gt;#include "ippcp.h"&lt;BR /&gt;#include &amp;lt;iostream&amp;gt;&lt;BR /&gt;#include &amp;lt;xsample_bignum.h&amp;gt;&lt;BR /&gt;#include &amp;lt;BigNumber.h&amp;gt;&lt;BR /&gt;using namespace std;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;#define ENCLAVE_FILE _T("EnclaveT.signed.dll")&lt;BR /&gt;#define MAX_BUF_LEN 100&lt;/P&gt;&lt;P&gt;static IppsBigNumState* newBN(int len, const Ipp32u* pData)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int size;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsBigNumGetSize(len, &amp;amp;size);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pBN = (IppsBigNumState*)(new Ipp8u[size]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsBigNumInit(len, pBN);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (pData)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsSet_BN(IppsBigNumPOS, len, pData, pBN);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pBN;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;IppsPRNGState* newPRNG(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int ctxSize;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPRNGGetSize(&amp;amp;ctxSize);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPRNGState* pCtx = (IppsPRNGState*)(new Ipp8u[ctxSize]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPRNGInit(160, pCtx);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pCtx;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;// Prime Generator context&lt;BR /&gt;//&lt;BR /&gt;IppsPrimeState* newPrimeGen(int maxBits)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int size;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPrimeGetSize(maxBits, &amp;amp;size);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPrimeState* pCtx = (IppsPrimeState*)(new Ipp8u[size]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPrimeInit(maxBits, pCtx);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pCtx;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;void deletePrimeGen(IppsPrimeState* pPrimeG)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delete[](Ipp8u*)pPrimeG;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void deletePRNG(IppsPRNGState* pPRNG)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delete[](Ipp8u*)pPRNG;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;int main()&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// specify the context of key components to contain generated key // data&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pModulus = newBN(1024 / 32, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pPublicExp = newBN(1024 / 32, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pPrivateExp = newBN(1024 / 32, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// (bit) size of key components&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsN = 1024; // Length of RSA system in bits(the modulus. size of &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;// our modulus, must be large(4096 standard), but we will 1024&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsE = 512; // Length of the RSA public exponent in bits(the e //component&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsP = 512; //Length in bits of the p factors of the modulus(that //is, the p in the equation: n = p*q&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsQ = 512;//Length in bits of the q factors of the modulus(that //is, the q in the equation: n = p*q&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int keyCtxSize; //Available size of memory buffer being initialized&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// setup public key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// calculate size of public keys context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_GetSizePublicKey(bitsN, bitsE, &amp;amp;keyCtxSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//public key context allocated with generated buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsRSAPublicKeyState* pPub = (IppsRSAPublicKeyState*)(new Ipp8u[keyCtxSize]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//context initialized in memory&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_InitPublicKey(bitsN, bitsE, pPub, keyCtxSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// setup (type2) private key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//calculate size of private keys context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_GetSizePrivateKeyType2(bitsP, bitsQ, &amp;amp;keyCtxSize);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//private key context allocated with generated buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsRSAPrivateKeyState* pPrv = (IppsRSAPrivateKeyState*)(new Ipp8u[keyCtxSize]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//context initialized in memory&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_InitPrivateKeyType2(bitsP, bitsQ, pPrv, keyCtxSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int buffSizePrivate; // create variable to reference retrieved size&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_GetBufferSizePrivateKey(&amp;amp;buffSizePrivate, pPrv); //retrieve //buffer size for private key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp8u * scratchBuffer = NULL; //initialize scratch buffer as ipp8u //(usigned char equivalent)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;scratchBuffer = new Ipp8u[buffSizePrivate]; //allocate memory for //scratch buffer&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// random generator&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPRNGState* pRand = newPRNG();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// prime generator&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPrimeState* pPrimeG = newPrimeGen(512);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int validateRes = IS_VALID_KEY; // IS_VALID_KEY is the success code&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// validate keys&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_ValidateKeys(&amp;amp;validateRes,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pPub, pPrv, NULL, scratchBuffer,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;10, pPrimeG, ippsPRNGen, pRand);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// check that success code hasn’t changed, and print message on //successful&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (IS_VALID_KEY == validateRes) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "validation successful \n" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Pointer to IppsBigNumState context for searching an RSA public //exponent&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp32u E = { 0x11 };&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pSrcPublicExp = newBN(1, &amp;amp;E);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppStatus status; // reference to generated message code&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// keys generator&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;status = ippsRSA_GenerateKeys(pSrcPublicExp, pModulus, pPublicExp, pPrivateExp, pPrv, scratchBuffer, 10, pPrimeG, ippsPRNGen, pRand);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// check for successful generation of keys&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ippStsNoErr signals success&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (status == ippStsNoErr) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "keys generation successful \n" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// get modulus generated&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BigNumber modN(pModulus); // create BigNumber instance of modulus&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//modN.tBN("Modulus (n): "); // display key data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//cout &amp;lt;&amp;lt; "\n" &amp;lt;&amp;lt; endl; // print empty line&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// get public key generated&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BigNumber Pk(pPublicExp); // create BigNumber instance of public key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Pk.tBN("Public Key Exponent (e): "); // display key data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//cout &amp;lt;&amp;lt; "\n" &amp;lt;&amp;lt; endl; // print empty line&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//get private key generated&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BigNumber Pvk(pPrivateExp); //create BigNumber instance of private key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Pvk.tBN("Private Key Exponent (d): "); // display key data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// set public key with generated public key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_SetPublicKey(pModulus, pPublicExp, pPub);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// set up type1 private key component with generated private key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_SetPrivateKeyType1(pModulus, pPrivateExp, pPrv);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp32u dataM[] = { // plain text to be encrypted&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x12345678,0xabcde123,0x87654321,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x111aaaa2,0xbbbbbbbb,0xcccccccc,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x12237777,0x82234587,0x1ef392c9,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x43581159,0xb5024121,0xa48D2869,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x2abababa,0x1a2b3c22,0xa47728B4,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x54321123,0xaaaaaaaa,0xbbbbbbbb,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xcccccccc,0xdddddddd,0x34667666,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xa46a3aaa,0xe4251e84,0xf31f2Eff,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xfec55267,0x11111111,0x98765432,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x54376511,0x21323111,0x85433abc,0xcaa44322,0x001234ef};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "DATAM "&amp;lt;&amp;lt; sizeof(dataM) &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// we will create ciphertext context with size of dataN&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp32u dataN[] = { // data for ciphertext context creation&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x03cccb37,0x6acadded,0xdf4f20d0,0x2458257d,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xda3b7886,0x5c1b1a4c,0xea6f676b,0x59f51e09,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xc0691195,0x8076c61f,0x4221d059,0xd021673a,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x139bd5ef,0x95189046,0x10eb90ea,0x127af4e5,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x14f5dcb8,0x1e13510f,0x6e2e0558,0xa650fce0,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xff0bcd51,0xe218e43d,0xad045536,0xdc4a21d7,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x74edee68,0xb474ad57,0x79514004,0xa65a27a3,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x9e5259c1,0xe78e89eb,0xb34ed292,0x99197f0d };&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// create contexts for &amp;nbsp;message and ciphertext, this allocate the //appropriate memory size for storing message and ciphertext&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// create message context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* Msg = newBN(sizeof(dataM) / sizeof(dataM[0]), dataM);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//create ciphertext context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* C = newBN(sizeof(dataN) / sizeof(dataN[0]), dataN);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// encrypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppStatus status1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;status1 = ippsRSA_Encrypt(Msg, C, pPub, scratchBuffer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// check for successful encryption of msg&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (status1 == ippStsNoErr) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "message encryption successful \n" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// de-crypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//IppStatus status2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//status2 = ippsRSA_Decrypt(C, Z, pPrv, scratchBuffer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// check for successful decryption of ciphertext&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//if (status2 == ippStsNoErr) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "message decryption successful \n" &amp;lt;&amp;lt; endl;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sgx_enclave_id_t&amp;nbsp;&amp;nbsp; &amp;nbsp; eid;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sgx_status_t&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = SGX_SUCCESS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sgx_launch_token_t&amp;nbsp;&amp;nbsp; &amp;nbsp;token = { 0 };&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;int updated = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;char buffer[MAX_BUF_LEN] = "Hello World!";&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//创建包含token的enclave容器&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &amp;amp;token, &amp;amp;updated, &amp;amp;eid, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (ret != SGX_SUCCESS)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printf("APP:error %#x ,failed to create enclave .\n", ret);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// create de-ciphertext context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* Z = newBN(sizeof(dataN) / sizeof(dataN[0]), dataN);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foo(eid, C, Z, pPrv, scratchBuffer);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// create de-ciphertext context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//IppsBigNumState* Z = newBN(sizeof(dataN) / sizeof(dataN[0]), dataN);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// de-crypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//IppStatus status2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//status2 = ippsRSA_Decrypt(C, Z, pPrv, scratchBuffer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "YIKU" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;////Enclave CALL(ECALL) 启动enclave容器&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//foo(0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//printf("successfully");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//getchar();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//销毁enclave容器&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (SGX_SUCCESS != sgx_destroy_enclave(eid))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;system("pause");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;getchar();&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;/P&gt;&lt;P&gt;}&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When I rebuild the enclave project, I get the error "&amp;nbsp; D:\project\EnclaveT\EnclaveT\EnclaveT.edl(246,7): parse error ".&amp;nbsp;&lt;/P&gt;&lt;P&gt;Could you tell how to solve this problem?&amp;nbsp;I guess the big problem appears in the edl file, but I don't know how to deal with it.&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sat, 28 Dec 2019 14:54:35 GMT</pubDate>
    <dc:creator>刘__高</dc:creator>
    <dc:date>2019-12-28T14:54:35Z</dc:date>
    <item>
      <title>About SGX ECALLs</title>
      <link>https://community.intel.com/t5/Intel-Confidential-Computing/About-SGX-ECALLs/m-p/1163913#M2969</link>
      <description>&lt;P&gt;In the edl file,&lt;/P&gt;&lt;P&gt;enclave {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; from "sgx_tstdc.edl" import *;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;ippcp.h&amp;gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; trusted {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* define ECALLs here. */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;public void foo([out]IppsBigNumState* C, [out]IppsBigNumState* Z, [out]IppsRSAPrivateKeyState* pPrv, [out]Ipp8u * scratchBuffer);&lt;BR /&gt;&amp;nbsp; &amp;nbsp; };&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; untrusted {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* define OCALLs here. */&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; };&lt;BR /&gt;};&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is Enclave.cpp&lt;/P&gt;&lt;P&gt;#include "EnclaveT_t.h"&lt;BR /&gt;#include "sgx_trts.h"&lt;BR /&gt;#include &amp;lt;ostream&amp;gt;&lt;BR /&gt;#include &amp;lt;string.h&amp;gt;&lt;BR /&gt;#include &amp;lt;ippcp.h&amp;gt;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;void foo(IppsBigNumState* C, IppsBigNumState* Z, IppsRSAPrivateKeyState* pPrv, Ipp8u * scratchBuffer)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// de-crypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppStatus status2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;status2 = ippsRSA_Decrypt(C, Z, pPrv, scratchBuffer);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is App.ccp&lt;/P&gt;&lt;P&gt;// NewencT.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。&lt;BR /&gt;//&lt;BR /&gt;#include "pch.h"&lt;BR /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR /&gt;#include &amp;lt;tchar.h&amp;gt;&lt;BR /&gt;#include "sgx_urts.h"&lt;BR /&gt;#include &amp;lt;string.h&amp;gt;&lt;BR /&gt;#include "EnclaveT_u.h"&lt;BR /&gt;#include "ippcp.h"&lt;BR /&gt;#include &amp;lt;iostream&amp;gt;&lt;BR /&gt;#include &amp;lt;xsample_bignum.h&amp;gt;&lt;BR /&gt;#include &amp;lt;BigNumber.h&amp;gt;&lt;BR /&gt;using namespace std;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;#define ENCLAVE_FILE _T("EnclaveT.signed.dll")&lt;BR /&gt;#define MAX_BUF_LEN 100&lt;/P&gt;&lt;P&gt;static IppsBigNumState* newBN(int len, const Ipp32u* pData)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int size;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsBigNumGetSize(len, &amp;amp;size);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pBN = (IppsBigNumState*)(new Ipp8u[size]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsBigNumInit(len, pBN);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (pData)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsSet_BN(IppsBigNumPOS, len, pData, pBN);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pBN;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;IppsPRNGState* newPRNG(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int ctxSize;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPRNGGetSize(&amp;amp;ctxSize);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPRNGState* pCtx = (IppsPRNGState*)(new Ipp8u[ctxSize]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPRNGInit(160, pCtx);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pCtx;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;// Prime Generator context&lt;BR /&gt;//&lt;BR /&gt;IppsPrimeState* newPrimeGen(int maxBits)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int size;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPrimeGetSize(maxBits, &amp;amp;size);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPrimeState* pCtx = (IppsPrimeState*)(new Ipp8u[size]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsPrimeInit(maxBits, pCtx);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return pCtx;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;void deletePrimeGen(IppsPrimeState* pPrimeG)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delete[](Ipp8u*)pPrimeG;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void deletePRNG(IppsPRNGState* pPRNG)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;delete[](Ipp8u*)pPRNG;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;int main()&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// specify the context of key components to contain generated key // data&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pModulus = newBN(1024 / 32, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pPublicExp = newBN(1024 / 32, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pPrivateExp = newBN(1024 / 32, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// (bit) size of key components&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsN = 1024; // Length of RSA system in bits(the modulus. size of &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;// our modulus, must be large(4096 standard), but we will 1024&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsE = 512; // Length of the RSA public exponent in bits(the e //component&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsP = 512; //Length in bits of the p factors of the modulus(that //is, the p in the equation: n = p*q&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int bitsQ = 512;//Length in bits of the q factors of the modulus(that //is, the q in the equation: n = p*q&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int keyCtxSize; //Available size of memory buffer being initialized&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// setup public key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// calculate size of public keys context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_GetSizePublicKey(bitsN, bitsE, &amp;amp;keyCtxSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//public key context allocated with generated buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsRSAPublicKeyState* pPub = (IppsRSAPublicKeyState*)(new Ipp8u[keyCtxSize]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//context initialized in memory&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_InitPublicKey(bitsN, bitsE, pPub, keyCtxSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// setup (type2) private key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//calculate size of private keys context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_GetSizePrivateKeyType2(bitsP, bitsQ, &amp;amp;keyCtxSize);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//private key context allocated with generated buffer size&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsRSAPrivateKeyState* pPrv = (IppsRSAPrivateKeyState*)(new Ipp8u[keyCtxSize]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//context initialized in memory&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_InitPrivateKeyType2(bitsP, bitsQ, pPrv, keyCtxSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int buffSizePrivate; // create variable to reference retrieved size&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_GetBufferSizePrivateKey(&amp;amp;buffSizePrivate, pPrv); //retrieve //buffer size for private key&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp8u * scratchBuffer = NULL; //initialize scratch buffer as ipp8u //(usigned char equivalent)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;scratchBuffer = new Ipp8u[buffSizePrivate]; //allocate memory for //scratch buffer&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// random generator&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPRNGState* pRand = newPRNG();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// prime generator&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsPrimeState* pPrimeG = newPrimeGen(512);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int validateRes = IS_VALID_KEY; // IS_VALID_KEY is the success code&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// validate keys&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_ValidateKeys(&amp;amp;validateRes,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pPub, pPrv, NULL, scratchBuffer,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;10, pPrimeG, ippsPRNGen, pRand);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// check that success code hasn’t changed, and print message on //successful&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (IS_VALID_KEY == validateRes) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "validation successful \n" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// Pointer to IppsBigNumState context for searching an RSA public //exponent&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp32u E = { 0x11 };&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* pSrcPublicExp = newBN(1, &amp;amp;E);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppStatus status; // reference to generated message code&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// keys generator&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;status = ippsRSA_GenerateKeys(pSrcPublicExp, pModulus, pPublicExp, pPrivateExp, pPrv, scratchBuffer, 10, pPrimeG, ippsPRNGen, pRand);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// check for successful generation of keys&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ippStsNoErr signals success&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (status == ippStsNoErr) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "keys generation successful \n" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// get modulus generated&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BigNumber modN(pModulus); // create BigNumber instance of modulus&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//modN.tBN("Modulus (n): "); // display key data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//cout &amp;lt;&amp;lt; "\n" &amp;lt;&amp;lt; endl; // print empty line&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// get public key generated&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BigNumber Pk(pPublicExp); // create BigNumber instance of public key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Pk.tBN("Public Key Exponent (e): "); // display key data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//cout &amp;lt;&amp;lt; "\n" &amp;lt;&amp;lt; endl; // print empty line&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//get private key generated&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;BigNumber Pvk(pPrivateExp); //create BigNumber instance of private key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//Pvk.tBN("Private Key Exponent (d): "); // display key data&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// set public key with generated public key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_SetPublicKey(pModulus, pPublicExp, pPub);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// set up type1 private key component with generated private key&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ippsRSA_SetPrivateKeyType1(pModulus, pPrivateExp, pPrv);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp32u dataM[] = { // plain text to be encrypted&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x12345678,0xabcde123,0x87654321,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x111aaaa2,0xbbbbbbbb,0xcccccccc,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x12237777,0x82234587,0x1ef392c9,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x43581159,0xb5024121,0xa48D2869,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x2abababa,0x1a2b3c22,0xa47728B4,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x54321123,0xaaaaaaaa,0xbbbbbbbb,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xcccccccc,0xdddddddd,0x34667666,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xa46a3aaa,0xe4251e84,0xf31f2Eff,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xfec55267,0x11111111,0x98765432,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x54376511,0x21323111,0x85433abc,0xcaa44322,0x001234ef};&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "DATAM "&amp;lt;&amp;lt; sizeof(dataM) &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// we will create ciphertext context with size of dataN&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Ipp32u dataN[] = { // data for ciphertext context creation&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x03cccb37,0x6acadded,0xdf4f20d0,0x2458257d,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xda3b7886,0x5c1b1a4c,0xea6f676b,0x59f51e09,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xc0691195,0x8076c61f,0x4221d059,0xd021673a,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x139bd5ef,0x95189046,0x10eb90ea,0x127af4e5,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x14f5dcb8,0x1e13510f,0x6e2e0558,0xa650fce0,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0xff0bcd51,0xe218e43d,0xad045536,0xdc4a21d7,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x74edee68,0xb474ad57,0x79514004,0xa65a27a3,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0x9e5259c1,0xe78e89eb,0xb34ed292,0x99197f0d };&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// create contexts for &amp;nbsp;message and ciphertext, this allocate the //appropriate memory size for storing message and ciphertext&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// create message context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* Msg = newBN(sizeof(dataM) / sizeof(dataM[0]), dataM);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//create ciphertext context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* C = newBN(sizeof(dataN) / sizeof(dataN[0]), dataN);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// encrypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppStatus status1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;status1 = ippsRSA_Encrypt(Msg, C, pPub, scratchBuffer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// check for successful encryption of msg&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (status1 == ippStsNoErr) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "message encryption successful \n" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// de-crypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//IppStatus status2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//status2 = ippsRSA_Decrypt(C, Z, pPrv, scratchBuffer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// check for successful decryption of ciphertext&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//if (status2 == ippStsNoErr) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "message decryption successful \n" &amp;lt;&amp;lt; endl;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sgx_enclave_id_t&amp;nbsp;&amp;nbsp; &amp;nbsp; eid;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sgx_status_t&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = SGX_SUCCESS;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sgx_launch_token_t&amp;nbsp;&amp;nbsp; &amp;nbsp;token = { 0 };&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;int updated = 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;char buffer[MAX_BUF_LEN] = "Hello World!";&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//创建包含token的enclave容器&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &amp;amp;token, &amp;amp;updated, &amp;amp;eid, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (ret != SGX_SUCCESS)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printf("APP:error %#x ,failed to create enclave .\n", ret);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// create de-ciphertext context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppsBigNumState* Z = newBN(sizeof(dataN) / sizeof(dataN[0]), dataN);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;foo(eid, C, Z, pPrv, scratchBuffer);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// create de-ciphertext context&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//IppsBigNumState* Z = newBN(sizeof(dataN) / sizeof(dataN[0]), dataN);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//// de-crypt &amp;nbsp;message, and return status code for verification&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//IppStatus status2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;//status2 = ippsRSA_Decrypt(C, Z, pPrv, scratchBuffer);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; "YIKU" &amp;lt;&amp;lt; endl;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;////Enclave CALL(ECALL) 启动enclave容器&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//foo(0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//printf("successfully");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//getchar();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//销毁enclave容器&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (SGX_SUCCESS != sgx_destroy_enclave(eid))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;system("pause");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;getchar();&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;/P&gt;&lt;P&gt;}&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When I rebuild the enclave project, I get the error "&amp;nbsp; D:\project\EnclaveT\EnclaveT\EnclaveT.edl(246,7): parse error ".&amp;nbsp;&lt;/P&gt;&lt;P&gt;Could you tell how to solve this problem?&amp;nbsp;I guess the big problem appears in the edl file, but I don't know how to deal with it.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 28 Dec 2019 14:54:35 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Confidential-Computing/About-SGX-ECALLs/m-p/1163913#M2969</guid>
      <dc:creator>刘__高</dc:creator>
      <dc:date>2019-12-28T14:54:35Z</dc:date>
    </item>
    <item>
      <title>Hello, </title>
      <link>https://community.intel.com/t5/Intel-Confidential-Computing/About-SGX-ECALLs/m-p/1163914#M2970</link>
      <description>&lt;P&gt;Hello,&amp;nbsp;&lt;/P&gt;&lt;P&gt;In the EDL file, remove the "#" from&amp;nbsp;#include &amp;lt;ippcp.h&amp;gt;. See page 61 of the Intel Software Guard Extensions SDK Developer Reference for Windows OS for more guidance on Enclave Definition Syntax.&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Jesus&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 31 Dec 2019 22:23:46 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Confidential-Computing/About-SGX-ECALLs/m-p/1163914#M2970</guid>
      <dc:creator>JesusG_Intel</dc:creator>
      <dc:date>2019-12-31T22:23:46Z</dc:date>
    </item>
  </channel>
</rss>

