Перевірка підпису КЕП та підписанта у контенті бізнес-процесу через API
| 🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію. | 
1. Загальний опис
При інтеграції зі сторонніми системами на рівні бізнес-процесів є необхідність роботи з підписаними файлами які завантажуються або передаються в бізнес-процес цими системами. А саме, є необхідність впевнитись в цілісності цих файлів шляхом перевірки КЕП накладеного на ці файли. Отримати інформацію про підписанта для подальшої обробки або внесення в реєстри. Також є необхідність перегляду вмісту файлів-контейнерів.
2. Функціональні сценарії
- 
Перевірка цілісності даних шляхом перевірки підпису з вказанням типу контейнера. 
- 
Отримання інформації про всіх підписантів даних 
- 
Отримання контенту з підписаного масиву даних. 
3. Ролі користувачів
- 
Моделювальник 
4. Загальні принципи та положення
- 
Дані опрацьовуються в скрипт-задачах бізнес-процесу. 
- 
Отримання даних з сторонніх джерел поза межами цього дизайну. 
- 
Байтові дані між системами передаються закодованими за допомогою Base64 
- 
Формат за замовченням використовується CAdES-X-Long. 
- 
Дані і підпис в даній ітерації завжди приходять в одному масиві даних. 
- 
Імплементація різних форматів валідація поза межами цього дизайну 
- 
Підписання файлів поза межами цього дизайну. 
- 
Імплементація алгоритмів по роботі з підписами відбувається за допомогою ІІТ-бібліотеки
5. Глосарій та акроніми
Контейнер - тип результуючого файлу. Розрізняються такі контейнери XAdES (xml), PAdES (pdf), CAdES (p7s),  ASiC (asic). Найбільш сучасним і рекомендованим  є контейнер типу ASiC.
ASiC - особливістю даного контейнеру є те що він побудований як архів для зберігання файлів і єдиний з перелічених дозволяє зберігати декілька файлів в різних форматах.
Формат - алгоритм який застосовується для підписання даних (XAdES-B-LT/CAdES-X-Long/CAdES-BASE/PAdES-B-LT) рекомендованим форматом є CAdES-X-Long
Тип підпису - розрізняється два типи підпису відокремлений (detached) та enveloped (вбудований).
| Терміни файл і дані в даному дизайні взаємозамінні. | 
6. Приклади моделювання
6.1. Приклад моделювання БП з ASiC контейнером в якості вхідного параметра який містить декілька файлів

def formData = submission('start_event').formData
def file = formData.prop('signed_data').value()
def allSignInfo = signature_details(file, SignFormat.ASiC).getAllSignInfo()
for (signInfo in allSignInfo) {
    if (signInfo.subjDRFOCode == null) {
        println "DRFO should be present"
    }
}
def allFiles = get_content(file, SignFormat.ASiC).getAllContent()
for (singleFile in allFiles) {
    set_variable(singleFile.getReference(), singleFile.getReferenceData())
}6.2. Приклад моделювання БП з отриманням p7s контейнера з вбудованим підписом як частина даних із зовнішнього API

