/*
 * MIT License
 *
 * Copyright (c) 2023 Open Electronic Identity
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 */

include "recipients.fbs";

namespace cdoc20.header;

// Union for communicating the recipient type
union Capsule {
    recipients.ECCPublicKeyCapsule,
    recipients.RSAPublicKeyCapsule,
    recipients.KeyServerCapsule,
    recipients.SymmetricKeyCapsule,
    recipients.PBKDF2Capsule,
    recipients.KeySharesCapsule
}

// FMK encryption method enum.
enum FMKEncryptionMethod:byte {
    UNKNOWN,
    XOR
}

// Payload encryption method enum.
enum PayloadEncryptionMethod:byte {
    UNKNOWN,
    CHACHA20POLY1305
}

// Intermediate record, some languages act very poorly when it comes
// to an array of unions.
// Thus it is better to have an an array of tables that
// contains the union as a field.
table RecipientRecord {
    capsule:                Capsule;
    key_label:              string (required);
    encrypted_fmk:          [ubyte] (required);
    fmk_encryption_method:  FMKEncryptionMethod = UNKNOWN;
}

// Header structure.
table Header {
    recipients:                [RecipientRecord];

    payload_encryption_method: PayloadEncryptionMethod = UNKNOWN;
}

root_type Header;
