BackupFileHeader.java

 1package eu.siacs.conversations.utils;
 2
 3import androidx.annotation.NonNull;
 4import eu.siacs.conversations.xmpp.Jid;
 5import java.io.DataInputStream;
 6import java.io.DataOutputStream;
 7import java.io.IOException;
 8
 9public class BackupFileHeader {
10
11    private static final int VERSION = 1;
12
13    private final String app;
14    private final Jid jid;
15    private final long timestamp;
16    private final byte[] iv;
17    private final byte[] salt;
18
19    @NonNull
20    @Override
21    public String toString() {
22        return "BackupFileHeader{"
23                + "app='"
24                + app
25                + '\''
26                + ", jid="
27                + jid
28                + ", timestamp="
29                + timestamp
30                + ", iv="
31                + CryptoHelper.bytesToHex(iv)
32                + ", salt="
33                + CryptoHelper.bytesToHex(salt)
34                + '}';
35    }
36
37    public BackupFileHeader(String app, Jid jid, long timestamp, byte[] iv, byte[] salt) {
38        this.app = app;
39        this.jid = jid;
40        this.timestamp = timestamp;
41        this.iv = iv;
42        this.salt = salt;
43    }
44
45    public void write(DataOutputStream dataOutputStream) throws IOException {
46        dataOutputStream.writeInt(VERSION);
47        dataOutputStream.writeUTF(app);
48        dataOutputStream.writeUTF(jid.asBareJid().toString());
49        dataOutputStream.writeLong(timestamp);
50        dataOutputStream.write(iv);
51        dataOutputStream.write(salt);
52    }
53
54    public static BackupFileHeader read(DataInputStream inputStream) throws IOException {
55        final int version = inputStream.readInt();
56        final String app = inputStream.readUTF();
57        final String jid = inputStream.readUTF();
58        long timestamp = inputStream.readLong();
59        final byte[] iv = new byte[12];
60        inputStream.readFully(iv);
61        final byte[] salt = new byte[16];
62        inputStream.readFully(salt);
63        if (version < VERSION) {
64            throw new OutdatedBackupFileVersion();
65        }
66        if (version != VERSION) {
67            throw new IllegalArgumentException(
68                    "Backup File version was "
69                            + version
70                            + " but app only supports version "
71                            + VERSION);
72        }
73        return new BackupFileHeader(app, Jid.of(jid), timestamp, iv, salt);
74    }
75
76    public byte[] getSalt() {
77        return salt;
78    }
79
80    public byte[] getIv() {
81        return iv;
82    }
83
84    public Jid getJid() {
85        return jid;
86    }
87
88    public String getApp() {
89        return app;
90    }
91
92    public long getTimestamp() {
93        return timestamp;
94    }
95
96    public static class OutdatedBackupFileVersion extends RuntimeException {}
97}