diff --git a/verifier.c b/verifier.c index b8fc5d1..f26d8e5 100644 --- a/verifier.c +++ b/verifier.c @@ -5,7 +5,8 @@ typedef enum verifierstate { ASKISSUER, GOTISSUER, ASKMEMBER, - GOTMEMBER + GOTMEMBER, + ASKATTEST, } verifierstate_e; typedef struct verifier { @@ -132,7 +133,7 @@ int verifier_getmember(char *buffer) { int ret = 0; switch (verifier.state) { - case ON: + case GOTISSUER: bzero(buffer, MAX_BUFSIZE); strncpy(buffer, "PUBLISH\n", 8); verifier.state = ASKMEMBER; @@ -167,9 +168,40 @@ int verifier_getmember(char *buffer) { //"ATTEST" > "OK" int verifier_attestmember(char *buffer) { - bzero(buffer, MAX_BUFSIZE); - strncat(buffer, "OK\n", 16); - return 0; + int ret = 0; + + switch (verifier.state) { + case GOTMEMBER: + bzero(buffer, MAX_BUFSIZE); + strncpy(buffer, "ATTEST\n", 8); + verifier.state = ASKATTEST; + break; + case ASKATTEST: + if (0 == strncasecmp("ATTEST", buffer, 7)) { + printf("MEMBER > VERIFIER: %s", buffer); + uint8_t binbuf[MAX_BUFSIZE]; + char *current = &buffer[8]; + ecdaa_hextobin(current, binbuf, ECDAA_MEMBER_PUBLIC_KEY_FP256BN_LENGTH); + ret = ecdaa_member_public_key_FP256BN_deserialize_no_check(&verifier.mpk, binbuf); + if (-1 == ret) { + printf("verifier_attestmember: member public key is malformed!\n"); + ret = -1; + } else if (-2 == ret) { + printf("verifier_attestmember: signature of member public key is invalid\n"); + ret = -1; + } else { + verifier.state = GOTMEMBER; + ret = 1; + } + } + break; + default: + ret = -1; + } + if (0 == ret) { + printf("MEMBER < VERIFIER: %s", buffer); + } + return ret; } //"LINK" > "NOT IMPLEMENTED"