Archive 07/10/2020.

TP16 erreur signature

gdouyere

Je ne comprends pas ce qu’il se passe
Y a t’il un pilote dans l"avion ?
Je n’ai j’amais eu une seule réponse de l’éqiuipe pédagogique à mes question
Normal ?

jovyan@e6b580d0a80c:~/work/iot-lab-training$ make -C riot/security/signature
make: Entering directory ‘/home/jovyan/work/iot-lab-training/riot/security/signature’
Building application “signature” for “native” with MCU “native”.

make[1]: Nothing to be done for ‘prepare’.
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/pkg/c25519
“make” -C /home/jovyan/work/iot-lab-training/riot/security/signature/bin/pkg/native/c25519/src -f /home/jovyan/work/iot-lab-training/riot/RIOT/pkg/c25519/Makefile.c25519
/home/jovyan/work/iot-lab-training/riot/security/signature/main.c:54:16: error: redefinition of ‘signature’
static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };
^~~~~~~~~
/home/jovyan/work/iot-lab-training/riot/security/signature/main.c:20:16: note:previous definition of ‘signature’ was here
static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };
^~~~~~~~~
/home/jovyan/work/iot-lab-training/riot/security/signature/main.c:55:13: error: redefinition of ‘signature_hex’
static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2] = { 0 };
^~~~~~~~~~~~~
/home/jovyan/work/iot-lab-training/riot/security/signature/main.c:21:13: note:previous definition of ‘signature_hex’ was here
static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2] = { 0 };
^~~~~~~~~~~~~
/home/jovyan/work/iot-lab-training/riot/security/signature/main.c:21:13: error: ‘signature_hex’ defined but not used [-Werror=unused-variable]
/home/jovyan/work/iot-lab-training/riot/security/signature/main.c:20:16: error: ‘signature’ defined but not used [-Werror=unused-variable]
static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };
^~~~~~~~~
cc1: all warnings being treated as errors
/home/jovyan/work/iot-lab-training/riot/RIOT/Makefile.base:109: recipe for target ‘/home/jovyan/work/iot-lab-training/riot/security/signature/bin/native/application_signature/main.o’ failed
make[1]: *** [/home/jovyan/work/iot-lab-training/riot/security/signature/bin/native/application_signature/main.o] Error 1
/home/jovyan/work/iot-lab-training/riot/security/signature/…/…/RIOT/Makefile.include:540: recipe for target ‘/home/jovyan/work/iot-lab-training/riot/security/signature/bin/native/application_signature.a’ failed
make: *** [/home/jovyan/work/iot-lab-training/riot/security/signature/bin/native/application_signature.a] Error 2
make: Leaving directory ‘/home/jovyan/work/iot-lab-training/riot/security/signature’

aabadie2

Bonjour,

Il semble que le code de l’application contienne plusieurs erreurs. Pouvez-vous poster le contenu de main.c pour qu’on puisse vous aider à trouver le/les problèmes ?

gdouyere

ci-joint copie du main.c
Merci de votre aide
Cordialement.
Gérard.

#include <inttypes.h>
#include <stdio.h>
#include <string.h>

/* Add required includes here */

#include "shell.h"
#include "fmt.h"
#include "edsign.h"
#include "ed25519.h"
#include "random.h"

/* Declare here the buffers where the asymmetric keys are stored */

static uint8_t secret_key[EDSIGN_SECRET_KEY_SIZE] = { 0 };
static uint8_t public_key[EDSIGN_PUBLIC_KEY_SIZE] = { 0 };

/* Declare here the buffers where the signature and its hexadecimal representation are stored */

static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };
static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2] = { 0 };

/* Implement the key command handler here */

static int _key_handler(int argc, char **argv)
{
    (void)argc;
    (void)argv;

    /* Create the new keypair */

random_bytes(secret_key, sizeof(secret_key));
ed25519_prepare(secret_key);
edsign_sec_to_pub(public_key, secret_key);

    /* Print the new keypair */

puts("New keypair generated:");
printf("  - Secret: ");
for (uint8_t i = 0; i < EDSIGN_SECRET_KEY_SIZE; ++i) {
  printf("%02X", secret_key[i]);
}

printf("\n  - Public: ");
for (uint8_t i = 0; i < EDSIGN_PUBLIC_KEY_SIZE; ++i) {
  printf("%02X", public_key[i]);
}
puts("");
    return 0;
}

/* Implement the sign command handler here */

static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };
static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2] = { 0 };

static int _sign_handler(int argc, char **argv)
{
    if (argc != 2) {
        printf("usage: %s <message>\n", argv[0]);
        return 1;
    }

    /* Clear signature temporary buffer content */
    
memset(signature, 0, sizeof(signature));

    /* Generate the signature here */

edsign_sign(signature, public_key, secret_key, (uint8_t *)argv[1], strlen(argv[1]));

    /* Convert the signature byte array to a string of hex characters */

fmt_bytes_hex(signature_hex, signature, EDSIGN_SIGNATURE_SIZE);
    
    /* Print the signature */
    
    printf("%s\n", signature_hex);

    return 0;
}

