Skip to content

Class: Sdsdk

The Sdsdk class is the central entry point of the SDK. It holds the KAS configuration and exposes the encrypt and decrypt methods.

An Sdsdk instance is stateful: its configuration impacts encryption and decryption behavior, DEK wrapping strategies, and access control enforcement.

Constructor

ts
new Sdsdk(configuration: SdsdkConfiguration)

SdsdkConfiguration

Object containing Sdsdk configuration.

  • defaultKasId (String) The default KAS identifier. It must match one of the kasList IDs.

  • kasList (Array) List of KAS, where each KAS is a RemoteKas or a LocalKas.

    RemoteKas
    • id (String) Unique identifier for the KAS. Any non-empty string of your choice. Id must be unique in the Kaslist.
    • protocols (Array) List of protocols supported by the KAS ('kas' or 'symmetric_kas').
    • url (String) URL of the remote KAS.
    • authentication (Object) RemoteKas authentication. ⚠️ secret
      • type (String) 'bearer' | 'basic'
      • value (String) The raw JWT value for 'bearer' or the Base64(user:password) for 'basic' (see: RemoteKas authentication setup)
    • optional publicKey (Object) Public key used for DEK encryption. Required when protocols includes 'kas'. (see: RemoteKas setup)
      • kid (String) Unique identifier of the asymmetric key in the Remote KAS.
      • value (String) Value of the public key in PEM format.
    LocalKas
    • id (String) Unique identifier for the KAS. Any non-empty string of your choice. Id must be unique in the Kaslist.
    • protocols (Array) List of protocols supported by the KAS ('local_symmetric_kas').
    • kek (Uint8Array) Key Encryption Key used for DEK wrapping. It must be a 32-byte Uint8Array generated with a true random number generator (TRNG). ⚠️ secret

    ⚠️ The kasList can only contain 1 LocalKas.

  • mappingSections (Optional) (Array) Configuration to dynamically select some KAS in the kasList depending on dataAttributes sent during encryption. List of MappingSection.

    MappingSection
    • label (String) Label of the mapping section.
    • mapping (Array) List of mappings.
      mapping
      • attributeName (String) Name of the attribute. Will match DataAttributes with top-level-key matching the referenced value.
      • type (String) Defines how matching KAS are grouped during encryption.
        • MappingItemType.Permissive (permissive): matching KAS are grouped together (logical OR).
        • MappingItemType.Restrictive (restrictive): each matching KAS generates an independent encryption split.
      • attributeValues (Array) List of AttributeValues.
        • value (String) Value of the DataAttribute to map. Will match the top-level keys of DataAttributes objects.
        • kasIds (Array) List of KAS IDs. Each ID must exist in the kasList.

⚠️ For the moment, only one mappingSection item is allowed in the mappingSections list. Each additional mappingSections item will cause an error. However, each section may contain multiple mapping items.

Examples

Minimal configuration - single RemoteKas - Protocol kas

ts
import { Sdsdk, SdsdkConfiguration, Protocol } from 'sdsdk';

const config: SdsdkConfiguration = {
  defaultKasId: 'kas-1',
  kasList: [
    {
      id: 'kas-1',
      protocols: [Protocol.Kas],
      url: 'https://kas.example.com/api/v1/kas',
      publicKey: {
        kid: 'my-kid',
        value: '-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----',
      },
      // can be omitted when using only encryption, but required for decryption
      authentication: {
        type: 'bearer',
        value: 'my-jwt-token', // ⚠️ **secret**
      },
    },
  ],
};

const sdsdk = new Sdsdk(config);

Minimal configuration - single RemoteKas - Protocol symmetric_kas

ts
import { Sdsdk, SdsdkConfiguration, Protocol } from 'sdsdk';

const config: SdsdkConfiguration = {
  defaultKasId: 'kas-1',
  kasList: [
    {
      id: 'kas-1',
      protocols: [Protocol.SymmetricKas],
      url: 'https://kas.example.com/api/v1/kas',
      authentication: {
        type: 'bearer',
        value: 'my-jwt-token', // ⚠️ **secret**
      },
    },
  ],
};

const sdsdk = new Sdsdk(config);

Minimal configuration - single LocalKas

ts
import { Sdsdk, SdsdkConfiguration, Protocol } from 'sdsdk';

const kek = crypto.getRandomValues(new Uint8Array(32));

const config: SdsdkConfiguration = {
  defaultKasId: 'local-kas',
  kasList: [
    {
      id: 'local-kas',
      protocols: [Protocol.LocalSymmetricKas],
      kek, // ⚠️ **secret**
    },
  ],
};

const sdsdk = new Sdsdk(config);

Advanced multi-KAS configuration with mapping

typescript
import { MappingItemType, Sdsdk, SdsdkConfiguration, Protocol } from 'sdsdk';

const config: SdsdkConfiguration = {
  defaultKasId: 'kas-1',
  kasList: [
    {
      id: 'kas-1',
      protocols: [Protocol.Kas, Protocol.SymmetricKas], // <- RemoteKas can support both protocols
      url: 'https://kas-1.example.com/api/v1/cb724d79-51e8-4816-b200-c0e88751bf89/kas',
      publicKey: {
        kid: 'my-kid',
        value: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqh[...]IBCgKCAQEA\n-----END PUBLIC KEY-----',
      },
      authentication: {
        type: 'basic',
        value: 'my-api-key', // ⚠️ secret
      },
    },
    {
      id: 'kas-2',
      protocols: [Protocol.Kas], // <- ... Or only one
      url: 'https://kas-2.example.com/api/v1/0f076525-684d-4289-9e09-3b2b105a6295/kas',
      publicKey: {
        kid: 'my-kid',
        value:
          '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQ[...]EFAAOCAQ8AMIIBCgKCAQEA\n-----END PUBLIC KEY-----',
      },
      authentication: {
        type: 'bearer',
        value: 'my-jwt-token', // ⚠️ secret
      },
    },
  ],
  mappingSections: [
    {
      label: 'default-mapping',
      mapping: [
        {
          attributeName: 'releasableTo',
          type: MappingItemType.Permissive,
          attributeValues: [
            { value: 'FRA', kasIds: ['kas-1', 'kas-2'] },
            { value: 'EN', kasIds: ['kas-2'] },
          ],
        },
      ],
    },
  ],
};

const sdsdk = new Sdsdk(config);

See the Dynamic KAS selection Mappings page for full behavior explanation (splits, SID, permissive vs restrictive, AND/OR model).