<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум компьютерной помощи &mdash; Бибилиотека на Lotus Script для Работы с крипроПРО]]></title>
		<link>https://itpmr.ru/viewtopic.php?id=1062</link>
		<atom:link href="https://itpmr.ru/extern.php?action=feed&amp;tid=1062&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Бибилиотека на Lotus Script для Работы с крипроПРО».]]></description>
		<lastBuildDate>Wed, 23 Jan 2019 17:47:21 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Бибилиотека на Lotus Script для Работы с крипроПРО]]></title>
			<link>https://itpmr.ru/viewtopic.php?pid=124728#p124728</link>
			<description><![CDATA[<div class="codebox"><pre><code>%REM
    Library CriptoGSS ver 1.0
    Created 21.01.2019 by Andrew Mirkin/Justice
    Description: Для Клиента 8 и выше!
        !!!Важно: используем Серийный номер подписи, а не слепок!!!

    SignString     - генерит подпись из строки
        sSignedData=SignString(doc.Content(0),sSerialNumber)

    SignXML     - подписывает ХМЛ документ  см. приказ ГСС ПМР №147 от 18.10.2018
        формируем ХМЛ и затем sSignedXML=SignXML(XMLstring,sSerialNumber)

    VerifySignature    - проверяет подпись да/нет

    GetSignerInfo    - возвращает информаццию о подписях в виде массива, но сначала надо делать VerifySignature
            mas=GetSignerInfo(signaturesxml)            
            Forall v In mas
                Print v
            End Forall
    ***    доп функции ***
    Unique                     - генерит уникальное имя файла
    GetNotesTempDirectory     - возвращает путь к времменым файлам
    
%END REM
Option Public
Option Declare


Const CAPICOM_CURRENT_USER_STORE = 2
Const CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1
Const CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME=0
Const CADESCOM_DISPLAY_DATA_CONTENT=1
Const CADESCOM_BASE64_TO_BINARY=1
Const CADESCOM_CADES_BES=1
Declare Function w32_OSGetSystemTempDirectory Lib &quot;nnotes&quot; Alias &quot;OSGetSystemTempDirectory&quot; ( ByVal S As String) As Integer 
%REM
    Function Get_Value
    Description: Comments for Function
%END REM
Function Get_Value (allText As String, paramName As String) As String
    Get_Value=StrRight(allText,paramName+&quot;=&quot;)
    Get_Value=StrLeft(Get_Value,&quot;,&quot;)
End Function
%REM
    Function GetNotesTempDirectory
    Description: Comments for Function
%END REM
Function GetNotesTempDirectory() As String 
    Dim d As String * 256 
    Dim s% 
    s% = w32_OSGetSystemTempDirectory(d) 
    GetNotesTempDirectory = Left$(d, s%) +&quot;\&quot;
End Function

%REM
    Function SignXML
    Description: передаем ХМЛ и Серийный номер подписи

%END REM
Function SignXML (XML As String, sSerialNumber As String) As String
    dim sSignedData As String
    XML=StrRight(XML,&quot;&lt;container&gt;&quot;) &#039;вынимаем соержимое контейнера
    XML=StrLeft(XML,&quot;&lt;/container&gt;&quot;) &#039;вынимаем соержимое контейнера
    sSignedData=SignString(XML ,sSerialNumber) &#039; генерим подпись
    &#039; формируем подписанных хмл
    SignXML={&lt;htmlx xmlns=&quot;http://_.w3.org/1999/xhtml&quot; xml:lang=&quot;ru&quot; lang=&quot;ru&quot;&gt;&lt;body2 id=&quot;electronic-document&quot; style=&quot;display: none;&quot;&gt;&lt;container&gt;}
    SignXML=SignXML+XML
    SignXML=SignXML+{&lt;/container&gt;&lt;servinfo&gt;&lt;signaturesxml&gt;}
    SignXML=SignXML+sSignedData
    SignXML=SignXML+{&lt;/signaturesxml&gt;&lt;/servinfo&gt;&lt;/body2&gt;&lt;/htmlx&gt;}
End Function
%REM
    Function SignString
    Description: Comments for Function
%END REM
Function SignString(Content As String,SerialNumber As String) As String
    Dim oSigner, oSignedData&#039;, oSettings
On Error GoTo failed
    Set oSigner = CreateObject(&quot;CAdESCOM.CPSigner&quot;)
    Set oSigner.Certificate = GetSignerCertificate(SerialNumber)
    oSigner.Options = CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
    Set oSignedData = CreateObject(&quot;CAdESCOM.CadesSignedData&quot;)
    oSignedData.DisplayData=CADESCOM_DISPLAY_DATA_CONTENT
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY
    oSignedData.Content  = StringToUTF8B64(Content) &#039;В UTF-8 и Base64 
    SignString = oSignedData.SignCades(oSigner,CADESCOM_CADES_BES,True)
    Exit Function
failed:
    Print &quot;Не удалось создать подпись из-за ошибки: &quot;+Error$
    Exit Function
End Function



%REM
    Function VerifySignature
    Description: Comments for Function
%END REM
Function VerifySignature(dataToVerify As String, sSignedMessage As String) As Boolean
    Dim  oSignedData    
On Error GoTo failed
    Set oSignedData = CreateObject(&quot;CAdESCOM.CadesSignedData&quot;)
    oSignedData.DisplayData=CADESCOM_DISPLAY_DATA_CONTENT
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY
    oSignedData.Content  = StringToUTF8B64(dataToVerify) &#039;В UTF-8 и Base64 
    Call StringTo(sSignedMessage)&#039;Непонятно что тут происходит но без этого не пашет
    VerifySignature = oSignedData.VerifyCades(sSignedMessage,CADESCOM_CADES_BES,True)
    Exit Function
failed:
    Print &quot;Не удалось проверить подпись из-за ошибки: &quot;+Error$
    Exit Function
End Function
Function GetSignerCertificate(SerialNumber) As Variant
    Set GetSignerCertificate = Nothing
    Dim oStore
On Error GoTo failed
    Set oStore = CreateObject(&quot;CAdESCOM.Store&quot;)
    oStore.Open(CAPICOM_CURRENT_USER_STORE)
    ForAll oCert In oStore.Certificates
        If oCert.SerialNumber = SerialNumber Then
            Set GetSignerCertificate = oCert
            Exit ForAll
        End If
    End ForAll
    If GetSignerCertificate Is Nothing then    Print &quot;Выбранный сертификат не найден&quot;    
    Exit Function
failed:
    Print &quot;Возникла ошибка при попытке обращения к хранилишу сертификатов: &quot;+Error$    
    Exit Function
End Function

%REM
    Function StringTo
    Description: Comments for Function
%END REM
Function StringTo (ByVal st As String) As String

End Function

%REM
    Function GetSignerInfo
    Description: Comments for Function
%END REM
Function GetSignerInfo (Sign As String) As Variant
    Dim  oSignedData, ns As Integer, mas() As String, k As Integer
    Set oSignedData = CreateObject(&quot;CAdESCOM.CadesSignedData&quot;)
    oSignedData.DisplayData=CADESCOM_DISPLAY_DATA_CONTENT
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY
    Call StringTo(Sign)&#039;Непонятно что тут происходит но без этого не пашет
    On Error Resume Next
    Call oSignedData.VerifyCades(Sign,CADESCOM_CADES_BES,False)
    ReDim Preserve mas(0)
    ForAll v In oSignedData.Signers
        ReDim Preserve mas(UBound(mas)+1)
        mas(k) = v.Certificate.GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME)+&quot;. &quot;+Get_Value(v.Certificate.SubjectName,&quot;O&quot;)
    End ForAll
    GetSignerInfo=mas    
        
End Function
Function Unique As String
    Dim unik
    unik = Evaluate(&quot;@Unique&quot;)
    Unique = StrToken(unik(0), &quot;-&quot;, -1) &#039; drop the username part of the ID which is always the same for this user
End Function

%REM
    Function StringToUTF8B64
    Description: Comments for Function
%END REM
Function StringToUTF8B64 (st As String) As String
    Dim session As New NotesSession, inStream As NotesStream
    Dim datapatch As String ,oname As String 
    datapatch$ = GetNotesTempDirectory&#039; &#039;Путь для временных файлов
    oname$=Unique&#039; временный файл
    Set inStream = session.CreateStream()  &#039; XML-ка
    Call inStream.Open(datapatch$ &amp; oname$, &quot;utf-8&quot;)
    Call inStream.Truncate
    Call inStream.WriteText(st)
    StringToUTF8B64 = inStream.ReadEncoded(ENC_BASE64, 76)
    Call inStream.Close    
    Kill     datapatch$ &amp; oname$    &#039; стереть файл    
    StringToUTF8B64  = Replace(StringToUTF8B64  ,Chr(10),&quot;&quot;)
    StringToUTF8B64  = Replace(StringToUTF8B64  ,Chr(9),&quot;&quot;)
    StringToUTF8B64  = Replace(StringToUTF8B64  ,Chr(13),&quot;&quot;)    
    
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (mirkin)]]></author>
			<pubDate>Wed, 23 Jan 2019 17:47:21 +0000</pubDate>
			<guid>https://itpmr.ru/viewtopic.php?pid=124728#p124728</guid>
		</item>
	</channel>
</rss>
