Skip to content

Commit 4dfd91d

Browse files
Fea #138, 添加ncrypt相关接口
- 添加 NCryptCreatePersistedKey - 添加 NCryptDeleteKey - 添加 NCryptExportKey - 添加 NCryptFinalizeKey - 添加 NCryptFreeObject - 添加 NCryptGetProperty - 添加 NCryptSetProperty - 添加 NCryptImportKey - 添加 NCryptIsAlgSupported - 添加 NCryptOpenKey - 添加 NCryptOpenStorageProvider - 添加 NCryptSignHash - 添加 NCryptEncrypt - 添加 NCryptDecrypt - 添加 NCryptCloseProtectionDescriptor - 添加 NCryptCreateProtectionDescriptor - 添加 NCryptGetProtectionDescriptorInfo - 添加 NCryptProtectSecret - 添加 NCryptUnprotectSecret - 添加 NCryptDeriveKey - 添加 NCryptSecretAgreement - 添加 NCryptVerifySignature
1 parent 3462033 commit 4dfd91d

7 files changed

Lines changed: 2586 additions & 2 deletions

File tree

.github/copilot-instructions.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
# Copilot Instructions
22

3-
## General Guidelines
3+
## 项目指南
44
- 你是中国人,平时喜欢使用中文交流。
55
- 你是拥有100年开发经验的Windows C++软件工程师。编写的代码可读性好、边界情况考虑全面、性能优越。
66
- 这个项目主要是为了老版本系统提供不存在时的API Fallback,确保程序在不同版本的Windows上都能正常运行。
77
- 添加代码后会同步添加单元测试
88
- 先只运行新增的单元测试,通过后再运行其他测试。
99
- 添加一个新的Windows API的Fallback后记得同步更新到`ThunksList.md`
10+
- 因为需要提供广泛的兼容性VC6-2026全部兼容,所以Thunks里代码不能使用std::vector、strcpy_s等函数,优先考虑项目里内部的一些设施。
11+
- 单元测试等其他地方无此限制
12+
- 实现Thunks逻辑时尽量兼容行为;确实无法支持时允许先添加 __WarningMessage__
13+
- 在单元测试中,NCrypt相关接口应尽量按“每个API单独一个TEST_CLASS”拆分,便于定位失败接口。
1014

1115
## Code Style
1216
- 参考`C++编码风格约定.md`

ThunksList.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,32 @@
222222
| CM_Get_DevNode_PropertyW | 调用CM_Get_DevNode_Property_ExW。
223223
| CM_Set_DevNode_PropertyW | 调用CM_Set_DevNode_Property_ExW。
224224

225+
## ncrypt.dll
226+
| 函数 | Fallback
227+
| ---- | -----------
228+
| NCryptOpenStorageProvider | 内部实现。
229+
| NCryptIsAlgSupported | 内部实现(当前返回 RSA/RSA_SIGN 支持)。
230+
| NCryptCreatePersistedKey | 调用 CryptAcquireContextW。当前仅支持 RSA。
231+
| NCryptSetProperty | 内部实现(支持 NCRYPT_LENGTH_PROPERTY)。
232+
| NCryptGetProperty | 内部实现(支持 NCRYPT_LENGTH_PROPERTY/NCRYPT_ALGORITHM_PROPERTY)。
233+
| NCryptFinalizeKey | 调用 CryptGenKey。
234+
| NCryptOpenKey | 调用 CryptAcquireContextW。
235+
| NCryptImportKey | 调用 CryptImportKey。
236+
| NCryptExportKey | 调用 CryptExportKey。
237+
| NCryptSignHash | 调用 CryptSignHashW。
238+
| NCryptVerifySignature | 调用 CryptVerifySignatureW。
239+
| NCryptEncrypt | 调用 CryptEncrypt。
240+
| NCryptDecrypt | 调用 CryptDecrypt。
241+
| NCryptDeleteKey | 内部实现。
242+
| NCryptFreeObject | 调用 CryptReleaseContext等。
243+
| NCryptCreateProtectionDescriptor | 内部实现(简化描述符对象)。
244+
| NCryptCloseProtectionDescriptor | 内部实现。
245+
| NCryptGetProtectionDescriptorInfo | 内部实现。
246+
| NCryptProtectSecret | 内部实现。
247+
| NCryptUnprotectSecret | 内部实现。
248+
| NCryptDeriveKey | 内部实现。
249+
| NCryptSecretAgreement | 内部实现。
250+
225251
## Credui.dll
226252
| 函数 | Fallback
227253
| ---- | -----------

src/Thunks/YY_Thunks.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ YY-Thunks支持的控制宏:
6565
_APPLY(mfplat, "mfplat" , 0 ) \
6666
_APPLY(mfreadwrite, "mfreadwrite" , 0 ) \
6767
_APPLY(mmdevapi, "mmdevapi" , 0 ) \
68+
_APPLY(ncrypy, "ncrypy" , 0 ) \
6869
_APPLY(ndfapi, "ndfapi" , 0 ) \
6970
_APPLY(bluetoothapis, "bluetoothapis" , 0 ) \
7071
_APPLY(netapi32, "netapi32" , 0 ) \
@@ -837,6 +838,24 @@ namespace YY::Thunks::internal
837838
return _cchString;
838839
}
839840

841+
template<typename Char>
842+
constexpr size_t StringCopy(_Out_writes_z_(_cchOut) Char* _szOut, size_t _cchOut, _In_z_ const Char* _szString, size_t _cchMaxLength = -1)
843+
{
844+
if (_szOut == nullptr || _cchOut == 0)
845+
return 0;
846+
847+
const auto _cchString = StringLength(_szString, _cchMaxLength);
848+
if (_cchOut <= _cchString)
849+
{
850+
*_szOut = '\0';
851+
return 0;
852+
}
853+
854+
memcpy(_szOut, _szString, _cchString * sizeof(Char));
855+
_szOut[_cchString] = L'\0';
856+
return _cchString;
857+
}
858+
840859
static LPCWSTR __fastcall FindStringTable(LPCWSTR* _pszTable, size_t _cCount, LPCWSTR _szFound) noexcept
841860
{
842861
const auto _pszTableEnded = _pszTable + _cCount;

0 commit comments

Comments
 (0)