// Copyright 2018-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

package signalservice;

option java_package = "org.whispersystems.libsignal.protocol";
option java_outer_classname = "WhisperProtos";

message ServerCertificate {
    message Certificate {
        optional uint32 id  = 1;
        optional bytes  key = 2;
    }

    optional bytes certificate = 1;
    optional bytes signature   = 2;
}

message SenderCertificate {
    message Certificate {
        optional string            senderE164    = 1;
        optional string            senderUuid    = 6;
        optional uint32            senderDevice  = 2;
        optional fixed64           expires       = 3;
        optional bytes             identityKey   = 4;
        optional ServerCertificate signer        = 5;
    }

    optional bytes certificate = 1;
    optional bytes signature   = 2;
}

message UnidentifiedSenderMessage {

    message Message {
        enum Type {
            PREKEY_MESSAGE         = 1;
            MESSAGE                = 2;
            // Further cases should line up with Envelope.Type, even though old cases don't.

            // Our parser does not handle reserved in enums: DESKTOP-1569
            // reserved 3 to 6;

            SENDERKEY_MESSAGE      = 7;
            PLAINTEXT_CONTENT      = 8;
        }

        enum ContentHint {
            // Show an error immediately; it was important but we can't retry.
            DEFAULT = 0;

            // Sender will try to resend; delay any error UI if possible
            RESENDABLE = 1;

            // Don't show any error UI at all; this is something sent implicitly like a typing message or a receipt
            IMPLICIT   = 2;
        }

        optional Type              type              = 1;
        optional SenderCertificate senderCertificate = 2;
        optional bytes             content           = 3;
        optional ContentHint       contentHint       = 4;
        optional bytes             groupId           = 5;
    }

    optional bytes ephemeralPublic  = 1;
    optional bytes encryptedStatic  = 2;
    optional bytes encryptedMessage = 3;
}
