From f35923ab74d9229ee5e90c27e3f865303242086a Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 24 Nov 2022 01:49:46 -0500 Subject: [PATCH] Way more of the token lifecycle implemented, there's base64 now --- base64.c | 214 ++++++++++++++++++++++++++++++++++++++++++++++ base64.h | 52 ++++++++++++ blindsig2 | Bin 0 -> 180536 bytes blindsig2.c | 188 +++++++++++++++++++++++++++++++++++++++++ build.sh | 2 +- ctm.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++----- debugprint.c | 22 ++++- debugprint.h | 3 +- fstoken.c | 116 ++++++++++++++++++++++++- fstoken.h | 52 +++++++++++- 10 files changed, 851 insertions(+), 33 deletions(-) create mode 100644 base64.c create mode 100644 base64.h create mode 100755 blindsig2 create mode 100644 blindsig2.c diff --git a/base64.c b/base64.c new file mode 100644 index 0000000..5162e8a --- /dev/null +++ b/base64.c @@ -0,0 +1,214 @@ +/* +This is derived from the libb64 project, which has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#include "base64.h" + +int base64_decode_value(char value_in) +{ + static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51}; + static const char decoding_size = sizeof(decoding); + value_in -= 43; + if (value_in < 0 || value_in >= decoding_size) return -1; + return decoding[(int)value_in]; +} + +void base64_init_decodestate(base64_decodestate* state_in) +{ + state_in->step = step_a; + state_in->plainchar = 0; +} + +int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in) +{ + const char* codechar = code_in; + char* plainchar = plaintext_out; + char fragment; + + *plainchar = state_in->plainchar; + + switch (state_in->step) + { + while (1) + { + case step_a: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_a; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar = (fragment & 0x03f) << 2; + // fall through + case step_b: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_b; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar++ |= (fragment & 0x030) >> 4; + *plainchar = (fragment & 0x00f) << 4; + // fall through + case step_c: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_c; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar++ |= (fragment & 0x03c) >> 2; + *plainchar = (fragment & 0x003) << 6; + // fall through + case step_d: + do { + if (codechar == code_in+length_in) + { + state_in->step = step_d; + state_in->plainchar = *plainchar; + return plainchar - plaintext_out; + } + fragment = (char)base64_decode_value(*codechar++); + } while (fragment < 0); + *plainchar++ |= (fragment & 0x03f); + } + } + /* control should not reach here */ + return plainchar - plaintext_out; +} + +void base64_init_encodestate(base64_encodestate* state_in) +{ + state_in->step = step_A; + state_in->result = 0; + state_in->stepcount = 0; +} + +char base64_encode_value(char value_in) +{ + static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + if (value_in > 63) return '='; + return encoding[(int)value_in]; +} + +int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in) +{ + const char* plainchar = plaintext_in; + const char* const plaintextend = plaintext_in + length_in; + char* codechar = code_out; + char result; + char fragment; + + result = state_in->result; + + switch (state_in->step) + { + while (1) + { + case step_A: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_A; + return codechar - code_out; + } + fragment = *plainchar++; + result = (fragment & 0x0fc) >> 2; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x003) << 4; + // fall through + case step_B: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_B; + return codechar - code_out; + } + fragment = *plainchar++; + result |= (fragment & 0x0f0) >> 4; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x00f) << 2; + // fall through + case step_C: + if (plainchar == plaintextend) + { + state_in->result = result; + state_in->step = step_C; + return codechar - code_out; + } + fragment = *plainchar++; + result |= (fragment & 0x0c0) >> 6; + *codechar++ = base64_encode_value(result); + result = (fragment & 0x03f) >> 0; + *codechar++ = base64_encode_value(result); + + ++(state_in->stepcount); + + #ifdef BASE64_USE_NEWLINES + if (state_in->stepcount == BASE64_CHARS_PER_LINE/4) + { + *codechar++ = '\n'; + state_in->stepcount = 0; + } + #endif + } + } + /* control should not reach here */ + return codechar - code_out; +} + +int base64_encode_blockend(char* code_out, base64_encodestate* state_in) +{ + char* codechar = code_out; + + switch (state_in->step) + { + case step_B: + *codechar++ = base64_encode_value(state_in->result); + *codechar++ = '='; + *codechar++ = '='; + break; + case step_C: + *codechar++ = base64_encode_value(state_in->result); + *codechar++ = '='; + break; + case step_A: + break; + } + #ifdef BASE64_USE_NEWLINES + *codechar++ = '\n'; + #endif + + return codechar - code_out; +} + +// These "one-shot" functions were not in the original project, I have added them and still need to be sure they work + +// note - output MUST be large enough to accomodate the base64'd input (i.e. must be 1/3 bigger than input_len plus the null terminator - 65 bytes for 48-byte input) +void base64_encode_oneshot(char* input, int input_len, char* output){ + base64_encodestate s; + char* c = output; + + base64_init_encodestate(&s); + c += base64_encode_block(input, input_len, output, &s); + c += base64_encode_blockend(c, &s); + *c = '\0'; +} + +// note - output MUST be large enough to accomodate the decoded input (i.e. must be at least 3/4 the size of the input - 48 bytes for 64-byte input) +void base64_decode_oneshot(char* input, int input_len, char* output){ + base64_decodestate s; + + base64_init_decodestate(&s); + base64_decode_block(input, input_len, output, &s); +} \ No newline at end of file diff --git a/base64.h b/base64.h new file mode 100644 index 0000000..4f66413 --- /dev/null +++ b/base64.h @@ -0,0 +1,52 @@ +/* +This is derived from the libb64 project, which has been placed in the public domain. +For details, see http://sourceforge.net/projects/libb64 +*/ + +#ifndef BASE64_H +#define BASE64_H + +#define BASE64_CHARS_PER_LINE 4 +//#define BASE64_USE_NEWLINES + +typedef enum +{ + step_a, step_b, step_c, step_d +} base64_decodestep; + +typedef struct +{ + base64_decodestep step; + char plainchar; +} base64_decodestate; + +void base64_init_decodestate(base64_decodestate* state_in); + +int base64_decode_value(char value_in); + +int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in); + +typedef enum +{ + step_A, step_B, step_C +} base64_encodestep; + +typedef struct +{ + base64_encodestep step; + char result; + int stepcount; +} base64_encodestate; + +void base64_init_encodestate(base64_encodestate* state_in); + +char base64_encode_value(char value_in); + +int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in); + +int base64_encode_blockend(char* code_out, base64_encodestate* state_in); + +void base64_encode_oneshot(char* input, int input_len, char* output); +void base64_decode_oneshot(char* input, int input_len, char* output); + +#endif diff --git a/blindsig2 b/blindsig2 new file mode 100755 index 0000000000000000000000000000000000000000..423c61adc05123a38794cd8517a9877167508e38 GIT binary patch literal 180536 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 +#include +#include +#include +#include "blst/blst.h" + +const byte dst[] = "MY-DST"; +double time_taken; +clock_t t; + +byte signer_private_key[32]; +byte signer_public_key[96]; + +void printbytes(byte *toprint, int length){ + for(int i=0;isk_available + 1; } -int keydump(char* targ_name){ +// Fill a buffer dest of size dest_size with exactly (dest_size - 2) characters and a null terminator, returning 1 if the user supplies any other number +int get_fixed_length(char* dest, size_t dest_size){ + dest[dest_size - 2] = '\0'; // Initialize this place, we're about to need to check it even if fgets never gets here + fgets(dest, dest_size, stdin); + if(dest[dest_size - 2] != '\n') return 1; //If there isn't a newline in the second-last character (i.e. the user specified too many) return 1 + + dest[dest_size - 2] = '\0'; // Cut it down to length and get rid of the newline we're now sure is in the right place + + return 0; +} + +int sign_single(char* targ_name, char* req_b64){ + fstoken_request req; + fstoken_target_descriptor targ; + fstoken_signature sig; + + base64_decode_oneshot((char*) req_b64, 64, (char*) req.id_blind); + + //debug_print_bytes("Signature hex: ", req.id_blind, 48); + + if(get_target(targ_name, &targ) != 2){ + printf("Target or private key unavailable. Are you sure you have a private key for this target?\n"); + return 1; + } + + if(fstoken_sign_request(&req, &sig, &targ)){ + printf("Signing failed. Is the token request valid?\n"); + return 1; + }; + + print_base64(sig.signature, 48); + + return 0; +} + +int interactive_request(char* targ_name, byte* token_id, byte* blinding_factor){ + fstoken_request req; + fstoken_request_descriptor reqdesc; + fstoken_target_descriptor target; + fstoken_signature sig; + fstoken_token token; + char req_base64_encoded[65]; + char sig_base64[66]; + int token_length; + + if(!get_target(targ_name, &target)){ + printf("Invalid target %s\n", targ_name); + return 1; + } + + fstoken_gen_request(&req, &reqdesc, &target, token_id, blinding_factor); + + base64_encode_oneshot((char*) req.id_blind, 48, req_base64_encoded); + + printf("A Token Request Code has been generated. Provide this code to the signer. Once you have received a signature, enter it below to generate your token.\n"); + printf("Token Request Code: %s\n", req_base64_encoded); + printf("Enter your signature: "); + + if(get_fixed_length(sig_base64, sizeof(sig_base64))){ + printf("Invalid signature length\n"); + return 1; + }; + + base64_decode_oneshot(sig_base64, 64, (char*) sig.signature); + + //debug_print_bytes("Signature as hex: ", sig.signature, 48); + + if(fstoken_gen_token(&reqdesc, &sig, &token)){ + printf("Failed to generate token.\n"); + return 1; + }; + + token_length = 48 + (target.idbits + 7) / 8; + + //debug_print_bytes("Token Unblinded Signature: ", token.signature, 48); + //debug_print_bytes("TOKEN: ", &token, token_length); + + printf("\nToken: "); + print_base64(&token, token_length); + + return 0; +} + +int targinfo(char* targ_name){ int targ_status; - target_descriptor target; + fstoken_target_descriptor target; targ_status = get_target(targ_name, &target); @@ -77,12 +165,12 @@ int keydump(char* targ_name){ return 1; case 1: printf("Public Key available - can verify and request for this target\n"); - print_bytes("Public Key: ", target.pk, 96); + print_bytes("Public Key: ", target.pk, 96, '\0'); break; case 2: printf("Secret Key and Public Key available - can verify, request, and sign for this target.\n"); - print_bytes("Secret Key: ", target.sk, 32); - print_bytes("Public Key: ", target.pk, 96); + print_bytes("Secret Key: ", target.sk, 32, '\0'); + print_bytes("Public Key: ", target.pk, 96, '\0'); break; } @@ -91,7 +179,40 @@ int keydump(char* targ_name){ return 0; } -/*int keyrepair(char* target){ +int striptarg(char* targ_name_in, char* targ_name_out){ + FILE *targ_out_file; + fstoken_target_descriptor targ_out; + char* targ_out_path; + + if(!get_target(targ_name_in, &targ_out)){ + printf("Unknown input target. Exiting.\n"); + return 1; + } + + if(targ_out.sk_available == false){ + printf("Target %s already lacks a Secret Key - only targets with Secret Keys can be stripped.\n", targ_name_in); + return 2; + } + + memset(targ_out.sk, 0x00, 32); + targ_out.sk_available = false; + + get_targ_path(targ_name_out, &targ_out_path); + + targ_out_file = fopen(targ_out_path, "w"); + if(!targ_out_file){ + printf("Could not open output target file. Exiting.\n"); + return 1; + } + fwrite(&targ_out, sizeof(fstoken_target_descriptor), 1, targ_out_file); + fclose(targ_out_file); + + printf("Public-Key-only target %s succesfully created from original target %s.\n", targ_name_in, targ_name_out); + + return 0; +} + +/*int keyrepair(char* target){ // this is probably no longer necessary with single-file targets FILE *key_file; byte sk[32]; byte pk[96]; @@ -130,7 +251,7 @@ int keydump(char* targ_name){ int keygen(char* target, byte* ikm, int idbits, int hashbits){ char *targ_path; FILE *targ_file; - target_descriptor targ; + fstoken_target_descriptor targ; debug_print_bytes("IKM: ", ikm, 32); @@ -153,7 +274,7 @@ int keygen(char* target, byte* ikm, int idbits, int hashbits){ printf("Could not open target file. Exiting.\n"); return 1; } - fwrite(&targ, sizeof(targ), 1, targ_file); + fwrite(&targ, sizeof(fstoken_target_descriptor), 1, targ_file); fclose(targ_file); return 0; @@ -179,7 +300,7 @@ int list_targets(bool verbose){ int n, targname_len; struct dirent **files; char *targdir_path, *targ_path, *targ_name; - target_descriptor targ; + fstoken_target_descriptor targ; targdir_path = malloc(strlen(token_path) + 9); if(targdir_path == NULL) return 1; @@ -233,6 +354,14 @@ void bendian_from_hex_string(byte* bendian, char* string, int length){ } } +void lendian_from_hex_string(byte* lendian, char* string, int length){ + char byte[2]; + for(int i = (length-1); i >= 0; i--){ + memcpy(byte, &string[i*2], 2); + lendian[i] = strtol(byte, 0, 16); + } +} + // mostly boring command line parsing int main(int argc, char *argv[]){ token_path = getenv("FEMTOSTAR_TOKEN_PATH"); @@ -259,6 +388,7 @@ int main(int argc, char *argv[]){ if(argc > 5){ printf("Too many arguments. Exiting.\n"); + return(1); } // Make sure there's a target name @@ -292,18 +422,18 @@ int main(int argc, char *argv[]){ return 1; } - bendian_from_hex_string(ikm, argv[4], 64); + lendian_from_hex_string(ikm, argv[4], 32); } return keygen(argv[2], ikm, idbits, hashbits); - }else if(strcmp(argv[1], "keydump") == 0){ + }else if(strcmp(argv[1], "info") == 0){ // Make sure there's a target name if(argc < 3){ - fprintf(stderr, "A target name must be provided, e.g. %s keydump [targ]\n", argv[0]); + fprintf(stderr, "A target name must be provided, e.g. %s info [targ]\n", argv[0]); return(1); } - return keydump(argv[2]); + return targinfo(argv[2]); }/*else if(strcmp(argv[1], "keyrepair") == 0){ // Make sure there's a target name if(argc < 3){ @@ -312,5 +442,64 @@ int main(int argc, char *argv[]){ } return keyrepair(argv[2]); - }*/ + }*/else if(strcmp(argv[1], "strip") == 0){ + // Make sure there's a target name + if(argc < 4){ + fprintf(stderr, "Two target names must be provided, e.g. %s strip [targin] [targout]\n", argv[0]); + return(1); + } + + return striptarg(argv[2], argv[3]); + }else if(strcmp(argv[1], "ireq") == 0){ + byte blinding_factor[32]; + byte token_id[IDBYTES_MAX]; + + // Make sure there's a target name + if(argc < 3){ + fprintf(stderr, "A target name must be provided, e.g. %s req [targ]\n", argv[0]); + return(1); + } + + if(argc > 5){ + printf("Too many arguments. Exiting.\n"); + return(1); + } + + if(argc < 4){ + getrandom(token_id, IDBYTES_MAX, GRND_NONBLOCK); + }else{ + if(strlen(argv[3]) > (IDBYTES_MAX * 2)){ + fprintf(stderr, "If providing a Token ID, it must be %i bits (%i hexadecimal digits) or less \n", IDBITS_MAX, IDBYTES_MAX * 2); + return 1; + } + + lendian_from_hex_string(token_id, argv[3], (strlen(argv[3]) + 1) / 2); + } + + // If no IKM is provided, use the system true randomness source + if(argc < 5){ + getrandom(blinding_factor, 32, GRND_NONBLOCK); + }else{ + if(strlen(argv[4]) != 64){ + fprintf(stderr, "If providing a blinding factor, it must be 32 bytes (64 hexadecimal digits)\n"); + return 1; + } + + lendian_from_hex_string(blinding_factor, argv[4], 32); + } + + return interactive_request(argv[2], token_id, blinding_factor); + }else if(strcmp(argv[1], "sign") == 0){ + if(argc != 4){ + fprintf(stderr, "Please provide a target [targ] and a Token Request Code [req]. See help.\n"); + return 1; + } + + if(strlen(argv[3]) != 64){ + fprintf(stderr, "Token request code must be 48 bytes (64 base64 characters).\n"); + return 1; + } + + sign_single(argv[2], argv[3]); + } } \ No newline at end of file diff --git a/debugprint.c b/debugprint.c index fb885c2..8f1be37 100644 --- a/debugprint.c +++ b/debugprint.c @@ -1,18 +1,34 @@ #include +#include #include "debugprint.h" #include "blst/blst.h" +#include "base64.h" -void print_bytes(const char* label, void *toprint, int length){ +void print_bytes(const char* label, void *toprint, int length, char separator){ printf("%s", label); for(int i=0;iidbits + 7)/8; + + //printf("IDBYTES_MAX: %i, IDBYTES for target: %i\n", IDBYTES_MAX, targ_idbytes); + + memcpy(&reqdesc->blinding_factor, blinding_factor, 32); + + bit_truncated_copy(token_id, reqdesc->token_id, IDBYTES_MAX, target->idbits); //cut down the supplied token ID to match the target's IDBITS value + + //debug_print_bytes("Working with ID: ", reqdesc->token_id, IDBYTES_MAX); + //debug_print_bytes("Working with Blinding Factor: ", blinding_factor, 32); + + // Hash the Token ID to a BLST P1 + blst_hash_to_g1(&hash, token_id, targ_idbytes, FSTOKEN_DST, strlen((char *) FSTOKEN_DST), target->pk, 96); + + // Get the blinding factor as a BLST scalar + blst_scalar_from_bendian(&blinding_r, blinding_factor); + + blst_p1_serialize(debug_print_buf, &hash); + //debug_print_bytes("HASH: ", debug_print_buf, 96); + + // Sign the hash as if the blinding factor was a private key + blst_sign_pk_in_g2(&blinded_id, &hash, &blinding_r); + + // Compress the resulting signature and put it in the signature request + blst_p1_compress(req->id_blind, &blinded_id); + + //debug_print_bytes("Blinded and compressed for wire: ", req->id_blind, 48); +} + +int fstoken_sign_request(fstoken_request* req, fstoken_signature* sig, fstoken_target_descriptor* targ){ + blst_scalar sk; + blst_p1 req_id, signature; + blst_p1_affine req_id_affine; + + // get the secret key as a scalar + blst_scalar_from_bendian(&sk, targ->sk); + + // Deserialize the request - it's already a serialized P1 point, we don't need to (literally) rehash it + blst_p1_uncompress(&req_id_affine, req->id_blind); + + // i do not know why deserializing always gives you affine points + blst_p1_from_affine(&req_id, &req_id_affine); + + // Return 1 if the point isn't in G1, this is basically a sanity check + if(!blst_p1_in_g1(&req_id)) return 1; + + // sign with it + blst_sign_pk_in_g2(&signature, &req_id, &sk); + + // Compress and print the signature + blst_p1_compress(sig->signature, &signature); + + //debug_print_bytes("Compressed signature:", sig->signature, 48); + + return 0; +} + +int fstoken_gen_token(fstoken_request_descriptor* req, fstoken_signature* sig, fstoken_token* token){ + blst_p1 returned_signature, unblinded_signature; + blst_p1_affine returned_signature_affine; + blst_scalar blinding_r, inverse_r; + + // We now have the signature back. returned_signature is a blst_p1_affine because this is pk_in_g2. + blst_p1_uncompress(&returned_signature_affine, sig->signature); + + // Convert the decompressed returned signature from an affine to a P1 + blst_p1_from_affine(&returned_signature, &returned_signature_affine); + + // Confirm the signature point is in the G1 group + if(!blst_p1_in_g1(&returned_signature)) return 1; + + // Retreive the blinding factor and take its inverse + blst_scalar_from_bendian(&blinding_r, req->blinding_factor); + blst_sk_inverse(&inverse_r, &blinding_r); + + //print_scalar("Inverse R: ", &inverse_r); + + // Unblind the signature using the inverse of the blinding factor + blst_sign_pk_in_g2(&unblinded_signature, &returned_signature, &inverse_r); + + memcpy(token->token_id, req->token_id, IDBYTES_MAX); + blst_p1_compress(token->signature, &unblinded_signature); + + return 0; +} + +void bit_truncated_copy(byte* src, byte* dest, size_t destlen, int bits){ + uint8_t bitmask; + int bytes; + + bytes = (bits + 7) / 8; + + memset(dest, 0, destlen); //clear out the destination + memcpy(dest, src, bytes); //copy over as many bytes as are needed for the number of bits + + //bitmask out the high (fsp is little-endian) bits of the destination if bits is not a round number of bytes + bitmask = 0xFF >> (bits % 8); + //printf("mask: 0x%0x\n", bitmask); + dest[bytes - 1] = dest[bytes - 1] & bitmask; } \ No newline at end of file diff --git a/fstoken.h b/fstoken.h index 9261bba..a888ba3 100644 --- a/fstoken.h +++ b/fstoken.h @@ -3,16 +3,33 @@ #include "blst/blst.h" #include #include +#include +// only used for debugging +#include +#include "debugprint.h" + +// Note: In constrained environments where the IDBITS and HASHBITS values of the tokens in use are known, such as in fsp, these can be set exactly. +// However, that may render some structs (such as the request descriptor) incompatible if moved to an environment where this is nonstandard. #define IDBITS_DEFAULT 128 #define IDBITS_MAX 256 #define HASHBITS_DEFAULT 256 #define HASHBITS_MAX 256 +#define IDBYTES_MAX (IDBITS_MAX + 7) / 8 +#define HASHBYTES_MAX (HASHBITS_MAX + 7) / 8 + +#define FSTOKEN_DST ((byte*) "MY-DST") + // For efficiency's sake, structs intended for use with the FemtoStar Protocol must be strictly-aligned without padding, with little-endian byte ordering. // This avoids wasting network capacity on padding, and avoids the performance impact of reordering on most modern platforms (most importantly x86 and RISC-V) // while ensuring compatibility with strict-alignment architectures. Take note: This is NOT typical network-order! +// Additionally, note that most structs do not explicitly include what target they are for (even the target descriptor!). Keeping what is for what target is +// not a core part of fstoken, and is the responsibility of the software using fstoken (e.g. ctm or an implementation of fsp). This keeps tokens light in +// situations where which target is relevant is unambiguous (e.g. in the session setup with a satellite, where the satellite is always the same target). + +// A target_descriptor is a stored description of a target, which can be used to request, verify, and sometimes sign tokens for it. typedef struct{ #pragma scalar_storage_order little-endian @@ -22,9 +39,42 @@ typedef struct{ uint16_t hashbits; byte sk[32]; byte pk[96]; -} target_descriptor; +} fstoken_target_descriptor; + +// A request descriptor is a structure held privately by the requester until they receive a signature for their request - it is then used to generate a token +typedef struct{ + #pragma scalar_storage_order little-endian + + byte blinding_factor[32]; + byte token_id[IDBYTES_MAX]; +} fstoken_request_descriptor; + +// A request is a structure sent by the requester to the signer, to be signed and a signature returned. It need not be kept private. +typedef struct{ + #pragma scalar_storage_order little-endian + + byte id_blind[48]; +} fstoken_request; + +// I'm unsure if these "single-item structs" make any sense - signatures in blst are independent of system or scalar_storage_order endianness anyway +typedef struct{ + #pragma scalar_storage_order little-endian + + byte signature[48]; +} fstoken_signature; + +typedef struct{ + #pragma scalar_storage_order little-endian + + byte signature[48]; + byte token_id[IDBYTES_MAX]; +} fstoken_token; void fstoken_keygen(byte* ikm, byte* sk_byte, byte* pk_byte); void fstoken_get_pk_from_sk(byte* sk_byte, byte* pk_byte); +void bit_truncated_copy(byte* src, byte* dest, size_t destlen, int bits); +void fstoken_gen_request(fstoken_request* req, fstoken_request_descriptor* reqdesc, fstoken_target_descriptor* target, byte* token_id, byte* blinding_factor); +int fstoken_sign_request(fstoken_request* req, fstoken_signature* sig, fstoken_target_descriptor* targ); +int fstoken_gen_token(fstoken_request_descriptor* req, fstoken_signature* sig, fstoken_token* token); #endif \ No newline at end of file