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}