Synapolis/DCC Custody Tool: Difference between revisions

From wikibase
Distill (talk | contribs)
m Distill moved page Синаполис/Кустодиальный инструмент DCC to Synapolis/DCC Custody Tool: Canonical Latin/ASCII-safe title for reliable public links
Distill (talk | contribs)
Финальный dual-mode выпуск: CLI, age/Stellar, CSP, тесты, хеши и статус подписи
 
Line 1: Line 1:
'''Кустодиальный инструмент DCC''' — автономная браузерная утилита для восстановления холодного класса данных DCC по схеме разделённого хранения. Публичная версия, исходный пакет, детерминированная сборка и тесты опубликованы 18 августа 2026 года. Контрольная сборка и полный набор тестов имеют статус '''PASS'''.
'''DCC Custody Tool''' — публичный офлайн-инструмент восстановления данных холодного хранения DCC по схеме 3-из-4. Финальный выпуск поддерживает два совместимых режима хранителя, воспроизводимую сборку и проверяемое сетевое ограничение. Выпуск '''не подписан''' и не проходил независимый аудит.


Инструмент предназначен для работы локально в браузере: страница не требует сети, не отправляет введённые данные и не использует браузерные хранилища. Для реального восстановления следует скачать файл на доверенную машину, отключить сеть и проверить его происхождение до ввода каких-либо чувствительных данных.
== Рекомендуемый способ работы ==


== Назначение и границы ==
Основной и рекомендуемый интерфейс — командная строка на чистом физически отключённом от сети хосте. CLI делает режим и тип секрета явными, читает секреты из файлов с правами <code>0600</code> и удобнее для аудита и повторяемой процедуры.


