syntax = "proto2"; package textsecure; option java_package = "org.whispersystems.libsignal.state"; option java_outer_classname = "StorageProtos"; message SessionStructure { message Chain { optional bytes senderRatchetKey = 1; optional bytes senderRatchetKeyPrivate = 2; message ChainKey { optional uint32 index = 1; optional bytes key = 2; } optional ChainKey chainKey = 3; message MessageKey { optional uint32 index = 1; optional bytes cipherKey = 2; optional bytes macKey = 3; optional bytes iv = 4; } repeated MessageKey messageKeys = 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; } 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 RecordStructure { optional SessionStructure currentSession = 1; repeated SessionStructure previousSessions = 2; } message PreKeyRecordStructure { optional uint32 id = 1; optional bytes publicKey = 2; optional bytes privateKey = 3; } message SignedPreKeyRecordStructure { optional uint32 id = 1; optional bytes publicKey = 2; optional bytes privateKey = 3; optional bytes signature = 4; optional fixed64 timestamp = 5; } message IdentityKeyPairStructure { optional bytes publicKey = 1; optional bytes privateKey = 2; } message SenderKeyStateStructure { 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; } optional uint32 senderKeyId = 1; optional SenderChainKey senderChainKey = 2; optional SenderSigningKey senderSigningKey = 3; repeated SenderMessageKey senderMessageKeys = 4; } message SenderKeyRecordStructure { repeated SenderKeyStateStructure senderKeyStates = 1; }