|
|
@ -1,63 +1,66 @@ |
|
|
#include <stdio.h> |
|
|
#include "verifier.h" |
|
|
#include <string.h> |
|
|
|
|
|
#include <ecdaa-tpm.h> |
|
|
|
|
|
#include "client.h" |
|
|
|
|
|
#include "server.h" |
|
|
|
|
|
|
|
|
|
|
|
typedef enum memberstate { |
|
|
typedef enum verifierstate { |
|
|
ON, |
|
|
ON, |
|
|
JOIN, |
|
|
ASKISSUER, |
|
|
APPEND, |
|
|
GOTISSUER, |
|
|
JOINPROCEED, |
|
|
ASKMEMBER, |
|
|
JOINED, |
|
|
GOTMEMBER |
|
|
ATTEST, |
|
|
} verifierstate_e; |
|
|
PUBLISH |
|
|
|
|
|
} memberstate_e; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct member { |
|
|
typedef struct verifier { |
|
|
struct ecdaa_member_public_key_FP256BN mpk; |
|
|
struct ecdaa_verifier_public_key_FP256BN mpk; |
|
|
struct ecdaa_member_public_key_FP256BN msk; |
|
|
struct ecdaa_verifier_public_key_FP256BN ipk; |
|
|
memberstate_e state; |
|
|
verifierstate_e state; |
|
|
} member_t; |
|
|
} verifier_t; |
|
|
|
|
|
|
|
|
member_t member; |
|
|
verifier_t verifier; |
|
|
|
|
|
|
|
|
int process_member(char *buffer); |
|
|
int verifier_getissuer(char *buffer); |
|
|
|
|
|
|
|
|
int member_join(char* buffer); |
|
|
int verifier_getmember(char *buffer); |
|
|
int member_attest(char* buffer); |
|
|
|
|
|
int member_publish(char* buffer); |
|
|
|
|
|
|
|
|
|
|
|
int main() { |
|
|
int main() { |
|
|
int err = 0; |
|
|
int err = 0; |
|
|
|
|
|
|
|
|
if (2 != server_start(&process_member, MEMBERPORT)) { |
|
|
if (2 != server_start(&process_verifier, VERIFIERPORT)) { |
|
|
printf("server failed\n"); |
|
|
printf("server failed\n"); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int process_member(char *buffer) { |
|
|
int process_verifier(char *buffer) { |
|
|
int ret = 0; |
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
printf("> MEMBER: %s\n", buffer); |
|
|
printf("> VERIFIER: %s\n", buffer); |
|
|
|
|
|
|
|
|
if (0 == strncasecmp("ATTEST", buffer, 6)) { |
|
|
if (0 == strncasecmp("VERIFY", buffer, 6)) { |
|
|
printf("attest()\n"); |
|
|
switch (verifier.state) { |
|
|
|
|
|
case GOTMEMBER: |
|
|
|
|
|
printf("verify()\n"); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
strncpy(buffer, "ATTEST ", 7); |
|
|
strncpy(buffer, "OK\n", 3); |
|
|
member_attest(buffer); |
|
|
break; |
|
|
} else if (0 == strncasecmp("PUBLISH", buffer, 7)) { |
|
|
default: |
|
|
printf("publish()\n"); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
|
|
|
strncpy(buffer, "ERR\n", 4); |
|
|
|
|
|
} |
|
|
|
|
|
} else if (0 == strncasecmp("LINk", buffer, 4)) { |
|
|
|
|
|
printf("getpublished()\n"); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
strncpy(buffer, "PUBLISH ", 8); |
|
|
strncpy(buffer, "OK\n", 3); |
|
|
member_publish(buffer); |
|
|
} else if (0 == strncasecmp("GETPUBLISHED", buffer, 12)) { |
|
|
} else if (0 == strncasecmp("JOIN", buffer, 4)) { |
|
|
printf("link()\n"); |
|
|
printf("join()\n"); |
|
|
verifier.state = ON; |
|
|
member.state = JOIN; |
|
|
ret = client_connect(&verifier_getissuer, ISSUERIP, ISSUERPORT); |
|
|
ret = client_connect(&member_join, ISSUERIP, ISSUERPORT); |
|
|
if (0 >= ret || GOTISSUER != verifier.state) { |
|
|
if (0 >= ret || JOINED != member.state) { |
|
|
printf("process_verifier: issuer connection failed\n"); |
|
|
printf("process_member: issuer connection failed\n"); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
|
|
|
strncpy(buffer, "ERR\n", 4); |
|
|
|
|
|
} else { |
|
|
|
|
|
ret = client_connect(&verifier_getmember, MEMBERIP, MEMBERPORT); |
|
|
|
|
|
if (0 >= ret || GOTMEMBER != verifier.state) { |
|
|
|
|
|
printf("process_verifier: issuer connection failed\n"); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
strncpy(buffer, "ERR\n", 4); |
|
|
strncpy(buffer, "ERR\n", 4); |
|
|
} else { |
|
|
} else { |
|
|
@ -65,6 +68,7 @@ int process_member(char *buffer) { |
|
|
strncpy(buffer, "OK\n", 3); |
|
|
strncpy(buffer, "OK\n", 3); |
|
|
} |
|
|
} |
|
|
ret = 0; |
|
|
ret = 0; |
|
|
|
|
|
} |
|
|
} else if (0 == strncasecmp("EXIT", buffer, 4)) { |
|
|
} else if (0 == strncasecmp("EXIT", buffer, 4)) { |
|
|
printf("exit()\n"); |
|
|
printf("exit()\n"); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
@ -81,31 +85,24 @@ int process_member(char *buffer) { |
|
|
ret = 0; |
|
|
ret = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
printf("< MEMBER: %s\n", buffer); |
|
|
printf("< VERIFIER: %s\n", buffer); |
|
|
return ret; |
|
|
return ret; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int member_join(char *buffer) { |
|
|
int verifier_getissuer(char *buffer) { |
|
|
int ret = 0; |
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
printf("ISSUER > MEMBER: %s", buffer); |
|
|
printf("ISSUER > VERIFIER: %s", buffer); |
|
|
switch (member.state) { |
|
|
switch (verifier.state) { |
|
|
case JOIN: |
|
|
case ON: |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
strncpy(buffer, "JOIN\n", 5); |
|
|
strncpy(buffer, "PUBLISH\n", 8); |
|
|
member.state = APPEND; |
|
|
verifier.state = ASKISSUER; |
|
|
break; |
|
|
break; |
|
|
case APPEND: |
|
|
case ASKISSUER: |
|
|
if (0 == strncasecmp("JOINSTART", buffer, 9)) { |
|
|
if (0 == strncasecmp("PUBLISH", buffer, 7)) { |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
strncpy(buffer, "APPEND\n", 7); |
|
|
verifier.state = GOTISSUER; |
|
|
member.state = JOINPROCEED; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case JOINPROCEED: |
|
|
|
|
|
if (0 == strncasecmp("JOINPROCEED", buffer, 11)) { |
|
|
|
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
|
|
|
member.state = JOINED; |
|
|
|
|
|
ret = 1; |
|
|
ret = 1; |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
@ -113,17 +110,33 @@ int member_join(char *buffer) { |
|
|
ret - 1; |
|
|
ret - 1; |
|
|
} |
|
|
} |
|
|
if (0 == ret) { |
|
|
if (0 == ret) { |
|
|
printf("ISSUER < MEMBER: %s", buffer); |
|
|
printf("ISSUER < VERIFIER: %s", buffer); |
|
|
} |
|
|
} |
|
|
return ret; |
|
|
return ret; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int member_attest(char* buffer) { |
|
|
int verifier_getmember(char *buffer) { |
|
|
strncat(buffer, "<attestval>\n", 13); |
|
|
int ret = 0; |
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int member_publish(char* buffer) { |
|
|
printf("ISSUER > VERIFIER: %s", buffer); |
|
|
strncat(buffer, "<publicval>\n", 12); |
|
|
switch (verifier.state) { |
|
|
return 0; |
|
|
case ON: |
|
|
|
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
|
|
|
strncpy(buffer, "PUBLISH\n", 8); |
|
|
|
|
|
verifier.state = ASKMEMBER; |
|
|
|
|
|
break; |
|
|
|
|
|
case ASKMEMBER: |
|
|
|
|
|
if (0 == strncasecmp("PUBLISH", buffer, 7)) { |
|
|
|
|
|
bzero(buffer, MAX_BUFSIZE); |
|
|
|
|
|
verifier.state = GOTMEMBER; |
|
|
|
|
|
ret = 1; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
ret - 1; |
|
|
|
|
|
} |
|
|
|
|
|
if (0 == ret) { |
|
|
|
|
|
printf("ISSUER < VERIFIER: %s", buffer); |
|
|
|
|
|
} |
|
|
|
|
|
return ret; |
|
|
} |
|
|
} |