KadNode icon indicating copy to clipboard operation
KadNode copied to clipboard

can't build with mbedtls 3.x

Open evilsocket opened this issue 1 year ago • 8 comments

Hi, apologies if this is documented somewhere, I tried to look for macOS installation instructions with no luck.

I downloaded the v2.3.0 version of the code and tried to use the macos/build.sh, however I got this message:

cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/main.o src/main.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/searches.o src/searches.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/kad.o src/kad.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/log.o src/log.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/conf.o src/conf.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/net.o src/net.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/utils.o src/utils.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/announces.o src/announces.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/peerfile.o src/peerfile.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/unix.o src/unix.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/ext-lpd.o src/ext-lpd.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/ext-bob.o src/ext-bob.c
src/ext-bob.c:9:10: fatal error: 'mbedtls/platform.h' file not found
#include "mbedtls/platform.h"

However I did install mbedtls with brew, in fact all I needed to do in order to fix this specific error was:

sudo ln -s /opt/homebrew/include /usr/local/include

Suggesting that the script doesn't take into account brew installed dependencies (or that my brew env is somehow very broken, but i don't think, it's relatively clean and new).

Now I'm getting another compilation error related to mbedtls:

cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/main.o src/main.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/searches.o src/searches.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/kad.o src/kad.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/log.o src/log.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/conf.o src/conf.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/net.o src/net.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/utils.o src/utils.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/announces.o src/announces.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/peerfile.o src/peerfile.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/unix.o src/unix.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/ext-lpd.o src/ext-lpd.c
cc -Os -Wall -Wwrite-strings -pedantic -std=gnu99 -I/usr/local/include  -DLPD -DBOB -DDNS -DTLS -c -o build/ext-bob.o src/ext-bob.c
src/ext-bob.c:116:13: error: no member named 'p' in 'struct mbedtls_mpi'
        if (grp->A.p == NULL) {
            ~~~~~~ ^
src/ext-bob.c:210:65: error: no member named 'Q' in 'struct mbedtls_ecp_keypair'
        mbedtls_mpi_write_binary(&mbedtls_pk_ec(resource->ctx_verify)->Q.X, buf + 3, ECPARAMS_SIZE);
                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ^
src/ext-bob.c:259:10: error: no member named 'grp' in 'struct mbedtls_ecp_keypair'
                                &kp->grp, compressed, sizeof(compressed),
                                 ~~  ^
src/ext-bob.c:268:10: error: no member named 'grp' in 'struct mbedtls_ecp_keypair'
                                &kp->grp, &kp->Q,
                                 ~~  ^
src/ext-bob.c:268:20: error: no member named 'Q' in 'struct mbedtls_ecp_keypair'
                                &kp->grp, &kp->Q,
                                           ~~  ^
src/ext-bob.c:325:49: error: no member named 'Q' in 'struct mbedtls_ecp_keypair'
        mbedtls_mpi_write_binary(&mbedtls_pk_ec(*ctx)->Q.X, buf, sizeof(buf));
                                  ~~~~~~~~~~~~~~~~~~~  ^
src/ext-bob.c:366:52: error: no member named 'Q' in 'struct mbedtls_ecp_keypair'
        } while (mbedtls_mpi_get_bit(&mbedtls_pk_ec(ctx)->Q.Y, 0) != 0);
                                      ~~~~~~~~~~~~~~~~~~  ^
src/ext-bob.c:387:54: error: too few arguments to function call, expected 5, have 3
        if ((ret = mbedtls_pk_parse_keyfile(&ctx, path, NULL)) != 0) {
                   ~~~~~~~~~~~~~~~~~~~~~~~~                 ^
/usr/local/include/mbedtls/pk.h:847:5: note: 'mbedtls_pk_parse_keyfile' declared here
int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx,
    ^
src/ext-bob.c:394:26: error: no member named 'grp' in 'struct mbedtls_ecp_keypair'
        if (mbedtls_pk_ec(ctx)->grp.id != ECPARAMS) {
            ~~~~~~~~~~~~~~~~~~  ^
src/ext-bob.c:396:59: error: no member named 'grp' in 'struct mbedtls_ecp_keypair'
                        mbedtls_ecp_curve_info_from_grp_id(mbedtls_pk_ec(ctx)->grp.id)->name,
                                                           ~~~~~~~~~~~~~~~~~~  ^
src/log.h:16:22: note: expanded from macro 'log_error'
  log_print(LOG_ERR, __VA_ARGS__);
                     ^~~~~~~~~~~
src/ext-bob.c:477:59: error: no member named 'Q' in 'struct mbedtls_ecp_keypair'
                mbedtls_mpi_write_binary(&mbedtls_pk_ec(key->ctx_sign)->Q.X, epkey, ECPARAMS_SIZE);
                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ^
src/ext-bob.c:507:56: error: too few arguments to function call, expected 9, have 8
                        sig + 3, &slen, mbedtls_ctr_drbg_random, &g_ctr_drbg);
                                                                            ^
/usr/local/include/mbedtls/ecdsa.h:307:5: note: 'mbedtls_ecdsa_write_signature' declared here
int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx,
    ^
src/ext-bob.c:584:64: error: no member named 'grp' in 'struct mbedtls_ecp_keypair'
                mbedtls_ecp_group_load(&mbedtls_pk_ec(resource->ctx_verify)->grp, ECPARAMS);
                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ^

It seems that the source is based on another version of the library, which is not indicated anywhere in the docs unless I've missed something.

macOS v12.6 (Monterey) running on M1 XCode tools installed brew installed mbedtls v3.2.1 installed via brew

How do I build this thing on macOS? :)

