Line data Source code
1 : /*
2 : * Famedly Matrix SDK
3 : * Copyright (C) 2019, 2020, 2021 Famedly GmbH
4 : *
5 : * This program is free software: you can redistribute it and/or modify
6 : * it under the terms of the GNU Affero General Public License as
7 : * published by the Free Software Foundation, either version 3 of the
8 : * License, or (at your option) any later version.
9 : *
10 : * This program is distributed in the hope that it will be useful,
11 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : * GNU Affero General Public License for more details.
14 : *
15 : * You should have received a copy of the GNU Affero General Public License
16 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 : */
18 :
19 : import 'dart:convert';
20 : import 'dart:typed_data';
21 :
22 : import 'package:matrix/encryption/utils/base64_unpadded.dart';
23 : import 'package:matrix/src/utils/crypto/crypto.dart';
24 :
25 : class EncryptedFile {
26 2 : EncryptedFile({
27 : required this.data,
28 : required this.k,
29 : required this.iv,
30 : required this.sha256,
31 : });
32 : Uint8List data;
33 : String k;
34 : String iv;
35 : String sha256;
36 : }
37 :
38 1 : Future<EncryptedFile> encryptFile(Uint8List input) async {
39 1 : final key = secureRandomBytes(32);
40 1 : final iv = secureRandomBytes(16);
41 2 : final data = await aesCtr.encrypt(input, key, iv);
42 2 : final hash = await sha256(data);
43 1 : return EncryptedFile(
44 : data: data,
45 2 : k: base64Url.encode(key).replaceAll('=', ''),
46 2 : iv: base64.encode(iv).replaceAll('=', ''),
47 2 : sha256: base64.encode(hash).replaceAll('=', ''),
48 : );
49 : }
50 :
51 : /// you would likely want to use [NativeImplementations] and
52 : /// [Client.nativeImplementations] instead
53 1 : Future<Uint8List?> decryptFileImplementation(EncryptedFile input) async {
54 5 : if (base64.encode(await sha256(input.data)) !=
55 2 : base64.normalize(input.sha256)) {
56 : return null;
57 : }
58 :
59 3 : final key = base64decodeUnpadded(base64.normalize(input.k));
60 3 : final iv = base64decodeUnpadded(base64.normalize(input.iv));
61 3 : return await aesCtr.encrypt(input.data, key, iv);
62 : }
|