我正在开发一个Crypto ++ for Flash的AIR Native Extension,我将作为公共域发布。我开始使用一些代码来测试散列(在这种情况下使用SHA-256)但由于某种原因CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
(由消除过程发现)导致Flash编译器无法识别任何可用的方法(扩展上下文确实如此)没有名为isSupported的方法。):
这里是完整的C ++代码:
FREObject isSupported(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
FREObject result;
uint32_t isSupportedSwitch = 1;
FRENewObjectFromBool(isSupportedSwitch, &result);
return result;
}
FREObject computeHash(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
FREObject result;
FREByteArray actualBytes;
FREAcquireByteArray(argv[0], &actualBytes);
byte const* pbData = (byte*) actualBytes.bytes;
unsigned int nDataLen = strlen((const char*) pbData);
byte abDigest[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
memcpy(actualBytes.bytes, (uint8_t*) abDigest, 32);
FREReleaseByteArray(argv[0]);
FRENewObjectFromBool(1, &result);
return result;
}
void testContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
{
*numFunctions = 2;
FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));
func[0].name = (const uint8_t*) "isSupported";
func[0].functionData = NULL;
func[0].function = &isSupported;
func[1].name = (const uint8_t*) "computeHash";
func[1].functionData = NULL;
func[1].function = &computeHash;
*functions = func;
}
void testContextFinalizer(FREContext ctx)
{
return;
}
void testInitializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
{
*ctxInitializer = &testContextInitializer;
*ctxFinalizer = &testContextFinalizer;
}
void testFinalizer(void* extData)
{
return;
}
对此的任何帮助都将深表感谢,并且在帮助我完成这个项目方面会有很长的路要走。
编辑:为了澄清,我问为什么CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);
导致上面提到的应用程序失败以及可能的解决方法。
答案 0 :(得分:2)
看起来你假设actualBytes.bytes是一个指向至少32字节的内存块的指针,因为你已经将32硬编码为memcpy中的第三个参数。
这可能是一个无效的假设,您应该在执行memcpy之前检查以确保actualBytes.length> = 32
最安全的方法可能是确保您从ActionScript端分配了足够大的内存块。或者,您可以尝试在C ++中分配内存,然后修改actualBytes内容以指向该分配并更改长度值。但这绝对看起来很危险。