0

ツールキットを使用して、ATMega2560 で楕円曲線暗号を実行しています。ツールキットで印刷機能を使用しようとすると、空の文字列が表示されます。x86 バージョンでは問題なく変数が出力されるため、出力関数が機能することはわかっています。私は ATMega の経験がなく、この問題について何か助けていただければ幸いです。印刷コードは以下に含まれています。

大きな数値を出力するコード (それ自体が util_print を呼び出します)

void bn_print(bn_t a) {
int i;

if (a->sign == BN_NEG) {
    util_print("-");
}
if (a->used == 0) {
    util_print("0\n");
} else {
#if WORD == 64
    util_print("%lX", (unsigned long int)a->dp[a->used - 1]);
    for (i = a->used - 2; i >= 0; i--) {
        util_print("%.*lX", (int)(2 * (BN_DIGIT / 8)),
                (unsigned long int)a->dp[i]);
    }
#else
    util_print("%llX", (unsigned long long int)a->dp[a->used - 1]);
    for (i = a->used - 2; i >= 0; i--) {
        util_print("%.*llX", (int)(2 * (BN_DIGIT / 8)),
                (unsigned long long int)a->dp[i]);
    }
#endif
    util_print("\n");
}
}

大きな数値変数を実際に出力するコード:

static char buffer[64 + 1];
void util_printf(char *format, ...) {
#ifndef QUIET
#if ARCH == AVR
char *pointer = &buffer[1];
va_list list;
va_start(list, format);
vsnprintf(pointer, 128, format, list);
buffer[0] = (unsigned char)2;
va_end(list);
#elif ARCH == MSP
va_list list;
va_start(list, format);
vprintf(format, list);
va_end(list);
#else
va_list list;
va_start(list, format);
vprintf(format, list);
fflush(stdout);
va_end(list);
#endif
#endif
}

編集: UART が初期化されており、printf ステートメントをコンソールに出力できます。

4

3 に答える 3

1

私は RELIC ツールキットの作成者の 1 人です。現在の util_printf() 関数は、デバッグ目的で Avrora シミュレーター内で印刷するために使用されます。コードを目的に合わせて調整していただけると幸いです。補足として、バッファ サイズの問題は、ツールキットの最近のリリースで既に修正されています。

ライブラリにさらに問題があることをお知らせください。個人的に私に連絡するか、ディスカッション グループに直接書き込むことができます。

ありがとうございました!

于 2012-09-17T20:16:45.173 に答える
0

vsnprintf は、指定されたバッファー (この場合はポインター変数によるアドレス ポイント) に出力を格納します。コンソールに (UART を介して) 表示するには、printf を使用してバッファーを送信する必要があります (printf("% を追加してみてください) s"、ポインタ) vsnprintf) の後、avr-libc を使用している場合は、printf 関数を呼び出す前に std ストリームを初期化することを忘れないでください。

ところで、コードはバッファ オーバーフロー攻撃に対して脆弱です。buffer[64 + 1] は、バッファ サイズが 65 バイトしかないことを意味します。アプリケーションで定義されている最大バッファが 128 バイトであることを意味します。オーバーフローを避けるために、65 バイト未満に変更してみてください

于 2012-07-28T04:06:50.323 に答える
0

よし、Bn 番号を ATMega2560 の stdout に出力する回避策を見つけました。ツールキットには、変数を文字列に書き込む関数 (bn_write_str) が付属しています。そこで、独自の印刷機能を次のように実装しました。

void print_bn(bn_t a)
{
    char print[BN_SIZE]; // max precision of a bn number
    int bi = bn_bits(a); // get the number of bits of the number
    bn_write_str(print, bi, a, 16) // 16 indicates the radix (hexadecimal)
    printf("%s\n"), print);
}

この関数は、bn 番号を 16 進形式で出力します。これが、AVR で RELIC ツールキットを使用しているすべての人に役立つことを願っています。

これにより、util_print 呼び出しがスキップされます。

于 2012-08-01T18:03:44.217 に答える