【问题标题】:sign with libgcrypt, crashes使用 libgcrypt 签名,崩溃
【发布时间】:2015-11-08 22:02:46
【问题描述】:

我正在尝试创建一个由具有主私钥的对等点控制的对等网络,其中一部分是批准对等点进行连接

以下代码假设获取一个公钥,对其进行签名并将其发送给对等点,以便它可以检查其是否有效并在其批准的对等点列表中

gcry_sexp_t signature, keydata;
char *blob = malloc(size + 64);

sprintf(blob, "(data\n (flags pkcs1)\n (hash sha1 #%.*s#))\n", (int)size, buf);
printf("%s\n", blob);
free(buf);

gcry_sexp_sscan(&keydata, &size, blob, strlen(blob));
printf("offset %d\n", (int)size);

size = gcry_sexp_sprint(keydata, GCRYSEXP_FMT_ADVANCED, NULL, 0);
printf("size %d\n", (int)size);

buf = gcry_xmalloc(size);
gcry_sexp_sprint(keydata, GCRYSEXP_FMT_ADVANCED, buf, size);
printf("keydata: %.*s\n", size, buf);
free(buf);

gcry_pk_sign(&signature, keydata, skey);
size = gcry_sexp_sprint(signature, GCRYSEXP_FMT_ADVANCED, NULL, 0);
buf = gcry_xmalloc(size);
gcry_sexp_sprint(signature, GCRYSEXP_FMT_ADVANCED, buf, size);
//add signature buf to msg and send to peer

但它崩溃了。任何想法为什么?

【问题讨论】:

    标签: c libgcrypt


    【解决方案1】:

    printf 参数是错误的。应该是:

    printf("keydata: %.*s\n", size, buf);
    

    【讨论】:

    • 愚蠢的错误,奇怪的是没有编译器警告尽管签名是空的
    • 奇怪。我的编译器(gcc 4.8.4)确实给出了警告:field precision specifier ‘.*’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
    • 哦,你已经改变了问题,使这个答案变得无关紧要(并且会让未来的读者感到困惑)。我对代表点并不大惊小怪,但正确的做法是接受这个答案(或者如果它对原始问题没有帮助,则不接受)并提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2019-03-02
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多