@ -22,127 +22,136 @@ typedef struct member {
} member_t ;
} member_t ;
member_t member ;
member_t member ;
uint8_t msg [ MAX_MSGSIZE ] ;
size_t msg_len ;
int member_join ( char * buffer ) ;
int member_join ( char * buffer ) ;
int member_attest ( char * buffer ) ;
int member_attest ( char * buffer ) ;
int member_publish ( char * buffer ) ;
int member_publish ( char * buffer ) ;
int member_getpublic ( char * buffer ) ;
/* int member_getpublic(char *buffer); */
int member_joinappend ( char * buffer ) ;
int member_joinappend ( char * buffer ) ;
int member_joinfinish ( char * buffer ) ;
int member_joinfinish ( char * buffer ) ;
int main ( ) {
int main ( int argc , char * * argv ) {
char buffer [ MAX_BUFSIZE ] ;
if ( 2 ! = server_start ( & process_member , MEMBERPORT ) ) {
char * remote_ip = argv [ 2 ] ;
printf ( " server failed \n " ) ;
}
return 0 ;
}
int process_member ( char * buffer ) {
int ret = 0 ;
int ret = 0 ;
switch ( argc ) {
bzero ( member . bsn , MAX_BSNSIZE ) ;
case 2 :
strncpy ( ( char * ) member . bsn , " Biometric Sensor " , 16 ) ;
if ( 0 = = strncasecmp ( " --join " , argv [ 1 ] , 6 ) | | 0 = = strncasecmp ( " -j " , argv [ 1 ] , 2 ) ) {
member . bsn_len = 16 ;
member . state = ON ;
ret = client_connect ( & member_join , remote_ip , ISSUERPORT ) ;
printf ( " > MEMBER: %s \n " , buffer ) ;
if ( member . state = = JOINED & & 0 = = strncasecmp ( " ATTEST " , buffer , 6 ) ) {
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " ATTEST " , 7 ) ;
member_attest ( buffer ) ;
} else if ( member . state = = ON & & 0 = = strncasecmp ( " GETPUBLIC " , buffer , 9 ) ) {
bzero ( buffer , MAX_BUFSIZE ) ;
ret = client_connect ( & member_getpublic , ISSUERIP , ISSUERPORT ) ;
if ( 0 > = ret | | RCVPUBLIC ! = member . state ) {
printf ( " process_member: issuer connection failed \n " ) ;
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " ERR \n " , 4 ) ;
} else {
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " OK \n " , 3 ) ;
}
ret = 0 ;
} else if ( 0 = = strncasecmp ( " PUBLISH " , buffer , 7 ) ) {
bzero ( buffer , MAX_BUFSIZE ) ;
member_publish ( buffer ) ;
} else if ( member . state = = RCVPUBLIC & & 0 = = strncasecmp ( " JOIN " , buffer , 4 ) ) {
member . state = JOIN ;
ret = client_connect ( & member_join , ISSUERIP , ISSUERPORT ) ;
if ( 0 > = ret | | JOINED ! = member . state ) {
if ( 0 > = ret | | JOINED ! = member . state ) {
printf ( " process_member: issuer connection failed \n " ) ;
printf ( " Join process failed! \n " ) ;
bzero ( buffer , MAX_BUFSIZE ) ;
return 1 ;
strncpy ( buffer , " ERR \n " , 4 ) ;
} else {
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " OK \n " , 3 ) ;
}
ret = 0 ;
} else if ( 0 = = strncasecmp ( " EXIT " , buffer , 4 ) ) {
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " OK \n " , 3 ) ;
ret = 1 ;
} else if ( 0 = = strncasecmp ( " SHUTDOWN " , buffer , 8 ) ) {
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " OK \n " , 3 ) ;
ret = 2 ;
} else {
} else {
bzero ( buffer , MAX_BUFSIZE ) ;
printf ( " Join process was successful \n " ) ;
strncpy ( buffer , " ERR \n " , 4 ) ;
ret = 0 ;
}
}
printf ( " < MEMBER: %s \n " , buffer ) ;
return ret ;
}
}
int member_join ( char * buffer ) {
int ret = 0 ;
switch ( member . state ) {
case JOIN :
bzero ( buffer , MAX_BUFSIZE ) ;
strncpy ( buffer , " JOIN \n " , 5 ) ;
member . state = APPEND ;
break ;
break ;
case APPEND :
case 3 :
if ( 0 = = strncasecmp ( " JOINSTART " , buffer , 9 ) ) {
if ( 0 = = strncasecmp ( " --send " , argv [ 1 ] , 6 ) | | 0 = = strncasecmp ( " -s " , argv [ 1 ] , 2 ) ) {
printf ( " ISSUER > MEMBER: %s " , buffer ) ;
char * msgfile = argv [ 3 ] ;
member_joinappend ( buffer ) ;
FILE * fileptr = fopen ( msgfile , " rb " ) ;
member . state = JOINPROCEED ;
if ( 0 = = fileptr ) {
} else {
printf ( " Could not open message file %s \n " , msgfile ) ;
printf ( " member_join: did not get nonce from issuer \n " ) ;
return 1 ;
member . state = RCVPUBLIC ;
ret = - 1 ;
}
}
break ;
size_t bytes_read = fread ( msg , 1 , MAX_MSGSIZE , fileptr ) ;
case JOINPROCEED :
if ( bytes_to_read ! = bytes_read & & ! feof ( file_ptr ) ) {
if ( 0 = = strncasecmp ( " JOINPROCEED " , buffer , 11 ) ) {
printf ( " Error reading message file " ) ;
printf ( " ISSUER > MEMBER: %s " , buffer ) ;
fclose ( fileptr ) ;
member_joinfinish ( buffer ) ;
return 1 ;
member . state = JOINED ;
ret = 1 ;
} else {
printf ( " member_getpublic: did not get credentials from issuer \n " ) ;
member . state = RCVPUBLIC ;
ret = - 1 ;
}
}
break ;
if ( 0 ! = fclose ( fileptr ) ) {
default :
printf ( " Error closing message file " ) ;
ret = - 1 ;
return 1 ;
}
}
if ( 0 = = ret ) {
if ( 0 ! = ecdaa_member_secret_key_FP256BN_deserialize_file ( & member . msk , member_secret_key_file ) | |
printf ( " ISSUER < MEMBER: %s " , buffer ) ;
0 ! = ecdaa_member_public_key_FP256BN_deserialize_file ( & member . mpk , member_public_key_file ) | |
0 ! = ecdaa_credential_FP256BN_deserialize_file ( & member . cred , member_credential_file ) ) {
printf ( " Could not import key files. importing from %s, %s or %s was not successful \n " , member_secret_key_file , member_public_key_file , member_credential_file ) ;
return 1 ;
}
}
return ret ;
member . state = JOINED
ret = client_connect ( & member_attest , remote_ip , VERIFIERPORT ) ;
if ( 0 > = ret | | JOINED ! = member . state ) {
printf ( " connection to verifier failed \n " ) ;
}
}
}
break ;
default :
printf ( " Usage: \n Join an issuer's group: %s --join <issuer's IPv4> \n " , argv [ 0 ] ) ;
printf ( " Send a signed message to the verifier: %s --send <verifier's IPv4> <msgfile> \n " , argv [ 0 ] ) ;
printf ( " Before sending a DAA-signed message, the member must join a DAA group \n " , argv [ 0 ] ) ;
break ;
return 0 ;
}
/* int process_member(char *buffer) { */
/* int ret = 0; */
/* char remote_ip[16]; */
/* bzero(member.bsn, MAX_BSNSIZE); */
/* strncpy((char *) member.bsn, "Biometric Sensor", 16); */
/* member.bsn_len = 16; */
/* printf("> MEMBER: %s\n", buffer); */
/* if (member.state == JOINED && 0 == strncasecmp("ATTEST", buffer, 6)) { */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "ATTEST ", 7); */
/* member_attest(buffer); */
/* } else if (member.state == ON && 0 == strncasecmp("GETPUBLIC", buffer, 9)) { */
/* strncpy(remote_ip, buffer[10], 15); */
/* ret = client_connect(&member_getpublic, remote_ip, ISSUERPORT); */
/* if (0 >= ret || RCVPUBLIC != member.state) { */
/* printf("process_member: issuer connection failed\n"); */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "ERR\n", 4); */
/* } else { */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "OK\n", 3); */
/* } */
/* ret = 0; */
/* } else if (0 == strncasecmp("PUBLISH", buffer, 7)) { */
/* bzero(buffer, MAX_BUFSIZE); */
/* member_publish(buffer); */
/* } else if (member.state == RCVPUBLIC && 0 == strncasecmp("JOIN", buffer, 4)) { */
/* member.state = JOIN; */
/* ret = client_connect(&member_join, ISSUERIP, ISSUERPORT); */
/* if (0 >= ret || JOINED != member.state) { */
/* printf("process_member: issuer connection failed\n"); */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "ERR\n", 4); */
/* } else { */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "OK\n", 3); */
/* } */
/* ret = 0; */
/* } else if (0 == strncasecmp("EXIT", buffer, 4)) { */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "OK\n", 3); */
/* ret = 1; */
/* } else if (0 == strncasecmp("SHUTDOWN", buffer, 8)) { */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "OK\n", 3); */
/* ret = 2; */
/* } else { */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "ERR\n", 4); */
/* ret = 0; */
/* } */
/* printf("< MEMBER: %s\n", buffer); */
/* return ret; */
/* } */
int member_getpublic ( char * buffer ) {
int member_join ( char * buffer ) {
int ret = 0 ;
int ret = 0 ;
switch ( member . state ) {
switch ( member . state ) {
@ -165,8 +174,7 @@ int member_getpublic(char *buffer) {
printf ( " member_getpublic: signature of issuer public key is invalid \n " ) ;
printf ( " member_getpublic: signature of issuer public key is invalid \n " ) ;
ret = - 1 ;
ret = - 1 ;
} else {
} else {
member . state = RCVPUBLIC ;
member . state = JOIN ;
ret = 1 ;
}
}
} else {
} else {
printf ( " member_getpublic: did not get public key from issuer \n " ) ;
printf ( " member_getpublic: did not get public key from issuer \n " ) ;
@ -174,11 +182,36 @@ int member_getpublic(char *buffer) {
ret = - 1 ;
ret = - 1 ;
}
}
break ;
break ;
default :
case JOIN :
printf ( " member_getpublic: did not get public key from issuer \n " ) ;
bzero ( buffer , MAX_BUFSIZE ) ;
member . state = ON ;
strncpy ( buffer , " JOIN \n " , 5 ) ;
member . state = APPEND ;
break ;
case APPEND :
if ( 0 = = strncasecmp ( " JOINSTART " , buffer , 9 ) ) {
printf ( " ISSUER > MEMBER: %s " , buffer ) ;
member_joinappend ( buffer ) ;
member . state = JOINPROCEED ;
} else {
printf ( " member_join: did not get nonce from issuer \n " ) ;
member . state = RCVPUBLIC ;
ret = - 1 ;
ret = - 1 ;
}
break ;
break ;
case JOINPROCEED :
if ( 0 = = strncasecmp ( " JOINPROCEED " , buffer , 11 ) ) {
printf ( " ISSUER > MEMBER: %s " , buffer ) ;
member_joinfinish ( buffer ) ;
member . state = JOINED ;
ret = 1 ;
} else {
printf ( " member_getpublic: did not get credentials from issuer \n " ) ;
member . state = RCVPUBLIC ;
ret = - 1 ;
}
break ;
default :
ret = - 1 ;
}
}
if ( 0 = = ret ) {
if ( 0 = = ret ) {
printf ( " ISSUER < MEMBER: %s " , buffer ) ;
printf ( " ISSUER < MEMBER: %s " , buffer ) ;
@ -186,12 +219,56 @@ int member_getpublic(char *buffer) {
return ret ;
return ret ;
}
}
/* int member_getpublic(char *buffer) { */
/* int ret = 0; */
/* switch (member.state) { */
/* case ON: */
/* bzero(buffer, MAX_BUFSIZE); */
/* strncpy(buffer, "PUBLISH\n", 8); */
/* member.state = ISSUERPUB; */
/* break; */
/* case ISSUERPUB: */
/* if (0 == strncasecmp("PUBLISH", buffer, 7)) { */
/* printf("ISSUER > MEMBER: %s", buffer); */
/* uint8_t binbuf[MAX_BUFSIZE]; */
/* char *current = &buffer[8]; */
/* ecdaa_hextobin(current, binbuf, ECDAA_ISSUER_PUBLIC_KEY_FP256BN_LENGTH); */
/* ret = ecdaa_issuer_public_key_FP256BN_deserialize(&member.ipk, binbuf); */
/* if (-1 == ret) { */
/* printf("member_getpublic: issuer public key is malformed!\n"); */
/* ret = -1; */
/* } else if (-2 == ret) { */
/* printf("member_getpublic: signature of issuer public key is invalid\n"); */
/* ret = -1; */
/* } else { */
/* member.state = RCVPUBLIC; */
/* ret = 1; */
/* } */
/* } else { */
/* printf("member_getpublic: did not get public key from issuer\n"); */
/* member.state = ON; */
/* ret = -1; */
/* } */
/* break; */
/* default: */
/* printf("member_getpublic: did not get public key from issuer\n"); */
/* member.state = ON; */
/* ret = -1; */
/* break; */
/* } */
/* if (0 == ret) { */
/* printf("ISSUER < MEMBER: %s", buffer); */
/* } */
/* return ret; */
/* } */
//"ATTEST" > "ATTEST <attestval>"
//"ATTEST" > "ATTEST <attestval>"
int member_attest ( char * buffer ) {
int member_attest ( char * buffer ) {
char * current = buffer ;
char * current = buffer ;
uint8_t binbuf [ MAX_BUFSIZE ] ;
uint8_t binbuf [ MAX_BUFSIZE ] ;
uint8_t msg [ MAX_MSGSIZE ] = " I am the real host " ;
/* uint8_t msg[MAX_MSGSIZE] = "I am the real host"; */
size_t msg_len = strlen ( ( char * ) msg ) ;
/* size_t msg_len = strlen((char*)msg); */
uint8_t has_nym = member . bsn_len ! = 0 ? 1 : 0 ;
uint8_t has_nym = member . bsn_len ! = 0 ? 1 : 0 ;
struct ecdaa_signature_FP256BN sig ;
struct ecdaa_signature_FP256BN sig ;
size_t sig_len = has_nym ? ECDAA_SIGNATURE_FP256BN_WITH_NYM_LENGTH : ECDAA_SIGNATURE_FP256BN_LENGTH ;
size_t sig_len = has_nym ? ECDAA_SIGNATURE_FP256BN_WITH_NYM_LENGTH : ECDAA_SIGNATURE_FP256BN_LENGTH ;
@ -280,6 +357,13 @@ int member_joinfinish(char *buffer) {
printf ( " member_joinfinish: siganture of credential is invalid " ) ;
printf ( " member_joinfinish: siganture of credential is invalid " ) ;
ret = - 1 ;
ret = - 1 ;
}
}
printf ( " member_joinfinish: writing key-pair and credential to disk " ) ;
if ( 0 ! = ecdaa_member_public_key_FP256BN_serialize_file ( member_public_key_file , & member . mpk ) | |
0 ! = ecdaa_member_secret_key_FP256BN_serialize_file ( member_secret_key_file , & member . msk ) | |
0 ! = ecdaa_credential_FP256BN_serialize_file ( member_credential_file , & member . cred ) ) {
printf ( " issuer_setup: Error saving key-pair or credential to disk \n " ) ;
return - 1 ;
}
return ret ;
return ret ;
}
}