Skip to content

Commit 15ee089

Browse files
committed
feat: encrypt log files
1 parent f47509e commit 15ee089

File tree

17 files changed

+359
-198
lines changed

17 files changed

+359
-198
lines changed

.github/workflows/automated_integration_test.yml

Lines changed: 163 additions & 162 deletions
Large diffs are not rendered by default.

.github/workflows/pr_test_build_android.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232

3333
steps:
3434
- name: Fix github actions messing up $HOME...
35-
run: 'echo HOME=/root | sudo tee -a $GITHUB_ENV'
35+
run: "echo HOME=/root | sudo tee -a $GITHUB_ENV"
3636
- uses: actions/checkout@v4
3737
with:
3838
ref: ${{ github.event.pull_request.head.sha }}
@@ -134,6 +134,8 @@ jobs:
134134
echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
135135
echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart
136136
echo "const chainStackApiKey = '${{ secrets.CHAIN_STACK_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart
137+
echo "const logPassword = '${{ secrets.LOG_PASSWORD }}';" >> cw_core/lib/.secrets.g.dart
138+
echo "const logSalt = '${{ secrets.LOG_SALT }}';" >> cw_core/lib/.secrets.g.dart
137139
echo "const testCakePayApiKey = '${{ secrets.TEST_CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart
138140
echo "const cakePayApiKey = '${{ secrets.CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart
139141
echo "const authorization = '${{ secrets.CAKE_PAY_AUTHORIZATION }}';" >> lib/.secrets.g.dart
@@ -232,7 +234,7 @@ jobs:
232234
wget https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.0-RC9/release-bundle.zip
233235
unzip release-bundle.zip
234236
rm release-bundle.zip
235-
unxz -fv release/*/*.xz
237+
unxz -fv release/*/*.xz
236238
popd
237239
238240
- name: Build Bitbox Flutter
@@ -324,10 +326,10 @@ jobs:
324326
with:
325327
path: ${{ github.workspace }}/build/app/outputs/flutter-apk
326328
name: "android apk"
327-
329+
328330
- name: 16KB align
329331
run: |
330332
cd build/app/outputs/flutter-apk
331333
for i in arm64-v8a x86_64; do
332334
../../../../scripts/android/check_16kb_align.sh app-$i-release.apk
333-
done
335+
done

.github/workflows/pr_test_build_linux.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525

2626
steps:
2727
- name: Fix github actions messing up $HOME...
28-
run: 'echo HOME=/root | sudo tee -a $GITHUB_ENV'
28+
run: "echo HOME=/root | sudo tee -a $GITHUB_ENV"
2929
- uses: actions/checkout@v4
3030
with:
3131
ref: ${{ github.event.pull_request.head.sha }}
@@ -127,6 +127,8 @@ jobs:
127127
echo "const polygonScanApiKey = '${{ secrets.POLYGON_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart
128128
echo "const ankrApiKey = '${{ secrets.ANKR_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart
129129
echo "const chainStackApiKey = '${{ secrets.CHAIN_STACK_API_KEY }}';" >> cw_solana/lib/.secrets.g.dart
130+
echo "const logPassword = '${{ secrets.LOG_PASSWORD }}';" >> cw_core/lib/.secrets.g.dart
131+
echo "const logSalt = '${{ secrets.LOG_SALT }}';" >> cw_core/lib/.secrets.g.dart
130132
echo "const testCakePayApiKey = '${{ secrets.TEST_CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart
131133
echo "const cakePayApiKey = '${{ secrets.CAKE_PAY_API_KEY }}';" >> lib/.secrets.g.dart
132134
echo "const authorization = '${{ secrets.CAKE_PAY_AUTHORIZATION }}';" >> lib/.secrets.g.dart
@@ -216,7 +218,7 @@ jobs:
216218
wget https://github.com/MrCyjaneK/monero_c/releases/download/v0.18.4.0-RC9/release-bundle.zip
217219
unzip release-bundle.zip
218220
rm release-bundle.zip
219-
unxz -fv release/*/*.xz
221+
unxz -fv release/*/*.xz
220222
popd
221223
222224
- name: Build Bitbox Flutter
@@ -266,11 +268,11 @@ jobs:
266268
- name: Prepare virtual desktop
267269
if: ${{ contains(env.message, 'run tests') }}
268270
run: |
269-
nohup Xvfb :99 -screen 0 720x1280x16 &
270-
echo DISPLAY=:99 | sudo tee -a $GITHUB_ENV
271-
dbus-daemon --system --fork
272-
nohup NetworkManager &
273-
nohup ffmpeg -framerate 60 -video_size 720x1280 -f x11grab -i :99 -c:v libx264 -c:a aac /opt/screen_grab.mkv &
271+
nohup Xvfb :99 -screen 0 720x1280x16 &
272+
echo DISPLAY=:99 | sudo tee -a $GITHUB_ENV
273+
dbus-daemon --system --fork
274+
nohup NetworkManager &
275+
nohup ffmpeg -framerate 60 -video_size 720x1280 -f x11grab -i :99 -c:v libx264 -c:a aac /opt/screen_grab.mkv &
274276
275277
# Note for people adding tests:
276278
# - Tests are ran on Linux, with some things being mocked out.

