Я пытаюсь внедрить BankID (шведский провайдер eID) для подписи файлов PDF в node.js. У них есть API для аутентификации пользователей и подписи файлов. Ключ должен получить файл PAdES в конце процесса. Сначала я изменяю PDF и вставляю нули заполнителей, которые будут заменены шестнадцатеричным значением цифровой подписи, например:
const addSignaturePlaceholder = ({pdf, reason, signatureLength = 8192}) => {
const signature = pdf.ref({
Type: 'Sig',
Filter: 'Adobe.PPKLite',
SubFilter: 'adbe.pkcs7.detached',
ByteRange: [
0,
DEFAULT_BYTE_RANGE_PLACEHOLDER,
DEFAULT_BYTE_RANGE_PLACEHOLDER,
DEFAULT_BYTE_RANGE_PLACEHOLDER,
],
Contents: Buffer.from(String.fromCharCode(0).repeat(signatureLength)),
Reason: new String(reason),
M: new Date(),
});
return signature;
};
Затем я отправляю этот PDF - преобразованный в байты, а Base-64 - в код BankID. После завершения процесса подписи BankID возвращает XML-DSig.
Мой вопрос: что мне делать дальше? Можно ли прикрепить подпись к PDF напрямую?
Вот сокращенный ответ BankID:
<?xml version="1.0" encoding="UTF-8"?>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
<Reference Type="http://www.bankid.com/signature/v1.0.0/types" URI="#bidSignedData">
<Transforms>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>LCJtWcNyKWs03NkV0mh2OHB4/9bX1kS8mWLdWIDNoHk=</DigestValue>
</Reference>
<Reference URI="#bidKeyInfo">
<Transforms>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<DigestValue>base64digest</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>sigbase64</SignatureValue>
<KeyInfo Id="bidKeyInfo">
<X509Data>
<X509Certificate>signercertinBase64</X509Certificate>
<X509Certificate>intermediateCRinBase64</X509Certificate>
<X509Certificate>intermediate2</X509Certificate>
</X509Data>
</KeyInfo>
<Object>
<bankIdSignedData xmlns="http://www.bankid.com/signature/v1.0.0/types" Id="bidSignedData">
<usrVisibleData charset="UTF-8" visible="wysiwys">Q29udHJhY3QgYmV0d2VlbiBBIGFuZCBC</usrVisibleData>
<usrNonVisibleData>encodedPDF</usrNonVisibleData>
<srvInfo>
<name>...</name>
<nonce>...</nonce>
<displayName>...</displayName>
</srvInfo>
<clientInfo>
<funcId>Signing</funcId>
<version>...</version>
</clientInfo>
</bankIdSignedData>
</Object>