Thanks

evilsocket avatar Nov 12 '22 19:11 evilsocket

I successfully tried mbedtls-2.16.12 and will try with 3.2.1 later today.

mwarning avatar Nov 13 '22 09:11 mwarning

mbedtls 3.0.0 made some fields private. We need to find a workaround.

mwarning avatar Nov 13 '22 12:11 mwarning

I've managed to build it by downgrading to 2.28.1 ( brew install mbedtls@2 ) and creating the following symlinks:

sudo ln -s /opt/homebrew/opt/mbedtls@2/include/mbedtls /usr/local/include/
sudo ln -s /opt/homebrew/opt/mbedtls@2/lib/*.* /usr/local/lib/

evilsocket avatar Nov 13 '22 17:11 evilsocket

homebrew is kind of special. I think brew link mbedtls would do the linking for you.

mwarning avatar Nov 13 '22 17:11 mwarning

FYI, this will help: https://github.com/Mbed-TLS/mbedtls/pull/6282

mwarning avatar Dec 16 '22 16:12 mwarning

src/ext-bob.c: In function 'mbedtls_ecp_decompress':
src/ext-bob.c:116:19: error: 'mbedtls_mpi' has no member named 'p'
  116 |         if (grp->A.p == NULL) {
      |                   ^
src/ext-bob.c: In function 'bob_send_challenge':
src/ext-bob.c:210:70: error: 'mbedtls_ecp_keypair' has no member named 'Q'
  210 |         mbedtls_mpi_write_binary(&mbedtls_pk_ec(resource->ctx_verify)->Q.X, buf + 3, ECPARAMS_SIZE);
      |                                                                      ^~
src/ext-bob.c: In function 'bob_trigger_auth':
src/ext-bob.c:259:36: error: 'mbedtls_ecp_keypair' has no member named 'grp'
  259 |                                 &kp->grp, compressed, sizeof(compressed),
      |                                    ^~
src/ext-bob.c:268:36: error: 'mbedtls_ecp_keypair' has no member named 'grp'
  268 |                                 &kp->grp, &kp->Q,
      |                                    ^~
src/ext-bob.c:268:46: error: 'mbedtls_ecp_keypair' has no member named 'Q'
  268 |                                 &kp->grp, &kp->Q,
      |                                              ^~
src/ext-bob.c: In function 'get_pkey_base32hex':
src/ext-bob.c:325:54: error: 'mbedtls_ecp_keypair' has no member named 'Q'
  325 |         mbedtls_mpi_write_binary(&mbedtls_pk_ec(*ctx)->Q.X, buf, sizeof(buf));
      |                                                      ^~
src/ext-bob.c: In function 'bob_create_key':
src/ext-bob.c:366:57: error: 'mbedtls_ecp_keypair' has no member named 'Q'
  366 |         } while (mbedtls_mpi_get_bit(&mbedtls_pk_ec(ctx)->Q.Y, 0) != 0);
      |                                                         ^~
src/ext-bob.c: In function 'bob_load_key':
src/ext-bob.c:387:20: error: too few arguments to function 'mbedtls_pk_parse_keyfile'
  387 |         if ((ret = mbedtls_pk_parse_keyfile(&ctx, path, NULL)) != 0) {
      |                    ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/mangix/devstuff/openwrt/staging_dir/target-i386_pentium-mmx_musl/usr/include/mbedtls/x509.h:17,
                 from src/ext-bob.c:15:
/home/mangix/devstuff/openwrt/staging_dir/target-i386_pentium-mmx_musl/usr/include/mbedtls/pk.h:1166:5: note: declared here
 1166 | int mbedtls_pk_parse_keyfile(mbedtls_pk_context *ctx,
      |     ^~~~~~~~~~~~~~~~~~~~~~~~
src/ext-bob.c:394:31: error: 'mbedtls_ecp_keypair' has no member named 'grp'
  394 |         if (mbedtls_pk_ec(ctx)->grp.id != ECPARAMS) {
      |                               ^~
In file included from src/ext-bob.c:19:
src/ext-bob.c:396:78: error: 'mbedtls_ecp_keypair' has no member named 'grp'
  396 |                         mbedtls_ecp_curve_info_from_grp_id(mbedtls_pk_ec(ctx)->grp.id)->name,
      |                                                                              ^~
src/log.h:16:22: note: in definition of macro 'log_error'
   16 |   log_print(LOG_ERR, __VA_ARGS__);
      |                      ^~~~~~~~~~~
src/ext-bob.c: In function 'bob_find_key':
src/ext-bob.c:477:71: error: 'mbedtls_ecp_keypair' has no member named 'Q'
  477 |                 mbedtls_mpi_write_binary(&mbedtls_pk_ec(key->ctx_sign)->Q.X, epkey, ECPARAMS_SIZE);
      |                                                                       ^~
src/ext-bob.c: In function 'bob_encrypt_challenge':
src/ext-bob.c:507:34: error: passing argument 6 of 'mbedtls_ecdsa_write_signature' makes integer from pointer without a cast [-Wint-conversion]
  507 |                         sig + 3, &slen, mbedtls_ctr_drbg_random, &g_ctr_drbg);
      |                                  ^~~~~
      |                                  |
      |                                  size_t * {aka unsigned int *}
In file included from src/ext-bob.c:12:
/home/mangix/devstuff/openwrt/staging_dir/target-i386_pentium-mmx_musl/usr/include/mbedtls/ecdsa.h:475:62: note: expected 'size_t' {aka 'unsigned int'} but argument is of type 'size_t *' {aka 'unsigned int *'}
  475 |                                   unsigned char *sig, size_t sig_size, size_t *slen,
      |                                                       ~~~~~~~^~~~~~~~
src/ext-bob.c:507:41: error: passing argument 7 of 'mbedtls_ecdsa_write_signature' from incompatible pointer type [-Wincompatible-pointer-types]
  507 |                         sig + 3, &slen, mbedtls_ctr_drbg_random, &g_ctr_drbg);
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~
      |                                         |
      |                                         int (*)(void *, unsigned char *, size_t) {aka int (*)(void *, unsigned char *, unsigned int)}
/home/mangix/devstuff/openwrt/staging_dir/target-i386_pentium-mmx_musl/usr/include/mbedtls/ecdsa.h:475:80: note: expected 'size_t *' {aka 'unsigned int *'} but argument is of type 'int (*)(void *, unsigned char *, size_t)' {aka 'int (*)(void *, unsigned char *, unsigned int)'}
  475 |                                   unsigned char *sig, size_t sig_size, size_t *slen,
      |                                                                        ~~~~~~~~^~~~
src/ext-bob.c:507:66: error: passing argument 8 of 'mbedtls_ecdsa_write_signature' from incompatible pointer type [-Wincompatible-pointer-types]
  507 |                         sig + 3, &slen, mbedtls_ctr_drbg_random, &g_ctr_drbg);
      |                                                                  ^~~~~~~~~~~
      |                                                                  |
      |                                                                  mbedtls_ctr_drbg_context *
/home/mangix/devstuff/openwrt/staging_dir/target-i386_pentium-mmx_musl/usr/include/mbedtls/ecdsa.h:476:41: note: expected 'int (*)(void *, unsigned char *, size_t)' {aka 'int (*)(void *, unsigned char *, unsigned int)'} but argument is of type 'mbedtls_ctr_drbg_context *'
  476 |                                   int (*f_rng)(void *, unsigned char *, size_t),
      |                                   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/ext-bob.c:504:23: error: too few arguments to function 'mbedtls_ecdsa_write_signature'
  504 |                 ret = mbedtls_ecdsa_write_signature(
      |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/mangix/devstuff/openwrt/staging_dir/target-i386_pentium-mmx_musl/usr/include/mbedtls/ecdsa.h:472:5: note: declared here
  472 | int mbedtls_ecdsa_write_signature(mbedtls_ecdsa_context *ctx,
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/ext-bob.c: In function 'bob_setup':
src/ext-bob.c:584:76: error: 'mbedtls_ecp_keypair' has no member named 'grp'
  584 |                 mbedtls_ecp_group_load(&mbedtls_pk_ec(resource->ctx_verify)->grp, ECPARAMS);
      |                                                                            ^~
make[3]: *** [Makefile:81: build/ext-bob.o] Error 1
make[3]: Leaving directory '/home/mangix/devstuff/openwrt/build_dir/target-i386_pentium-mmx_musl/KadNode-2.3.0'

neheb avatar May 14 '24 23:05 neheb

Hi @neheb. KadNode does not support mbedtls 3.x yet. If OpenWrt wants to update, then I suggest to remove the KadeNode package for now.

mwarning avatar May 15 '24 21:05 mwarning

mbedtls 3.6 is in master.

neheb avatar May 15 '24 21:05 neheb