在 C++ 项目中使用 Keccak 库
Using Keccak Library in a C++ project
我正在尝试在项目中使用 Keccak Code Package,尤其是 SHAKE128 可扩展输出哈希函数。我按照他们的说明编译了库,我得到了两个文件夹,一个是libkeccak.a,里面全是.o文件,另一个是 libkeccak.a.headers 并且充满了 .h.
现在我的项目结构如下所示:
Project
|
+ -- MakeFile
|
+ -- Lamport
| |
| + -- lamportOTS.cpp
|
+ --libkeccak.a
| |
| + -- *.o
|
+ -- libkeccak.a.headers
| |
| + -- *.h
我要使用的函数在libkeccak.a.headers/SimpleFIPS202.h中指定。因此我包含了头文件。但是我找不到如何正确编译它。我试过:
g++ -c Lamport/lamportOTS.cpp
g++ lamportOTS.o libkeccak.a/SImpleFIPS202.o
它找到了 SHAKE128 函数,但编译失败,因为不同的 .o 文件似乎是相互依赖的。这是lamportOTS.cpp
的草图
#include "../libkeccak.a.headers/SimpleFIPS202.h"
void sign(unsigned char* message, unsigned char* signature, unsigned char*** key){
unsigned char randombits[2][256][32];
...
/* Apply SHAKE128 to each value */
for(int i = 0; i != 2; i++){
for(int j = 0; j!= 256;j++){
SHAKE128(key[i][j],32, randombits[i][j], 32);
}
}
}
编辑:
有关编译错误的详细信息已在评论中询问。 运行
g++ lamportOTS.o libkeccak.a/SimpleFIPS202.o
给出如下错误
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: dans la fonction « _start »:
(.text+0x20): référence indéfinie vers « main »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE128 »:
SimpleFIPS202.c:(.text+0x19): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE256 »:
SimpleFIPS202.c:(.text+0x49): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_224 »:
SimpleFIPS202.c:(.text+0x80): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_256 »:
SimpleFIPS202.c:(.text+0xb0): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_384 »:
SimpleFIPS202.c:(.text+0xe0): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o:SimpleFIPS202.c:(.text+0x110): encore plus de références indéfinies suivent vers « KeccakWidth1600_Sponge »
lamportOTS.o: dans la fonction « sign(unsigned char*, unsigned char*, unsigned char***) »:
lamportOTS.cpp:(.text+0x140): référence indéfinie vers « SHAKE128(unsigned char*, unsigned long, unsigned char const*, unsigned long) »
collect2: error: ld returned 1 exit status
终于成功了。仅作记录,这是我必须做的:
- 查找 .a 文件而不是文件夹
- 将 include 包装如下,因为库是用 C 编写的
extern "C" {#include "libkeccak.a.headers/SimpleFIPS202.h"}
- 运行
g++ Lamport/lamportOTS.cpp -o Lamport/lamportOTS -L[folder containing libkeccak.a] -lkeccak
(顺序似乎很重要)
我正在尝试在项目中使用 Keccak Code Package,尤其是 SHAKE128 可扩展输出哈希函数。我按照他们的说明编译了库,我得到了两个文件夹,一个是libkeccak.a,里面全是.o文件,另一个是 libkeccak.a.headers 并且充满了 .h.
现在我的项目结构如下所示:
Project
|
+ -- MakeFile
|
+ -- Lamport
| |
| + -- lamportOTS.cpp
|
+ --libkeccak.a
| |
| + -- *.o
|
+ -- libkeccak.a.headers
| |
| + -- *.h
我要使用的函数在libkeccak.a.headers/SimpleFIPS202.h中指定。因此我包含了头文件。但是我找不到如何正确编译它。我试过:
g++ -c Lamport/lamportOTS.cpp
g++ lamportOTS.o libkeccak.a/SImpleFIPS202.o
它找到了 SHAKE128 函数,但编译失败,因为不同的 .o 文件似乎是相互依赖的。这是lamportOTS.cpp
的草图#include "../libkeccak.a.headers/SimpleFIPS202.h"
void sign(unsigned char* message, unsigned char* signature, unsigned char*** key){
unsigned char randombits[2][256][32];
...
/* Apply SHAKE128 to each value */
for(int i = 0; i != 2; i++){
for(int j = 0; j!= 256;j++){
SHAKE128(key[i][j],32, randombits[i][j], 32);
}
}
}
编辑: 有关编译错误的详细信息已在评论中询问。 运行
g++ lamportOTS.o libkeccak.a/SimpleFIPS202.o
给出如下错误
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: dans la fonction « _start »:
(.text+0x20): référence indéfinie vers « main »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE128 »:
SimpleFIPS202.c:(.text+0x19): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHAKE256 »:
SimpleFIPS202.c:(.text+0x49): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_224 »:
SimpleFIPS202.c:(.text+0x80): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_256 »:
SimpleFIPS202.c:(.text+0xb0): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o: dans la fonction « SHA3_384 »:
SimpleFIPS202.c:(.text+0xe0): référence indéfinie vers « KeccakWidth1600_Sponge »
libkeccak.a/SimpleFIPS202.o:SimpleFIPS202.c:(.text+0x110): encore plus de références indéfinies suivent vers « KeccakWidth1600_Sponge »
lamportOTS.o: dans la fonction « sign(unsigned char*, unsigned char*, unsigned char***) »:
lamportOTS.cpp:(.text+0x140): référence indéfinie vers « SHAKE128(unsigned char*, unsigned long, unsigned char const*, unsigned long) »
collect2: error: ld returned 1 exit status
终于成功了。仅作记录,这是我必须做的:
- 查找 .a 文件而不是文件夹
- 将 include 包装如下,因为库是用 C 编写的
extern "C" {#include "libkeccak.a.headers/SimpleFIPS202.h"}
- 运行
g++ Lamport/lamportOTS.cpp -o Lamport/lamportOTS -L[folder containing libkeccak.a] -lkeccak
(顺序似乎很重要)