Skip to content
This repository has been archived by the owner on Dec 23, 2020. It is now read-only.

enhance the functions of ECPublicKey and ECPrivateKey, and add ECDH f… #192

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions lib/ecc/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ library pointycastle.api.ecc;
import "dart:typed_data";

import "package:pointycastle/api.dart";
import "package:pointycastle/key_generators/api.dart";
import "package:pointycastle/src/registry/registry.dart";

/// Standard ECC curve description
Expand Down Expand Up @@ -130,6 +131,27 @@ class ECPrivateKey extends ECAsymmetricKey implements PrivateKey {
return (other.parameters == this.parameters) && (other.d == this.d);
}

/// Restore privatekey from stored hex string
static ECPrivateKey fromStored(String storedPriKey, ECDomainParameters domainParams){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you rename this fromHex instead? Someone could store a private key in base64 as well, f.e..

ECDomainParameters _params = domainParams;
BigInt theD = BigInt.parse(storedPriKey, radix: 16);
return new ECPrivateKey(theD, _params);
}

/// return Hex string of d, can easily store or transfer on internet
String hexString() => this.d.toRadixString(16);

/// Generate publickey from private key
ECPublicKey generatePubkey(){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rename to just ECPublicKey get publicKey {.

var Q = this.parameters.G * this.d;
return new ECPublicKey(Q, this.parameters);
}

Uint8List generateSecret(ECPublicKey pubkey) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait is this Shamir's secret sharing? I would certainly not name this generateSecret. I'm not sure if this method should be on PrivateKey, but if it's here, please explicitly mention that it's for secret sharing. F.e.

/// Create a shared secret using Shamir's secret sharing scheme.
Uint8List getSharedSecret(ECPublicKey other) {

var secret = pubkey.Q * this.d;
return secret.getEncoded();
}

int get hashCode {
return parameters.hashCode + d.hashCode;
}
Expand All @@ -149,6 +171,17 @@ class ECPublicKey extends ECAsymmetricKey implements PublicKey {
return (other.parameters == this.parameters) && (other.Q == this.Q);
}

/// return Uint8List so can easily stored or transfer on internet
Uint8List getEncoded(){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

toBytes()? Perhaps also add hexString() that encodes as hex. And perhaps also a toBytes on PrivateKey as well?

return this.Q.getEncoded();
}

/// restore public key from Uint8List from stored string or internet
static ECPublicKey fromStored(Uint8List theQ, ECDomainParameters domainParams){
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fromBytes?

Why do you do bytes for public key and hex string for private key? Quite inconsistent.. I'd either just have bytes on both or hex on both or both on both.

ECPoint Q = domainParams.curve.decodePoint(theQ);
return new ECPublicKey(Q, domainParams);
}

int get hashCode {
return parameters.hashCode + Q.hashCode;
}
Expand Down