Check out the Dart Basic Utils package. I have done this by using Pointycastle and the ASN1 package.
Update pubspec.yaml and add the following line to your dependencies.
dependencies:
basic_utils: ^2.5.6
Repository : https://github.com/Ephenodrom/Dart-Basic-Utils
Pub.dev : https://pub.dev/packages/basic_utils
String encodeEcPublicKeyToPem(ECPublicKey publicKey);
String encodeEcPrivateKeyToPem(ECPrivateKey ecPrivateKey);
Here is the full code if you don't want to use a package:
static String encodeEcPublicKeyToPem(ECPublicKey publicKey) {
ASN1ObjectIdentifier.registerFrequentNames();
var outer = ASN1Sequence();
var algorithm = ASN1Sequence();
algorithm.add(ASN1ObjectIdentifier.fromName('ecPublicKey'));
algorithm.add(ASN1ObjectIdentifier.fromName('prime256v1'));
var subjectPublicKey = ASN1BitString(publicKey.Q.getEncoded(false));
outer.add(algorithm);
outer.add(subjectPublicKey);
var dataBase64 = base64.encode(outer.encodedBytes);
var chunks = StringUtils.chunk(dataBase64, 64);
return '$BEGIN_EC_PUBLIC_KEY\n${chunks.join('\n')}\n$END_EC_PUBLIC_KEY';
}
static String encodeEcPrivateKeyToPem(ECPrivateKey ecPrivateKey) {
ASN1ObjectIdentifier.registerFrequentNames();
var outer = ASN1Sequence();
var version = ASN1Integer(BigInt.from(1));
var privateKeyAsBytes = _bigIntToBytes(ecPrivateKey.d);
var privateKey = ASN1OctetString(privateKeyAsBytes);
var choice = ASN1Sequence(tag: 0xA0);
choice
.add(ASN1ObjectIdentifier.fromName(ecPrivateKey.parameters.domainName));
var publicKey = ASN1Sequence(tag: 0xA1);
var subjectPublicKey =
ASN1BitString(ecPrivateKey.parameters.G.getEncoded(false));
publicKey.add(subjectPublicKey);
outer.add(version);
outer.add(privateKey);
outer.add(choice);
outer.add(publicKey);
var dataBase64 = base64.encode(outer.encodedBytes);
var chunks = StringUtils.chunk(dataBase64, 64);
return '$BEGIN_EC_PRIVATE_KEY\n${chunks.join('\n')}\n$END_EC_PRIVATE_KEY';
}