/* Implement the verify command handler here */

static int _verify_handler(int argc, char **argv)
{
    if (argc != 3) {
        printf("usage: %s <message> <signature>\n", argv[0]);
        return 1;
    }

    /* Clear signature temporary buffer content */
    
    memset(signature, 0, sizeof(signature));

    /* Convert the input signature in hex to a byte array here */

fmt_hex_bytes(signature, argv[2]);
    
    /* Verify the signature here */

if (edsign_verify(signature, public_key, (uint8_t *)argv[1], strlen(argv[1]))) {
  puts("Message verified");
}
else {
  puts("Message not verified");
}
    return 0;
}

/* Declare the list of shell commands */

static const shell_command_t shell_commands[] = {
    { "key", "Generate a new pair of keys", _key_handler },
    { "sign", "Compute the signature of a message", _sign_handler },
    { "verify", "Verify the signature of a message", _verify_handler },
    { NULL, NULL, NULL }
};

int main(void)
{
    /* Initialize the random seed */
    random_init(0);

    /* Configure and start the shell */
    char line_buf[SHELL_DEFAULT_BUFSIZE + 32];
    shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE + 32);

    return 0;
}
aabadie2

Bonjour,

Il y a 2 problèmes:

  • les lignes
static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };
static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2] = { 0 };

apparaissent 2 fois. Il faut donc enlever la deuxième occurence (celle qui est placée avant la fonction _sign_handler. C’est ce qui cause l’erreur de compilation dont le message d’erreur est /home/jovyan/work/iot-lab-training/riot/security/signature/main.c:54:16: error: redefinition of ‘signature’ static uint8_t signature[EDSIGN_SIGNATURE_SIZE] = { 0 };

  • ensuite il faut remplacer la ligne
static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2] = { 0 };

par

static char signature_hex[EDSIGN_SIGNATURE_SIZE * 2 + 1] = { 0 };

(c’est une coquille dans le notebook).

Le reste me parait bon.

gdouyere

Merci pour votre réponse.
Je vais un peu plus loin dans la réalisation du T.P mais j’ai encore le message d’erreur suivant ;

De plus au niveau du terminal je ne vois pas le > qui me permettré de taper le “help”.
Merci pour votre patience et pour votre prochaine réponse.*Cordialement

Building application “signature” for “iotlab-m3” with MCU “stm32f1”.

make[1]: Nothing to be done for ‘prepare’.
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/pkg/c25519
“make” -C /home/jovyan/work/iot-lab-training/riot/security/signature/bin/pkg/iotlab-m3/c25519/src -f /home/jovyan/work/iot-lab-training/riot/RIOT/pkg/c25519/Makefile.c25519
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/boards/iotlab-m3
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/boards/common/iotlab
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/core
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32f1
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/cortexm_common
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/cortexm_common/periph
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32_common
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32_common/periph
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/cpu/stm32f1/periph
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/drivers
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/drivers/periph_common
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/auto_init
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/isrpipe
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/luid
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/newlib_syscalls_default
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/pm_layered
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/random
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/random/tinymt32
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/shell
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/stdio_uart
“make” -C /home/jovyan/work/iot-lab-training/riot/RIOT/sys/tsrb
/home/jovyan/work/iot-lab-training/riot/security/signature/bin/iotlab-m3/application_signature/main.o: In function _verify_handler': /home/jovyan/work/iot-lab-training/riot/security/signature/main.c:95: undefined reference tofmt_hex_bytes’
/home/jovyan/work/iot-lab-training/riot/security/signature/bin/iotlab-m3/application_signature/main.o: In function _sign_handler': /home/jovyan/work/iot-lab-training/riot/security/signature/main.c:71: undefined reference tofmt_bytes_hex’
collect2: error: ld returned 1 exit status
/home/jovyan/work/iot-lab-training/riot/security/signature/…/…/RIOT/Makefile.include:537: recipe for target ‘/home/jovyan/work/iot-lab-training/riot/security/signature/bin/iotlab-m3/signature.elf’ failed
make: *** [/home/jovyan/work/iot-lab-training/riot/security/signature/bin/iotlab-m3/signature.elf] Error 1

aabadie2

Bonjour,

Je pense qu’il vous manque l’ajout du module fmt dans le Makefile (voir la section Add required modules to the build du notebook).

gdouyere

Oui merci,
il y avait une erreur de frappe dans l’ajout du module fmt.
Je suis (enfin !) arrivé au but du TP16.
Merci encore pour votre patience et aide.
Cordialement