package dfu;

// Version 0.1

enum FwType {
    APPLICATION             = 0;
    SOFTDEVICE              = 1;
    BOOTLOADER              = 2;
    SOFTDEVICE_BOOTLOADER   = 3;
    EXTERNAL_APPLICATION    = 4;
}

enum HashType {
    NO_HASH = 0;
    CRC     = 1;
    SHA128  = 2;
    SHA256  = 3;
    SHA512  = 4;
}

enum OpCode {
    INIT = 1;
}

enum ValidationType {
    NO_VALIDATION                   = 0;
    VALIDATE_GENERATED_CRC          = 1;
    VALIDATE_SHA256                 = 2;
    VALIDATE_ECDSA_P256_SHA256      = 3;
}

message Hash {
    required HashType   hash_type   = 1;
    required bytes      hash        = 2;
}

message BootValidation {

    required ValidationType type    = 1;
    required bytes          bytes   = 2;
}

// Commands data
message InitCommand {
    optional uint32             fw_version      = 1;
    optional uint32             hw_version      = 2;
    repeated uint32             sd_req          = 3 [packed = true];
    optional FwType             type            = 4;

    optional uint32             sd_size         = 5;
    optional uint32             bl_size         = 6;
    optional uint32             app_size        = 7;

    optional Hash               hash            = 8;

    optional bool               is_debug        = 9 [default = false];
    repeated BootValidation     boot_validation = 10;
}

// Command type
message Command {
    optional OpCode         op_code = 1;
    optional InitCommand    init    = 2;
}

// Signed command types
enum SignatureType {
    ECDSA_P256_SHA256   = 0;
    ED25519             = 1;
}

message SignedCommand {
    required Command        command         = 1;
    required SignatureType  signature_type  = 2;
    required bytes          signature       = 3;
}

// Parent packet type
message Packet {
    optional Command        command         = 1;
    optional SignedCommand  signed_command  = 2;
}