| // See file LICENSE for more information. |
| |
| library impl.key_generator.ec_key_generator; |
| |
| import 'package:pointycastle/api.dart'; |
| import 'package:pointycastle/ecc/api.dart'; |
| import 'package:pointycastle/key_generators/api.dart'; |
| import 'package:pointycastle/src/registry/registry.dart'; |
| |
| /// Abstract [CipherParameters] to init an ECC key generator. |
| class ECKeyGenerator implements KeyGenerator { |
| static final FactoryConfig factoryConfig = |
| StaticFactoryConfig(KeyGenerator, 'EC', () => ECKeyGenerator()); |
| |
| late ECDomainParameters _params; |
| late SecureRandom _random; |
| |
| @override |
| String get algorithmName => 'EC'; |
| |
| @override |
| void init(CipherParameters params) { |
| ECKeyGeneratorParameters ecparams; |
| |
| if (params is ParametersWithRandom) { |
| _random = params.random; |
| ecparams = params.parameters as ECKeyGeneratorParameters; |
| } else { |
| _random = SecureRandom(); |
| ecparams = params as ECKeyGeneratorParameters; |
| } |
| |
| _params = ecparams.domainParameters; |
| } |
| |
| @override |
| AsymmetricKeyPair generateKeyPair() { |
| var n = _params.n; |
| var nBitLength = n.bitLength; |
| BigInt? d; |
| |
| do { |
| d = _random.nextBigInteger(nBitLength); |
| } while (d == BigInt.zero || (d >= n)); |
| |
| var Q = _params.G * d; |
| |
| return AsymmetricKeyPair(ECPublicKey(Q, _params), ECPrivateKey(d, _params)); |
| } |
| } |