<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Security &amp; Architecture : CryptoAPI</title><link>http://blogs.msdn.com/mariofontana/archive/tags/CryptoAPI/default.aspx</link><description>Tags: CryptoAPI</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Windows Web Services API : Configurazione Certificati e sicurezza per gli esempi con SSL</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/30/windows-web-services-api-configurazione-certificati-e-sicurezza-per-gli-esempi-con-ssl.aspx</link><pubDate>Mon, 30 Mar 2009 14:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9513771</guid><dc:creator>mfontana</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9513771.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9513771</wfw:commentRss><description>&lt;P&gt;Tutti gli esempi che ho creato nei post precedenti erano su HTTP quindi senza sfruttare la sicurezza di trasporto (SSL). Ora vediamo quali passi sono necessari per configurare la comunicazione su SSL (&lt;A href="http://msdn.microsoft.com/en-us/library/dd323341(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323341(VS.85).aspx"&gt;uso questo esempio su MSDN&lt;/A&gt; )&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;IMPORTANTE !!! &lt;/STRONG&gt;In questo post alcune delle configurazioni che faccio sui certificati digitali possono risultare molto pericolose su macchine di produzione… In un ambiente di produzione il rilascio,l’installazione e la manutenzione dei certificati deve essere seguito secondo i processi definiti dalla PKI !! Al contrario, sulle macchine dei sviluppatori spesso risulta necessario farsi delle configurazioni ad hoc per essere autonomi rispetto ai colleghi sistemisti :-) :-). Per facilitare la cosa metterò un tag &lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt; &lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;su tutte quelle procedure da non riprodurre in produzione !!&lt;/P&gt;
&lt;P&gt;Innanzitutto i passaggi per impostare i progetti client e service e il processo di creazione dei file .c e .h dal wsdl sono sempre i medesimi descritti &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx"&gt;qui&lt;/A&gt; e &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx"&gt;qui&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Per far si che il nostro Web Service possa utilizzare il protocollo SSL è necessario configurare quale certificato verrà utilizzato per l’inizializzazione del protocollo. Ce lo ricorda anche un commento nel codice presente in tutti gli esempi su MSDN che utilizzano SSL&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;// NOTE: At the server, the SSL certificate for the listen URI must be &lt;BR&gt;// registered with http.sys using a tool such as httpcfg.exe.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Questa operazione andrà eseguita perchè faremo noi l’hosting del Web Service all’interno di una Win32 console al posto di IIS !! &lt;/P&gt;
&lt;P&gt;In questo post utilizzerò l’utility &lt;EM&gt;netsh.exe &lt;/EM&gt;invece di &lt;EM&gt;httpcfg.exe&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Per prima cosa dovremo procurarci un certificato digitale X509v3. Se non riusciamo ad avere in tempo un certificato da una CA allora seguite questi semplici passi:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;usiamo l’utility &lt;EM&gt;makecert.exe&lt;/EM&gt; per creare ed installare il certificato nel &lt;EM&gt;certificate store &lt;/EM&gt;di Windows. (maggiori info sui &lt;A href="http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx"&gt;certificati&lt;/A&gt; e sugli &lt;A href="http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx"&gt;store&lt;/A&gt; in Windows). Apriamo una console di Visual Studio in Administrator mode e lanciamo :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;makecert -r -pe -n "CN= 127.0.0.1" -b 01/01/2009 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;/WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Tramite questo comando abbiamo creato un certificato per “Ensure the identity of a remote computer” e “All issuance policies” ed è stato installato nel certificate store della macchina (local machine). Apriamo la mmc dei certificati e clicchiamo sul certificato in &lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; e dovremmo vedere una cosa simile a quanto riportato in figura.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_10.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_4.png" width=511 height=334 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;a questo punto se proviamo a lanciare il nostro esempio riceviamo il seguente errore : &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x803d0014 &lt;BR&gt;There was an error communicating with the endpoint at '&lt;/EM&gt;&lt;A href="https://127.0.0.1:8999/examplex" mce_href="https://127.0.0.1:8999/examplex"&gt;&lt;EM&gt;https://127.0.0.1:8999/example’&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;. &lt;BR&gt;The connection with the server was terminated abnormally&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;questo perchè non abbiamo ancora creato il binding tra l’URI e il certificato digitale nel nostro kernel mode http listener(Http.sys) e quindi il protocollo SSL non può funzionare.&amp;nbsp; Infatti se lanciamo il seguente comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http show sslcert&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;abbiamo una lista dei certificati configurati per SSL con relativo IP:port e hash del certificato! Ovviamente il nostro &lt;EM&gt;127.0.0.1:8999 &lt;/EM&gt;non esiste. Quindi lo creiamo lanciando il seguente comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http add sslcert ipport=&lt;STRONG&gt;127.0.0.1:8999&lt;/STRONG&gt; certhash=a455de0b81ce3251d177d9fb74c62fe237a49ae1 appid={00112233-4455-6677-8899-AABBCCDDEEFF}&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In questo caso abbiamo impostato il parametro &lt;STRONG&gt;&lt;EM&gt;ipport=127.0.0.1:8999 &lt;/EM&gt;&lt;/STRONG&gt;e &lt;EM&gt;certhash &lt;/EM&gt;con l’hash del nostro certificato appena creato. Per ottenere il valore dell’hash dobbiamo aprire il certificato e alla voce &lt;EM&gt;Thumbprint &lt;/EM&gt;nella tab &lt;EM&gt;Details &lt;/EM&gt;copiare il contenuto. &lt;STRONG&gt;Ricordarsi di togliere gli spazi !!!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_12.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_5.png" width=395 height=356 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;se ora rilanciamo il comando &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http show sslcert&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;potremo vedere il nuovo binding sulla porta 8999&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_14.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_6.png" width=390 height=147 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Se proviamo ora a lanciare il nostro esempio riceviamo un altro errore:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x803d000a &lt;BR&gt;There was an error communicating with the endpoint at '&lt;/EM&gt;&lt;A href="https://127.0.0.1:8999/example’" mce_href="https://127.0.0.1:8999/example’"&gt;&lt;EM&gt;https://127.0.0.1:8999/example’&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;. &lt;BR&gt;The certificate authority is invalid or incorrect&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;infatti come si vede anche dalla &lt;STRONG&gt;figura 1&lt;/STRONG&gt; il certificato che abbiamo creato ed installato non è valido dal punto di vista della “&lt;EM&gt;Certification path&lt;/EM&gt;”. Per rimediare a questo problema basta copiare il certificato da &lt;BR&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;a&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Certificates (Local Computer)-&amp;gt;Trusted Root Certification Authorities-&amp;gt;Certificates &lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;/WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;a quel punto, se riclicchiamo sul certificato all’interno di &lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; avremo :&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_3.png" width=335 height=209 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;che ci assicura che tutta la “&lt;EM&gt;Certification path&lt;/EM&gt;” è corretta.&lt;/P&gt;
&lt;P&gt;Finalmente, se ora lanciamo il&amp;nbsp; Web Service e il client il tutto funziona con il protocollo SSL !!!! Finito?? Non direi :-) &lt;/P&gt;
&lt;H3&gt;NOOOOO… UN WEB SERVICE CHE GIRA SOLO COME ADMINISTRATOR???&lt;/H3&gt;
&lt;P&gt;In effetti, se ci fermiamo qui i nostri Web Services girano solo se hanno le credenziali di amministratore !!! Orrore !!! Infatti se creiamo due local &lt;EM&gt;Users demo1 &lt;/EM&gt;e &lt;EM&gt;demo2 (aggiungere la policy longon locally se si tratta del server) &lt;/EM&gt;e dalla nostra console amministrativa lanciamo &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;runas /user:demo1 cmd.exe (dopo l’invio ci chiede la password)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;runas /user:demo2 cmd.exe (dopo l’invio ci chiede la password)&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;se nella cmd di &lt;EM&gt;demo1&lt;/EM&gt; ad esempio lanciamo il nostro service (che prima funzionava nella console che gira come admin) avremo come risposta :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x80070005 &lt;BR&gt;Unable to add URL to HTTP URL group. &lt;BR&gt;&lt;STRONG&gt;Access is denied.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Per superare questo ultimo scoglio dobbiamo assegnare i permessi ad un gruppo di utenti (o ad un singolo utente nel nostro caso, per semplicità) per un determinato &lt;EM&gt;HTTP URL namespace&lt;/EM&gt;. Con questa operazione di fatto diamo la possibilità di creare dei servizi di listener su determinati URL a tutti i processi che girano con le credenziali definite. Questa operazione verrà effettuata, ad esempio, durante il processo di installazione dei nostri servizi. Per fare questa operazione lanciamo il comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http add urlacl url=http&lt;B&gt;s&lt;/B&gt;://127.0.0.1:8999/example user=demo1&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;e possiamo visualizzare il nuovo namespace reservation tramite il comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http show urlacl&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_16.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_7.png" width=421 height=134 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_7.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;a questo punto se rilanciamo il servizio sempre dalla console &lt;EM&gt;demo1&lt;/EM&gt; … funzionerà !!!&amp;nbsp; mentre se lo lanciamo dalla console &lt;EM&gt;demo2 &lt;/EM&gt;no !! &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_18.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_18.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_8.png" width=561 height=297 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_8.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;La prova del nove? Dalla console amministrativa lanciate il comando:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http delete urlacl url=https://127.0.0.1:8999/example&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;che cancella nuovamente la reservation e vedrete che se rilanciate il vostro Web service sempre dalla console &lt;EM&gt;demo1&lt;/EM&gt; non funzionerà nuovamente :-)&lt;/P&gt;
&lt;H3&gt;Un paio di Curiosità &lt;/H3&gt;
&lt;P&gt;1) &lt;STRONG&gt;Dove vengono registrate le info di &lt;EM&gt;netsh.exe&lt;/EM&gt; ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Tutte le impostazioni vengono salvate nel registy :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\&lt;STRONG&gt;SslBindingInfo&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_22.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_22.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_2.png" width=503 height=102 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;e in &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\&lt;STRONG&gt;UrlAclInfo&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_20.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_20.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_1.png" width=505 height=254 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2) Quali API devo utilizzare per crearmi programmaticamente una URL reservation?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Le API di riferimento sono le &lt;/STRONG&gt;&lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa364622(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa364622(VS.85).aspx"&gt;HTTP Server API Reference&lt;/A&gt;. &lt;BR&gt;Alla fine il tutto si risolve tramite le API &lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;ULONG HttpInitialize( __in HTTPAPI_VERSION Version, &lt;BR&gt;&lt;/EM&gt;&lt;EM&gt;__in ULONG Flags, &lt;BR&gt;__reserved PVOID pReserved );&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;e&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;EM&gt;ULONG HttpSetServiceConfiguration(
  __in  HANDLE ServiceHandle,
  __in  HTTP_SERVICE_CONFIG_ID ConfigId,
  __in  PVOID pConfigInformation,
  __in  ULONG ConfigInformationLength,
  __in  LPOVERLAPPED pOverlapped
);&lt;/EM&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Stavo per scrivere il wrapper in C# via p/Invoke ma grazie a Keith Brown &lt;A href="http://www.pluralsight.com/community/blogs/keith/archive/2005/10/17/15632.aspx" target=_blank mce_href="http://www.pluralsight.com/community/blogs/keith/archive/2005/10/17/15632.aspx"&gt;ho risparmiato almeno un’oretta di lavoro&lt;/A&gt; :-). Anche in questo caso, esclusi i vari controlli il tutto si riduce nelle due chiamate alle HTTP API.&lt;/P&gt;&lt;EM&gt;&lt;/EM&gt;
&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// Inizializzazioni varie delle HTTP API&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;…&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// Impostazione delle ACL&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;int errorCode = HttpInitialize(httpApiVersion,HTTP_INITIALIZE_CONFIG, IntPtr.Zero);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;errorCode = HttpSetServiceConfigurationAcl(IntPtr.Zero, HttpServiceConfigUrlAclInfo,ref configInfo, Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)),IntPtr.Zero);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;//Chiamte a Funzioni HTTPAPI di CleanUp…&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;…&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Infine, mi raccomando di ricordarsi di cancellare o disattivare gli utenti locali demo1 e demo2 e di cancellare i certificati quanto prima !!!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;--Mario&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9513771" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Crittografia/default.aspx">Crittografia</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/CryptoAPI/default.aspx">CryptoAPI</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx">C/C++</category></item><item><title>Certificati, Store e un po' di utilities via CryptoAPI</title><link>http://blogs.msdn.com/mariofontana/archive/2008/02/06/un-po-di-esempi-via-cryptoapi.aspx</link><pubDate>Wed, 06 Feb 2008 12:38:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7487620</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7487620.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7487620</wfw:commentRss><description>&lt;p&gt;Oggi ho dovuto riesumare i ricordi sulle &lt;em&gt;CryptoAPI&lt;/em&gt; e &lt;em&gt;C SDK&lt;/em&gt;. Ecco un po' di codice per la gestione dei certificati X509, i certificate store, i key containers e un po' di utilities che possono risultare utili :-)&lt;/p&gt; &lt;p&gt;Attenzione, se riutilizzate il codice verificate che si integri con il vostro sistema di Exception Management!!&lt;/p&gt; &lt;h2&gt;Certificati&lt;/h2&gt; &lt;p&gt;/**************************************************************************&lt;/p&gt; &lt;p&gt;* Function: void CSpy_DumpExtraCertInfo(PCCERT_CONTEXT pcert)&lt;/p&gt; &lt;p&gt;*&lt;/p&gt; &lt;p&gt;* Purpose :&amp;nbsp; Print additional Certificate information&lt;/p&gt; &lt;p&gt;**************************************************************************/&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; CSpy_DumpExtraCertInfo(PCCERT_CONTEXT pcert)&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR szName[1000];&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT pCurrentCert;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT pIssuerCert;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwVerificationFlags;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR lpszString = (LPWSTR)malloc(&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR) * MAX_PATH);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SYSTEMTIME stNotBefore,stNotAfter;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp; dwBitLen;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PBYTE pThumbprint;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PBYTE pData;&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;__try&lt;/span&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// display leaf name&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pcert-&amp;gt;dwCertEncodingType,&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;Subject,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building subject name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; subject: %s\n"&lt;/span&gt;, szName);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pcert-&amp;gt;dwCertEncodingType,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;Issuer,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building issuer name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; issuer: %s\n"&lt;/span&gt;, szName);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; serial number: "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData = pcert-&amp;gt;pCertInfo-&amp;gt;SerialNumber.cbData;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt; (DWORD n = 0; n &amp;lt; dwData; n++)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%02X"&lt;/span&gt;,pcert-&amp;gt;pCertInfo-&amp;gt;SerialNumber.pbData[dwData - (n + 1)]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( n&amp;gt;0&amp;amp;&amp;amp;(1== n % 2))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileTimeToSystemTime(&amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;NotBefore, &amp;amp;stNotBefore);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wsprintf(lpszString, L&lt;span style="color: rgb(163,21,21)"&gt;"%02d/%02d/%d"&lt;/span&gt;,stNotBefore.wDay, stNotBefore.wMonth, stNotBefore.wYear);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; NotBefore : %s\n"&lt;/span&gt;,lpszString);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileTimeToSystemTime(&amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;NotAfter, &amp;amp;stNotAfter);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wsprintf(lpszString, L&lt;span style="color: rgb(163,21,21)"&gt;"%02d/%02d/%d"&lt;/span&gt;,stNotAfter.wDay, stNotAfter.wMonth, stNotAfter.wYear);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; NotAfter : %s\n"&lt;/span&gt;,lpszString);&lt;/p&gt;&amp;nbsp; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;//Thumbprint&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Thumbprint : "&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (!CertGetCertificateContextProperty(pcert, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_SHA1_HASH_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error : CertGetCertificateContextProperty() failed in retrieve memory settings.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (NULL == (pThumbprint = (BYTE*) malloc(dwData)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error [E_OUTOFMEMORY]: malloc() failed.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (!CertGetCertificateContextProperty(pcert, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_SHA1_HASH_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pThumbprint, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error : CertGetCertificateContextProperty() failed.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt; (DWORD n = 0; n &amp;lt; dwData; n++)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%02X"&lt;/span&gt;,pThumbprint[n]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( n&amp;gt;0&amp;amp;&amp;amp;(1== n % 2))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(pThumbprint);&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;//UI description&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertGetCertificateContextProperty(pcert, &lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_DESCRIPTION_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (NULL == (pData = (BYTE*) malloc(dwData)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error [E_OUTOFMEMORY]: malloc() failed.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertGetCertificateContextProperty(pcert, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_DESCRIPTION_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pData, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Description=%s\n"&lt;/span&gt;,pData);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(pData);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;//end od UI&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DumpCertificateExtensions(pcert);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;//Public Key Infos&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Public Key :\n"&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (0 != (dwBitLen = CertGetPublicKeyLength(&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MY_ENCODING_TYPE,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; length=%i\n"&lt;/span&gt;, dwBitLen);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x in CertGetPublicKeyLength\n"&lt;/span&gt;, GetLastError());&lt;/p&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; Algorithm ID= "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//TODO: Add a new function to decode CRYPT_ALGORITHM_IDENTIFIER&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; counter=0;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.Algorithm.pszObjId[counter] != &lt;span style="color: rgb(163,21,21)"&gt;'\0'&lt;/span&gt;)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%c"&lt;/span&gt;,pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.Algorithm.pszObjId[counter++]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; Key="&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData = pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.PublicKey.cbData;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt; (DWORD n = 0; n &amp;lt; dwData; n++)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%02X"&lt;/span&gt;,pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.PublicKey.pbData[n]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( n&amp;gt;0&amp;amp;&amp;amp;(1== n % 2))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//_tprintf(L"&amp;nbsp; Private Key : %s",(CSpy_CertificateHasPrivateKey(pcert))?L"Present":L"Not present");&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Private Key : "&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CSpy_CertificateHasPrivateKey(pcert))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"YES\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DumpCSPInfos(pcert);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"NO\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// display certificate chain&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentCert = pcert;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pCurrentCert != NULL)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwVerificationFlags = 0;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pIssuerCert = CertGetIssuerCertificateFromStore(pcert-&amp;gt;hCertStore,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentCert,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwVerificationFlags);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(pIssuerCert == NULL)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(pCurrentCert != pcert)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CertFreeCertificateContext(pCurrentCert);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pIssuerCert-&amp;gt;dwCertEncodingType,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pIssuerCert-&amp;gt;pCertInfo-&amp;gt;Subject,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building subject name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; CA subject: %s\n"&lt;/span&gt;, szName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pIssuerCert-&amp;gt;dwCertEncodingType,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pIssuerCert-&amp;gt;pCertInfo-&amp;gt;Issuer,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building issuer name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; CA issuer: %s\n\n"&lt;/span&gt;, szName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(pCurrentCert != pcert)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CertFreeCertificateContext(pCurrentCert);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentCert = pIssuerCert;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pIssuerCert = NULL;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;//end__try&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__finally&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: bool CSpy_CertificateHasPrivateKey(PCCERT_CONTEXT pcert)&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; Test if a certificate has the private key&lt;br&gt;**************************************************************************/&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;bool&lt;/span&gt; CSpy_CertificateHasPrivateKey(PCCERT_CONTEXT pcert)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD cb = 0;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; CertGetCertificateContextProperty(pcert, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_KEY_PROV_INFO_PROP_ID, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;cb)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !=0; &lt;span style="color: rgb(0,128,0)"&gt;//to avoid Compiler warning (level 3) C4800&lt;br&gt;&lt;/span&gt;}&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: UINT CSpy_DumpCertificateExtensions(PCCERT_CONTEXT pCertContext)&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; Display cert extensions. Return number of extensions&lt;br&gt;**************************************************************************/&lt;br&gt;&lt;br&gt;&lt;/span&gt;UINT CSpy_DumpCertificateExtensions(PCCERT_CONTEXT pCertContext)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; N. Ext. : %d\n"&lt;/span&gt;,pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension&amp;gt;0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; x =0; x &amp;lt;(&lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt;)pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension;x++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; Critical=%s&amp;nbsp; "&lt;/span&gt;,(pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension-&amp;gt;fCritical)? L&lt;span style="color: rgb(163,21,21)"&gt;"Yes"&lt;/span&gt;:L&lt;span style="color: rgb(163,21,21)"&gt;"NO"&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" OID="&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; n=0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension-&amp;gt;pszObjId[n]!=&lt;span style="color: rgb(163,21,21)"&gt;'\0'&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%c"&lt;/span&gt;,(TCHAR)pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension-&amp;gt;pszObjId[n++]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension++;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: rgb(0,128,0)"&gt;//endfor(int x =0; x &amp;lt;pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension;x++)&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;//endif (pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension&amp;gt;0)&lt;br&gt;&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension;&lt;br&gt;}&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Certificate Store&lt;/h2&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;* Function: void CSpy_DumpStore(TCHAR *storeName)&lt;/p&gt; &lt;p&gt;*&lt;/p&gt; &lt;p&gt;* Purpose :&amp;nbsp; Open a list all certificate in a store&lt;/p&gt; &lt;p&gt;**************************************************************************/&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; CSpy_DumpStore(TCHAR *storeName)&lt;/p&gt;&lt;/span&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HCERTSTORE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hCertStore;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCertContext = NULL;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwFlags=0;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwStrType = CERT_OID_NAME_STR;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cbNameLen;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *sz;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;long&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nCerts=0;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (_tcsclen(storeName) &amp;gt; MAX_PATH )&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; storeName[MAX_PATH] = &lt;span style="color: rgb(163,21,21)"&gt;'\0'&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\nDumping '%s' Store.....\n"&lt;/span&gt;,storeName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Begin Processing by opening a certificate store.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!(hCertStore=CertOpenStore(&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_STORE_PROV_SYSTEM,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MY_ENCODING_TYPE,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_SYSTEM_STORE_CURRENT_USER|CERT_STORE_OPEN_EXISTING_FLAG ,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; storeName)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"The store did not open."&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pCertContext = CertEnumCertificatesInStore(&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hCertStore,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCertContext))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get and display&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the name of subject of the certificate.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!(cbNameLen = CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,NULL,0)))&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"CertGetName 1 failed."&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!(sz = (TCHAR*) malloc(&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR) *cbNameLen+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"Memory allocation failed."&lt;/span&gt;);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,(LPWSTR)sz,cbNameLen+1))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\nCertificate n. %d Version=V%d :(%s)."&lt;/span&gt;,nCerts+1,pCertContext-&amp;gt;pCertInfo-&amp;gt;dwVersion+1,sz);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"CertGetName failed."&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(sz);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DumpExtraCertInfo(pCertContext);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nCerts++;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;// End of while loop&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n=&amp;gt;Total : %s store contains %d certificates"&lt;/span&gt;,storeName,nCerts);&amp;nbsp; &lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp; Close the store.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertCloseStore(hCertStore,CERT_CLOSE_STORE_CHECK_FLAG))&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt; == g_bverbose)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"The store is closed. All certificates are released.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt; == g_bverbose)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"The store was closed, but certificates still in use.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h2&gt;Key Containers&lt;/h2&gt;
&lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: DWORD CSpy_DeleteKeyContainer(PCCERT_CONTEXT pCertContext)&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; &lt;br&gt;**************************************************************************/&lt;br&gt;&lt;br&gt;&lt;/span&gt;DWORD CSpy_DeleteKeyContainer(PCCERT_CONTEXT pCertContext)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD nRetCode = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD cb = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRYPT_KEY_PROV_INFO * pKeyProvInfo = NULL;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__try&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HCRYPTPROV hCryptProv;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (!CryptAcquireContext(&amp;amp;hCryptProv, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKeyProvInfo-&amp;gt;pwszContainerName,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKeyProvInfo-&amp;gt;pwszProvName,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKeyProvInfo-&amp;gt;dwProvType,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRYPT_DELETEKEYSET))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError (L&lt;span style="color: rgb(163,21,21)"&gt;"Unable to Delete the context."&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" %s "&lt;/span&gt;,pKeyProvInfo-&amp;gt;pwszContainerName);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__leave&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__finally&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (pKeyProvInfo)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(pKeyProvInfo);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; nRetCode;&lt;br&gt;&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Utilities&lt;/h2&gt;
&lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: VOID DumpBinaryData( PBYTE pBuffer, ULONG uLen )&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; DumpBinaryData()&lt;br&gt;**************************************************************************/&lt;br&gt;&lt;/span&gt;VOID CSpy_DumpBinaryData( PBYTE pBuffer, ULONG uLen )&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR&amp;nbsp; *p = (TCHAR *)pBuffer;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp; dw;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"{\n&amp;nbsp; "&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;( i &amp;lt; uLen ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = *p;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dw = (DWORD)(c);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"0x%02X, "&lt;/span&gt;, dw &amp;amp; 0xFF );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; ((i % 8) == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n&amp;nbsp; "&lt;/span&gt; );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n}\n"&lt;/span&gt; );&lt;br&gt;}&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7487620" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Crittografia/default.aspx">Crittografia</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/CryptoAPI/default.aspx">CryptoAPI</category></item></channel></rss>