グループ署名方式とは
グループ署名方式とは署名者がグループに含まれることを証明する署名方式です。
グループ署名についての説明はこちら にあります。
想定する環境
- Ubuntu 20.04
インストール
1. 必要なパッケージをインストール
以下のコマンドで事前に必要なプログラムをインストールしておきます。
$ sudo apt update
$ sudo apt install git build-essential cmake libssl-dev
2. libgroupsigのインストール
以下のコマンドでlibgroupsigをインストールします。
$ git clone https://github.com/IBM/libgroupsig
$ cd libgroupsig
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
プログラムの作成
1. プログラムの記述
以下のようなプログラムを書き、sign_gl19.c
という名前で保存します。
#include <groupsig/groupsig.h>
int main (int argc, char *argv[]) {
groupsig_config_t *cfg;
groupsig_key_t *grpkey, *isskey, *cnvkey, *memkey;
groupsig_signature_t *sig;
message_t *msg, *m1, *m2, *m3, *m4;
uint8_t b;
/* Initialize environment for GL19 */
cfg = groupsig_init(GROUPSIG_GL19_CODE, 0);
/** Create the group **/
/* Initialize the group and manager keys */
grpkey = groupsig_grp_key_init(GROUPSIG_GL19_CODE);
isskey = groupsig_mgr_key_init(GROUPSIG_GL19_CODE);
cnvkey = groupsig_mgr_key_init(GROUPSIG_GL19_CODE);
/* Run the Issuer part of the setup */
groupsig_setup(GROUPSIG_GL19_CODE, grpkey, isskey, NULL, cfg);
/* Run the Converter part of the setup */
groupsig_setup(GROUPSIG_GL19_CODE, grpkey, cnvkey, NULL, cfg);
/** Add a member to the group **/
/* Initialize the member key */
memkey = groupsig_mem_key_init(GROUPSIG_GL19_CODE);
/* Simulate the issue-join interactive process */
m1 = m2 = m3 = m4 = NULL;
groupsig_join_mgr(&m1, NULL, isskey, 0, NULL, grpkey);
groupsig_join_mem(&m2, memkey, 1, m1, grpkey);
groupsig_join_mgr(&m3, NULL, isskey, 2, m2, grpkey);
groupsig_join_mem(&m4, memkey, 3, m3, grpkey);
/** Sign a message **/
/* Prepare the message */
msg = message_from_string("Hello, World!");
/* Initialize the signature object */
sig = groupsig_signature_init(GROUPSIG_GL19_CODE);
groupsig_sign(sig, msg, memkey, grpkey, 0);
/** Verify the signature **/
groupsig_verify(&b, sig, msg, grpkey);
if (b) {
fprintf(stdout, "VALID signature.\n");
} else {
fprintf(stdout, "WRONG signature.\n");
}
/* Free memory */
groupsig_clear(GROUPSIG_GL19_CODE, cfg); cfg = NULL;
groupsig_grp_key_free(grpkey); grpkey = NULL;
groupsig_mgr_key_free(isskey); isskey = NULL;
groupsig_mgr_key_free(cnvkey); cnvkey = NULL;
groupsig_mem_key_free(memkey); memkey = NULL;
groupsig_signature_free(sig); sig = NULL;
message_free(msg); msg = NULL;
message_free(m1); m1 = NULL;
message_free(m2); m2 = NULL;
message_free(m3); m3 = NULL;
message_free(m4); m4 = NULL;
return 0;
}
2. コンパイル&実行
以下のコマンドで、コンパイルと実行を行います。
$ gcc sign_gl19.c -o sign_gl19 -lgroupsig -lmcl -Wl,-rpath=/usr/local/lib
$ ./sign_gl19
VALID signature
と表示されれば成功です。