{
    "name": "Ololow",
    "day-of-birth": "01/01/01",
    "request": "dGVzdCBkYXRh",
    "request_received": "20/02/14"
}def containerType = validationResult.prop('container').value()
def info = signature_details(request, containerType).getSignInfo()
if (info.subjDRFOCode == null) {
    println "DRFO should be present"
}
originRequestDate = signature_content(request, containerType).getContent().getData()
def requestBytes = Base64.decode(originRequestDate)
save_digital_document(requestBytes, 'request.pdf')
set_variable('fileContent', originRequestDate)7. Делегат для валідації
7.1. Параметри делегату
| Назва параметру | Опис | Тип | Тип даних | 
|---|---|---|---|
| data | Дані які включають в себе підпис в форматі Base64 | Вхідний | String | 
| container | Перелік доступних для використання типів файлів | Вхідний | Enum (ASiC/CAdES) | 
| result | Результат валідації | Вихідний | ValidatioResult | 
7.2. REST API
POST /api/esignature/validate
{
  "data": "dGVzdCBkYXRh",
  "container": "CAdES/ASiC/XdES/..."
}| Json Path | Тип | Опис | 
|---|---|---|
| $result.isValid | boolean | Результат перевірки даних | 
| $result.container | String | Тип контейнеру | 
| $.error.code | String | Відповідний код статусу | 
| $.error.message | String | Деталі та опис помилки | 
| $.error.localizedMessage | String | Локалізовані деталі та опис помилки | 
7.3. Низькорівневий дизайн
Для валідації підписів ASiC контейнерів відбувається отримання кількості підписантів за допомогою EndUser::ASiCGetSignsCount(base64Data), а далі перевіряється валідність кожного EndUser::ASiCVerify(index, base64Data)
Для CAdES використовується EndUser::VerifyInternal(base64Data)
8. signature_details(<string|data>, <enum|dataFormat>)
8.1. JUEL функція
| Назва параметру | Опис | Тип | Тип даних | 
|---|---|---|---|
| data | Дані які включають в себе підпис в форматі Base64 | Вхідний | String | 
| container | Перелік доступних для використання типів файлів | Вхідний | Enum (ASiC/CAdES) | 
| signInfo | Деталі про підпис | Вихідний | SignatureInfo | 
| Json Path | Тип | Опис | 
|---|---|---|
| issuer | String | Видавець сертифікату | 
| issuerCN | String | Назва видавця сертифікату | 
| serial | String | Серійний номер сертифікату | 
| subject | String | Загальна інформація про власника сертифікату | 
| subjCN | String | Ім’я власника сертифікату | 
| subjOrg | String | Організація власника сертифікату | 
| subjOrgUnit | String | Підрозділ власника сертифікату | 
| subjTitle | String | Посада власника сертифікату | 
| subjState | String | Регіон/область власника сертифікату | 
| subjLocality | String | Локаль підписанта | 
| subjFullName | String | ПІБ підписанта | 
| subjAddress | String | Адреса підписанта | 
| subjPhone | String | Телефон підписанта | 
| subjDNS | String | DNS-ім’я чи інше технічного засобу | 
| subjEDRPOUCode | String | ЄДРПОУ підписанта | 
| subjDRFOCode | String | ДРФО підписанта | 
8.2. REST API
POST /api/esignature/info
{
  "data": "dGVzdCBkYXRh",
  "container": "CAdES/ASiC/XdES/..."
}| Json Path | Тип | Опис | 
|---|---|---|
| $.info[] | array[SignatureInfo] | Масив даних що містить в себе деталі про кожен підпис | 
| $.error.code | String | Відповідний код статусу | 
| $.error.message | String | Деталі та опис помилки | 
| $.error.localizedMessage | String | Локалізований опис | 
8.3. Низькорівневий дизайн
Для даних у форматі ASiC передбачено можливість накладання декількох підписів, тому при отриманні інформації про підпис, повертається масив з деталями про кожен накладений на дані підпис.
IntStream.rangeClosed(0, endUser.ASiCGetSignsCount(data))
                .mapToObj(index -> endUser.ASiCVerify(index, data))
                .collect(Collectors.toList());Для даних в форматі CAdES використовується EndUser::VerifyInternal(base64Data) та повертається деталі з об’єкту EndUserSignInfo як єдиний елемент в масиві.
9. signature_content(<string|data>, <enum|dataFormat>)
9.1. JUEL функція
| Назва параметру | Опис | Тип | Тип даних | 
|---|---|---|---|
| data | Дані які включають в себе підпис в форматі Base64 | Вхідний | String | 
| container | Перелік доступних для використання типів файлів | Вхідний | Enum (ASiC/CAdES) | 
| response | Обʼєкт з даними | Вихідний | SignData | 
9.2. REST API
POST /api/esignature/content
{
  "data": "dGVzdCBkYXRh",
  "container": "CAdES/ASiC/XdES/..."
}| Json Path | Тип | Опис | 
|---|---|---|
| $.content[] | array[Content] | Вміст контейнеру | 
| $.error.code | String | Відповідний код статусу | 
| $.error.message | String | Деталі та опис помилки | 
| $.error.localizedMessage | String | Локалізовані деталі та опис помилки | 
9.3. Низькорівневий дизайн
Для ASiC контейнеру отримання переліку всіх файлів в контенйері відбувається за допомогою EndUser::ASiCGetSignReferences(index, base64Data) для кожного індексу, а отримання контенту за допомогою EndUser::ASiCGetReference(reference)
Для CAdES контейнерів дані є частина вихідного параметру EndUser::VerifyInternal(base64Data)::GetData()
10. Оновлення бібліотеки ІІТ
- 
Криптобібліотека надається у вигляді посилання на архів https://iit.com.ua/download/EUSignCP-Java-20230629.zip 
- 
Архів з бібліотекою складається з папок - 
Documentation – актуальна документація для поточної версії криптобібліотеки; 
- 
Modules та\або Installs – актуальні модулі та\або інсталяційні пакети поточної версії криптобібліотеки; 
- 
Usage – актуального прикладу використання криптобібліотеки. Документація складається з настанови для системного програміста (містить загальну інформацію по бібліотеці: як підключати, налаштовувати та використовувати бібліотеку) та додатку (містить опис функцій та параметрів). 
 
- 
- 
Оновлення, що містять не критичні доопрацювання, надаються за запитом на пошту supp@iit.com.ua (в листі треба вказати номер діючого договору тех. підтримки). Про критичні оновлення інформуємо листом на пошту, яка вказана в контактах для організації 
12. Технічні експертизи
- 
BE (java) 
13. План розробки
- 
Оновлення бібліотеки ІІТ 
- 
Розширення DSO відповідними точками інтеграції 
- 
Створення делегату для валідації 
- 
Додавання JUEL-функцій 
- 
Додавання утілітарної функції для кодування і декодування Base64 
- 
Розробка референтних прикладів