PEP-02: acb-and-initial-encrypting-scheme Задача: шифровать контент таким образом, что бы его могло получать несколько [1..n], n ~ в перспективе сотни? получателей. Предлагаемое решение: Вводим ACB, Access Control Block. ACB представляет собой ключ шифрования, зашифрованный публичными ключами предполагаемых получателей. Схемы могу быть разные, так что какой конкретно этот ключ определяется из самого ACB. На первоначальном этапе предлагается использовать пару ключей Curve25519 (?), т.е ключевую пару асимметричного шифрования libsodium (haskell: saltine), так как тесты показали заметно более высокую скорость по сравнению с шифрованием симметричным ключом (AES). В любом случае, предполагается в будущем использовать и другие схемы контроля доступа к контенту, таким образом, возможность расширения должна быть заложена в структуры данных. ``` -- PubKey 'Sign e ;;; ключ подписи Ed25519 data family ACB e schema :: Type data family AccessKey e schema :: Type data ACBSchema = NaClAsymm data instance ACB e NaClAsymm = ACBNaClAsymm { acbParent :: HashRef -- указатель на предыдущий ACB , acbRoot :: PubKey 'Sign e -- корневой владелец , acbOwners :: [PubKey 'Sign e] -- ключи владельцев , acbRead :: [(PubKey 'Sign e, PubKey 'Encrypt e)] -- при чтении нужно расшифровывать и идентифицировать ключ , acbWrite :: [(PubKey 'Sign e)] -- при публикации нужно проверять подпись } ``` Что бы подписчик мог что-то публиковать (write), мы должны знать его публичный ключ подписи, что бы её проверять и принимать, или отвергать данные. Что бы подписчик мог что-то читать, мы должны знать его публичный ключ шифрования, что бы он мог расшифровать публикуемый контент. ``` -- EncryptedBox - обертка вокруг ключа ассиметричного шифрования -- (KeyPAir) newtype instance AccessKey e NaClAsymm = AccessKeyNaClAsymm { permitted :: [(PubKey 'Sign e, EncryptedBox)] } ``` Список пар (ключ подписи пользователя, ключ шифрования). Пара необходима, что бы пользователи за O(1) найти и расшифровать свой ключ. Операции: - Добавить право на чтение - Добавить право на публикацию - Удалить право на чтение - Удалить право на публикацию - Добавить владельца - Удалить владельца - Создать новый ключ публикации ### Создать новый ключ публикации - Получить ACB - Для каждого подписчика на чтение добавить зашифрованный ключ в permitted