我在项目中使用libtomcrypt,特别是使用RSA哈希和签名一些数据。由于内存需求,我想切换到mbedtls。但是,当尝试使用mbedtls验证libtomcrypt生成的签名时,我注意到一个问题。存在填充(PKCS#1 PSS)解码问题。
因为我不知道这些库中的哪个(也许)有一个错误,所以我使用openssl进行了验证。
我用openssl成功地验证了由mbedtls生成的签名,并且在验证一种生成的形式libtomcrypt时出现了验证失败,这使我认为libtomcrypt存在错误。
但是,因为可能是配置问题,所以我创建了一个带有最少示例的存储库,希望有人可以检测到来自我而不是库本身的问题。
测试仓库为here
感谢您提供的任何帮助!
答案 0 :(得分:2)
缺少一个重要部分,您不应对数据进行签名,而应对数据进行哈希处理。
添加此操作可解决此问题:
diff --git a/test-rsa-sign-verify-libtomcrypt-openssl.c b/test-rsa-sign-verify-
libtomcrypt-openssl.c
index 758994a..25e1312 100644
--- a/test-rsa-sign-verify-libtomcrypt-openssl.c
+++ b/test-rsa-sign-verify-libtomcrypt-openssl.c
@@ -9,6 +9,7 @@
#include "openssl/err.h"
#include "openssl/rsa.h"
+#define ERRORe(e) printf("%d: \"%s\"\n", __LINE__, error_to_string(e));
#define ERROR() printf("Error at line : %d\n", __LINE__);
char *data = "This is the data which will be hashed and then signed by RSA";
@@ -57,10 +58,18 @@ int main(void)
printf("* Random number generator registered\n");
size_t data_length = strlen(data);
+
+ uint8_t hash[32];
+ unsigned long hash_length = sizeof(hash);
+ if ((err = hash_memory(hash_idx, data, data_length, hash, &hash_length)) != CRYPT_OK) {
+ ERRORe(err);
+ return -1;
+ }
+
unsigned long signature_length = 256;
unsigned char *signature = calloc(signature_length, sizeof(unsigned char));
- err = rsa_sign_hash((const unsigned char *) data, data_length,
+ err = rsa_sign_hash((const unsigned char *) hash, hash_length,
signature, &signature_length,
NULL, prng_idx, hash_idx, 12,
&private_key);