Является ли вызов BCryptGetProperty детерминированным? - PullRequest
0 голосов
/ 18 октября 2019

Может ли кто-нибудь ответить на один вопрос, пожалуйста?

Является ли вызов BCryptGetProperty детерминированным? (Должен ли он возвращать одинаковые результаты для тех же параметров в вызовах при выполнении в одном процессе?) Идея состоит в том, чтобы не вызывать одну и ту же функцию более одного раза для вычисления хешей или шифрования. Я понимаю, что результат SHA256 должен иметь одинаковый размер, но есть элементы менее очевидные (BCRYPT_OBJECT_LENGTH и т. Д.)

1 Ответ

1 голос
/ 18 октября 2019

Да, размер хеша SHA256 всегда одинаков. Получение размера путем запроса поставщика шифрования полезно, если вы работаете на более высоком уровне.

Представьте, что у вас есть общий класс хеш-функции:

class Hash {
  bool Init(LPCWSTR pszAlgId) { BCryptGetProperty(m_AlgoProvider, BCRYPT_OBJECT_LENGTH, ...); m_data = malloc(); ... BCryptCreateHash(..., pszAlgId, m_data, ...) ... }
  void AddData(LPCVOID p, SIZE_T cb) { ... }
  DWORD GetHashSize() { BCryptGetProperty(m_HashObj, BCRYPT_HASH_LENGTH, ...); }
  bool Finalize(LPVOID pHash) { ... }
};

Класс не знает алгоритм хешированияни размер хеша во время компиляции.

BCRYPT_OBJECT_LENGTH - это размер внутренних данных, используемых функцией хеширования. Он одинаков для всех хешей определенного типа, реализованных конкретным поставщиком криптографии. Если вы поддерживаете только Windows 7 и более поздние версии, вы можете попросить Windows выделить эту память для вас, и вам не нужно запрашивать размер объекта.

Я считаю, что все свойства BCRYPT являются детерминированными после того, как криптообъект был должным образомсоздан / инициализирован, и вы можете кэшировать очевидные постоянные поля, такие как размеры и режимы. Такие вещи, как BCRYPT_INITIALIZATION_VECTOR, очевидно, являются свойствами для каждого объекта и должны кэшироваться только для этого конкретного объекта.

...