Merge pull request #4 from jgarzik/compressed-keys

eckey: add support for compressed or uncompressed keys
This commit is contained in:
Stephen Pair 2013-07-10 12:50:18 -07:00
commit 3dcf318b19
2 changed files with 36 additions and 0 deletions

View File

@ -108,6 +108,8 @@ void Key::Init(Handle<Object> target)
GetPrivate, SetPrivate);
s_ct->InstanceTemplate()->SetAccessor(String::New("public"),
GetPublic, SetPublic);
s_ct->InstanceTemplate()->SetAccessor(String::New("compressed"),
GetCompressed, SetCompressed);
// Methods
NODE_SET_PROTOTYPE_METHOD(s_ct, "verifySignature", VerifySignature);
@ -126,6 +128,7 @@ void Key::Init(Handle<Object> target)
Key::Key() :
lastError(NULL),
isCompressed(true),
hasPrivate(false),
hasPublic(false)
{
@ -240,6 +243,28 @@ Key::SetPrivate(Local<String> property, Local<Value> value, const AccessorInfo&
key->hasPrivate = true;
}
void
Key::SetCompressed(Local<String> property, Local<Value> value, const AccessorInfo& info)
{
if (!value->IsBoolean()) {
ThrowException(Exception::Error(String::New("compressed must be boolean")));
return;
}
Key* key = node::ObjectWrap::Unwrap<Key>(info.Holder());
key->isCompressed = value->BooleanValue();
}
Handle<Value>
Key::GetCompressed(Local<String> property, const AccessorInfo& info)
{
HandleScope scope;
Key* key = node::ObjectWrap::Unwrap<Key>(info.Holder());
return scope.Close(Boolean::New(key->isCompressed));
}
Handle<Value>
Key::GetPublic(Local<String> property, const AccessorInfo& info)
{
@ -250,6 +275,10 @@ Key::GetPublic(Local<String> property, const AccessorInfo& info)
return scope.Close(Null());
}
// Set compressed/uncompressed (we prefer compressed)
EC_KEY_set_conv_form(key->ec, key->isCompressed ?
POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED);
// Export public
int pub_size = i2o_ECPublicKey(key->ec, NULL);
if (!pub_size) {

View File

@ -16,6 +16,7 @@ private:
const char *lastError;
EC_KEY *ec;
bool isCompressed;
bool hasPrivate;
bool hasPublic;
@ -70,6 +71,12 @@ public:
static void
SetPublic(Local<String> property, Local<Value> value, const AccessorInfo& info);
static Handle<Value>
GetCompressed(Local<String> property, const AccessorInfo& info);
static void
SetCompressed(Local<String> property, Local<Value> value, const AccessorInfo& info);
static Handle<Value>
RegenerateSync(const Arguments& args);