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; }