Example #1
0
int get_key(char *keyfile, fenc_context *context, fenc_key *secret_key)
{
	FENC_ERROR result;
	char *keyfile_buf = NULL;
	size_t key_len;
	FILE *fp;
	fp = fopen(keyfile, "r");
	if(fp != NULL) {
		if((key_len = read_file(fp, &keyfile_buf)) > 0) {
			// printf("\nYour private-key:\t'%s'\n", keyfile_buf);
			size_t keyLength;
			uint8 *bin_keyfile_buf = NewBase64Decode((const char *) keyfile_buf, key_len, &keyLength);
			
#ifdef DEBUG
			/* base-64 decode user's private key */
			printf("Base-64 decoded buffer:\t");
			print_buffer_as_hex(bin_keyfile_buf, keyLength);
#endif			
			result = libfenc_import_secret_key(context, secret_key, bin_keyfile_buf, keyLength);
			report_error("Importing secret key", result);
			free(keyfile_buf);
			free(bin_keyfile_buf);
		}			
	}
	else {
		fprintf(stderr, "Could not load input file: %s\n", keyfile);
		return FALSE;
	}
	fclose(fp);
	
	return TRUE;
}
Example #2
0
Bool abe_decrypt(FENC_SCHEME_TYPE scheme, char *public_params, char *inputfile, char *keyfile)
{
	FENC_ERROR result;
	fenc_context context;
	fenc_group_params group_params;
	fenc_global_params global_params;
	fenc_ciphertext ciphertext;
	fenc_plaintext aes_session_key;
	pairing_t pairing;
	fenc_key secret_key;
	FILE *fp;
	char c;
	int pub_len = 0;
	size_t serialized_len = 0;
	char public_params_buf[SIZE];
	int magic_failed;
	/* Clear data structures. */
	memset(&context, 0, sizeof(fenc_context));
	memset(&group_params, 0, sizeof(fenc_group_params));
	memset(&global_params, 0, sizeof(fenc_global_params));	
	memset(&ciphertext, 0, sizeof(fenc_ciphertext));
	memset(&aes_session_key, 0, sizeof(fenc_plaintext));
	memset(&secret_key, 0, sizeof(fenc_key));
	// all this memory must be free'd 
	char *input_buf = NULL,*keyfile_buf = NULL;
	char *aes_blob64 = NULL, *abe_blob64 = NULL, *iv_blob64 = NULL;
	ssize_t input_len, key_len;
	
	/* Load user's input file */
	fp = fopen(inputfile, "r");
	if(fp != NULL) {
		if((input_len = read_file(fp, &input_buf)) > 0) {
			// printf("Input file: %s\n", input_buf);
			tokenize_inputfile(input_buf, &abe_blob64, &aes_blob64, &iv_blob64);
			debug("abe ciphertext = '%s'\n", abe_blob64);
			debug("init vector = '%s'\n", iv_blob64);
			debug("aes ciphertext = '%s'\n", aes_blob64);
			free(input_buf);
		}
	}
	else {
		fprintf(stderr, "Could not load input file: %s\n", inputfile);
		return FALSE;
	}
	fclose(fp);
	
	/* make sure the abe and aes ptrs are set */
	if(aes_blob64 == NULL || abe_blob64 == NULL || iv_blob64 == NULL) {
		fprintf(stderr, "Input file either not well-formed or not encrypted.\n");
		return FALSE;
	}
	
	/* Initialize the library. */
	result = libfenc_init();
	/* Create a Sahai-Waters context. */
	result = libfenc_create_context(&context, scheme);	
	/* Load group parameters from a file. */
	fp = fopen(PARAM, "r");
	if (fp != NULL) {
		libfenc_load_group_params_from_file(&group_params, fp);
		libfenc_get_pbc_pairing(&group_params, pairing);
	} else {
		perror("Could not open "PARAM" parameters file");
		return FALSE;
	}
	fclose(fp);
	
	/* Set up the global parameters. */
	result = context.generate_global_params(&global_params, &group_params);
	report_error("Loading global parameters", result);
	
	result = libfenc_gen_params(&context, &global_params);
	report_error("Generating scheme parameters and secret key", result);
	
	/* read public parameters file */
	fp = fopen(public_params, "r");
	if(fp != NULL) {
		while (TRUE) {
			c = fgetc(fp);
			if(c != EOF) {
				// statically allocated to prevent memory leaks
				public_params_buf[pub_len] = c;
				pub_len++;
			}
			else {
				break;
			}
		}
	}
	else {
		fprintf(stderr, "Could not load input file: %s\n", public_params);
		return FALSE;
	}
	fclose(fp);

	debug("public params input = '%s'\n", public_params_buf);
	
	/* base-64 decode public parameters */
	uint8 *bin_public_buf = NewBase64Decode((const char *) public_params_buf, pub_len, &serialized_len);
	// printf("public params binary = '%s'\n", bin_public_buf);
	
	/* Import the parameters from binary buffer: */
	result = libfenc_import_public_params(&context, bin_public_buf, serialized_len);
	report_error("Importing public parameters", result);
	
	/* read input key file */ // (PRIVATE KEY)
	debug("keyfile => '%s'\n", keyfile);
	fp = fopen(keyfile, "r");
	if(fp != NULL) {
		if((key_len = read_file(fp, &keyfile_buf)) > 0) {
			// printf("\nYour private-key:\t'%s'\n", keyfile_buf);
			size_t keyLength;
			uint8 *bin_keyfile_buf = NewBase64Decode((const char *) keyfile_buf, key_len, &keyLength);

			/* base-64 decode user's private key */
			debug("Base-64 decoded buffer:\t");
			print_buffer_as_hex(bin_keyfile_buf, keyLength);

			result = libfenc_import_secret_key(&context, &secret_key, bin_keyfile_buf, keyLength);
			report_error("Importing secret key", result);
			free(keyfile_buf);
		}			
	}
	else {
		fprintf(stderr, "Could not load input file: %s\n", keyfile);
		/* clear allocated possibly allocated memory */
		return FALSE;
	}
	fclose(fp);	

	size_t abeLength;
	uint8 *data = NewBase64Decode((const char *) abe_blob64, strlen(abe_blob64), &abeLength);
	ciphertext.data = data;
	ciphertext.data_len = abeLength;
	ciphertext.max_len = abeLength;	
	
	/* Descrypt the resulting ciphertext. */
	result = libfenc_decrypt(&context, &ciphertext, &secret_key, &aes_session_key);
	report_error("Decrypting the ciphertext", result);
	
	debug("Decrypted session key is: ");
	print_buffer_as_hex(aes_session_key.data, aes_session_key.data_len);

	/* decode the iv_blob64 */
	size_t ivLength;
	char *ivec = NewBase64Decode((const char *) iv_blob64, strlen(iv_blob64), &ivLength);
	debug("IV: ");
	print_buffer_as_hex((uint8 *) ivec, AES_BLOCK_SIZE);

	/* decode the aesblob64 */
	size_t aesLength;
	char *aesblob = NewBase64Decode((const char *) aes_blob64, strlen(aes_blob64), &aesLength);
	
	/* use the PSK to encrypt using openssl functions here */
	AES_KEY sk;
	char aes_result[aesLength+1];
	AES_set_decrypt_key((uint8 *) aes_session_key.data, 8*SESSION_KEY_LEN, &sk);

	memset(aes_result, 0, aesLength+1);
	AES_cbc_encrypt((uint8 *) aesblob, (uint8 *) aes_result, aesLength, &sk, (uint8 *) ivec, AES_DECRYPT);
	/* base-64 both ciphertext and write to the stdout -- in XML? */
	
	char magic[strlen(MAGIC)+1];
	memset(magic, 0, strlen(MAGIC)+1);
	strncpy(magic, aes_result, strlen(MAGIC));
	
	if(strcmp(magic, MAGIC) == 0) {
		debug("Recovered magic: '%s'\n", magic);
		debug("Plaintext: %s\n", (char *) (aes_result + strlen(MAGIC)));
		magic_failed = FALSE;
	}
	else {
		fprintf(stderr, "ERROR: ABE decryption unsuccessful!!\n");
		magic_failed = TRUE;
	}
	
	/* free allocated memory */
	free(aesblob);
	free(aes_blob64);
	free(ivec);
	free(iv_blob64);
	free(data);
	free(abe_blob64);

	/* Destroy the context. */
	result = libfenc_destroy_context(&context);
	report_error("Destroying the encryption context", result);	
	
	/* Shutdown the library. */
	result = libfenc_shutdown();
	report_error("Shutting down library", result);
	return magic_failed;
}
Example #3
0
int gen_ukeys(FENC_SCHEME_TYPE scheme, char *g_params, char *public_params, char *uskfile ,char *upkfile) {
	FENC_ERROR result;
	fenc_context context;
	fenc_group_params group_params;
	fenc_global_params global_params;
	pairing_t pairing;
	FILE *fp;
	int c;
	size_t serialized_len = 0;
	size_t pub_len = 0;
	uint8 public_params_buf[SIZE];
	uint8 *uskBuffer = NULL;
	uint8 *upkBuffer = NULL;
	fenc_USK_KSFCP usk;
	fenc_UPK_KSFCP upk;
	size_t usk_len = 0, b64_usk_len = 0;
	size_t upk_len = 0, b64_upk_len = 0;

	/* Clear data structures. */
	memset(&context, 0, sizeof(fenc_context));
	memset(&group_params, 0, sizeof(fenc_group_params));
	memset(&global_params, 0, sizeof(fenc_global_params));
	memset(&public_params_buf, 0, SIZE);
	memset(&usk, 0, sizeof(fenc_USK_KSFCP));
	memset(&upk, 0, sizeof(fenc_UPK_KSFCP));

	/* Initialize the library. */
	result = libfenc_init();
	report_error("Initializing library", result);

	// insert code here...
	debug("Generating master ABE system parameters...\n");
	/* Create a Sahai-Waters context. */
	result = libfenc_create_context(&context, scheme);

	/* Load group parameters from a file. */
	fp = fopen(g_params, "r");
	if (fp != NULL) {
		libfenc_load_group_params_from_file(&group_params, fp);
		libfenc_get_pbc_pairing(&group_params, pairing);
	} else {
		perror("Could not open parameters file.\n");
		goto cleanup;
	}
	fclose(fp);

	/* Set up the global parameters. */
	result = context.generate_global_params(&global_params, &group_params);
	report_error("Loading global parameters", result);

	result = libfenc_gen_params(&context, &global_params);
	report_error("Generating scheme parameters and secret key", result);

	debug("Reading the public parameters file = %s\n", public_params);
	/* read file */
	fp = fopen(public_params, "r");
	if(fp != NULL) {
		while (TRUE) {
			c = fgetc(fp);
			if(c != EOF) {
				public_params_buf[pub_len] = c;
				pub_len++;
			}
			else {
				break;
			}
		}
	}
	else {
		perror("File does not exist.\n");
		return -1;
	}
	fclose(fp);

	//debug("public params input = '%s'\n", public_params_buf);

	/* base-64 decode */
	uint8 *bin_public_buf = NewBase64Decode((const char *) public_params_buf, pub_len, &serialized_len);
	/* Import the parameters from binary buffer: */
	result = libfenc_import_public_params(&context, bin_public_buf, serialized_len);
	report_error("Importing public parameters", result);

	result = libfenc_gen_ukey_KSFCP(&context, &usk, &upk);

	uskBuffer = (uint8 *) malloc(KEYSIZE_MAX);
	memset(uskBuffer, 0, KEYSIZE_MAX);
	upkBuffer = (uint8 *) malloc(KEYSIZE_MAX);
	memset(upkBuffer, 0, KEYSIZE_MAX);

	debug("Generating USK...\n");

	result = libfenc_export_usk_KSFCP(&context, &usk, uskBuffer, KEYSIZE_MAX, &usk_len);
	if(result != FENC_ERROR_NONE) {
		report_error("Generating USK error!", result);
		return result;
	}

	/* base-64 encode the key and write to disk */
	char *b64_usk_buf = NewBase64Encode(uskBuffer, usk_len, FALSE, &b64_usk_len);
	fp = fopen(uskfile, "w");
	if(fp != NULL) {
		fprintf(fp, "%s", b64_usk_buf);
	}
	fclose(fp);

	debug("Generating UPK...\n");

	result = libfenc_export_upk_KSFCP(&context, &upk, upkBuffer, KEYSIZE_MAX, &upk_len);
	if(result != FENC_ERROR_NONE) {
		report_error("Generating UPK error!", result);
		return result;
	}

	/* base-64 encode the key and write to disk */
	char *b64_upk_buf = NewBase64Encode(upkBuffer, upk_len, FALSE, &b64_upk_len);
	fp = fopen(upkfile, "w");
	if(fp != NULL) {
		fprintf(fp, "%s", b64_upk_buf);
	}
	fclose(fp);

cleanup:
	/* Destroy the context. */
	result = libfenc_destroy_context(&context);
	report_error("Destroying context", result);

	/* Shutdown the library. */
	result = libfenc_shutdown();
	report_error("Shutting down library", result);

	free(bin_public_buf);
	free(uskBuffer);
	free(upkBuffer);
	free(b64_usk_buf);
	free(b64_upk_buf);
	return 0;
}
Example #4
0
int tfel_decrypt_cp(char *inputfile, char *keyfile, char *output) {
    int i;
    FILE *fp;
    //pubkey input //共通
    tfel_pubkey *pubkey = NULL;
    pubkey = (tfel_pubkey*)malloc(sizeof(tfel_pubkey));
    if (pubkey == NULL) return -1;
    tfel_param_G *param_G;
    param_G = (tfel_param_G*)malloc(sizeof(tfel_param_G));
    if (param_G == NULL) {
        tfel_clear_pk(pubkey->num_att, pubkey);
        free(pubkey);
        return -1;
    }
    memset(param_G, 0, sizeof(tfel_param_G));
    pairing_init(param_G->p, CURVE);
    importpub(pubkey, *param_G);
    //pubkey input
    
    
    //sk_Gamma input //CP
    secretkey sk_Gamma;
    sk_Gamma.sk_Delta = (attribute_set*)malloc(sizeof(attribute_set));
    sk_Gamma.sk_AS = NULL;
    sk_Gamma.sk_kStar = (basis*)malloc(sizeof(basis));
    import_sk(sk_Gamma.sk_Delta, sk_Gamma.sk_kStar, *param_G, keyfile);
    //sk_Gamma input

    
    //ciphertext input //共通
    char *input_buf = NULL;//,*keyfile_buf = NULL;
    char *aes_blob64 = NULL, *abe_blob64 = NULL, *iv_blob64 = NULL;
    ssize_t input_len;
    size_t key_len;
    
    fp = fopen(inputfile, "r");
    if(fp != NULL) {
        if((input_len = read_file(fp, &input_buf)) > 0) {
            tokenize_inputfile(input_buf, &abe_blob64, &aes_blob64, &iv_blob64);
            if(aes_blob64 == NULL || abe_blob64 == NULL || iv_blob64 == NULL) {
                fprintf(stderr, "Input file either not well-formed or not encrypted.\n");
                
                fclose(fp);
                return -1;
            }
            
            free(input_buf);
        }
    }
    else {
        fprintf(stderr, "Could not load input file: %s\n", inputfile);
        return FALSE;
    }
    fclose(fp);
    //ciphertext input
    
    //decode ciphertext //共通
    tfel_ciphertext ct;
    memset(&ct, 0, sizeof(tfel_ciphertext));
    size_t abeLength;
    unsigned char *data = NewBase64Decode((const char *) abe_blob64, strlen(abe_blob64), &abeLength);
    ct.data = data;
    ct.data_len = abeLength;
    ct.max_len = abeLength;
    //decode ciphertext
    
    //deserialize ciphertext
    /*printf("abe_blob64 = %zd\n", strlen(abe_blob64));
     printf("abeLength = %zd\n", abeLength);
     printf("ct.data = %s\n", ct.data);
     printf("ct.data_len = %zd\n", ct.data_len);
     printf("ct.max_len = %zd\n", ct.max_len);*/
    
    basis *c_i = NULL;
    c_i = (basis*)malloc(sizeof(basis));
    if (c_i == NULL){
        //error処理
    }

    AccessStructure *AS = NULL;
    AS = (AccessStructure*)malloc(sizeof(AccessStructure));
    tfel_deserialize_ciphertext_cp(AS, c_i, ct.data, ct.max_len, param_G->p);
    
    //deserialize ciphertext
    
    
    
    //decode iv
    size_t ivLength;
    char *ivec = NewBase64Decode((const char *) iv_blob64, strlen(iv_blob64), &ivLength);
    //debug("IV: ");
    //print_buffer_as_hex((uint8 *) ivec, AES_BLOCK_SIZE);
    //decode iv
    
    //decode aes
    /* decode the aesblob64 */
    size_t aesLength;
    char *aesblob = NewBase64Decode((const char *) aes_blob64, strlen(aes_blob64), &aesLength);
    //printf("sizeof(aesblob) = %zd\n", aesLength);
    //decode aes
    
    
    
    //拡大係数行列のチェック
    printf("check\n");
    AccessStructure *aAS;

    aAS = check_attribute_to_matrix(sk_Gamma.sk_Delta, AS); //errorならNULLを返す
    
    
    //alpha_iを生成
    mpz_t order;
    mpz_init(order);
    mpz_set(order, *pairing_get_order(param_G->p));
    mpz_t *alpha_i;
    mpz_t temp;
    mpz_init(temp);
    Element *K;
    Element *temp_E;
    Element temp_0;
    element_init(temp_0, param_G->p->g3);

    alpha_i = calc_alpha_i(aAS, order);
    
    
    
    rho_i *r_ptr;
    r_ptr = aAS->rho;
    
    int t; //search_tで使用
    
    for (i = 0; i < aAS->num_policy+1; i++) { //generate K
        if (i == 0) {
            K = pairing_c_k(param_G->p, NULL, c_i->M[0], sk_Gamma.sk_kStar->M[0], NULL);
        }
        else {
            t = search_t(r_ptr, sk_Gamma.sk_Delta); //r_ptrからtを持ってくる関数
            temp_E = pairing_c_k(param_G->p, r_ptr, c_i->M[i], sk_Gamma.sk_kStar->M[t], &alpha_i[i-1]);
            //temp_E = pairing_c_k(param_G->p, r_ptr, c_i->M[t], sk_Gamma.sk_kStar->M[i], &alpha_i[i-1]);
            
            element_mul(temp_0, *temp_E, *K);
            element_set(*K, temp_0);
            element_clear(*temp_E);
            free(temp_E);
            r_ptr = r_ptr->next;
        }
    }
    //printf("K generate\n");
    
    
    //Kのバイト列を16ビットのハッシュに
    key_len = element_get_oct_length(*K); // size of K
    unsigned char *K_oct;
    K_oct = (unsigned char*)malloc(sizeof(unsigned char)*key_len);
    element_to_oct(K_oct, &key_len, *K); // bytes of K
    
    unsigned char *session_key;
    session_key = (unsigned char *)malloc(sizeof(unsigned char)*16);
    //int d_len;
    
    hash_to_bytes(K_oct, key_len, SESSION_KEY_LEN, session_key, 2);
    //Kのバイト列を16ビットのハッシュに
    
    //復号
    AES_KEY sk;
    //char aes_result[aesLength+1];
    char *aes_result;
    aes_result = (char*)malloc(sizeof(char)*aesLength+1);
    AES_set_decrypt_key((uint8 *) session_key, 8*SESSION_KEY_LEN, &sk);
    memset(aes_result, 0, aesLength+1);
    AES_cbc_encrypt((uint8 *) aesblob, (uint8 *) aes_result, aesLength, &sk, (uint8 *) ivec, AES_DECRYPT);
    char magic[strlen(MAGIC)+1];
    memset(magic, 0, strlen(MAGIC)+1);
    strncpy(magic, aes_result, strlen(MAGIC));
    
    
    if(strcmp(magic, MAGIC) == 0) {
        //printf("Recovered magic: '%s'\n", magic);
        //printf("Plaintext: %s\n", (char *) (aes_result + strlen(MAGIC)));
        if ((fp = fopen(output, "w")) == NULL) {
            fprintf(stderr, "output open error\n");
        }
        else {
            fprintf(fp, "%s\n", (char*)(aes_result + strlen(MAGIC)));
            fclose(fp);
        }
        //magic_failed = FALSE;
    }
    else {
        printf("error decryption\n");
        //printf(stderr, "ERROR: ABE decryption unsuccessful!!\n");
        //magic_failed = TRUE;
    }
    //復号
    
    free(aesblob);
    free(aes_blob64);
    free(ivec);
    free(iv_blob64);
    free(data);
    free(abe_blob64);
    free(aes_result);
    //free(&input_buf);
    free(session_key);
    free(K_oct);
    element_clear(*K);
    free(K);
    if (aAS != NULL) {
        for (i = 0; i < aAS->S->row; i++) {
            mpz_clear(alpha_i[i]);
        }
        free(alpha_i);
        AccessStructure_clear(aAS);//error
    }
    element_clear(temp_0);
    mpz_clear(order);
    mpz_clear(temp);
    
    for (i = 0; i < c_i->dim; i++) { //memsetとか追加?
        free(c_i->M[i]);
    }
    free(c_i->M);
    free(c_i);
    
    Spanprogram_clear(AS->S);
    free(AS);
    
    //AccessStructure_clear(AS);//すでにAS->rhoがAccessStructure_clear(aAS)により解放されているため
    
    return 0;
}
void generate_keys(char *outfile, FENC_SCHEME_TYPE scheme, char *secret_params, char *public_params)
{
	FENC_ERROR result;
	fenc_context context;
	fenc_group_params group_params;
	fenc_global_params global_params;
	fenc_function_input func_object_input; // could be policy or list
	pairing_t pairing;
	fenc_key key;
	fenc_key key2;
	FILE *fp;
	char c;
	size_t pub_len = 0, sec_len = 0;
	size_t serialized_len = 0;
	uint8 public_params_buf[SIZE];
	uint8 secret_params_buf[SIZE];
	// char session_key[SESSION_KEY_LEN];
	uint8 output_str[SIZE];
	size_t output_str_len = 0;
	// size_t session_key_len;
	
	/* Clear data structures. */
	memset(&context, 0, sizeof(fenc_context));
	memset(&group_params, 0, sizeof(fenc_group_params));
	memset(&global_params, 0, sizeof(fenc_global_params));	
	memset(&public_params_buf, 0, SIZE);
	memset(&secret_params_buf, 0, SIZE);
	memset(output_str, 0, SIZE);
	/* stores user's authorized attributes */
	memset(&func_object_input, 0, sizeof(fenc_function_input));
	/* stores the user's private key */
	memset(&key, 0, sizeof(fenc_key)); 
	memset(&key2, 0, sizeof(fenc_key));

	/* Initialize the library. */
	result = libfenc_init();
	/* Create a Sahai-Waters context. */
	result = libfenc_create_context(&context, scheme);
			
	/* Load group parameters from a file. */
	fp = fopen(PARAM, "r");
	if (fp != NULL) {
		libfenc_load_group_params_from_file(&group_params, fp);
		libfenc_get_pbc_pairing(&group_params, pairing);
	} else {
		perror("Could not open parameters file.\n");
		return;
	}
	fclose(fp);
	
	/* Set up the global parameters. */
	result = context.generate_global_params(&global_params, &group_params);
	report_error("Loading global parameters", result);
	
	result = libfenc_gen_params(&context, &global_params);
	report_error("Generating scheme parameters and secret key", result);
		
	printf("Reading the public parameters file = %s\n", public_params);	
	/* read file */
	fp = fopen(public_params, "r");
	if(fp != NULL) {
		while (TRUE) {
			c = fgetc(fp);
			if(c != EOF) {
				public_params_buf[pub_len] = c;
				pub_len++;
			}
			else {
				break;
			}
		}
	}
	else {
		perror("File does not exist.\n");
		return;
	}
	fclose(fp);

	printf("Reading the secret parameters file = %s\n", secret_params);	
	/* read file */
	fp = fopen(secret_params, "r");
	if(fp != NULL) {
		while (TRUE) {
			c = fgetc(fp);
			if(c != EOF) {
				secret_params_buf[sec_len] = c;
				sec_len++;
			}
			else {
				break;
			}
		}
	}
	else {
		perror("File does not exist.\n");
		return;
	}	
	fclose(fp);
	
	printf("public params input = '%s'\n", public_params_buf);
	printf("secret params input = '%s'\n", secret_params_buf);
	
	/* base-64 decode */
	uint8 *bin_public_buf = NewBase64Decode((const char *) public_params_buf, pub_len, &serialized_len);
	/* Import the parameters from binary buffer: */
	result = libfenc_import_public_params(&context, bin_public_buf, serialized_len);
	report_error("Importing public parameters", result);

	uint8 *bin_secret_buf = NewBase64Decode((const char *) secret_params_buf, sec_len, &serialized_len);
	result = libfenc_import_secret_params(&context, bin_secret_buf, serialized_len, NULL, 0);
	report_error("Importing secret parameters", result);
	
	if(scheme == FENC_SCHEME_LSW) {
		fenc_create_func_input_for_policy(policy_string, &func_object_input);
		debug_print_policy((fenc_attribute_policy *)(func_object_input.scheme_input));
		free(policy_string);
	}
	else if(scheme == FENC_SCHEME_WATERSCP || scheme == FENC_SCHEME_WATERSSIMPLECP) {
		fenc_create_func_input_for_attributes(attribute_string, &func_object_input);
		debug_print_attribute_list((fenc_attribute_list*)(func_object_input.scheme_input));
		free(attribute_string);
	}
		
	result = libfenc_extract_key(&context, &func_object_input, &key);
	report_error("Extracting a decryption key", result);

	uint8 *buffer = malloc(KEYSIZE_MAX);
	memset(buffer, 0, KEYSIZE_MAX);	
	result = libfenc_export_secret_key(&context, &key, buffer, KEYSIZE_MAX, &serialized_len);
	report_error("Exporting key", result);
	
	size_t keyLength;
	char *secret_key_buf = NewBase64Encode(buffer, serialized_len, FALSE, &keyLength);
	// printf("Your secret-key:\t'%s'\nKey-len:\t'%zd'\n", secret_key_buf, serialized_len);	
	
	fp = fopen(outfile, "w");
	if(fp != NULL) {
		fprintf(fp, "%s", secret_key_buf);
	}
	else {
		perror("Error writing private key.");
	}
	fclose(fp);

	/*
	printf("........Confirming contents of exported key......\n");
	printf("Buffer contents:\n");
	print_buffer_as_hex(buffer, serialized_len);

	if(scheme == FENC_SCHEME_LSW) {
		result = libfenc_import_secret_key(&context, &key2, buffer, serialized_len);
		report_error("Import secret key", result);
	
		fenc_key_LSW *myKey2 = (fenc_key_LSW *) key2.scheme_key;
	
		size_t serialized_len2;
		uint8 *buffer2 = malloc(KEYSIZE_MAX);
		memset(buffer2, 0, KEYSIZE_MAX);
		result = libfenc_serialize_key_LSW(myKey2, buffer2, KEYSIZE_MAX, &serialized_len2);		
		report_error("Serialize user's key", result);
	
		printf("Key-len2: '%zu'\n", serialized_len2);
		printf("Buffer contents 2:\n");
		print_buffer_as_hex(buffer2, serialized_len2);
	} */
cleanup:
	fenc_func_input_clear(&func_object_input);
	
	/* Destroy the context. */
	result = libfenc_destroy_context(&context);
	report_error("Destroying context", result);

	/* Shutdown the library. */
	result = libfenc_shutdown();
	report_error("Shutting down library", result);	
		
	/* free buffer */
	free(buffer);
	return;
}
Example #6
0
void apply_scheme(FENC_SCHEME_TYPE scheme, char *public_params, char *data, char *outfile) 
{
	FENC_ERROR result;
	fenc_context context;
	fenc_group_params group_params;
	fenc_global_params global_params;
	fenc_function_input func_input;
	fenc_ciphertext ciphertext;
	fenc_key master_key;
	pairing_t pairing;
	FILE *fp;
	char *public_params_buf = NULL, *scheme_text = NULL;
	char session_key[SESSION_KEY_LEN];
	fenc_plaintext rec_session_key;
	size_t serialized_len;
	clock_t start, stop;
	uint32 num_leaves;
	fenc_attribute_policy *parsed_policy = NULL;
	fenc_attribute_list *parsed_attributes = NULL;
	
	memset(&context, 0, sizeof(fenc_context)); 
	memset(&group_params, 0, sizeof(fenc_group_params));
	memset(&global_params, 0, sizeof(fenc_global_params));	
	memset(&ciphertext, 0, sizeof(fenc_ciphertext));
	memset(&master_key, 0, sizeof(fenc_key));
	
	/* Initialize the library. */
	result = libfenc_init();
	report_error("Initializing library", result);
	
	/* Create a Sahai-Waters context. */
	result = libfenc_create_context(&context, scheme);
	report_error("Creating context for Waters CP scheme", result);
	
	/* Load group parameters from a file. */
	fp = fopen(PARAM, "r");
	if (fp != NULL) {
		libfenc_load_group_params_from_file(&group_params, fp);
		libfenc_get_pbc_pairing(&group_params, pairing);
	} else {
		perror("Could not open type-d parameters file.\n");
		return;
	}
	fclose(fp);
	
	/* Set up the global parameters. */
	result = context.generate_global_params(&global_params, &group_params);	
	result = libfenc_gen_params(&context, &global_params);
	
	/* Set up the publci parameters */
	fp = fopen(public_params, "r");
	if(fp != NULL) {
		size_t pub_len = read_file(fp, &public_params_buf);
		/* base-64 decode */
		uint8 *bin_public_buf = NewBase64Decode((const char *) public_params_buf, pub_len, &serialized_len);
		/* Import the parameters from binary buffer: */
		result = libfenc_import_public_params(&context, bin_public_buf, serialized_len);
		report_error("Importing public parameters", result);
		free(public_params_buf);
		free(bin_public_buf);
	}
	else {
		perror("Could not open public parameters\n");
		return;
	}
	fclose(fp);
	
	if(scheme == FENC_SCHEME_LSW) {
		/* convert the list of attributes into a fenc_attribute_list structure */
		parsed_attributes = (fenc_attribute_list *) malloc(sizeof(fenc_attribute_list));		
		fenc_buffer_to_attribute_list(&data, parsed_attributes);
						
		func_input.input_type = FENC_INPUT_ATTRIBUTE_LIST;
		func_input.scheme_input = (void *) parsed_attributes;
		
		/* store attribute list for future reference */
		char attr_str[SIZE];
		memset(attr_str, 0, SIZE);
		size_t attr_str_len;
		fenc_attribute_list_to_buffer((fenc_attribute_list*)(func_input.scheme_input), (uint8 *)attr_str, SIZE, &attr_str_len);
		printf("Attribute list: %s\n", attr_str);
		
		/* test */
		num_leaves = 0;
		
	}
	else {
	//else if(scheme == FENC_SCHEME_WATERSCP) {
		/* encrypt under given policy */ 
	// fenc_attribute_policy *parsed_policy = construct_test_policy2();
		parsed_policy = (fenc_attribute_policy *) malloc(sizeof(fenc_attribute_policy));
		memset(parsed_policy, 0, sizeof(fenc_attribute_policy));

		fenc_policy_from_string(parsed_policy, data); 
		func_input.input_type = FENC_INPUT_NM_ATTRIBUTE_POLICY;
		func_input.scheme_input = (void *) parsed_policy;
		
		/* store the policy for future reference */
		char policy_str[SIZE];
		memset(policy_str, 0, SIZE);
		fenc_attribute_policy_to_string(parsed_policy->root, policy_str, SIZE);	
		printf("POLICY => '%s'\n", policy_str);	
	}
		
	/* perform encryption */
	result = libfenc_kem_encrypt(&context, &func_input, SESSION_KEY_LEN, (uint8 *) session_key, &ciphertext);	
	
	printf("Decryption key:\t");
	print_buffer_as_hex((uint8 *)session_key, SESSION_KEY_LEN);
	
	/* now perform decryption with session key */		
	
	if(scheme == FENC_SCHEME_LSW) {
		printf("Successful import => '%d'\n", get_key(kp_abe_priv_keyfile, &context, &master_key));
		fenc_key_LSW *key_LSW = (fenc_key_LSW *) master_key.scheme_key;
		num_leaves = prune_tree(key_LSW->policy->root, parsed_attributes);
		scheme_text = "KP";
	}
	else if(scheme == FENC_SCHEME_WATERSCP) {
		printf("Successful import => '%d'\n", get_key(cp_abe_priv_keyfile, &context, &master_key));
		fenc_key_WatersCP *key_WatersCP = (fenc_key_WatersCP *) master_key.scheme_key;	
		num_leaves = prune_tree(parsed_policy->root, &(key_WatersCP->attribute_list));
		scheme_text = "CP";
	}
	else {
		printf("Successful import => '%d'\n", get_key(scp_abe_priv_keyfile, &context, &master_key));
		fenc_key_WatersSimpleCP *key_WatersSimpleCP = (fenc_key_WatersSimpleCP *) master_key.scheme_key;	
		num_leaves = prune_tree(parsed_policy->root, &(key_WatersSimpleCP->attribute_list));	
		scheme_text = "SCP";
	}
	
	printf("Start timer.\n");
	/* start timer */
	start = clock();
	/* Descrypt the resulting ciphertext. */
	result = libfenc_decrypt(&context, &ciphertext, &master_key, &rec_session_key);	
	/* stop timer */
	stop = clock();
	printf("Stop timer.\n");
	double diff = ((double)(stop - start))/CLOCKS_PER_SEC;

	printf("Recovered session key:\t");
	print_buffer_as_hex(rec_session_key.data, rec_session_key.data_len);		
	
	if(memcmp(rec_session_key.data, session_key, rec_session_key.data_len) == 0) {
		printf("\nDECRYPTION TIME => %f secs.\n", diff);
		printf("NUMBER OF LEAVES => %d\n", num_leaves);		
		fp = fopen(outfile, "a");
		fprintf(fp, "%s:%d:%f\n", scheme_text, num_leaves, diff);
		fclose(fp);
	}
	
	if(parsed_attributes != NULL)
		free(parsed_attributes);
	if(parsed_policy != NULL)
		free(parsed_policy);
	/* Shutdown the library. */
	result = libfenc_shutdown();
	report_error("Shutting down library", result);		
}
Example #7
0
void test_libfenc(char *policy)
{
	FENC_ERROR result;
	fenc_context context;
	fenc_group_params group_params;
	fenc_global_params global_params;
	fenc_function_input policy_input;
	pairing_t pairing;
	FILE *fp;
	char *public_params_buf = NULL;
	size_t serialized_len;
	
	memset(&context, 0, sizeof(fenc_context)); 
	memset(&group_params, 0, sizeof(fenc_group_params));
	memset(&global_params, 0, sizeof(fenc_global_params));	
	
	/* Initialize the library. */
	result = libfenc_init();
	report_error("Initializing library", result);
	
	/* Create a Sahai-Waters context. */
	result = libfenc_create_context(&context, FENC_SCHEME_WATERSCP);
	report_error("Creating context for Waters CP scheme", result);
	
	/* Load group parameters from a file. */
	fp = fopen(PARAM, "r");
	if (fp != NULL) {
		libfenc_load_group_params_from_file(&group_params, fp);
		libfenc_get_pbc_pairing(&group_params, pairing);
	} else {
		perror("Could not open type-d parameters file.\n");
		return;
	}
	fclose(fp);
	
	/* Set up the global parameters. */
	result = context.generate_global_params(&global_params, &group_params);	
	result = libfenc_gen_params(&context, &global_params);
	
	/* Set up the publci parameters */
	fp = fopen(PUBLIC_FILE".cp", "r");
	if(fp != NULL) {
		size_t pub_len = read_file(fp, &public_params_buf);
		/* base-64 decode */
		uint8 *bin_public_buf = NewBase64Decode((const char *) public_params_buf, pub_len, &serialized_len);
		/* Import the parameters from binary buffer: */
		result = libfenc_import_public_params(&context, bin_public_buf, serialized_len);
		report_error("Importing public parameters", result);
		free(public_params_buf);
		free(bin_public_buf);
	}
	else {
		perror("Could not open public parameters\n");
		return;
	}
	fclose(fp);
	
	/* encrypt under given policy */
	// fenc_attribute_policy *parsed_policy = construct_test_policy();
	fenc_attribute_policy *parsed_policy = (fenc_attribute_policy *) malloc(sizeof(fenc_attribute_policy));
	memset(parsed_policy, 0, sizeof(fenc_attribute_policy)); 
	
	fenc_policy_from_string(parsed_policy, policy);
	
	policy_input.input_type = FENC_INPUT_NM_ATTRIBUTE_POLICY;
	policy_input.scheme_input = (void *) parsed_policy;
	
	printf("START: test_secret_sharing\n");
	test_secret_sharing(parsed_policy, pairing);
	printf("END: test_secret_sharing\n");

	/* simple test */
	element_t ONE, TWO, THREE, ONEG2, TWOG2, THREEG2, ONEGT, TWOGT, FinalGT;
	element_init_G1(ONE, pairing);
	element_init_G1(TWO, pairing);
	element_init_G1(THREE, pairing);
	element_init_G2(ONEG2, pairing);
	element_init_G2(TWOG2, pairing);
	element_init_G2(THREEG2, pairing);
	element_init_GT(ONEGT, pairing);
	element_init_GT(TWOGT, pairing);
	element_init_GT(FinalGT, pairing);

	clock_t start, stop;
	double timeG1, timeG2, timePairing;
	element_random(ONE);
	element_random(TWO);
	element_random(ONEG2);
	element_random(TWOG2);
	// element_random(ONEGT);
	// element_random(TWOGT);
	
	/* time G1 */
	start = clock();
	element_mul(THREE, ONE, TWO);	
	stop = clock();
	timeG1 = ((double)(stop - start))/CLOCKS_PER_SEC;

	element_printf("THREEG1: %B, ", THREE);
	printf("G1 mul time: %f secs\n", timeG1);
	
	/* time G2 */
	start = clock();
	element_mul(THREEG2, ONEG2, TWOG2);	
	stop = clock();
	timeG2 = ((double)(stop - start))/CLOCKS_PER_SEC;
		
	element_printf("THREEG2: %B, ", THREEG2);
	printf("G2 mul time: %f secs\n", timeG2);
	
	/* time GT 
	start = clock();
	element_mul(FinalGT, ONEGT, TWOGT);	
	stop = clock();
	timeGT = ((double)(stop - start))/CLOCKS_PER_SEC;	

	element_printf("FinalGT: %B, ", FinalGT);
	printf("GT mul time: %f secs\n", timeGT); */
	
	/* time pairings */
	start = clock();
	pairing_apply(FinalGT, THREE, THREEG2, pairing);
	stop = clock();
	timePairing = ((double)(stop - start))/CLOCKS_PER_SEC;

	element_printf("Pairing: %B, ", FinalGT);
	printf("GT pairing time: %f secs\n", timePairing);
	
	free(parsed_policy);
	result = libfenc_shutdown();
	report_error("Shutting down library", result);	
}
Example #8
0
void abe_encrypt(FENC_SCHEME_TYPE scheme, char *public_params, char *data, char *enc_file, int isXML, char *ext)
{
	FENC_ERROR result;
	fenc_context context;
	fenc_group_params group_params;
	fenc_global_params global_params;
	fenc_ciphertext ciphertext;
	fenc_function_input func_object_input;
	pairing_t pairing;
	FILE *fp;
	char c;
	size_t pub_len = 0;
	size_t serialized_len = 0;
	uint8 public_params_buf[SIZE];
	char session_key[SESSION_KEY_LEN];
	// size_t session_key_len;
	char pol_str[MAX_POLICY_STR];
	int pol_str_len = MAX_POLICY_STR;
	/* Clear data structures. */
	memset(&context, 0, sizeof(fenc_context));
	memset(&group_params, 0, sizeof(fenc_group_params));
	memset(&global_params, 0, sizeof(fenc_global_params));	
	memset(&public_params_buf, 0, SIZE);
	memset(&ciphertext, 0, sizeof(fenc_ciphertext));
	memset(pol_str, 0, pol_str_len);
	
	/* Initialize the library. */
	result = libfenc_init();
	/* Create a Sahai-Waters context. */
	result = libfenc_create_context(&context, scheme);
	
	/* Load group parameters from a file. */
	fp = fopen(PARAM, "r");
	if (fp != NULL) {
		libfenc_load_group_params_from_file(&group_params, fp);
		libfenc_get_pbc_pairing(&group_params, pairing);
	} else {
		perror("Could not open "PARAM" parameters file.\n");
		return;
	}
	fclose(fp);
	
	/* Set up the global parameters. */
	result = context.generate_global_params(&global_params, &group_params);
	report_error("Loading global parameters", result);
	
	result = libfenc_gen_params(&context, &global_params);
	report_error("Generating scheme parameters and secret key", result);
	
	debug("Reading the public parameters file = %s\n", public_params);
	/* read file */
	fp = fopen(public_params, "r");
	if(fp != NULL) {
		while (TRUE) {
			c = fgetc(fp);
			if(c != EOF) {
				public_params_buf[pub_len] = c;
				pub_len++;
			}
			else {
				break;
			}
		}
	}
	else {
		perror("File does not exist.\n");
		return;
	}
	fclose(fp);
		
	if(scheme == FENC_SCHEME_LSW) {
		fenc_create_func_input_for_attributes(attribute_string, &func_object_input);
		debug_print_attribute_list((fenc_attribute_list*)(func_object_input.scheme_input));
		free(attribute_string);
	}
	else if(scheme == FENC_SCHEME_WATERSCP) {
		fenc_create_func_input_for_policy(policy_string, &func_object_input);
		debug_print_policy((fenc_attribute_policy *)(func_object_input.scheme_input));
		free(policy_string);
	}
	
	/* base-64 decode */
	uint8 *bin_public_buf = NewBase64Decode((const char *) public_params_buf, pub_len, &serialized_len);
	// printf("public params binary = '%s'\n", bin_public_buf);
	
	/* Import the parameters from binary buffer: */
	result = libfenc_import_public_params(&context, bin_public_buf, serialized_len);
	// report_error("Importing public parameters", result);
	
	/* key encapsulation to obtain session key from policy */
	result = libfenc_kem_encrypt(&context, &func_object_input, SESSION_KEY_LEN, (uint8 *)session_key, &ciphertext);	
	
	/* generated PSK from policy string */
	debug("Generated session key: ");
	print_buffer_as_hex((uint8 *) session_key, SESSION_KEY_LEN);

	/* encrypted blob that belongs in the <ABED></ABE> tags */
	// print_buffer_as_hex(ciphertext.data, ciphertext.data_len);
		
	/* use the PSK to encrypt using openssl functions here */
	AES_KEY key;
	size_t iv_length;
	uint8 iv[AES_BLOCK_SIZE+1];
	int data_len = (int) ceil((strlen(data) + strlen(MAGIC))/(double)(AES_BLOCK_SIZE)) * AES_BLOCK_SIZE; // round to nearest multiple of 16-bytes
	char aes_ciphertext[data_len], data_magic[data_len];
	
	/* generate a random IV */
	memset(iv, 0, AES_BLOCK_SIZE);
	RAND_bytes((uint8 *) iv, AES_BLOCK_SIZE);
	debug("IV: ");
	print_buffer_as_hex((uint8 *) iv, AES_BLOCK_SIZE);
	char *iv_base64 = NewBase64Encode(iv, AES_BLOCK_SIZE, FALSE, &iv_length);

	memset(aes_ciphertext, 0, data_len);
	AES_set_encrypt_key((uint8 *) session_key, 8*SESSION_KEY_LEN, &key);
	sprintf(data_magic, MAGIC"%s", data);
	debug("\nEncrypting data...\n");
	debug("\tPlaintext is => '%s'.\n", data);
	
	AES_cbc_encrypt((uint8 *)data_magic, (uint8 *) aes_ciphertext, data_len, &key, (uint8 *) iv, AES_ENCRYPT);
	// printf("\tAES Ciphertext base 64: ");
	// print_buffer_as_hex((uint8 *) aes_ciphertext, data_len);
	
	char filename[strlen(enc_file)+1];
	memset(filename, 0, strlen(enc_file));
	uint8 *rand_id[BYTES+1];
	if(isXML) {
		sprintf(filename, "%s.%s.xml", enc_file, ext);
		fp = fopen(filename, "w");
		/* generate the random unique id */
		RAND_bytes((uint8 *) rand_id, BYTES);
		debug("Generated random id: %08x\n", (unsigned int) rand_id[0]);
	}
	else {
		sprintf(filename, "%s.%s", enc_file, ext);
		fp = fopen(filename, "w");
	}
	debug("\tCiphertext stored in '%s'.\n", filename);
	debug("\tABE Ciphertex size is: '%zd'.\n", ciphertext.data_len);
	debug("\tAES Ciphertext size is: '%d'.\n", data_len);

	/* base-64 both ciphertexts and write to the stdout -- in XML? */
	size_t abe_length, aes_length;
	char *ABE_cipher_base64 = NewBase64Encode(ciphertext.data, ciphertext.data_len, FALSE, &abe_length);
	char *AES_cipher_base64 = NewBase64Encode(aes_ciphertext, data_len, FALSE, &aes_length);
	
	/* output ciphertext to disk: either xml or custom format */
	if(isXML) {
		fprintf(fp,"<Encrypted id='");
		fprintf(fp, "%08x", (unsigned int) rand_id[0]);
		fprintf(fp,"'><ABE type='CP'>%s</ABE>", ABE_cipher_base64);
		fprintf(fp,"<IV>%s</IV>", iv_base64);
		fprintf(fp,"<EncryptedData>%s</EncryptedData></Encrypted>", AES_cipher_base64);
		fclose(fp);
	}
	else {
		fprintf(fp, ABE_TOKEN":%s:"ABE_TOKEN_END":", ABE_cipher_base64);
		fprintf(fp, IV_TOKEN":%s:"IV_TOKEN_END":", iv_base64);
		fprintf(fp, AES_TOKEN":%s:"AES_TOKEN_END, AES_cipher_base64);
		fclose(fp);
	}
		
	if(ABE_cipher_base64 != NULL)
		free(ABE_cipher_base64);
	if(ABE_cipher_base64 != NULL)
		free(AES_cipher_base64);
	if(iv_base64 != NULL)
		free(iv_base64);
	
	fenc_func_input_clear(&func_object_input);
	
	/* Shutdown the library. */
	result = libfenc_shutdown();
	report_error("Shutting down library", result);
	return;
}