Crypto++导致应用程序失败

Crypto++ causing application failure

本文关键字:失败 应用程序 Crypto++      更新时间:2023-10-16

我正在开发Crypto++的Flash的AIR本地扩展,我将作为公共领域发布。我开始用一些代码来测试哈希(在这种情况下使用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);会导致上面提到的应用程序失败以及修复它的可能方法。

看起来您假设actualBytes。Bytes是指向至少32字节的内存块的指针,因为您已经将32硬编码为memcpy中的第三个参数。

这可能是一个无效的假设,您应该检查以确保actualBytes。长度>= 32,然后执行memcpy

最安全的方法可能是确保从ActionScript端分配了足够大的内存块。或者,您可以尝试在c++中分配内存,然后修改actualBytes内容以指向该分配并更改长度值。但这似乎充满了危险。

相关文章: