summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorKarel Miko <karel.miko@gmail.com>2016-10-19 12:18:25 +0200
committerKarel Miko <karel.miko@gmail.com>2016-10-19 12:18:25 +0200
commitd22a1d9006f84e926feaa52ea31badfbab2e38d7 (patch)
treecd1252d32ca583e84c9b69e1b009633fc55cff10 /inc
parent35133440b4c042e1ad073066d92ce6b96e00a4b7 (diff)
RSA: sign/verify functions now support "none" padding (INSECURE!)
Diffstat (limited to 'inc')
-rw-r--r--inc/CryptX_PK_RSA.xs.inc39
1 files changed, 32 insertions, 7 deletions
diff --git a/inc/CryptX_PK_RSA.xs.inc b/inc/CryptX_PK_RSA.xs.inc
index ea729026..56beb546 100644
--- a/inc/CryptX_PK_RSA.xs.inc
+++ b/inc/CryptX_PK_RSA.xs.inc
@@ -321,7 +321,7 @@ _decrypt(Crypt::PK::RSA self, SV * data, char * padding, char * oaep_hash, SV *
RETVAL
SV *
-_sign(Crypt::PK::RSA self, SV * data, char * padding, char * hash_name, unsigned long saltlen=12)
+_sign(Crypt::PK::RSA self, SV * data, char * padding, char * hash_name=NULL, unsigned long saltlen=12)
CODE:
{
int rv, hash_id;
@@ -333,9 +333,9 @@ _sign(Crypt::PK::RSA self, SV * data, char * padding, char * hash_name, unsigned
data_ptr = (unsigned char *)SvPVbyte(data, data_len);
RETVAL = newSVpvn(NULL, 0); /* undef */
- hash_id = find_hash(hash_name);
- if(hash_id==-1) croak("FATAL: find_hash failed for '%s'", hash_name);
if (strnEQ(padding, "pss", 3)) {
+ hash_id = find_hash(hash_name);
+ if(hash_id==-1) croak("FATAL: find_hash failed for '%s'", hash_name);
rv = rsa_sign_hash_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, LTC_PKCS_1_PSS,
&self->yarrow_prng_state, self->yarrow_prng_index,
hash_id, saltlen, &self->key);
@@ -343,12 +343,20 @@ _sign(Crypt::PK::RSA self, SV * data, char * padding, char * hash_name, unsigned
RETVAL = newSVpvn((char*)buffer, buffer_len);
}
else if (strnEQ(padding, "v1.5", 4)) {
+ hash_id = find_hash(hash_name);
+ if(hash_id==-1) croak("FATAL: find_hash failed for '%s'", hash_name);
rv = rsa_sign_hash_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, LTC_PKCS_1_V1_5,
&self->yarrow_prng_state, self->yarrow_prng_index,
hash_id, 0, &self->key);
if (rv != CRYPT_OK) croak("FATAL: rsa_sign_hash_ex failed: %s", error_to_string(rv));
RETVAL = newSVpvn((char*)buffer, buffer_len);
}
+ else if (strnEQ(padding, "none", 4)) {
+ /* raw RSA */
+ rv = ltc_mp.rsa_me(data_ptr, (unsigned long)data_len, buffer, &buffer_len, PK_PRIVATE, &self->key);
+ if (rv != CRYPT_OK) croak("FATAL: rsa_me failed: %s", error_to_string(rv));
+ RETVAL = newSVpvn((char*)buffer, buffer_len);
+ }
else {
croak("FATAL: rsa_sign invalid padding '%s'", padding);
}
@@ -357,31 +365,48 @@ _sign(Crypt::PK::RSA self, SV * data, char * padding, char * hash_name, unsigned
RETVAL
int
-_verify(Crypt::PK::RSA self, SV * sig, SV * data, char * padding, char * hash_name, unsigned long saltlen=12)
+_verify(Crypt::PK::RSA self, SV * sig, SV * data, char * padding, char * hash_name=NULL, unsigned long saltlen=12)
CODE:
{
- int rv, hash_id, stat;
+ int rv, hash_id, stat, i;
unsigned char *data_ptr=NULL;
STRLEN data_len=0;
unsigned char *sig_ptr=NULL;
STRLEN sig_len=0;
+ unsigned char buffer[1024];
+ unsigned long buffer_len = 1024;
data_ptr = (unsigned char *)SvPVbyte(data, data_len);
sig_ptr = (unsigned char *)SvPVbyte(sig, sig_len);
RETVAL = 1;
- hash_id = find_hash(hash_name);
- if(hash_id==-1) croak("FATAL: find_hash failed for '%s'", hash_name);
if (strnEQ(padding, "pss", 3)) {
+ hash_id = find_hash(hash_name);
+ if(hash_id==-1) croak("FATAL: find_hash failed for '%s'", hash_name);
rv = rsa_verify_hash_ex(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, LTC_PKCS_1_PSS,
hash_id, saltlen, &stat, &self->key);
if (rv != CRYPT_OK || stat != 1) RETVAL = 0;
}
else if (strnEQ(padding, "v1.5", 4)) {
+ hash_id = find_hash(hash_name);
+ if(hash_id==-1) croak("FATAL: find_hash failed for '%s'", hash_name);
rv = rsa_verify_hash_ex(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, LTC_PKCS_1_V1_5,
hash_id, 0, &stat, &self->key);
if (rv != CRYPT_OK || stat != 1) RETVAL = 0;
}
+ else if (strnEQ(padding, "none", 4)) {
+ /* raw RSA */
+ Zero(buffer, buffer_len, unsigned char);
+ rv = ltc_mp.rsa_me(sig_ptr, (unsigned long)sig_len, buffer, &buffer_len, PK_PUBLIC, &self->key);
+ if (rv != CRYPT_OK) croak("FATAL: rsa_me failed: %s", error_to_string(rv));
+ if (data_len <= buffer_len && buffer_len > 0 && data_len > 0) {
+ for (i = 0; i < buffer_len - data_len; i++) if (buffer[i] != 0) RETVAL = 0;
+ if (memNE(data_ptr, buffer + buffer_len - data_len, data_len)) RETVAL = 0;
+ }
+ else {
+ RETVAL = 0;
+ }
+ }
else {
croak("FATAL: rsa_verify invalid padding '%s'", padding);
}