37 lines
1.1 KiB
Dart
37 lines
1.1 KiB
Dart
import 'dart:math';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/export.dart';
|
|
import 'package:pointycastle/src/impl/base_key_derivator.dart';
|
|
import 'package:pointycastle/src/utils.dart';
|
|
|
|
import '../src/registry/registry.dart';
|
|
|
|
class ECDHKeyDerivator extends BaseKeyDerivator {
|
|
late ECDHKDFParameters parameters;
|
|
static final FactoryConfig factoryConfig =
|
|
StaticFactoryConfig(KeyDerivator, 'ECDH', () => ECDHKeyDerivator());
|
|
|
|
@override
|
|
String get algorithmName => '/ECDH';
|
|
|
|
@override
|
|
int deriveKey(Uint8List inp, int inpOff, Uint8List out, int outOff) {
|
|
var ecdh = ECDHBasicAgreement()..init(parameters.privateKey);
|
|
var ag = ecdh.calculateAgreement(parameters.publicKey);
|
|
var key = encodeBigIntAsUnsigned(ag);
|
|
// pad to keysize
|
|
var padlength = max((keySize / 8).ceil() - key.length, 0);
|
|
out.setAll(outOff, Uint8List.fromList(List.filled(padlength, 0)));
|
|
out.setAll(outOff + padlength, key);
|
|
return padlength + key.length;
|
|
}
|
|
|
|
@override
|
|
void init(covariant ECDHKDFParameters params) {
|
|
parameters = params;
|
|
}
|
|
|
|
@override
|
|
int get keySize => parameters.privateKey.parameters!.curve.fieldSize;
|
|
}
|