Skip to content

Commit c4afd54

Browse files
committed
add askarKeyFromKeyExchange and askarKeyConvert
1 parent 47da8fd commit c4afd54

File tree

4 files changed

+87
-25
lines changed

4 files changed

+87
-25
lines changed

lib/askar/askar_wrapper.dart

+24-12
Original file line numberDiff line numberDiff line change
@@ -336,22 +336,28 @@ AskarResult<Uint8List> askarKeyAeadRandomNonce(
336336
return AskarResult<Uint8List>(errorCode, value);
337337
}
338338

339-
ErrorCode askarKeyConvert(
339+
AskarResult<LocalKeyHandle> askarKeyConvert(
340340
LocalKeyHandle handle,
341-
String alg,
342-
Pointer<NativeLocalKeyHandle> out,
341+
KeyAlgorithm alg,
343342
) {
344-
final algPointer = alg.toNativeUtf8();
343+
Pointer<NativeLocalKeyHandle> localKeyHandlePtr = calloc<NativeLocalKeyHandle>();
344+
345+
final algPointer = alg.value.toNativeUtf8();
345346

346347
final result = nativeAskarKeyConvert(
347348
handle.toInt(),
348349
algPointer,
349-
out,
350+
localKeyHandlePtr,
350351
);
351352

353+
final errorCode = ErrorCode.fromInt(result);
354+
355+
final localKeyHandle = LocalKeyHandle.fromPointer(errorCode, localKeyHandlePtr);
356+
352357
calloc.free(algPointer);
358+
calloc.free(localKeyHandlePtr);
353359

354-
return ErrorCode.fromInt(result);
360+
return AskarResult<LocalKeyHandle>(errorCode, localKeyHandle);
355361
}
356362

357363
ErrorCode askarKeyCryptoBox(
@@ -640,24 +646,30 @@ AskarResult<LocalKeyHandle> askarKeyFromJwk(String jwk) {
640646
return AskarResult<LocalKeyHandle>(errorCode, value);
641647
}
642648

643-
ErrorCode askarKeyFromKeyExchange(
644-
String alg,
649+
AskarResult<LocalKeyHandle> askarKeyFromKeyExchange(
650+
KeyAlgorithm alg,
645651
LocalKeyHandle skHandle,
646652
LocalKeyHandle pkHandle,
647-
Pointer<NativeLocalKeyHandle> out,
648653
) {
649-
final algPointer = alg.toNativeUtf8();
654+
Pointer<NativeLocalKeyHandle> localKeyHandlePtr = calloc<NativeLocalKeyHandle>();
655+
656+
final algPointer = alg.value.toNativeUtf8();
650657

651658
final result = nativeAskarKeyFromKeyExchange(
652659
algPointer,
653660
skHandle.toInt(),
654661
pkHandle.toInt(),
655-
out,
662+
localKeyHandlePtr,
656663
);
657664

665+
final errorCode = ErrorCode.fromInt(result);
666+
667+
final localKeyHandle = LocalKeyHandle.fromPointer(errorCode, localKeyHandlePtr);
668+
658669
calloc.free(algPointer);
670+
calloc.free(localKeyHandlePtr);
659671

660-
return ErrorCode.fromInt(result);
672+
return AskarResult<LocalKeyHandle>(errorCode, localKeyHandle);
661673
}
662674

663675
AskarResult<LocalKeyHandle> askarKeyFromPublicBytes(

lib/askar/crypto/askar_key.dart

+20-10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:import_so_libaskar/askar/enums/askar_key_algorithm.dart';
77
import 'package:import_so_libaskar/askar/enums/askar_key_backend.dart';
88
import 'package:import_so_libaskar/askar/enums/askar_signature_algorithm.dart';
99
import 'package:import_so_libaskar/askar/exceptions/exceptions.dart';
10+
import 'package:import_so_libaskar/global.dart';
1011

1112
class AskarKey {
1213
final LocalKeyHandle localKeyHandle;
@@ -63,17 +64,26 @@ class AskarKey {
6364
}
6465
}
6566

66-
// TODO
67-
// AskarKey convertKey({required KeyAlgorithm algorithm}) {
68-
// return AskarKey(askar.keyConvert(localKeyHandle: handle, algorithm: algorithm));
69-
// }
67+
AskarKey convertKey({required KeyAlgorithm algorithm}) {
68+
try {
69+
return AskarKey(askarKeyConvert(localKeyHandle, algorithm).getValueOrException());
70+
} catch (e) {
71+
throw AskarKeyException('Failed to convert key from algorithm: $e');
72+
}
73+
}
7074

71-
// TODO
72-
// AskarKey keyFromKeyExchange(
73-
// {required KeyAlgorithm algorithm, required AskarKey publicKey}) {
74-
// return AskarKey(askar.keyFromKeyExchange(
75-
// skHandle: handle, pkHandle: publicKey.handle, algorithm: algorithm));
76-
// }
75+
AskarKey keyFromKeyExchange(
76+
{required KeyAlgorithm algorithm,
77+
required AskarKey secretKey,
78+
required AskarKey publicKey}) {
79+
try {
80+
return AskarKey(
81+
askarKeyFromKeyExchange(algorithm, secretKey.handle, publicKey.handle)
82+
.getValueOrException());
83+
} catch (e) {
84+
throw AskarKeyException('Failed to get key from key exchange: $e');
85+
}
86+
}
7787

7888
LocalKeyHandle get handle => localKeyHandle;
7989

test/askar_test.dart

+41-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,22 @@ void main() {
176176

177177
final publicBytes = keyGetPublicBytesTest(localKeyHandle).value;
178178

179-
keyFromPublicBytesTest(algorithm, publicBytes);
179+
keyFromPublicBytesTest(algorithm, publicBytes).value;
180+
181+
// Início do keyFromKeyExchangeTest
182+
final convertedAlgorithm = KeyAlgorithm.x25519;
183+
final convertedKeyHandle = keyConvertTest(localKeyHandle, convertedAlgorithm).value;
184+
185+
final convertedKeyGenerateResult = keyGenerateTest(convertedAlgorithm);
186+
final newKeyHandle = convertedKeyGenerateResult.value;
187+
keyGetAlgorithmTest(newKeyHandle, expected: convertedAlgorithm);
188+
189+
final exchangeAlgorithm = KeyAlgorithm.chacha20XC20P;
190+
final exchangedKeyHandle =
191+
keyFromKeyExchangeTest(exchangeAlgorithm, convertedKeyHandle, newKeyHandle)
192+
.value;
193+
keyGetAlgorithmTest(exchangedKeyHandle, expected: exchangeAlgorithm);
194+
// Fim do keyFromKeyExchangeTest
180195

181196
await sessionInsertKeyTest(
182197
sessionHandle, localKeyHandle, '${name}_1', metadata, tags);
@@ -445,6 +460,17 @@ void main() {
445460
});
446461
}
447462

463+
AskarResult<LocalKeyHandle> keyConvertTest(
464+
LocalKeyHandle handle, KeyAlgorithm algorithm) {
465+
final result = askarKeyConvert(handle, algorithm);
466+
467+
printAskarResult('KeyConvertTest', result);
468+
469+
expect(result.errorCode, equals(ErrorCode.success));
470+
471+
return result;
472+
}
473+
448474
AskarResult<AskarEncryptedBuffer> keyAeadEncryptTest(
449475
LocalKeyHandle handle, Uint8List message,
450476
{Uint8List? nonce, Uint8List? aad}) {
@@ -1063,6 +1089,20 @@ AskarResult<LocalKeyHandle> keyFromPublicBytesTest(
10631089
return result;
10641090
}
10651091

1092+
AskarResult<LocalKeyHandle> keyFromKeyExchangeTest(
1093+
KeyAlgorithm algorithm,
1094+
LocalKeyHandle secretKeyHandle,
1095+
LocalKeyHandle publicKeyHandle,
1096+
) {
1097+
final result = askarKeyFromKeyExchange(algorithm, secretKeyHandle, publicKeyHandle);
1098+
printAskarResult('KeyFromKeyExchange', result);
1099+
1100+
expect(result.errorCode, ErrorCode.success);
1101+
expect(result.value.toInt(), greaterThan(0));
1102+
1103+
return result;
1104+
}
1105+
10661106
Future<AskarCallbackBlankResult> sessionCloseTest(SessionHandle handle) async {
10671107
final result = await askarSessionClose(handle, true);
10681108

todo.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
- [x] askar_key_aead_random_nonce: (args_0: Buffer, args_1: Buffer) => number;
4444

45-
- [ ] askar_key_convert: (args_0: Buffer, args_1: string, args_2: Buffer) => number;
45+
- [x] askar_key_convert: (args_0: Buffer, args_1: string, args_2: Buffer) => number;
4646

4747
- [ ] askar_key_crypto_box: (args_0: Buffer, args_1: Buffer, args_2: Buffer, args_3: Buffer, args_4: Buffer) => number;
4848

@@ -76,7 +76,7 @@
7676

7777
- [x] askar_key_from_jwk: (args_0: Buffer, args_1: Buffer) => number;
7878

79-
- [ ] askar_key_from_key_exchange: (args_0: string, args_1: Buffer, args_2: Buffer, args_3: Buffer) => number;
79+
- [x] askar_key_from_key_exchange: (args_0: string, args_1: Buffer, args_2: Buffer, args_3: Buffer) => number;
8080

8181
- [ ] askar_key_from_public_bytes: (args_0: string, args_1: Buffer, args_2: Buffer) => number;
8282

0 commit comments

Comments
 (0)