Описания интерфейсов сущности (EDL, CDL, IDL)
Для контроля взаимодействий между сущностями необходимо, чтобы структура пересылаемых IPC-сообщений была прозрачна для модуля безопасности. В KasperskyOS это достигается с помощью статического декларирования интерфейсов сущностей. Для этого используются специальные языки: Entity Definition Language (EDL), Component Definition Language (CDL) и Interface Definition Language (IDL). Если IPC-сообщение не соответствует описанию интерфейса, оно будет отклонено модулем безопасности.
Описание интерфейсов сущности определяет допустимые структуры IPC-сообщений. Так задается явная связь между реализацией каждого метода и тем, как вызов этого метода представлен для модуля безопасности. Почти все инструменты сборки решения явно или косвенно используют описания интерфейсов сущностей.
Виды статических описаний
Описание интерфейсов сущности строится по модели "сущность-компонент-интерфейс":
- IDL‑описание декларирует интерфейс, а также пользовательские типы и константы (опционально). В сумме все IDL-описания решения охватывают все реализуемые в решении интерфейсы.
- В CDL-описании перечислены интерфейсы, реализуемые компонентом. Компоненты дают возможность группировать реализации интерфейсов. Компоненты могут включать в себя другие компоненты.
- В EDL-описании сущности декларируются экземпляры компонентов, входящие в эту сущность. В частности, сущность может не включать в себя ни один компонент.
Пример
Ниже приведены статические описания решения, состоящего из сущности Client
, не реализующей ни одного интерфейса, и сущности Server
, реализующей интерфейс FileOps
.
Client.edl
// Статическое описание состоит только из имени сущности
entity Client
Server.edl
// Сущность Server содержит экземпляр компонента Operations
entity Server
components {
OpsComp: Operations
}
Operations.cdl
// Компонент Operations реализует интерфейс FileOps
component Operations
interfaces {
FileOpsImpl: FileOps
}
FileOps.idl
package FileOps
// Объявление пользовательского типа String
typedef array <UInt8, 256> String;
// Интерфейс FileOps содержит единственный метод Open с входным аргументом name и выходным аргументом h
interface {
Open(in String name, out UInt32 h);
}
См. подробнее о синтаксисе статических описаний.