Crypto ++ вызывает сбой приложения - PullRequest
0 голосов
/ 07 декабря 2011

Я разрабатываю собственное расширение AIR для Crypto ++ для Flash, которое я выпущу как общественное достояние.Я начал с некоторого кода для тестирования хэширования (в данном случае с 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); вызывает сбой приложения, упомянутый выше, и возможные способы его устранения.

1 Ответ

2 голосов
/ 07 декабря 2012

Похоже, вы предполагаете, что actualBytes.bytes - это указатель на блок памяти, который составляет не менее 32 байтов, поскольку вы жестко запрограммировали 32 в качестве третьего аргумента в memcpy.

Вероятно, это неверное предположение, и вам следует убедиться, что factBytes.length> = 32 перед выполнением memcpy

Самый безопасный подход - убедиться, что вы выделили достаточно большой блок памяти изСторона ActionScript.В качестве альтернативы вы можете попробовать выделить память в C ++, а затем изменить содержимое actualBytes, чтобы указать на это распределение и изменить значение длины.Но это определенно кажется опасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...