From eecdb4fe3c69a465369b8ba0fb9fab36d093f724 Mon Sep 17 00:00:00 2001 From: Krille Date: Wed, 21 Jun 2023 09:11:40 +0200 Subject: [PATCH] feat: Add optional ECDomainParameters to ec key from bytes method This makes it possible to create ec keys with special curves like brainpoolP256r1 --- lib/src/CryptoUtils.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/src/CryptoUtils.dart b/lib/src/CryptoUtils.dart index 576fb34..7e68ed7 100644 --- a/lib/src/CryptoUtils.dart +++ b/lib/src/CryptoUtils.dart @@ -680,7 +680,7 @@ class CryptoUtils { /// Supports SEC1 () and PKCS8 () /// static ECPrivateKey ecPrivateKeyFromDerBytes(Uint8List bytes, - {bool pkcs8 = false}) { + {bool pkcs8 = false, ECDomainParameters? parameters}) { var asn1Parser = ASN1Parser(bytes); var topLevelSeq = asn1Parser.nextObject() as ASN1Sequence; var curveName; @@ -722,13 +722,17 @@ class CryptoUtils { x = privateKeyAsOctetString.valueBytes!; } - return ECPrivateKey(osp2i(x), ECDomainParameters(curveName)); + return ECPrivateKey( + osp2i(x), + parameters ?? ECDomainParameters(curveName), + ); } /// /// Decode the given [bytes] into an [ECPublicKey]. /// - static ECPublicKey ecPublicKeyFromDerBytes(Uint8List bytes) { + static ECPublicKey ecPublicKeyFromDerBytes(Uint8List bytes, + {ECDomainParameters? parameters}) { if (bytes.elementAt(0) == 0) { bytes = bytes.sublist(1); } @@ -759,7 +763,7 @@ class CryptoUtils { } var x = pubBytes.sublist(1, (pubBytes.length / 2).round()); var y = pubBytes.sublist(1 + x.length, pubBytes.length); - var params = ECDomainParameters(curveName); + var params = parameters ?? ECDomainParameters(curveName); var bigX = decodeBigIntWithSign(1, x); var bigY = decodeBigIntWithSign(1, y); var pubKey = ECPublicKey(