Потоковая проверка подписи
Примечание
Режим потоковой проверки подписи может быть применен только к одиночным запросам на проверку,
пакетная проверка подписи НЕ поддерживается.
Хэш-значения для файла подписи (SignatureDocumentHash) и для исходного документа (DocumentHash) не могут быть вычислены в потоковом режиме.
Для обработки документов большого размера требуются значительные ресурсы со стороны сервера, так как весь документ на время проверки хранится в памяти, для обхода этого ограничения следует применять режим потоковой передачи данных.
В потоковом режиме обработки запроса сервер начинает выполнение операции сразу после получения первых байтов документа, из входного потока данные считываются небольшими блоками, без буферизации всего содержимого в памяти.
Формат запроса
Для того чтобы передать запрос на проверку подписи в потоковом режиме, клиентское приложение должно сформировать следующий HTTP запрос.
POST /vs/api/signatures/ HTTP/1.1
CPSVS-PARAMS: ewoiQ29udGVudCI6Ik1JSU1pUVlKS29aSWh2...
Content-Type: application/octet-stream
Host: example.com
Отличия от обычного режима передачи:
- Для присоединенной подписи содержимое файла с подписью передается в теле запроса, а параметры проверки - в заголовке
CPSVS-PARAMS. Тип содержимого при этом должен бытьapplication/octet-stream. - Для отсоединенной подписи содержимое исходного документа передается в теле запроса, а параметры проверки, включающие в себя файл подписи - в заголовке
CPSVS-PARAMS. Тип содержимого при этом должен бытьapplication/octet-stream.
Формирование заголовка CPSVS-PARAMS
Заголовок CPSVS-PARAMS в качестве значения содержит параметры операции проверки подписи (то есть запрос в обычном режиме).
Наличие или отсутствие полей Content и Source зависит от формата проверяемой подписи:
1. Подпись формата GOST3410:
* поле `Content` содержит данные подписи, поле `Source` отсутствует, исходный документ передается в теле запроса.
2. Подпись формата CAdES:
* Для отсоединенных подписей поле `Content` содержит данные подписи, поле `Source` отсутсвует, исходный документ передается в теле запроса. Параметр `IsDetached` обязателен и должен иметь значение `true`.
* Для присоединенных подписей поля `Content` и `Source` отсутствуют, документ с подписью передается в теле запроса.
3. Подпись формата XMLDSig/XAdES:
* поля `Content` и `Source` отсутствуют, документ с подписью передается в теле запроса.
4. Подпись формата PDF:
* поля `Content` и `Source` отсутствуют, документ с подписью передается в теле запроса.
Пример запроса на проверку подписи
В примере приведен обычный запрос на проверку отсоединенной подписи формата CAdES (данные, закодированные в Base64, сокращены для удобства чтения):
{
"Content":"MIIMi...Jhu",
"Source":"...",
"SignatureType": 2,
"VerifyParams": {
"VerifyAll": "true",
"IsDetached":"true"
}
}
В потоковом режиме в заголовок помещается следующее значение:
ewoiQ29udGVudCI6Ik1JSU1pUVlKS29aSWh2Y05BUWNDb0lJTWVqQ0NESFlDQVFFeE5EQUtCZ1lxaFFNQ0Fna0ZBREFLQmdncWhRTUhBUUVDQWpBTUJnZ3FoUU1IQVFFQ0FnVUFNQXdHQ0NxRkF3Y0JBUUlEQlFBd0N3WUpLb1pJaHZjTkFRY0JvSUlJSVRDQ0NCMHdnZ2ZLb0FNQ0FRSUNFUWJUVVgwQXVMS0Jna0tOL2t1UExwaDlNQW9HQ0NxRkF3Y0JBUU1DTUlJQlZqRVZNQk1HQlNxRkEyUUVFZ28zTnpFM01UQTNPVGt4TVNBd0hnWUpLb1pJaHZjTkFRa0JGaEZwYm1adlFHTnllWEIwYjNCeWJ5NXlkVEVZTUJZR0JTcUZBMlFCRWcweE1ETTNOekF3TURnMU5EUTBNUXN3Q1FZRFZRUUdFd0pTVlRFWU1CWUdBMVVFQ0F3UE56Y2cwSnpRdnRHQjBMclFzdEN3TVJVd0V3WURWUVFIREF6UW5OQyswWUhRdXRDeTBMQXhMekF0QmdOVkJBa01KdEdEMExzdUlOQ2gwWVBSaWRHUjBMTFJnZEM2MExqUXVTRFFzdEN3MExzZzBMUXVJREU0TVNVd0l3WURWUVFLREJ6UW50Q2UwSjRnSXRDYTBLRFFtTkNmMEtMUW5pM1FuOUNnMEo0aU1Xc3dhUVlEVlFRRERHTFFvdEMxMFlIUmd0QyswTExSaTlDNUlOQy8wTDdRdE5HSDBMalF2ZEMxMEwzUXZkR0wwTGtnMEtQUXBpRFFudENlMEo0Z0l0Q2EwS0RRbU5DZjBLTFFuaTNRbjlDZzBKNGlJTkNUMEo3UW9kQ2lJREl3TVRJZ0tOQ2owS1lnTWk0d0tUQWVGdzB5TlRBME1EY3dOekkyTVRkYUZ3MHlOVEEzTURjd056TTJNVGRhTUJVeEV6QVJCZ05WQkFNTUNtZHlZVzVrWDJOdmNtVXdaakFmQmdncWhRTUhBUUVCQVRBVEJnY3FoUU1DQWlRQUJnZ3FoUU1IQVFFQ0FnTkRBQVJBZ2V3Z1k1REhMUzJWMkJ3MVMvcmVYcmt5KzJWdWlTVGpnb2o3aS8yM3h2WlNRWjJGM1pCNG9TYjhKRUtaUVMyaFRmTTBYU3JUWm9VdS95ZFBIWmtDaXFPQ0Jha3dnZ1dsTUIwR0ExVWREZ1FXQkJRWjArYnR0R0FDNW44VHo4Z3o2anQzcHJ2WDVUQTFCZ2tyQmdFRUFZSTNGUWNFS0RBbUJoNHFoUU1DQWpJQkNZZnc0RTZHN3M4TWhlbVJXNEt2dEZ5QnlsV0NzMFFDQVFFQ0FRQXdDd1lEVlIwUEJBUURBZ1R3TUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNRUJnZ3JCZ0VGQlFjREFqQW5CZ2tyQmdFRUFZSTNGUW9FR2pBWU1Bb0dDQ3NHQVFVRkJ3TUVNQW9HQ0NzR0FRVUZCd01DTUlIZ0JnZ3JCZ0VGQlFjQkFRU0IwekNCMERBNUJnZ3JCZ0VGQlFjd0FZWXRhSFIwY0RvdkwzUmxjM1JqWVRJd01USXVZM0o1Y0hSdmNISnZMbkoxTDI5amMzQXlMMjlqYzNBdWMzSm1NRFlHQ0NzR0FRVUZCekFCaGlwb2RIUndPaTh2ZEdWemRHTmhNakF4TWk1amNubHdkRzl3Y204dWNuVXZiMk56Y0hObGNuWnBZMlV3V3dZSUt3WUJCUVVITUFLR1QyaDBkSEE2THk5MFpYTjBZMkV5TURFeUxtTnllWEIwYjNCeWJ5NXlkUzloYVdFdllXUTVOVEZoWmpnelpUQTJZVGt4WmpNeU9UQTRZelUxTTJZMVlqUTRaVFEyTW1Vd05qWmtZaTVqY25Rd0hRWURWUjBnQkJZd0ZEQUlCZ1lxaFFOa2NRSXdDQVlHS29VRFpIRUJNQ3NHQTFVZEVBUWtNQ0tBRHpJd01qVXdOREEzTURjeU5qRTJXb0VQTWpBeU5UQTNNRGN3TnpJMk1UWmFNSUlCa0FZRktvVURaSEFFZ2dHRk1JSUJnUXhUMEtIUW10Q1gwSmdnSXRDYTBZRFF1TkMvMFlMUXZ0Q2YwWURRdmlCRFUxQWlJTkN5MExYUmdOR0IwTGpSanlBMExqQWdValFnS05DNDBZSFF2OUMrMEx2UXZkQzEwTDNRdU5DMUlESXRRbUZ6WlNrTWdZZlFuOUNRMEpvZ3dxdlFvOUMwMEw3UmdkR0MwTDdRc3RDMTBZRFJqOUdPMFluUXVOQzVJTkdHMExYUXZkR0MwWUFnd3F2UW10R0EwTGpRdjlHQzBMN1FuOUdBMEw0ZzBLUFFwc0s3SU5DeTBMWFJnTkdCMExqUXVDQXlMakRDdXlBbzBMTFFzTkdBMExqUXNOQzkwWUlnMExqUmdkQy8wTDdRdTlDOTBMWFF2ZEM0MFk4Z09Ta01UOUNoMExYUmdOR0MwTGpSaE5DNDBMclFzTkdDSU5HQjBMN1F2dEdDMExMUXRkR0MwWUhSZ3RDeTBMalJqeURpaEpZZzBLSFFwQzh4TWpRdE5EY3hOeURRdnRHQ0lERTFMakF4TGpJd01qUU1UOUNoMExYUmdOR0MwTGpSaE5DNDBMclFzTkdDSU5HQjBMN1F2dEdDMExMUXRkR0MwWUhSZ3RDeTBMalJqeURpaEpZZzBLSFFwQzh4TWpndE5ESTNNaURRdnRHQ0lERXpMakEzTGpJd01qSXdMd1lGS29VRFpHOEVKZ3drMEovUWtOQ2EwSndnMEpyUmdOQzQwTC9SZ3RDKzBKL1JnTkMrSUVoVFRTQXlMakF1TUdBR0ExVWRId1JaTUZjd1ZhQlRvRkdHVDJoMGRIQTZMeTkwWlhOMFkyRXlNREV5TG1OeWVYQjBiM0J5Ynk1eWRTOWpaSEF2WVdRNU5URmhaamd6WlRBMllUa3haak15T1RBNFl6VTFNMlkxWWpRNFpUUTJNbVV3Tmpaa1lpNWpjbXd3REFZRktvVURaSElFQXdJQkFqQ0NBWklHQTFVZEl3U0NBWWt3Z2dHRmdCU3RsUnI0UGdhcEh6S1FqRlUvVzBqa1l1Qm0yNkdDQVZpa2dnRlVNSUlCVURFZ01CNEdDU3FHU0liM0RRRUpBUllSYVc1bWIwQmpjbmx3ZEc5d2NtOHVjblV4Q3pBSkJnTlZCQVlUQWxKVk1SVXdFd1lGS29VRFpBUVNDamMzTVRjeE1EYzVPVEV4R0RBV0JnVXFoUU5rQVJJTk1UQXpOemN3TURBNE5UUTBOREVZTUJZR0ExVUVDQXdQTnpjZzBKelF2dEdCMExyUXN0Q3dNUlV3RXdZRFZRUUhEQXpRbk5DKzBZSFF1dEN5MExBeEx6QXRCZ05WQkFrTUp0R0QwTHN1SU5DaDBZUFJpZEdSMExMUmdkQzYwTGpRdVNEUXN0Q3cwTHNnMExRdUlERTRNU1V3SXdZRFZRUUtEQnpRbnRDZTBKNGdJdENhMEtEUW1OQ2YwS0xRbmkzUW45Q2cwSjRpTVdVd1l3WURWUVFEREZ6UW90QzEwWUhSZ3RDKzBMTFJpOUM1SU5DejBMN1F1OUMrMExMUXZkQyswTGtnMEtQUXBpRFFudENlMEo0Z0l0Q2EwS0RRbU5DZjBLTFFuaTNRbjlDZzBKNGlJTkNUMEo3UW9kQ2lJREl3TVRJZ0tOQ2owS1lnTWk0d0tZSVJCbHMxbkFDc3NyNlhTTEt1STFnMlFsQXdDZ1lJS29VREJ3RUJBd0lEUVFETWZ6N1hNbDdlb3V6Qk56a3hPRHEwS1Jlc1gzbTN1UTNEK2VTNnhvSTNCS1hlQnNSeVllMXZvMjM5eFllWGtVNHUvMlVHQjREbkpUSmFVMzVYQkdUUE1ZSUVCekNDQkFNQ0FRRXdnZ0Z0TUlJQlZqRVZNQk1HQlNxRkEyUUVFZ28zTnpFM01UQTNPVGt4TVNBd0hnWUpLb1pJaHZjTkFRa0JGaEZwYm1adlFHTnllWEIwYjNCeWJ5NXlkVEVZTUJZR0JTcUZBMlFCRWcweE1ETTNOekF3TURnMU5EUTBNUXN3Q1FZRFZRUUdFd0pTVlRFWU1CWUdBMVVFQ0F3UE56Y2cwSnpRdnRHQjBMclFzdEN3TVJVd0V3WURWUVFIREF6UW5OQyswWUhRdXRDeTBMQXhMekF0QmdOVkJBa01KdEdEMExzdUlOQ2gwWVBSaWRHUjBMTFJnZEM2MExqUXVTRFFzdEN3MExzZzBMUXVJREU0TVNVd0l3WURWUVFLREJ6UW50Q2UwSjRnSXRDYTBLRFFtTkNmMEtMUW5pM1FuOUNnMEo0aU1Xc3dhUVlEVlFRRERHTFFvdEMxMFlIUmd0QyswTExSaTlDNUlOQy8wTDdRdE5HSDBMalF2ZEMxMEwzUXZkR0wwTGtnMEtQUXBpRFFudENlMEo0Z0l0Q2EwS0RRbU5DZjBLTFFuaTNRbjlDZzBKNGlJTkNUMEo3UW9kQ2lJREl3TVRJZ0tOQ2owS1lnTWk0d0tRSVJCdE5SZlFDNHNvR0NRbzMrUzQ4dW1IMHdDZ1lJS29VREJ3RUJBZ0tnZ2dJeE1CZ0dDU3FHU0liM0RRRUpBekVMQmdrcWhraUc5dzBCQndFd0hBWUpLb1pJaHZjTkFRa0ZNUThYRFRJMU1EVXlNREE1TVRnME5Gb3dMd1lKS29aSWh2Y05BUWtFTVNJRUlKeGdlcEc2NEdudGJMdTNtb0hoSWFkaCt5TnZFSkNSOWpnZkJCL1NmTWRQTUlJQnhBWUxLb1pJaHZjTkFRa1FBaTh4Z2dHek1JSUJyekNDQWFzd2dnR25NQW9HQ0NxRkF3Y0JBUUlDQkNCNWRtT3R4V3o2c2tyK29GR3B2V21VdUZhYlpMZjJhaC9IR2RvNVZMblBKekNDQVhVd2dnRmVwSUlCV2pDQ0FWWXhGVEFUQmdVcWhRTmtCQklLTnpjeE56RXdOems1TVRFZ01CNEdDU3FHU0liM0RRRUpBUllSYVc1bWIwQmpjbmx3ZEc5d2NtOHVjblV4R0RBV0JnVXFoUU5rQVJJTk1UQXpOemN3TURBNE5UUTBOREVMTUFrR0ExVUVCaE1DVWxVeEdEQVdCZ05WQkFnTUR6YzNJTkNjMEw3UmdkQzYwTExRc0RFVk1CTUdBMVVFQnd3TTBKelF2dEdCMExyUXN0Q3dNUzh3TFFZRFZRUUpEQ2JSZzlDN0xpRFFvZEdEMFluUmtkQ3kwWUhRdXRDNDBMa2cwTExRc05DN0lOQzBMaUF4T0RFbE1DTUdBMVVFQ2d3YzBKN1FudENlSUNMUW10Q2cwSmpRbjlDaTBKNHQwSi9Rb05DZUlqRnJNR2tHQTFVRUF3eGkwS0xRdGRHQjBZTFF2dEN5MFl2UXVTRFF2OUMrMExUUmg5QzQwTDNRdGRDOTBMM1JpOUM1SU5DajBLWWcwSjdRbnRDZUlDTFFtdENnMEpqUW45Q2kwSjR0MEovUW9OQ2VJaURRazlDZTBLSFFvaUF5TURFeUlDalFvOUNtSURJdU1Da0NFUWJUVVgwQXVMS0Jna0tOL2t1UExwaDlNQW9HQ0NxRkF3Y0JBUUVCQkVCQVJYQ1YvQUJxMEd0RSt2SFRnWW9pRGdSMmY0SjNkZ2lvTWQzWjhhQkVFVjRQWUVWeUtqQjNFMGhZbzJMdHdFMkVJTU1CVmFqRlFCR0YxZUxYZUpodSIsCiAgICAiU2lnbmF0dXJlVHlwZSI6IDIsCiAgICAiVmVyaWZ5UGFyYW1zIjogewogICAgICAgICJWZXJpZnlBbGwiOiAidHJ1ZSIsCiAgICAgICAgIklzRGV0YWNoZWQiOiJ0cnVlIgogICAgfQp9
Данное значение представляет собой BASE64URL(UTF8Bytes(M)), где M:
{"Content":"MIIMi...Jhu","SignatureType":2,"VerifyParams":{"VerifyAll":"true","IsDetached":"true"}}