CryptSIPVerifyIndirectData函數分析

可以使用此函數從SIP接口對應的文件中提取簽名信息
CryptSIPVerifyIndirectData:將當前文件的哈希結果做為“指紋”,并與從CryptSIPGetSignedDataMsg中提取的簽名信息進行比較。
如果哈希結果相同,則意味著當前文件與之前簽名的文件相同;如果沒有,這意味著文件在傳輸或復制過程中被破壞。


第一部分:


BOOL WINAPI CryptSIPVerifyIndirectData(? ? IN SIP_SUBJECTINFO? ? ? *pSubjectInfo,
IN SIP_INDIRECT_DATA? ? *psData)
{
if (!(pSubjectInfo))
{
SetLastError((DWORD)ERROR_INVALID_PARAMETER);
return(FALSE);
}

? ? SIPObject_? ? ? ? ? *pSubjectObj;

? ? if (!(WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(SIP_SUBJECTINFO, pSubjectInfo->cbSize, dwEncodingType)))
{
SetLastError((DWORD)ERROR_INVALID_PARAMETER);
return(FALSE);
}

? ? pSubjectObj = mssip_CreateSubjectObject(pSubjectInfo->pgSubjectType);

? ? if (!(pSubjectObj))
{
return(FALSE);
}

? ? //
//? if we are a catalog member, set the version number to whatever
//? was set when the catalog file was created...
//
if ((WVT_IS_CBSTRUCT_GT_MEMBEROFFSET(SIP_SUBJECTINFO, pSubjectInfo->cbSize, dwUnionChoice)) &&
(pSubjectInfo->dwUnionChoice == MSSIP_ADDINFO_CATMEMBER) &&
(pSubjectInfo->psCatMember))
{
if (pSubjectInfo->psCatMember->cbStruct == sizeof(MS_ADDINFO_CATALOGMEMBER))
{
if ((pSubjectInfo->psCatMember->pMember) &&
(pSubjectInfo->psCatMember->pMember->cbStruct == sizeof(CRYPTCATMEMBER)))
{
pSubjectInfo->dwIntVersion = pSubjectInfo->psCatMember->pMember->dwCertVersion;
}
}
}

? ? pSubjectObj->set_CertVersion(pSubjectInfo->dwIntVersion);

? ? if (pSubjectObj->get_CertVersion() < WIN_CERT_REVISION_2_0)
{
DWORD? ?dwCAPIFlags;

? ? ? ? CryptSIPGetRegWorkingFlags(&dwCAPIFlags);

? ? ? ? if (dwCAPIFlags & WTPF_VERIFY_V1_OFF)
{
delete pSubjectObj;

? ? ? ? ? ? SetLastError((DWORD)CRYPT_E_SECURITY_SETTINGS);

? ? ? ? ? ? return(FALSE);
}
}

? ? BOOL? ? bRet;

? ? bRet = pSubjectObj->VerifyIndirectData(pSubjectInfo, psData);

? ? delete pSubjectObj;

? ? return(bRet);
}


第二部分:

BOOL SIPObject_::VerifyIndirectData(SIP_SUBJECTINFO *pSI,
SIP_INDIRECT_DATA *psData)
{
if (!(psData))
{
if (this->FileHandleFromSubject(pSI))? ?// if the file exists, set bad parameter!
{
SetLastError((DWORD)ERROR_INVALID_PARAMETER);
}
return(FALSE);
}

? ? if (this->FileHandleFromSubject(pSI))
{
DWORD? ?cbDigest;
BYTE? ? *pbDigest;

? ? ? ? if (!(pbDigest = this->DigestFile(? pSI->hProv,
this->GetDigestFlags(pSI),
psData->DigestAlgorithm.pszObjId,
&cbDigest)))
{
return(FALSE);
}


if ((cbDigest != psData->Digest.cbData) ||
(memcmp(pbDigest,psData->Digest.pbData,cbDigest) != 0))
{
delete pbDigest;

? ? ? ? ? ? SetLastError(TRUST_E_BAD_DIGEST);
return(FALSE);
}

? ? ? ? delete pbDigest;

? ? ? ? return(TRUE);
}

? ? return(FALSE);
}

第三部分:


