crypto: deduplicate encoding parsing logic

This commit is contained in:
Ben Noordhuis 2011-12-14 02:56:23 +01:00
parent 321ec97d95
commit ef12fa1bf7

View File

@ -2107,20 +2107,16 @@ class Cipher : public ObjectWrap {
Local<Value> outString;
if (out_len==0) {
outString=String::New("");
} else {
if (args.Length() <= 2 || !args[2]->IsString()) {
// Binary
outString = Encode(out, out_len, BINARY);
} else {
char* out_hexdigest;
int out_hex_len;
String::Utf8Value encoding(args[2]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[2], BINARY);
if (enc == HEX) {
// Hex encoding
HexEncode(out, out_len, &out_hexdigest, &out_hex_len);
outString = Encode(out_hexdigest, out_hex_len, BINARY);
delete [] out_hexdigest;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
// Base64 encoding
// Check to see if we need to add in previous base64 overhang
if (cipher->incomplete_base64!=NULL){
@ -2150,14 +2146,13 @@ class Cipher : public ObjectWrap {
base64(out, out_len, &out_hexdigest, &out_hex_len);
outString = Encode(out_hexdigest, out_hex_len, BINARY);
delete [] out_hexdigest;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
outString = Encode(out, out_len, BINARY);
} else {
fprintf(stderr, "node-crypto : Cipher .update encoding "
"can be binary, hex or base64\n");
}
}
}
if (out) delete [] out;
@ -2181,17 +2176,13 @@ class Cipher : public ObjectWrap {
return scope.Close(String::New(""));
}
if (args.Length() == 0 || !args[0]->IsString()) {
// Binary
outString = Encode(out_value, out_len, BINARY);
} else {
String::Utf8Value encoding(args[0]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[0], BINARY);
if (enc == HEX) {
// Hex encoding
HexEncode(out_value, out_len, &out_hexdigest, &out_hex_len);
outString = Encode(out_hexdigest, out_hex_len, BINARY);
delete [] out_hexdigest;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
// Check to see if we need to add in previous base64 overhang
if (cipher->incomplete_base64!=NULL){
unsigned char* complete_base64 = new unsigned char[out_len+cipher->incomplete_base64_len+1];
@ -2208,13 +2199,13 @@ class Cipher : public ObjectWrap {
base64(out_value, out_len, &out_hexdigest, &out_hex_len);
outString = Encode(out_hexdigest, out_hex_len, BINARY);
delete [] out_hexdigest;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
outString = Encode(out_value, out_len, BINARY);
} else {
fprintf(stderr, "node-crypto : Cipher .final encoding "
"can be binary, hex or base64\n");
}
}
delete [] out_value;
return scope.Close(outString);
}
@ -2493,11 +2484,8 @@ class Decipher : public ObjectWrap {
char* ciphertext;
int ciphertext_len;
if (args.Length() <= 1 || !args[1]->IsString()) {
// Binary - do nothing
} else {
String::Utf8Value encoding(args[1]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[1], BINARY);
if (enc == HEX) {
// Hex encoding
// Do we have a previous hex carry over?
if (cipher->incomplete_hex_flag) {
@ -2527,7 +2515,7 @@ class Decipher : public ObjectWrap {
len = ciphertext_len;
alloc_buf = true;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
unbase64((unsigned char*)buf, len, (char **)&ciphertext, &ciphertext_len);
if (alloc_buf) {
delete [] buf;
@ -2536,14 +2524,13 @@ class Decipher : public ObjectWrap {
len = ciphertext_len;
alloc_buf = true;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
// Binary - do nothing
} else {
fprintf(stderr, "node-crypto : Decipher .update encoding "
"can be binary, hex or base64\n");
}
}
unsigned char *out=0;
int out_len=0;
@ -2558,10 +2545,8 @@ class Decipher : public ObjectWrap {
Local<Value> outString;
if (out_len==0) {
outString=String::New("");
} else if (args.Length() <= 2 || !args[2]->IsString()) {
outString = Encode(out, out_len, BINARY);
} else {
enum encoding enc = ParseEncoding(args[2]);
enum encoding enc = ParseEncoding(args[2], BINARY);
if (enc == UTF8) {
// See if we have any overhang from last utf8 partial ending
if (cipher->incomplete_utf8!=NULL) {
@ -2819,27 +2804,22 @@ class Hmac : public ObjectWrap {
return scope.Close(String::New(""));
}
if (args.Length() == 0 || !args[0]->IsString()) {
// Binary
outString = Encode(md_value, md_len, BINARY);
} else {
String::Utf8Value encoding(args[0]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[0], BINARY);
if (enc == HEX) {
// Hex encoding
HexEncode(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
base64(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
outString = Encode(md_value, md_len, BINARY);
} else {
fprintf(stderr, "node-crypto : Hmac .digest encoding "
"can be binary, hex or base64\n");
}
}
delete [] md_value;
return scope.Close(outString);
}
@ -2975,31 +2955,26 @@ class Hash : public ObjectWrap {
Local<Value> outString;
if (args.Length() == 0 || !args[0]->IsString()) {
// Binary
outString = Encode(md_value, md_len, BINARY);
} else {
String::Utf8Value encoding(args[0]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[0], BINARY);
if (enc == HEX) {
// Hex encoding
char* md_hexdigest;
int md_hex_len;
HexEncode(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
char* md_hexdigest;
int md_hex_len;
base64(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
outString = Encode(md_value, md_len, BINARY);
} else {
fprintf(stderr, "node-crypto : Hash .digest encoding "
"can be binary, hex or base64\n");
}
}
return scope.Close(outString);
}
@ -3186,28 +3161,23 @@ class Sign : public ObjectWrap {
return scope.Close(String::New(""));
}
if (args.Length() == 1 || !args[1]->IsString()) {
// Binary
outString = Encode(md_value, md_len, BINARY);
} else {
String::Utf8Value encoding(args[1]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[1], BINARY);
if (enc == HEX) {
// Hex encoding
HexEncode(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
base64(md_value, md_len, &md_hexdigest, &md_hex_len);
outString = Encode(md_hexdigest, md_hex_len, BINARY);
delete [] md_hexdigest;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
outString = Encode(md_value, md_len, BINARY);
} else {
outString = String::New("");
fprintf(stderr, "node-crypto : Sign .sign encoding "
"can be binary, hex or base64\n");
}
}
delete [] md_value;
return scope.Close(outString);
@ -3442,28 +3412,23 @@ class Verify : public ObjectWrap {
int r=-1;
if (args.Length() == 2 || !args[2]->IsString()) {
// Binary
r = verify->VerifyFinal(kbuf, klen, hbuf, hlen);
} else {
String::Utf8Value encoding(args[2]->ToString());
if (strcasecmp(*encoding, "hex") == 0) {
enum encoding enc = ParseEncoding(args[2], BINARY);
if (enc == HEX) {
// Hex encoding
HexDecode(hbuf, hlen, (char **)&dbuf, &dlen);
r = verify->VerifyFinal(kbuf, klen, dbuf, dlen);
delete [] dbuf;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
// Base64 encoding
unbase64(hbuf, hlen, (char **)&dbuf, &dlen);
r = verify->VerifyFinal(kbuf, klen, dbuf, dlen);
delete [] dbuf;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
r = verify->VerifyFinal(kbuf, klen, hbuf, hlen);
} else {
fprintf(stderr, "node-crypto : Verify .verify encoding "
"can be binary, hex or base64\n");
}
}
delete [] kbuf;
delete [] hbuf;
@ -3938,23 +3903,23 @@ class DiffieHellman : public ObjectWrap {
return len;
}
static int DecodeWithEncoding(Handle<Value> str, Handle<Value> enc,
static int DecodeWithEncoding(Handle<Value> str, Handle<Value> encoding_v,
char** buf) {
int len = DecodeBinary(str, buf);
if (len == -1) {
return len;
}
String::Utf8Value encoding(enc->ToString());
enum encoding enc = ParseEncoding(encoding_v, (enum encoding) -1);
char* retbuf = 0;
int retlen;
if (strcasecmp(*encoding, "hex") == 0) {
if (enc == HEX) {
HexDecode((unsigned char*)*buf, len, &retbuf, &retlen);
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
unbase64((unsigned char*)*buf, len, &retbuf, &retlen);
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
// Binary - do nothing
} else {
fprintf(stderr, "node-crypto : Diffie-Hellman parameter encoding "
@ -3970,24 +3935,25 @@ class DiffieHellman : public ObjectWrap {
return len;
}
static Local<Value> EncodeWithEncoding(Handle<Value> enc, char* buf,
static Local<Value> EncodeWithEncoding(Handle<Value> encoding_v, char* buf,
int len) {
HandleScope scope;
Local<Value> outString;
String::Utf8Value encoding(enc->ToString());
enum encoding enc = ParseEncoding(encoding_v, (enum encoding) -1);
char* retbuf;
int retlen;
if (strcasecmp(*encoding, "hex") == 0) {
if (enc == HEX) {
// Hex encoding
HexEncode(reinterpret_cast<unsigned char*>(buf), len, &retbuf, &retlen);
outString = Encode(retbuf, retlen, BINARY);
delete [] retbuf;
} else if (strcasecmp(*encoding, "base64") == 0) {
} else if (enc == BASE64) {
base64(reinterpret_cast<unsigned char*>(buf), len, &retbuf, &retlen);
outString = Encode(retbuf, retlen, BINARY);
delete [] retbuf;
} else if (strcasecmp(*encoding, "binary") == 0) {
} else if (enc == BINARY) {
outString = Encode(buf, len, BINARY);
} else {
fprintf(stderr, "node-crypto : Diffie-Hellman parameter encoding "