@@ -5,6 +5,7 @@ import 'dart:ffi';
5
5
import 'package:ffi/ffi.dart' ;
6
6
import 'package:flutter/foundation.dart' ;
7
7
import 'package:import_so_libaskar/askar/askar_callbacks.dart' ;
8
+ import 'package:import_so_libaskar/askar/crypto/askar_encrypted_buffer.dart' ;
8
9
import 'package:import_so_libaskar/askar/enums/askar_entry_operation.dart' ;
9
10
import 'package:import_so_libaskar/askar/enums/askar_error_code.dart' ;
10
11
import 'package:import_so_libaskar/askar/enums/askar_key_algorithm.dart' ;
@@ -27,19 +28,6 @@ final class AskarResult<T> {
27
28
}
28
29
}
29
30
30
- final class AskarEncryptedBuffer {
31
- final Uint8List buffer;
32
- final int tagPos;
33
- final int noncePos;
34
-
35
- AskarEncryptedBuffer (this .buffer, this .tagPos, this .noncePos);
36
-
37
- @override
38
- String toString () {
39
- return "AskarEncryptedBuffer(tagPos: $tagPos , noncePos: $noncePos , buffer: $buffer )" ;
40
- }
41
- }
42
-
43
31
typedef LocalKeyHandle = int ;
44
32
typedef ScanHandle = int ;
45
33
typedef StoreHandle = int ;
@@ -242,7 +230,7 @@ ErrorCode askarKeyAeadDecrypt(
242
230
return ErrorCode .fromInt (result);
243
231
}
244
232
245
- AskarResult <Uint8List > askarKeyAeadEncrypt (
233
+ AskarResult <AskarEncryptedBuffer > askarKeyAeadEncrypt (
246
234
LocalKeyHandle localKeyHandle, Uint8List message,
247
235
{Uint8List ? nonce, Uint8List ? aad}) {
248
236
final randomNonce = askarKeyAeadRandomNonce (localKeyHandle);
@@ -264,7 +252,9 @@ AskarResult<Uint8List> askarKeyAeadEncrypt(
264
252
265
253
final errorCode = ErrorCode .fromInt (funcResult);
266
254
267
- final encryptedData = secretBufferToBytesList (outPtr.ref.buffer);
255
+ final value = (errorCode == ErrorCode .success)
256
+ ? readNativeEncryptedBuffer (outPtr.ref)
257
+ : AskarEncryptedBuffer (Uint8List .fromList ([]), 0 , 0 );
268
258
269
259
calloc.free (messagePtr.ref.data);
270
260
calloc.free (noncePtr.ref.data);
@@ -274,7 +264,7 @@ AskarResult<Uint8List> askarKeyAeadEncrypt(
274
264
calloc.free (aadPtr);
275
265
calloc.free (outPtr);
276
266
277
- return AskarResult (errorCode, encryptedData );
267
+ return AskarResult < AskarEncryptedBuffer > (errorCode, value );
278
268
}
279
269
280
270
ErrorCode askarKeyAeadGetPadding (
@@ -447,32 +437,47 @@ ErrorCode askarKeyDeriveEcdh1pu(
447
437
return ErrorCode .fromInt (result);
448
438
}
449
439
450
- ErrorCode askarKeyDeriveEcdhEs (
451
- String alg,
452
- LocalKeyHandle ephemKey,
453
- LocalKeyHandle recipKey,
454
- Pointer <NativeByteBuffer > algId,
455
- Pointer <NativeByteBuffer > apu,
456
- Pointer <NativeByteBuffer > apv,
457
- int receive,
458
- Pointer <NativeLocalKeyHandle > out,
440
+ AskarResult <LocalKeyHandle > askarKeyDeriveEcdhEs (
441
+ KeyAlgorithm algorithm,
442
+ LocalKeyHandle ephemeralKey,
443
+ LocalKeyHandle recipientKey,
444
+ Uint8List algId,
445
+ Uint8List apu,
446
+ Uint8List apv,
447
+ bool receive,
459
448
) {
460
- final algPointer = alg. toNativeUtf8 ();
449
+ Pointer < NativeLocalKeyHandle > outPtr = calloc < NativeLocalKeyHandle > ();
461
450
462
- final result = nativeAskarKeyDeriveEcdhEs (
451
+ final algPointer = algorithm.value.toNativeUtf8 ();
452
+ final algIdByteBufferPtr = bytesListToByteBuffer (algId);
453
+ final apuByteBufferPtr = bytesListToByteBuffer (apu);
454
+ final apvByteBufferPtr = bytesListToByteBuffer (apv);
455
+
456
+ final funcResult = nativeAskarKeyDeriveEcdhEs (
463
457
algPointer,
464
- ephemKey ,
465
- recipKey ,
466
- algId ,
467
- apu ,
468
- apv ,
469
- receive,
470
- out ,
458
+ ephemeralKey ,
459
+ recipientKey ,
460
+ algIdByteBufferPtr.ref ,
461
+ apuByteBufferPtr.ref ,
462
+ apvByteBufferPtr.ref ,
463
+ boolToInt ( receive) ,
464
+ outPtr ,
471
465
);
472
466
467
+ final errorCode = ErrorCode .fromInt (funcResult);
468
+
469
+ LocalKeyHandle value = (errorCode == ErrorCode .success ? outPtr.value : 0 );
470
+
471
+ calloc.free (algIdByteBufferPtr.ref.data);
472
+ calloc.free (algIdByteBufferPtr);
473
+ calloc.free (apuByteBufferPtr.ref.data);
474
+ calloc.free (apuByteBufferPtr);
475
+ calloc.free (apvByteBufferPtr.ref.data);
476
+ calloc.free (apvByteBufferPtr);
473
477
calloc.free (algPointer);
478
+ calloc.free (outPtr);
474
479
475
- return ErrorCode . fromInt (result );
480
+ return AskarResult < LocalKeyHandle >(errorCode, value );
476
481
}
477
482
478
483
AskarResult <int > askarKeyEntryListCount (KeyEntryListHandle handle) {
@@ -574,10 +579,21 @@ void askarKeyFree(LocalKeyHandle handle) {
574
579
nativeAskarKeyFree (handle);
575
580
}
576
581
577
- ErrorCode askarKeyFromJwk (
578
- Pointer <NativeByteBuffer > jwk, Pointer <NativeLocalKeyHandle > out) {
579
- final result = nativeAskarKeyFromJwk (jwk, out);
580
- return ErrorCode .fromInt (result);
582
+ AskarResult <LocalKeyHandle > askarKeyFromJwk (String jwk) {
583
+ Pointer <NativeLocalKeyHandle > outPtr = calloc <NativeLocalKeyHandle >();
584
+
585
+ final jwkByteBufferPtr = stringToByteBuffer (jwk);
586
+
587
+ final errorCode =
588
+ ErrorCode .fromInt (nativeAskarKeyFromJwk (jwkByteBufferPtr.ref, outPtr));
589
+
590
+ final value = (errorCode == ErrorCode .success ? outPtr.value : 0 );
591
+
592
+ calloc.free (outPtr);
593
+ calloc.free (jwkByteBufferPtr.ref.data);
594
+ calloc.free (jwkByteBufferPtr);
595
+
596
+ return AskarResult <LocalKeyHandle >(errorCode, value);
581
597
}
582
598
583
599
ErrorCode askarKeyFromKeyExchange (
@@ -709,22 +725,29 @@ ErrorCode askarKeyGetEphemeral(LocalKeyHandle handle, Pointer<Int8> out) {
709
725
return ErrorCode .fromInt (result);
710
726
}
711
727
712
- ErrorCode askarKeyGetJwkPublic (
728
+ AskarResult < String > askarKeyGetJwkPublic (
713
729
LocalKeyHandle handle,
714
- String alg,
715
- Pointer <Pointer <Utf8 >> out,
730
+ KeyAlgorithm algorithm,
716
731
) {
717
- final algPointer = alg.toNativeUtf8 ();
732
+ Pointer <Pointer <Utf8 >> out = calloc <Pointer <Utf8 >>();
733
+
734
+ final algPtr = algorithm.value.toNativeUtf8 ();
718
735
719
- final result = nativeAskarKeyGetJwkPublic (
736
+ final funcResult = nativeAskarKeyGetJwkPublic (
720
737
handle,
721
- algPointer ,
738
+ algPtr ,
722
739
out,
723
740
);
724
741
725
- calloc. free (algPointer );
742
+ final errorCode = ErrorCode . fromInt (funcResult );
726
743
727
- return ErrorCode .fromInt (result);
744
+ final String value = (errorCode == ErrorCode .success) ? out.value.toDartString () : "" ;
745
+
746
+ calloc.free (algPtr);
747
+ calloc.free (out.value);
748
+ calloc.free (out);
749
+
750
+ return AskarResult <String >(errorCode, value);
728
751
}
729
752
730
753
ErrorCode askarKeyGetJwkSecret (
@@ -827,28 +850,43 @@ AskarResult<Uint8List> askarKeySignMessage(
827
850
return AskarResult <Uint8List >(errorCode, value);
828
851
}
829
852
830
- ErrorCode askarKeyUnwrapKey (
853
+ AskarResult < LocalKeyHandle > askarKeyUnwrapKey (
831
854
LocalKeyHandle handle,
832
- String alg,
833
- Pointer <NativeByteBuffer > ciphertext,
834
- Pointer <NativeByteBuffer > nonce,
835
- Pointer <NativeByteBuffer > tag,
836
- Pointer <NativeLocalKeyHandle > out,
855
+ KeyAlgorithm algorithm,
856
+ Uint8List ciphertext,
857
+ Uint8List nonce,
858
+ Uint8List tag,
837
859
) {
838
- final algPointer = alg.toNativeUtf8 ();
860
+ Pointer <NativeLocalKeyHandle > out = calloc <NativeLocalKeyHandle >();
861
+
862
+ final algPtr = algorithm.value.toNativeUtf8 ();
863
+ final cipherByteBufferPtr = bytesListToByteBuffer (ciphertext);
864
+ final nonceByteBufferPtr = bytesListToByteBuffer (nonce);
865
+ final tagByteBufferPtr = bytesListToByteBuffer (tag);
839
866
840
- final result = nativeAskarKeyUnwrapKey (
867
+ final funcResult = nativeAskarKeyUnwrapKey (
841
868
handle,
842
- algPointer ,
843
- ciphertext ,
844
- nonce ,
845
- tag ,
869
+ algPtr ,
870
+ cipherByteBufferPtr.ref ,
871
+ nonceByteBufferPtr.ref ,
872
+ tagByteBufferPtr.ref ,
846
873
out,
847
874
);
848
875
849
- calloc. free (algPointer );
876
+ final errorCode = ErrorCode . fromInt (funcResult );
850
877
851
- return ErrorCode .fromInt (result);
878
+ final value = (errorCode == ErrorCode .success ? out.value : 0 );
879
+
880
+ calloc.free (cipherByteBufferPtr.ref.data);
881
+ calloc.free (cipherByteBufferPtr);
882
+ calloc.free (nonceByteBufferPtr.ref.data);
883
+ calloc.free (nonceByteBufferPtr);
884
+ calloc.free (tagByteBufferPtr.ref.data);
885
+ calloc.free (tagByteBufferPtr);
886
+ calloc.free (algPtr);
887
+ calloc.free (out);
888
+
889
+ return AskarResult <LocalKeyHandle >(errorCode, value);
852
890
}
853
891
854
892
AskarResult <bool > askarKeyVerifySignature (
0 commit comments