BYTE *SIPObject_::DigestFile(HCRYPTPROV hProv, DWORD dwFlags, char *pszObjId, DWORD *pcbDigest)
{
DIGEST_DATA? ? ? ? ? ? ?DigestData;
A_SHA_CTX? ? ? ? ? ? ? ?sShaCtx;
MD5_CTX? ? ? ? ? ? ? ? ?sMd5Ctx;

? ? *pcbDigest = 0;

? ? if ((DigestData.dwAlgId = CertOIDToAlgId(pszObjId)) == 0)
{
SetLastError((DWORD)NTE_BAD_ALGID);
return(NULL);
}

? ? DigestData.cbCache? ? ? ? ? = 0;
DigestData.hHash? ? ? ? ? ? = 0;

? ? switch (DigestData.dwAlgId)
{
case CALG_MD5:
DigestData.pvSHA1orMD5Ctx = &sMd5Ctx;
break;

? ? ? ? case CALG_SHA1:
DigestData.pvSHA1orMD5Ctx = &sShaCtx;
break;

? ? ? ? default:
DigestData.pvSHA1orMD5Ctx? ?= NULL;
}

? ? if (!(SipCreateHash(hProv, &DigestData)))
{
return(NULL);
}

? ? if (!(this->GetDigestStream(&DigestData, (DIGEST_FUNCTION)DigestFileData, dwFlags)))
{
return(NULL);
}

? ? // Data left over ?
if (DigestData.cbCache > 0)
{
if (!(SipHashData(&DigestData, DigestData.pbCache, DigestData.cbCache)))
{
SipDestroyHash(&DigestData);
return(NULL);
}
}

第四部分:

BOOL SipHashData(DIGEST_DATA *psDigestData, BYTE *pbData, DWORD cbData)
{
switch (psDigestData->dwAlgId)
{
case CALG_MD5:
MD5Update((MD5_CTX *)psDigestData->pvSHA1orMD5Ctx, pbData, cbData);
return(TRUE);

? ? ? ? case CALG_SHA1:
A_SHAUpdate((A_SHA_CTX *)psDigestData->pvSHA1orMD5Ctx, pbData, cbData);
return(TRUE);
}

? ? return(CryptHashData(psDigestData->hHash, pbData, cbData, 0));
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94251.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20250823解決榮品RD-RK3588-MID開發板在充電的時候大概每10s屏幕會像水波紋閃爍一下

20250823解決榮品RD-RK3588-MID開發板在充電的時候大概每10s屏幕會像水波紋閃爍一下 2025/8/23 17:58【結論】&#xff1a;使用直流電源供電&#xff0c;給電池【快速】充電&#xff0c;但是直流電源的電壓穩定&#xff0c;電流抖動導致的&#xff01;那個是2.4G 已經知道了我司…

CANN安裝

前提條件 請參考本文檔正確安裝和使用CANN軟件,不建議將CANN安裝在共享磁盤后,通過掛載的方式使用CANN,因為CANN對文件系統有文件鎖的依賴,部分共享存儲不支持文件鎖,可能導致任務拉起失敗。 root用戶和非root用戶安裝CANN軟件包的步驟一致,當前示例步驟以非root用戶為例…

docker的基礎配置

目錄 數據卷 數據卷容器 端口映射與容器互聯 互聯機制實現便捷互訪(基于容器搭建論壇) 數據卷 1.創建數據卷 [rootopenEuler-1 /]# docker volume create test test [rootopenEuler-1 /]# docker volume ls DRIVER VOLUME NAME local test [ro…

VSCode Import Cost:5 分鐘學會依賴瘦身

一句話作用&#xff1a;在代碼里 import 時&#xff0c;實時顯示包大小&#xff0c;幫你一眼揪出體積炸彈。1?? 30 秒安裝 & 啟動 打開 VSCode → 擴展商店搜索 Import Cost → 安裝重啟 VSCode&#xff0c;立即生效&#xff0c;零配置。2?? 使用方式&#xff08;開箱即…

TCP/UDP詳解(一)

UDP報文源端口16bit 目的端口16bit校驗和checksum16bit 總長度16bit--------------------------------------------------------------------------------------------------------------------------源目端口用于標識應用層協議&#xff0c;分為知名端口&#x…

數據庫優化提速(一)之進銷存庫存管理—仙盟創夢IDE

從存儲過程到通用 SQL&#xff1a;進銷存系統的數據操作優化在進銷存系統的開發與維護中&#xff0c;數據庫查詢語句的編寫方式對系統的性能、兼容性和可維護性有著深遠影響。本文將圍繞給定的三段 SQL 代碼展開&#xff0c;深入探討將存儲過程轉換為通用 SQL 在進銷存場景下的…

Redis面試精講 Day 28:Redis云原生部署與Kubernetes集成

【Redis面試精講 Day 28】Redis云原生部署與Kubernetes集成 在當今微服務與容器化浪潮中&#xff0c;Redis作為高性能緩存和消息中間件&#xff0c;已從單機部署逐步演進為云原生環境下的核心組件。Day 28 聚焦“Redis云原生部署與Kubernetes集成”&#xff0c;深入解析如何在…

leetcode刷題記錄03——top100題里的6道簡單+1道中等題

leetcode刷題記錄03——top100題里的6道簡單1道中等題上一篇博客&#xff1a; leetcode刷題記錄01——top100題里的7道簡單題 leetcode刷題記錄02——top100題里的7道簡單題 有效的括號 看懂需要用棧了&#xff0c;但是不知道怎么去寫&#xff0c;看了題解mark下正確答案。 cla…

求單位球內滿足邊界條件 u = z3 的調和函數

問題 6&#xff1a;在區域 {x2y2z2≤1}\{x^{2}y^{2}z^{2}\leq 1\}{x2y2z2≤1} 內找到一個調和函數 uuu&#xff0c;使得在邊界 x2y2z21x^{2}y^{2}z^{2}1x2y2z21 上&#xff0c;uuu 等于 gz3gz^{3}gz3。 提示&#xff1a;根據第8.1節&#xff0c;解必須是一個三次調和多項式&…

AAA 服務器與 RADIUS 協議筆記

一、AAA 服務器概述1. 核心定義AAA 是認證&#xff08;Authentication&#xff09;、授權&#xff08;Authorization&#xff09;和計費&#xff08;Accounting&#xff09; 的簡稱&#xff0c;是網絡安全領域中實現訪問控制的核心安全管理機制&#xff0c;通過整合三種服務確保…

Vue3源碼reactivity響應式篇之數組代理的方法

概覽 vue3中對于普通的代理包含對象和數組兩類&#xff0c;對于數組的方法是重寫了許多方法&#xff0c;具體實現參見packages\reactivity\src\arrayInstrumentations.ts arrayInstrumentations實際上就是一個對象&#xff0c;對象的屬性就是數組的方法&#xff0c;屬性值就是重…

如何玩轉K8s:從入門到實戰

一、K8S介紹及部署 1 應用的部署方式演變 部署應用程序的方式上&#xff0c;主要經歷了三個階段&#xff1a; 傳統部署&#xff1a;互聯網早期&#xff0c;會直接將應用程序部署在物理機上 優點&#xff1a;簡單&#xff0c;不需要其它技術的參與 缺點&#xff1a;不能為應用…

綜合測驗:配置主dns,dhcp,虛擬主機,nfs文件共享等

綜合實驗(所有設備關閉防火墻和selinux)在appsrv上部署主dns&#xff0c;為example.com提供域名解析 安裝bind bind-chroot rootappsrv ~]# yum install bind bind-chroot -y編輯主配置文件&#xff0c;全局配置文件&#xff0c;正向解析文件 [rootappsrv ~]# vim /etc/named.c…

MySQL數據庫管理與索引優化全攻略

一、表管理1.建庫語法&#xff1a;create database if not exists 數據庫名;命名規則&#xff1a;僅可使用數字、字母、下劃線、不能純數字&#xff1b;區分字母大小寫&#xff1b;具有唯一性&#xff1b;不可使用MySQL命令或特殊字符。相關命令&#xff1a;show databases; …

基于大模型構建 Java 混淆的方式方法(從入門到精通 · 含開源實踐)

1. 目標與威脅模型:你到底想防什么? 把“混淆”當作成本疊加器:讓逆向者付出更多時間與技能,而不影響用戶體驗與可維護性。可用 Collberg 等提出的四指標來權衡:有效性/韌性/隱蔽性/成本(potency/resilience/stealth/cost)。近年的研究也在重審這些評估方法,建議結合可…

RabbitMQ面試精講 Day 28:Docker與Kubernetes部署實踐

【RabbitMQ面試精講 Day 28】Docker與Kubernetes部署實踐 在微服務架構日益普及的今天&#xff0c;消息中間件RabbitMQ已成為解耦系統、異步通信的核心組件。隨著云原生技術的成熟&#xff0c;如何在Docker與Kubernetes&#xff08;K8s&#xff09;環境中高效、高可用地部署Ra…

神經網絡和深度學習介紹

目錄 1.深度學習的介紹 2.神經網絡的構造 ①神經元結構 ②神經網絡組成 ③權重核心性 3.神經網絡的本質 4.感知器 單層感知器的局限性&#xff1a; 5.多層感知器 多層感知器的優勢&#xff1a; 6.偏置 7.神經網絡的設計 8.損失函數 常用的損失函數&#xff1a; 9…

云原生俱樂部-k8s知識點歸納(8)

這一部分主要講一講CRD客戶資源定義、Gateway API、Priority Class優先類、HPA自動擴縮這四部分內容。還剩下Argo CD的內容了整個k8s&#xff0c;至于operator的話單獨有一本書&#xff0c;都是實戰內容。CRD客戶資源定義先來講一講這節內容的幾個核心術語&#xff0c;Custom R…

【機器學習】7.隨機森林之數學原理

隨機森林&#xff08;Random Forest&#xff09;的數學原理核心是“決策樹基學習器 Bootstrap抽樣 特征隨機選擇” 的集成框架&#xff0c;通過降低單棵決策樹的方差、提升模型泛化能力來工作。以下分步驟解析其數學推導與核心邏輯&#xff1a; 一、 基學習器&#xff1a;決策…

大模型微調面試題全解析:從概念到實戰

大模型微調面試題全解析&#xff1a;從概念到實戰 微調基礎概念 本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型開發 學習視頻/籽料/面試題 都在這>>Github<< >>gitee<< &#xff08;一&#xff09;什么是微調 微調&#xf…