syntax = "proto3";
package SignalLocalStorageProtocol;

message SenderKeyRecordStructure {
    repeated SenderKeyStateStructure senderKeyStates = 1;
}

message SenderKeyStateStructure {
    optional uint32 senderKeyId = 1;
    optional SenderChainKey senderChainKey = 2;
    optional SenderSigningKey senderSigningKey = 3;
    repeated SenderMessageKey senderMessageKeys = 4;
    message SenderChainKey {
        optional uint32 iteration = 1;
        optional bytes seed = 2;
    }
    message SenderMessageKey {
        optional uint32 iteration = 1;
        optional bytes seed = 2;
    }
    message SenderSigningKey {
        optional bytes public = 1;
        optional bytes private = 2;
    }
}

message IdentityKeyPairStructure {
    optional bytes publicKey = 1;
    optional bytes privateKey = 2;
}

message SignedPreKeyRecordStructure {
    optional uint32 id = 1;
    optional bytes publicKey = 2;
    optional bytes privateKey = 3;
    optional bytes signature = 4;
    optional fixed64 timestamp = 5;
}

message PreKeyRecordStructure {
    optional uint32 id = 1;
    optional bytes publicKey = 2;
    optional bytes privateKey = 3;
}

message RecordStructure {
    optional SessionStructure currentSession = 1;
    repeated SessionStructure previousSessions = 2;
}

message SessionStructure {
    optional uint32 sessionVersion = 1;
    optional bytes localIdentityPublic = 2;
    optional bytes remoteIdentityPublic = 3;
    optional bytes rootKey = 4;
    optional uint32 previousCounter = 5;
    optional Chain senderChain = 6;
    repeated Chain receiverChains = 7;
    optional PendingKeyExchange pendingKeyExchange = 8;
    optional PendingPreKey pendingPreKey = 9;
    optional uint32 remoteRegistrationId = 10;
    optional uint32 localRegistrationId = 11;
    optional bool needsRefresh = 12;
    optional bytes aliceBaseKey = 13;
    message Chain {
        optional bytes senderRatchetKey = 1;
        optional bytes senderRatchetKeyPrivate = 2;
        optional ChainKey chainKey = 3;
        repeated MessageKey messageKeys = 4;
        message ChainKey {
            optional uint32 index = 1;
            optional bytes key = 2;
        }
        message MessageKey {
            optional uint32 index = 1;
            optional bytes cipherKey = 2;
            optional bytes macKey = 3;
            optional bytes iv = 4;
        }
    }
    message PendingKeyExchange {
        optional uint32 sequence = 1;
        optional bytes localBaseKey = 2;
        optional bytes localBaseKeyPrivate = 3;
        optional bytes localRatchetKey = 4;
        optional bytes localRatchetKeyPrivate = 5;
        optional bytes localIdentityKey = 7;
        optional bytes localIdentityKeyPrivate = 8;
    }
    message PendingPreKey {
        optional uint32 preKeyId = 1;
        optional int32 signedPreKeyId = 3;
        optional bytes baseKey = 2;
    }
}