cw_bitcoin/pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,14 @@ packages:
706706
url: "https://pub.dev"
707707
source: hosted
708708
version: "5.4.5"
709+
mutex:
710+
dependency: transitive
711+
description:
712+
name: mutex
713+
sha256: "8827da25de792088eb33e572115a5eb0d61d61a3c01acbc8bcbe76ed78f1a1f2"
714+
url: "https://pub.dev"
715+
source: hosted
716+
version: "3.1.0"
709717
nested:
710718
dependency: transitive
711719
description:
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import 'dart:convert';
2+
import 'dart:io';
3+
import 'package:cryptography/cryptography.dart';
4+
import 'package:mutex/mutex.dart';
5+
import 'package:cw_core/.secrets.g.dart' as secrets;
6+
7+
final logMutex = Mutex();
8+
final password = secrets.logPassword.isEmpty ? ':)' : secrets.logPassword;
9+
final salt = secrets.logSalt.isEmpty ? '(:' : secrets.logSalt;
10+
11+
class EncryptionLogUtil {
12+
static final _algorithm = AesGcm.with256bits();
13+
static SecretKey? cachedKey = null;
14+
static Future<SecretKey> _deriveKey() async {
15+
if (cachedKey != null) {
16+
return cachedKey!;
17+
}
18+
final pbkdf2 = Pbkdf2(
19+
macAlgorithm: Hmac.sha256(),
20+
iterations: 120000, // OWASP recommendation: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
21+
bits: 256,
22+
);
23+
final key = await pbkdf2.deriveKey(
24+
secretKey: SecretKey(utf8.encode(password)),
25+
nonce: utf8.encode(salt),
26+
);
27+
cachedKey = key;
28+
return key;
29+
}
30+
31+
static Future<void> write({required String path, required String data}) async {
32+
await logMutex.acquire();
33+
try {
34+
final key = await _deriveKey();
35+
final secretKey = await _algorithm.newSecretKey();
36+
final iv = await secretKey.extractBytes();
37+
38+
final nonce = iv.sublist(0, 12);
39+
40+
final secretBox = await _algorithm.encrypt(
41+
utf8.encode(data),
42+
secretKey: key,
43+
nonce: nonce,
44+
);
45+
46+
final line = base64.encode([...nonce, ...secretBox.cipherText, ...secretBox.mac.bytes]);
47+
File(path).writeAsStringSync("$line\n", mode: FileMode.append);
48+
} finally {
49+
logMutex.release();
50+
}
51+
}
52+
53+
static Future<String> read({required String path}) async {
54+
await logMutex.acquire();
55+
try {
56+
final key = await _deriveKey();
57+
final file = File(path);
58+
final lines = file.readAsLinesSync();
59+
final sb = StringBuffer();
60+
61+
for (final line in lines) {
62+
try {
63+
final bytes = base64.decode(line);
64+
final nonce = bytes.sublist(0, 12);
65+
final cipherText = bytes.sublist(12, bytes.length - 16);
66+
final macBytes = bytes.sublist(bytes.length - 16);
67+
68+
final secretBox = SecretBox(
69+
cipherText,
70+
nonce: nonce,
71+
mac: Mac(macBytes),
72+
);
73+
74+
final decrypted = await _algorithm.decrypt(secretBox, secretKey: key);
75+
sb.write(utf8.decode(decrypted));
76+
} catch (_) {
77+
sb.writeln(line);
78+
}
79+
}
80+
81+
return sb.toString();
82+
} finally {
83+
logMutex.release();
84+
}
85+
}
86+
}

cw_core/lib/utils/print_verbose.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import 'dart:async';
12
import 'dart:io';
23
import 'dart:math';
4+
import 'package:cw_core/encryption_log_utils.dart';
35
import 'package:flutter/foundation.dart';
46

57
enum LogLevel { info, debug, warn, error }
@@ -21,7 +23,10 @@ void printV(
2123
if (!logFile.existsSync()) {
2224
logFile.createSync(recursive: true);
2325
}
24-
logFile.writeAsStringSync("$logLine\n", mode: FileMode.append, flush: true);
26+
unawaited(EncryptionLogUtil.write(
27+
path: logFile.path,
28+
data: "$logLine\n",
29+
));
2530
}
2631
}
2732

cw_core/pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,14 @@ packages:
466466
url: "https://pub.dev"
467467
source: hosted
468468
version: "2.7.1"
469+
mutex:
470+
dependency: "direct main"
471+
description:
472+
name: mutex
473+
sha256: "8827da25de792088eb33e572115a5eb0d61d61a3c01acbc8bcbe76ed78f1a1f2"
474+
url: "https://pub.dev"
475+
source: hosted
476+
version: "3.1.0"
469477
nested:
470478
dependency: transitive
471479
description:

cw_core/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ dependencies:
4444
git:
4545
url: https://github.com/cake-tech/blockchain_utils
4646
ref: cake-update-v2
47+
mutex: ^3.1.0
4748

4849
dev_dependencies:
4950
flutter_test:

cw_decred/pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,14 @@ packages:
489489
url: "https://pub.dev"
490490
source: hosted
491491
version: "2.7.0"
492+
mutex:
493+
dependency: transitive
494+
description:
495+
name: mutex
496+
sha256: "8827da25de792088eb33e572115a5eb0d61d61a3c01acbc8bcbe76ed78f1a1f2"
497+
url: "https://pub.dev"
498+
source: hosted
499+
version: "3.1.0"
492500
nested:
493501
dependency: transitive
494502
description:

cw_nano/pubspec.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,14 @@ packages:
534534
url: "https://pub.dev"
535535
source: hosted
536536
version: "2.7.1"
537+
mutex:
538+
dependency: transitive
539+
description:
540+
name: mutex
541+
sha256: "8827da25de792088eb33e572115a5eb0d61d61a3c01acbc8bcbe76ed78f1a1f2"
542+
url: "https://pub.dev"
543+
source: hosted
544+
version: "3.1.0"
537545
nanodart:
538546
dependency: transitive
539547
description:

0 commit comments

Comments
 (0)