2011-12-07 96 views
0

我正在開發一個我將作爲公共域發佈的Crypto ++ for Flash的AIR本機擴展。我開始使用一些代碼來測試哈希(在這種情況下使用SHA-256),但由於某些原因CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);(如消除過程所發現的)導致Flash編譯器無法識別任何可用的方法(擴展上下文沒有方法名爲則isSupported):Crypto ++導致應用程序失敗

下面是完整的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

如果你在Flash中寫這個,爲什麼包含C++代碼而不是Flash代碼?爲什麼你將它標記爲「C++」而不是「flash」? –

+0

這是一個AIR本機擴展。我引用:'Adobe AIR的本機擴展是ActionScript類和本機代碼的組合,可以輕鬆訪問設備特定的庫和功能,這些功能在內置的ActionScript類中不可用。在這種情況下,我試圖編寫Crypto ++ ANE,因爲C++的性能比ActionScript要高得多。你在問題中看到的是C++代碼。 –

回答

2

看起來你假設actualBytes.bytes是一個指向至少32字節的內存塊的指針,因爲你已經對memcpy中的第三個參數進行了硬編碼。

這可能是一個無效的假設,你應該檢查,以確保actualBytes.length> = 32執行的memcpy前

最安全的辦法是,確保你已經分配的內存足夠大的塊從ActionScript一側開始。或者,您可以嘗試在C++中分配內存,然後修改actualBytes內容以指向該分配並更改長度值。但這絕對看起來有危險。

相關問題