Search in sources :

Example 1 with ManifestRecord

use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by WhisperSystems.

the class SignalStorageModels method remoteToLocalStorageManifest.

public static SignalStorageManifest remoteToLocalStorageManifest(StorageManifest manifest, StorageKey storageKey) throws IOException, InvalidKeyException {
    byte[] rawRecord = SignalStorageCipher.decrypt(storageKey.deriveManifestKey(manifest.getVersion()), manifest.getValue().toByteArray());
    ManifestRecord manifestRecord = ManifestRecord.parseFrom(rawRecord);
    List<StorageId> ids = new ArrayList<>(manifestRecord.getIdentifiersCount());
    for (ManifestRecord.Identifier id : manifestRecord.getIdentifiersList()) {
        ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getType().getNumber()));
    }
    return new SignalStorageManifest(manifestRecord.getVersion(), ids);
}
Also used : ManifestRecord(org.whispersystems.signalservice.internal.storage.protos.ManifestRecord) ArrayList(java.util.ArrayList)

Example 2 with ManifestRecord

use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by signalapp.

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();
}
Also used : ManifestRecord(org.whispersystems.signalservice.internal.storage.protos.ManifestRecord) ArrayList(java.util.ArrayList)

Example 3 with ManifestRecord

use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by signalapp.

the class SignalStorageModels method remoteToLocalStorageManifest.

public static SignalStorageManifest remoteToLocalStorageManifest(StorageManifest manifest, StorageKey storageKey) throws IOException, InvalidKeyException {
    byte[] rawRecord = SignalStorageCipher.decrypt(storageKey.deriveManifestKey(manifest.getVersion()), manifest.getValue().toByteArray());
    ManifestRecord manifestRecord = ManifestRecord.parseFrom(rawRecord);
    List<StorageId> ids = new ArrayList<>(manifestRecord.getIdentifiersCount());
    for (ManifestRecord.Identifier id : manifestRecord.getIdentifiersList()) {
        ids.add(StorageId.forType(id.getRaw().toByteArray(), id.getType().getNumber()));
    }
    return new SignalStorageManifest(manifestRecord.getVersion(), ids);
}
Also used : ManifestRecord(org.whispersystems.signalservice.internal.storage.protos.ManifestRecord) ArrayList(java.util.ArrayList)

Example 4 with ManifestRecord

use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by signalapp.

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();
    }
}
Also used : SignalStorageManifest(org.whispersystems.signalservice.api.storage.SignalStorageManifest) ManifestRecord(org.whispersystems.signalservice.internal.storage.protos.ManifestRecord) StorageManifestKey(org.whispersystems.signalservice.api.storage.StorageManifestKey) ArrayList(java.util.ArrayList) SignalStorageRecord(org.whispersystems.signalservice.api.storage.SignalStorageRecord) ByteString(com.google.protobuf.ByteString) StorageId(org.whispersystems.signalservice.api.storage.StorageId) StorageManifest(org.whispersystems.signalservice.internal.storage.protos.StorageManifest) SignalStorageManifest(org.whispersystems.signalservice.api.storage.SignalStorageManifest) WriteOperation(org.whispersystems.signalservice.internal.storage.protos.WriteOperation)

Example 5 with ManifestRecord

use of org.whispersystems.signalservice.internal.storage.protos.ManifestRecord in project Signal-Android by WhisperSystems.

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);
    }
}
Also used : ManifestRecord(org.whispersystems.signalservice.internal.storage.protos.ManifestRecord) ArrayList(java.util.ArrayList) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) StorageManifest(org.whispersystems.signalservice.internal.storage.protos.StorageManifest)

Aggregations

ArrayList (java.util.ArrayList)8 ManifestRecord (org.whispersystems.signalservice.internal.storage.protos.ManifestRecord)8 StorageManifest (org.whispersystems.signalservice.internal.storage.protos.StorageManifest)4 ByteString (com.google.protobuf.ByteString)2 InvalidProtocolBufferException (com.google.protobuf.InvalidProtocolBufferException)2 SignalStorageManifest (org.whispersystems.signalservice.api.storage.SignalStorageManifest)2 SignalStorageRecord (org.whispersystems.signalservice.api.storage.SignalStorageRecord)2 StorageId (org.whispersystems.signalservice.api.storage.StorageId)2 StorageManifestKey (org.whispersystems.signalservice.api.storage.StorageManifestKey)2 WriteOperation (org.whispersystems.signalservice.internal.storage.protos.WriteOperation)2