use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by WhisperSystems.
the class SignalStorageManifest method serialize.
public byte[] serialize() {
List<ManifestRecord.Identifier> ids = new ArrayList<>(storageIds.size());
for (StorageId id : storageIds) {
ids.add(ManifestRecord.Identifier.newBuilder().setTypeValue(id.getType()).setRaw(ByteString.copyFrom(id.getRaw())).build());
}
ManifestRecord manifestRecord = ManifestRecord.newBuilder().addAllIdentifiers(ids).build();
return StorageManifest.newBuilder().setVersion(version).setValue(manifestRecord.toByteString()).build().toByteArray();
}
use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by WhisperSystems.
the class SignalServiceAccountManager method writeStorageRecords.
/**
* @return If there was a conflict, the latest {@link SignalStorageManifest}. Otherwise absent.
*/
private Optional<SignalStorageManifest> writeStorageRecords(StorageKey storageKey, SignalStorageManifest manifest, List<SignalStorageRecord> inserts, List<byte[]> deletes, boolean clearAll) throws IOException, InvalidKeyException {
ManifestRecord.Builder manifestRecordBuilder = ManifestRecord.newBuilder().setVersion(manifest.getVersion());
for (StorageId id : manifest.getStorageIds()) {
ManifestRecord.Identifier idProto = ManifestRecord.Identifier.newBuilder().setRaw(ByteString.copyFrom(id.getRaw())).setType(ManifestRecord.Identifier.Type.forNumber(id.getType())).build();
manifestRecordBuilder.addIdentifiers(idProto);
}
String authToken = this.pushServiceSocket.getStorageAuth();
StorageManifestKey manifestKey = storageKey.deriveManifestKey(manifest.getVersion());
byte[] encryptedRecord = SignalStorageCipher.encrypt(manifestKey, manifestRecordBuilder.build().toByteArray());
StorageManifest storageManifest = StorageManifest.newBuilder().setVersion(manifest.getVersion()).setValue(ByteString.copyFrom(encryptedRecord)).build();
WriteOperation.Builder writeBuilder = WriteOperation.newBuilder().setManifest(storageManifest);
for (SignalStorageRecord insert : inserts) {
writeBuilder.addInsertItem(SignalStorageModels.localToRemoteStorageRecord(insert, storageKey));
}
if (clearAll) {
writeBuilder.setClearAll(true);
} else {
for (byte[] delete : deletes) {
writeBuilder.addDeleteKey(ByteString.copyFrom(delete));
}
}
Optional<StorageManifest> conflict = this.pushServiceSocket.writeStorageContacts(authToken, writeBuilder.build());
if (conflict.isPresent()) {
StorageManifestKey conflictKey = storageKey.deriveManifestKey(conflict.get().getVersion());
byte[] rawManifestRecord = SignalStorageCipher.decrypt(conflictKey, conflict.get().getValue().toByteArray());
ManifestRecord record = ManifestRecord.parseFrom(rawManifestRecord);
List<StorageId> ids = new ArrayList<>(record.getIdentifiersCount());
for (ManifestRecord.Identifier id : record.getIdentifiersList()) {
ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getType().getNumber()));
}
SignalStorageManifest conflictManifest = new SignalStorageManifest(record.getVersion(), ids);
return Optional.of(conflictManifest);
} else {
return Optional.absent();
}
}
use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by signalapp.
the class SignalStorageManifest method deserialize.
public static SignalStorageManifest deserialize(byte[] serialized) {
try {
StorageManifest manifest = StorageManifest.parseFrom(serialized);
ManifestRecord manifestRecord = ManifestRecord.parseFrom(manifest.getValue());
List<StorageId> ids = new ArrayList<>(manifestRecord.getIdentifiersCount());
for (ManifestRecord.Identifier id : manifestRecord.getIdentifiersList()) {
ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getTypeValue()));
}
return new SignalStorageManifest(manifest.getVersion(), ids);
} catch (InvalidProtocolBufferException e) {
throw new AssertionError(e);
}
}
Aggregations