Утилита выполняет три связанные операции:
Однофайловый [https://aination.center/custody/recover.html recover.html] — только вторичный офлайн-вариант для удобства. Даже при запрете сети расширения браузера, история, буфер обмена, скомпрометированный профиль или сам браузер могут раскрыть секрет. Нельзя вводить реальные ключи или доли в сетевую копию страницы.


# преобразует публичный ключ Stellar в соответствующий публичный получатель <code>age</code>;
== Режимы хранителя и совместимость ==
# локально расшифровывает выбранный публичный шифротекст с помощью введённого секретного ключа Stellar и получает одну долю;
# объединяет не менее трёх корректных долей по схеме Шамира 3-из-4 и позволяет сохранить восстановленный результат.


Утилита '''не''':
Каждый хранитель независимо и добровольно выбирает один из режимов:


* получает секреты с сервера и не содержит защищённого открытого текста;
* '''Dedicated age (рекомендуется):''' отдельная пара ключей <code>age</code>; наружу нужен только публичный получатель <code>age1...</code>.
* не хранит введённые ключи, доли или результат в <code>localStorage</code>, <code>sessionStorage</code>, <code>IndexedDB</code> или cookies;
* '''Stellar compatibility:''' существующий публичный G-ключ детерминированно отображается в получателя <code>age</code>, а соответствующий S-ключ открывает уже развёрнутые совместимые конверты.
* не создаёт и не подписывает транзакции Stellar, не передаёт транзакционные конверты;
* не ротирует, не перевыпускает и не заменяет холодные ключи;
* не отменяет необходимость доверенной офлайн-среды, проверки хешей и организационной процедуры хранения долей;
* не гарантирует безопасность скомпрометированной операционной системы, браузера или устройства.


== Публичная архитектура и состав пакета ==
Принудительной миграции нет. Старые конверты и существующие доли 3-из-4 не изменены и остаются читаемыми. Добавление dedicated-age получателя в будущий набор конвертов потребует отдельной авторизации и согласия хранителя.


Публичный пакет содержит:
Публичный получатель для dedicated-age предложен в черновом BSN-теге:


* <code>src/core.js</code> — криптографическое ядро: разбор ключей Stellar, вывод идентичности <code>age</code>, расшифрование <code>age</code>, операции GF(256) и объединение долей Шамира;
<pre>DCC_CUSTODY_AGE_RECIPIENT_V1 = age1&lt;bech32-recipient&gt;</pre>
* <code>src/ui.html</code> — интерфейс и шаблон автономной страницы;
* <code>src/envelopes/</code> — четыре публичных шифротекста; приватных ключей и защищённого открытого текста в каталоге нет;
* <code>stellar-recover.py</code> — независимая эталонная реализация вывода ключей для проверки;
* <code>build.sh</code> — детерминированная сборка одного файла <code>dist/recover.html</code>;
* <code>tests/</code> — тесты ядра, интерфейса и статической политики;
* <code>MANIFEST.txt</code> и <code>TEST-RESULTS.txt</code> — контрольные суммы файлов и сводка тестов.


Финальный <code>recover.html</code> объединяет интерфейс, ядро и публичные шифротексты в один автономный HTML-файл.
Статус предложения: '''DRAFT / NOT ADOPTED / NO LEDGER ACTION'''. Оно не заменяет Stellar G-ключ, не разрешает пересоздание конвертов и не доказывает владение ключом.


== Детерминированная сборка и CSP ==
== Раздельные парсеры и входы ==


Сборка не зависит от времени, случайных значений или сетевых ресурсов. <code>build.sh</code> читает исходники в фиксированном порядке, вставляет публичные шифротексты и формирует точные байты встроенного сценария. Затем SHA-256 этого сценария автоматически переводится в Base64 и подставляется в политику Content Security Policy (CSP).
CLI требует явный <code>--mode age</code> или <code>--mode stellar</code>. Identity <code>AGE-SECRET-KEY-1...</code> принимается только отдельным age-парсером и отдельным файлом <code>--age-identity-file</code>. Stellar S-ключ принимается только Stellar-парсером и файлом <code>--stellar-secret-file</code>. Age identity не представляется как Stellar secret и не передаётся в S-key парсер.


Такой порядок устраняет ручное рассогласование: если сценарий меняется, его CSP-хеш пересчитывается той же сборкой. Для контрольного выпуска значение <code>script-src</code> равно <code>sha256-t9AfZxC/8De6gvP0jrt5DLtw8d/kbMWD9QA0oOZYOjk=</code>. Политика также запрещает все источники по умолчанию, отправку форм и использование <code>base-uri</code>; стили разрешены только встроенные.
== Граница совместимости Shamir ==


Две последовательные сборки и сборка из заново скачанного исходного архива дали одинаковый <code>dist/recover.html</code>.
<code>src/legacy-shamir.js</code> изолирован как legacy-декодер '''только для чтения'''. Замена его формата или арифметики новой библиотекой нарушила бы совместимость с уже развёрнутыми долями и потребовала бы их запрещённого перевыпуска. Код нельзя использовать для выпуска новых долей.


== Тестирование ==
Проверки прошли на фиксированной fixture, всех C(4,3) комбинациях, исчерпывающем сравнении операций GF(256) с независимой реализацией и некорректных входах. Эти тесты подтверждают совместимость, но независимого аудита декодера нет.


Полный набор запускается командой <code>bash tests/run.sh</code> и проверяет:
== Сетевое ограничение и CSP ==


* AEAD ChaCha20-Poly1305 на десяти длинах с эталоном Node.js;
В выпуске нет Yandex, аналитики, внешних ресурсов, сетевых API, cookies и браузерных storage API. Runtime network-trap зафиксировал '''ноль попыток''' сетевого обращения.
* вывод ключей Stellar с независимой сверкой через Python;
* реальные <code>age 1.2.1</code> armor/binary-шифротексты, многоблочное расшифрование и отказ при неверном ключе;
* все сочетания C(4,3) схемы Шамира, отказ при двух долях и независимую реализацию GF(256);
* пользовательские ветви успеха и ошибок, включая синтетическое успешное восстановление с тестовым ключом Stellar;
* отказ интерфейса при двух долях и успешную ветвь при трёх;
* отсутствие сетевых API, внешних URL, аналитики и браузерных хранилищ в собранном HTML;
* точное соответствие CSP-хеша фактическим байтам встроенного сценария.


Синтетические ключи и данные используются только в тестах и не относятся к реальным учётным записям или архивам.
Точное значение HTTP CSP:


== Публикация и внешний readback ==
<pre>default-src 'none'; script-src 'sha256-lbW9/RKTWSsWCiAaTbyNjXSxkwmwnmOV0vA+444xhC0='; style-src 'unsafe-inline'; form-action 'none'; base-uri 'none'; frame-ancestors 'none'</pre>


Публикационный конвейер разделяет исходный пакет, локальную сборку, установку HTML и внешнюю проверку. После установки проверяется конфигурация веб-сервера и CSP, а затем все артефакты заново читаются через публичный HTTPS-адрес.
В <code>script-src</code> нет <code>'unsafe-inline'</code>: встроенный сценарий разрешён только точным SHA-256. В <code>style-src</code> <code>'unsafe-inline'</code> пока остаётся. Meta CSP служит офлайн-страховкой скачанного файла; HTTP-заголовок является серверной политикой.


Внешний readback выполняется '''после''' обработчика, который может добавлять в HTML публичные метаданные страницы. Это важно: проверка файла до такого обработчика доказывает только состояние на диске, но не те байты, которые получает пользователь. Для воспроизводимости криптографической части контрольным является результат чистой сборки из опубликованного архива. Если внешний обработчик позднее изменяет только метаданные HTML, полный хеш HTTP-представления может отличаться; встроенный сценарий при этом должен по-прежнему соответствовать опубликованному CSP-хешу.
== Статус подписи и аудита ==


== Публичные артефакты и контрольные суммы ==
Выпуск '''UNSIGNED'''. Точный блокер: отсутствуют настроенная авторизованная custody signing identity и независимо аутентифицированная политика подписи с публичным ключом проверки. Конвейер, инструкции подписи и проверки опубликованы в <code>release/</code>; для этого выпуска ключ не создавался. Нельзя утверждать, что выпуск подписан или независимо аудирован.
 
Самотесты, фиксированные fixtures, runtime confinement и воспроизводимость — проверяемые свидетельства, а не независимый аудит безопасности.
 
== Публичные артефакты ==


{| class="wikitable"
{| class="wikitable"
|-
|-
! Артефакт !! URL !! SHA-256 контрольного выпуска
! Артефакт !! SHA-256
|-
|-
| Рабочая автономная страница || [https://aination.center/custody/recover.html recover.html] || <code>4db1ca817b4df280d3012b3948f8e38615263befdb73f8d16acf4577700be252</code>
| [https://aination.center/custody/recover.html recover.html] || <code>fbf803b154aaf075da03463e6db3d183cc3233765fd228ccd40f7be5c0a3736c</code>
|-
|-
| Манифест исходного пакета || [https://aination.center/custody/src/MANIFEST.txt MANIFEST.txt] || <code>5451c3134d6203a2c7cb6a840c36021e0a98e3956337a7f5f5425732a911ec86</code>
| [https://aination.center/custody/custody-src.tar.gz custody-src.tar.gz] || <code>3e6261e1d7723da76aaf9943f8f381f747b9a51bcfe742854b6d6e57c140e285</code>
|-
|-
| Архив исходников || [https://aination.center/custody/custody-src.tar.gz custody-src.tar.gz] || <code>1e4cb09087b2af4798f607ae76f954257c3057548d365df043f7ea45f000bc7f</code>
| [https://aination.center/custody/src/SHA256SUMS SHA256SUMS] || <code>eecd0c2a7914702e595ffda0041b9174b7b93032a94cc8726cf6259b3b3b8010</code>
|-
| <code>CSP.txt</code> || <code>4e74b009a1eedac79d0dfcdcb11b8dc3b3f794f001c32213cc8da389c836eaeb</code>
|}
|}


Каталог исходников: [https://aination.center/custody/src/ aination.center/custody/src/].
Исходники и документация: [https://aination.center/custody/src/ публичный каталог].


Хеш <code>recover.html</code> выше относится к детерминированному результату контрольной сборки. Для проверки именно сборки следует получить исходный архив и сравнить локальный <code>dist/recover.html</code> с этим значением; публичная выдача HTML может дополнительно содержать неисполняемые метаданные публикационного слоя.
== Точное воспроизведение и проверка ==


== Практическая проверка воспроизводимости ==
Команды из публичных README и release-документации (Bash, Node 20, Python 3, эталонный <code>age 1.2.1</code>):
 
Требуются Bash, Node.js 20, Python 3 и <code>age 1.2.1</code>. Проверку безопасно выполнять в новом каталоге без каких-либо реальных секретов.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
curl -fSLO https://aination.center/custody/custody-src.tar.gz
curl -fSLO https://aination.center/custody/custody-src.tar.gz
printf '%s  %s\n' \
printf '%s  %s\n' \
   '1e4cb09087b2af4798f607ae76f954257c3057548d365df043f7ea45f000bc7f' \
   '3e6261e1d7723da76aaf9943f8f381f747b9a51bcfe742854b6d6e57c140e285' \
   'custody-src.tar.gz' | sha256sum -c -
   'custody-src.tar.gz' | sha256sum -c -
mkdir custody-src
mkdir custody-src
tar -xzf custody-src.tar.gz -C custody-src
tar -xzf custody-src.tar.gz -C custody-src
cd custody-src
cd custody-src
sha256sum MANIFEST.txt
sha256sum SHA256SUMS
bash build.sh
sha256sum dist/recover.html
bash build.sh
bash build.sh
sha256sum dist/recover.html
bash tests/run.sh
bash tests/run.sh
SOURCE_DATE_EPOCH=1787097600 bash release/build-release.sh
bash release/verify-release.sh release/out/custody-hardening-source.tar.gz release/out/SHA256SUMS
SOURCE_DATE_EPOCH=1787097600 OUT_DIR=release/out-a bash release/build-release.sh
SOURCE_DATE_EPOCH=1787097600 OUT_DIR=release/out-b bash release/build-release.sh
sha256sum release/out-{a,b}/custody-hardening-source.tar.gz
cmp release/out-a/custody-hardening-source.tar.gz release/out-b/custody-hardening-source.tar.gz
</syntaxhighlight>
</syntaxhighlight>


Ожидаемые результаты:
До проверки архива и сборки реальные секреты использовать нельзя. Точный хеш встроенного сценария берётся из созданного <code>dist/CSP.txt</code>; сервер должен отдавать приведённый выше HTTP CSP.
 
* SHA-256 <code>MANIFEST.txt</code> — <code>5451c3134d6203a2c7cb6a840c36021e0a98e3956337a7f5f5425732a911ec86</code>;
* обе сборки <code>dist/recover.html</code> — <code>4db1ca817b4df280d3012b3948f8e38615263befdb73f8d16acf4577700be252</code>;
* последняя строка тестов — <code>PASS all custody tests</code>.
 
До проверки архива и сборки реальные ключи или доли вводить нельзя. Для обычного пользователя минимальная процедура: скачать автономную страницу, сверить её с локально воспроизведённой сборкой, перенести на доверенное офлайн-устройство и лишь затем выполнять восстановление.
 
== Практические уроки ==
 
* Доступность исходников сама по себе недостаточна: воспроизводимость требует фиксированных версий инструментов, манифеста, двух одинаковых сборок и сборки из внешне скачанного архива.
* CSP-хеш встроенного сценария следует вычислять автоматически из финальных байтов, а не переносить вручную.
* Проверять нужно не только криптографическое ядро, но и видимые пользователю ветви интерфейса, минимальный порог долей и отрицательные сценарии.
* Финальная проверка должна читать публичные URL через тот же внешний путь, что и пользователь, после всех публикационных обработчиков.
* Успешная сборка и публикация не являются операцией с реальным ключом: выпуск исходников не должен включать открытый текст, секреты или транзакционные материалы.
 
== Ограничения безопасности ==


Публичность исходного кода и успешные тесты повышают проверяемость, но не заменяют независимый криптографический аудит. Реальное восстановление концентрирует чувствительные данные на одном устройстве; после процедуры следует выполнять принятую политику очистки и повторной защиты результата. Нельзя вставлять реальные ключи в сетевую копию страницы, публиковать доли, пересылать снимки экрана или использовать неизвестные модифицированные сборки.
== Семь рассмотренных улучшений ==


Схема 3-из-4 защищает от недостатка долей и допускает потерю одной доли, но не исправляет компрометацию трёх хранителей, подмену доверенной среды или ошибки дальнейшего обращения с восстановленным материалом.
# '''CLI как основной путь — реализовано:''' browser UI сохранён как вторичное офлайн-удобство с явным предупреждением о рисках.
# '''Выделенный age-ключ на хранителя — реализовано опционально и рекомендуется:''' Stellar-совместимость сохранена, миграция не навязана.
# '''BSN-тег получателя — опубликован только как черновик:''' <code>DCC_CUSTODY_AGE_RECIPIENT_V1</code> не принят, действий в ledger не было.
# '''Разделение секретных входов — реализовано:''' age identity и Stellar S-key имеют разные параметры и парсеры.
# '''Замена custom Shamir — отклонена ради совместимости:''' legacy decoder изолирован decode-only и расширенно протестирован; независимого аудита нет.
# '''Усиление офлайн-политики — реализовано:''' Yandex/analytics отсутствуют, network-trap показал ноль попыток, HTTP CSP привязан к точному script hash; inline styles пока разрешены.
# '''Подписанный воспроизводимый выпуск — воспроизводимость реализована, подпись заблокирована:''' инструкции готовы, но авторизованная signing identity и независимо подтверждённая политика/public key отсутствуют.


== См. также ==
== См. также ==


* [[Архитектурный принцип: Кустодиальный мультиподписной доступ]]
* Архитектурный принцип «Кустодиальный мультиподписной доступ» (историческая статья Wiki)
* [[Синаполис]]
* [[Synapolis]]
* [https://aination.center/custody/src/ Публичный каталог исходников DCC custody]
* [https://aination.center/custody/src/docs/CLI.md Offline CLI procedure]
* [https://aination.center/custody/src/docs/SECURITY.md Security and review status]
* [https://aination.center/custody/src/release/SIGNING.md Signing and verification]


[[Category:Синаполис]]
[[Category:Synapolis]]
[[Category:Инфраструктура]]
[[Category:Infrastructure]]
[[Category:Stellar]]
[[Category:Stellar]]

Latest revision as of 17:42, 19 August 2026

DCC Custody Tool — публичный офлайн-инструмент восстановления данных холодного хранения DCC по схеме 3-из-4. Финальный выпуск поддерживает два совместимых режима хранителя, воспроизводимую сборку и проверяемое сетевое ограничение. Выпуск не подписан и не проходил независимый аудит.

Рекомендуемый способ работы[edit | edit source]

Основной и рекомендуемый интерфейс — командная строка на чистом физически отключённом от сети хосте. CLI делает режим и тип секрета явными, читает секреты из файлов с правами 0600 и удобнее для аудита и повторяемой процедуры.

Однофайловый recover.html — только вторичный офлайн-вариант для удобства. Даже при запрете сети расширения браузера, история, буфер обмена, скомпрометированный профиль или сам браузер могут раскрыть секрет. Нельзя вводить реальные ключи или доли в сетевую копию страницы.

Режимы хранителя и совместимость[edit | edit source]

Каждый хранитель независимо и добровольно выбирает один из режимов:

  • Dedicated age (рекомендуется): отдельная пара ключей age; наружу нужен только публичный получатель age1....
  • Stellar compatibility: существующий публичный G-ключ детерминированно отображается в получателя age, а соответствующий S-ключ открывает уже развёрнутые совместимые конверты.

Принудительной миграции нет. Старые конверты и существующие доли 3-из-4 не изменены и остаются читаемыми. Добавление dedicated-age получателя в будущий набор конвертов потребует отдельной авторизации и согласия хранителя.

Публичный получатель для dedicated-age предложен в черновом BSN-теге:

DCC_CUSTODY_AGE_RECIPIENT_V1 = age1<bech32-recipient>

Статус предложения: DRAFT / NOT ADOPTED / NO LEDGER ACTION. Оно не заменяет Stellar G-ключ, не разрешает пересоздание конвертов и не доказывает владение ключом.

Раздельные парсеры и входы[edit | edit source]

CLI требует явный --mode age или --mode stellar. Identity AGE-SECRET-KEY-1... принимается только отдельным age-парсером и отдельным файлом --age-identity-file. Stellar S-ключ принимается только Stellar-парсером и файлом --stellar-secret-file. Age identity не представляется как Stellar secret и не передаётся в S-key парсер.

Граница совместимости Shamir[edit | edit source]

src/legacy-shamir.js изолирован как legacy-декодер только для чтения. Замена его формата или арифметики новой библиотекой нарушила бы совместимость с уже развёрнутыми долями и потребовала бы их запрещённого перевыпуска. Код нельзя использовать для выпуска новых долей.

Проверки прошли на фиксированной fixture, всех C(4,3) комбинациях, исчерпывающем сравнении операций GF(256) с независимой реализацией и некорректных входах. Эти тесты подтверждают совместимость, но независимого аудита декодера нет.

Сетевое ограничение и CSP[edit | edit source]

В выпуске нет Yandex, аналитики, внешних ресурсов, сетевых API, cookies и браузерных storage API. Runtime network-trap зафиксировал ноль попыток сетевого обращения.

Точное значение HTTP CSP:

default-src 'none'; script-src 'sha256-lbW9/RKTWSsWCiAaTbyNjXSxkwmwnmOV0vA+444xhC0='; style-src 'unsafe-inline'; form-action 'none'; base-uri 'none'; frame-ancestors 'none'

В script-src нет 'unsafe-inline': встроенный сценарий разрешён только точным SHA-256. В style-src 'unsafe-inline' пока остаётся. Meta CSP служит офлайн-страховкой скачанного файла; HTTP-заголовок является серверной политикой.

Статус подписи и аудита[edit | edit source]

Выпуск UNSIGNED. Точный блокер: отсутствуют настроенная авторизованная custody signing identity и независимо аутентифицированная политика подписи с публичным ключом проверки. Конвейер, инструкции подписи и проверки опубликованы в release/; для этого выпуска ключ не создавался. Нельзя утверждать, что выпуск подписан или независимо аудирован.

Самотесты, фиксированные fixtures, runtime confinement и воспроизводимость — проверяемые свидетельства, а не независимый аудит безопасности.

Публичные артефакты[edit | edit source]

Артефакт SHA-256
recover.html fbf803b154aaf075da03463e6db3d183cc3233765fd228ccd40f7be5c0a3736c
custody-src.tar.gz 3e6261e1d7723da76aaf9943f8f381f747b9a51bcfe742854b6d6e57c140e285
SHA256SUMS eecd0c2a7914702e595ffda0041b9174b7b93032a94cc8726cf6259b3b3b8010
CSP.txt 4e74b009a1eedac79d0dfcdcb11b8dc3b3f794f001c32213cc8da389c836eaeb

Исходники и документация: публичный каталог.

Точное воспроизведение и проверка[edit | edit source]

Команды из публичных README и release-документации (Bash, Node 20, Python 3, эталонный age 1.2.1):

curl -fSLO https://aination.center/custody/custody-src.tar.gz
printf '%s  %s\n' \
  '3e6261e1d7723da76aaf9943f8f381f747b9a51bcfe742854b6d6e57c140e285' \
  'custody-src.tar.gz' | sha256sum -c -
mkdir custody-src
tar -xzf custody-src.tar.gz -C custody-src
cd custody-src
sha256sum SHA256SUMS
bash build.sh
bash tests/run.sh
SOURCE_DATE_EPOCH=1787097600 bash release/build-release.sh
bash release/verify-release.sh release/out/custody-hardening-source.tar.gz release/out/SHA256SUMS
SOURCE_DATE_EPOCH=1787097600 OUT_DIR=release/out-a bash release/build-release.sh
SOURCE_DATE_EPOCH=1787097600 OUT_DIR=release/out-b bash release/build-release.sh
sha256sum release/out-{a,b}/custody-hardening-source.tar.gz
cmp release/out-a/custody-hardening-source.tar.gz release/out-b/custody-hardening-source.tar.gz

До проверки архива и сборки реальные секреты использовать нельзя. Точный хеш встроенного сценария берётся из созданного dist/CSP.txt; сервер должен отдавать приведённый выше HTTP CSP.

Семь рассмотренных улучшений[edit | edit source]

  1. CLI как основной путь — реализовано: browser UI сохранён как вторичное офлайн-удобство с явным предупреждением о рисках.
  2. Выделенный age-ключ на хранителя — реализовано опционально и рекомендуется: Stellar-совместимость сохранена, миграция не навязана.
  3. BSN-тег получателя — опубликован только как черновик: DCC_CUSTODY_AGE_RECIPIENT_V1 не принят, действий в ledger не было.
  4. Разделение секретных входов — реализовано: age identity и Stellar S-key имеют разные параметры и парсеры.
  5. Замена custom Shamir — отклонена ради совместимости: legacy decoder изолирован decode-only и расширенно протестирован; независимого аудита нет.
  6. Усиление офлайн-политики — реализовано: Yandex/analytics отсутствуют, network-trap показал ноль попыток, HTTP CSP привязан к точному script hash; inline styles пока разрешены.
  7. Подписанный воспроизводимый выпуск — воспроизводимость реализована, подпись заблокирована: инструкции готовы, но авторизованная signing identity и независимо подтверждённая политика/public key отсутствуют.

См. также[edit | edit source]