2011-12-07 11 views
0

パブリックドメインとして公開するFlash用のCrypto ++のAIRネイティブ拡張を開発しています。私は、SHA-256を使ってハッシュをテストするいくつかのコードから始めましたが、なんらかの理由で、Flashコンパイラは利用可能なメソッドを認識しません(拡張コンテキストにはメソッドがありませんここでは、完全なC++コードですCrypto ++でアプリケーションのエラーが発生する

:名前はのisSupportedで)。

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で書いているのであれば、なぜFlashコードではなくC++コードを含めるべきですか?なぜあなたは "フラッシュ"の代わりに "C++"というタグを付けましたか? –

+0

AIR Native Extensionです。私は引用: 'Adobe AIRのネイティブ拡張は、ActionScriptクラスと組み込みActionScriptクラスでは利用できないデバイス固有のライブラリや機能に簡単にアクセスできるネイティブコードの組み合わせです。この場合、C++のパフォーマンスはActionScriptよりもはるかに高いので、私はCrypto ++ ANEを記述しようとしています。この質問にはC++コードがあります。 –

答えて

2

memcpyの3番目の引数としてハードコーディングしたので、actualBytes.bytesが少なくとも32バイトのメモリブロックへのポインタであると仮定しているようです。

これはおそらく、無効な仮定であり、あなたがactualBytes.length> = 32のmemcpyを実行する前に

が最も安全なアプローチは、あなたがメモリの十分に大きなブロックを割り当てられたことを確実にするためであるかもしれないことを確認するためにチェックする必要がありますActionScript側からあるいは、C++でメモリを割り当ててから、その割り当てを指すようにactualBytesの内容を変更し、長さの値を変更することもできます。しかし、これは間違いなく危機に直面しているようです。

関連する問題