[Kernel] Implemented XeCryptHmacShaInit, XeCryptHmacShaUpdate and XeCryptHmacShaFinal
This commit is contained in:
@@ -48,6 +48,11 @@ struct XECRYPT_SHA_STATE {
|
|||||||
};
|
};
|
||||||
static_assert_size(XECRYPT_SHA_STATE, 0x58);
|
static_assert_size(XECRYPT_SHA_STATE, 0x58);
|
||||||
|
|
||||||
|
struct XECRYPT_HMACSHA_STATE {
|
||||||
|
XECRYPT_SHA_STATE sha_state[2];
|
||||||
|
};
|
||||||
|
static_assert_size(XECRYPT_HMACSHA_STATE, 0xB0);
|
||||||
|
|
||||||
// TODO: Size of this struct hasn't been confirmed yet.
|
// TODO: Size of this struct hasn't been confirmed yet.
|
||||||
struct XECRYPT_SHA256_STATE {
|
struct XECRYPT_SHA256_STATE {
|
||||||
xe::be<uint32_t> count; // 0x0
|
xe::be<uint32_t> count; // 0x0
|
||||||
@@ -489,6 +494,48 @@ void XeCryptSha_entry(lpvoid_t input_1, dword_t input_1_size, lpvoid_t input_2,
|
|||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(XeCryptSha, kNone, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(XeCryptSha, kNone, kImplemented);
|
||||||
|
|
||||||
|
void XeCryptHmacShaInit_entry(pointer_t<XECRYPT_HMACSHA_STATE> sha_state_ptr,
|
||||||
|
lpvoid_t key_ptr, dword_t key_size) {
|
||||||
|
sha_state_ptr.Zero();
|
||||||
|
|
||||||
|
const uint8_t* key_data_ptr = key_ptr.as<uint8_t*>();
|
||||||
|
const uint32_t key_size_ = key_size > 64 ? 64 : key_size.value();
|
||||||
|
|
||||||
|
XeCryptShaInit_entry(sha_state_ptr->sha_state);
|
||||||
|
XeCryptShaInit_entry(&sha_state_ptr->sha_state[1]);
|
||||||
|
|
||||||
|
std::array<uint8_t, 64> key_1 = {};
|
||||||
|
std::array<uint8_t, 64> key_2 = {};
|
||||||
|
|
||||||
|
std::copy_n(key_data_ptr, key_size_, key_1.begin());
|
||||||
|
std::copy_n(key_data_ptr, key_size_, key_2.begin());
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < key_size_; i += 1) {
|
||||||
|
key_1[i] ^= 0x5C5C5C5Cu;
|
||||||
|
key_2[i] ^= 0x36363636u;
|
||||||
|
}
|
||||||
|
|
||||||
|
XeCryptShaUpdate_entry(sha_state_ptr->sha_state, key_2.data(), key_size_);
|
||||||
|
XeCryptShaUpdate_entry(&sha_state_ptr->sha_state[1], key_1.data(), key_size_);
|
||||||
|
}
|
||||||
|
DECLARE_XBOXKRNL_EXPORT1(XeCryptHmacShaInit, kNone, kImplemented);
|
||||||
|
|
||||||
|
void XeCryptHmacShaUpdate_entry(pointer_t<XECRYPT_HMACSHA_STATE> sha_state_ptr,
|
||||||
|
lpvoid_t input, dword_t input_size) {
|
||||||
|
XeCryptShaUpdate_entry(sha_state_ptr->sha_state, input, input_size);
|
||||||
|
}
|
||||||
|
DECLARE_XBOXKRNL_EXPORT1(XeCryptHmacShaUpdate, kNone, kImplemented);
|
||||||
|
|
||||||
|
void XeCryptHmacShaFinal_entry(pointer_t<XECRYPT_HMACSHA_STATE> sha_state_ptr,
|
||||||
|
pointer_t<uint8_t> out, dword_t out_size) {
|
||||||
|
XeCryptShaFinal_entry(sha_state_ptr->sha_state, 0, 0);
|
||||||
|
XeCryptShaUpdate_entry(&sha_state_ptr->sha_state[1],
|
||||||
|
sha_state_ptr->sha_state->state,
|
||||||
|
sizeof(XECRYPT_SHA_STATE::state));
|
||||||
|
XeCryptShaFinal_entry(&sha_state_ptr->sha_state[1], out, out_size);
|
||||||
|
}
|
||||||
|
DECLARE_XBOXKRNL_EXPORT1(XeCryptHmacShaFinal, kNone, kImplemented);
|
||||||
|
|
||||||
void XeCryptMd5_entry(lpvoid_t input_1, dword_t input_1_size, lpvoid_t input_2,
|
void XeCryptMd5_entry(lpvoid_t input_1, dword_t input_1_size, lpvoid_t input_2,
|
||||||
dword_t input_2_size, lpvoid_t input_3,
|
dword_t input_2_size, lpvoid_t input_3,
|
||||||
dword_t input_3_size, lpvoid_t output,
|
dword_t input_3_size, lpvoid_t output,
|
||||||
|
|||||||
Reference in New Issue
Block a user