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