Exemple #1
0
Fichier : search.c Projet : vab/cks
int  retrieve_key(PGconn *conn, char *fingerprint, unsigned int full,struct cks_config *config)
{
	struct openPGP_keyring *keyring = NULL;
	struct openPGP_pubkey *key_result = NULL;

	int rslt = 0;


	key_result = (struct openPGP_pubkey *)retrieve_pubkey(conn,fingerprint,D_SOURCE_ADD_CGI);
	if(key_result == NULL)
	{
		fprintf(stderr,_("Failed to retrieve key: %s\n"),fingerprint);
		do_error_page(_("Failed to retrieve key from database.\n"));

		return -1;
	}

	rslt = parse_pubkey(&key_result,D_SOURCE_SEARCH_CGI);
	if(rslt == -1)
	{
		fprintf(stderr,_("Failed to parse retrieved pubkey: %s\n"),fingerprint);

		return -1;
	}
	rslt = parse_packets(&key_result,D_SOURCE_SEARCH_CGI);
	if(rslt == -1)
	{
		fprintf(stderr,_("Failed to parse retrieved pubkey's packets: %s\n"),fingerprint);

		return -1;
	}

	if(full)
	{
		echo_key_info(conn,key_result);
		echo_radix_key(key_result,config);
	}
	else
	{
		printf("<pre>\n");
		printf("<hr size=\"1\" width=\"100%%\">\n");
		fflush(0);
		echo_abrev_key_info(conn,key_result);
	}

	if(key_result != NULL)
	{
        	free_pubkey(&key_result);
	}


        return rslt;
}
Exemple #2
0
int main(int argc,char *argv[])
{
        struct  cks_config *config = NULL;

        PGconn          *conn = NULL;

	FILE 		*kr = NULL;

        PGresult        *result = NULL;
        struct          openPGP_pubkey *key_result = NULL;

	int rslt = 0;
	int rslt_2 = 0;
	unsigned long to_export = 0;
	unsigned long exported = 0;

	unsigned char fp[41];
	unsigned long i = 0;
	unsigned long j = 0;

	/* 50000 pubkeys per file. */
	unsigned long max_keys = 50000;
	unsigned int file_num = 0;
	unsigned char file_name[20];

	unsigned int arg = 0;
	unsigned int verbose = 0;


        config = (struct cks_config *)malloc(sizeof(struct cks_config));
	if(config == NULL)
	{
		fprintf(stderr,_("cks_export: Fatal Error:  Malloc Call Failed: Out of memroy.\n"));

		return -1;
	}
        rslt = init_config(&config);
        if(rslt == -1)
        {
                fprintf(stderr,_("cks_export:  Non-Fatal Error: Failed to read config.\n"));
                fprintf(stderr,_("cks_export:  Using default configuration information.\n"));
        }

	if(argc > 0)
	{
		for(arg=1;arg<argc;arg++)
		{
			if(argv[arg][0] == '-')
			{
				if(argv[arg][1] == '-')
				{
					if(strstr(argv[arg],"help") != NULL)
					{
						printf("Usage: cks_export\n");
						printf("	-v Verbose Mode\n");
						printf("	-h This Help Text\n");
						printf("	--help This Help Text\n");
						printf("	--version Display Version Information\n");
						printf("\n");

						return 0;
					}
					else if(strstr(argv[arg],"version") != NULL)
					{
						printf("CKS Version 0.2.2\n");

						return 0;
					}
				}
				else if(argv[arg][1] == 'v')
				{
					verbose = 1;
				}
				else
				{
					printf("Usage: cks_export\n");
					printf("	-v Verbose Mode\n");
					printf("	-h This Help Text\n");
					printf("	--help This Help Text\n");
					printf("	--version Display Version Information\n");
					printf("\n");

					return 0;

				}
			}
		}
	}


	/* open the export file */
	if((kr = fopen("cks_ring-000.pgp","wb")) == NULL)
        {
                fprintf(stderr,_("cks_export: Failed to open file export_ring.pgp\n"));
		free(config);

                return -1;
        }

        /* Make the DB Connection. */
        conn = db_connect(config);
        if(conn == NULL)
        {
                fprintf(stderr,_("cks_export: Failed to connect to postgres database"));
                fprintf(stderr,_("cks_export: Connection to database failed.\n"));
                fprintf(stderr,"cks_export: %s", PQerrorMessage(conn));
		if(config != NULL)
		{
			free(config);
		}

                return -1;
        }


	result = PQexec(conn,"select fp from cks_fp_key_table\n");
	if(PQresultStatus(result) != PGRES_TUPLES_OK)
	{
		fprintf(stderr,_("cks_export:  Failed to return tuples.\n"));
		fprintf(stderr,_("cks_export:  Offending Query: select fp from cks_fp_key_table\n"));
		PQclear(result);
        	db_disconnect(conn);
		if(config != NULL)
		{
			free(config);
		}

		return -1;
	}

	to_export = PQntuples(result);
        if(to_export == 0)
        {
                fprintf(stderr, _("cks_export:  No Records Found.\n"));
		fprintf(stderr,_("cks_export:  Offending Query: select fp from cks_fp_key_table\n"));
                PQclear(result);
        	db_disconnect(conn);
		if(config != NULL)
		{
			free(config);
		}

		return -1;
        }


        printf(_("cks_export:  exporting %lu keys.\n"),to_export);
	printf(_("0 of %lu keys exported.\n"),to_export);

	for(i=0;i<to_export;i++)
	{
		key_result = retrieve_pubkey(conn,PQgetvalue(result,i,0),0);
		rslt_2 = parse_pubkey(&key_result,0);
		if(rslt_2 != 0)
		{
			free_pubkey(&key_result);
			continue;
		}
		rslt_2 = parse_packets(&key_result,0);
		if(rslt_2 != 0)
		{
			/* Thank you. Drive Through. */
			free_pubkey(&key_result);
			continue;
		}

		/* Write the key to the out file.  */
		rslt_2 = decode_radix(key_result);
		if(rslt_2 != 0)
		{
			free_pubkey(&key_result);
			continue;
		}
		/* TODO:  Speed this up with fwrite, it's fine for now though. */
		for(j=0;j<key_result->buffer_idx;j++)
		{
			/* TODO: Check for success here. */
			fputc(key_result->buffer[j],kr);
		}
		exported++;
		if((exported % 5000) == 0)
		{
			printf(_("%lu of %lu keys exported.\n"),exported,to_export);
		}
		/* If i is divisable by max_keys (default: 50,000), open a new file */
		if((exported % max_keys) == 0)
		{
			fclose(kr);
			file_num++;
			snprintf(file_name,19,"cks_ring-%03d.pgp",file_num);
			if((kr = fopen(file_name,"wb")) == NULL)
			{
				fprintf(stderr,_("cks_export: Failed to open file %s\n"),file_name);
				PQclear(result);
        			db_disconnect(conn);
				if(config != NULL)
				{
					free(config);
				}

				return -1;
			}
		}
		free_pubkey(&key_result);
	}

	/* Finish.  Clean up memory and exit. */
	PQclear(result);
        db_disconnect(conn);

        fclose(kr);

	if(config != NULL)
	{
		free(config);
	}


	return 0;
}
Exemple #3
0
int  retrieve_key_and_display(PGconn *conn, char *fingerprint, unsigned int full,struct cks_config *config)
{
	unsigned long i = 0;
	FILE *test = NULL;
	struct openPGP_packet *walk_packet = NULL;

	int rslt = 0;


	key_result = (struct openPGP_pubkey *)retrieve_pubkey(conn,fingerprint,D_SOURCE_ADD_CGI);
	if(key_result == NULL)
	{
		fprintf(stderr,_("Failed to retrieve key: %s\n"),fingerprint);
		do_error_page(_("Failed to retrieve key from database.\n"));

		return -1;
	}

	rslt = parse_pubkey(&key_result,D_SOURCE_SEARCH_CGI);
	if(rslt == -1)
	{
		fprintf(stderr,_("cks: cks_keyimg.c: Failed to parse retrieved pubkey: %s\n"),fingerprint);

		return -1;
	}
	rslt = parse_packets(&key_result,D_SOURCE_SEARCH_CGI);
	if(rslt == -1)
	{
		fprintf(stderr,_("Failed to parse retrieved pubkey's packets: %s\n"),fingerprint);

		return -1;
	}

//	dump_pubkey_packet_info_stderr(key_result);
	if(NULL == (test = fopen("/tmp/test.jpg","w")))
	{
		fprintf(stderr,"Failed to open out put file.\n");

		return -1;
	}

	fprintf(stderr,"image_len = %lu\n",key_result->image_len);
	fputc(0xd8,test);
	fputc(0xff,test);
	fputc(0xe0,test);
	fputc(0xff,test);
	fputc(0x10,test);
	fputc(0x00,test);
	fputc(0x46,test);
	fputc(0x4a,test);
	fputc(0x46,test);
	fputc(0x49,test);
	fputc(0x01,test);
	fputc(0x00,test);
	for(i=0;i<key_result->image_len;i++)
	{
		fputc(key_result->img_data[i],test);
	}

	fclose(test);
	printf("Content-type: image/jpg\n\n");
	printf("%c%c%c%c%c%c%c%c%c%c\n", 0xd8, 0xff, 0xe0, 0xff, 0x10, 0x00, 0x46, 0x4a, 0x46, 0x49, 0x01, 0x00);
	for(i=0;i<key_result->image_len;i++)
	{
		printf("%c",key_result->img_data[i]);
	}

	free_pubkey(&key_result);

	return rslt;
}
Exemple #4
0
/*
* RSA public cryptography function.
* Encrypt 'in_len' bytes from 'plaintext' buffer with the public key contained in 'pub_key_file' 
* Parameter 'outlen' is the size of output buffer 
* It returns the envelope which has to be sent to the receiver or NULL if an error occurs.
*/
unsigned char* asym_crypto(unsigned char* plaintext, int in_len, int* out_len, char* pub_key_file){
	EVP_PKEY* pubkey;
	int ret;	
	EVP_CIPHER_CTX* ctx;
	unsigned char* encrypted_key;
	int encrypted_key_len;
	unsigned char* iv;
	int iv_len;
	unsigned char* ciphertext;
	int cipher_len;
	int app;
	unsigned char* output;
	int total_output_size = 0;
		
	if(plaintext == NULL || in_len < 0 || out_len == NULL || pub_key_file == NULL)
		return NULL;
	
	//Reads the receiver's public key for its file
	pubkey = retrieve_pubkey(pub_key_file);
	if(pubkey == NULL)
		return NULL;
	encrypted_key_len = EVP_PKEY_size(pubkey);
	total_output_size += encrypted_key_len;
	iv_len = EVP_CIPHER_iv_length(SYM_CIPHER);
	total_output_size += iv_len;
	//Allocation of encrypted symmetric key and initialization vector
   	encrypted_key = malloc(encrypted_key_len);
   	iv = malloc(iv_len);
	//Seeding the RNG
	RAND_seed(iv, 8);
	
	//Instantiate and initialize the context
	ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
	EVP_CIPHER_CTX_init(ctx);
	ret = EVP_SealInit(ctx, SYM_CIPHER, &encrypted_key, &encrypted_key_len, iv, &pubkey ,1);
	if(ret == 0){
		fprintf(stderr, "Error in SealInit\n");
		goto error;
	}
	
	//Encrypt the input buffer
	cipher_len = in_len + EVP_CIPHER_block_size(SYM_CIPHER);
	ciphertext = malloc(cipher_len);
	cipher_len = 0;
	
	ret = EVP_SealUpdate(ctx, ciphertext, &app, plaintext, in_len);
	cipher_len += app;
	if(ret == 0){
		fprintf(stderr, "Error in SealUpdate\n");
		goto error;
	}
	ret = EVP_SealFinal(ctx, ciphertext + app, &app);
	cipher_len += app;
	if(ret == 0){
		fprintf(stderr, "Error in SealFinal\n");
		goto error;
	}
	total_output_size += cipher_len;
	
	//Concatenates the envelop in the outbuffer with format: <IV><Dim_Key><Ecrypt_KEY><Ciphertext>
	total_output_size += sizeof(int);
	output = malloc(total_output_size);
	app = 0;
	//<IV>
	memcpy(output, iv, iv_len);
	app += iv_len;
	//<Dim_Key>
	memcpy(output + app, &encrypted_key_len, sizeof(int));
	app += sizeof(int);
	//<Ecrypt_KEY>
	memcpy(output + app, encrypted_key, encrypted_key_len);
	app += encrypted_key_len;
	//<Ciphertext>
	memcpy(output + app, ciphertext, cipher_len);
	app += encrypted_key_len;
	
	*out_len = total_output_size;
	
	//Cleanup
	EVP_CIPHER_CTX_cleanup(ctx);
   	free(ctx);
	free(ciphertext);
	free(pubkey);
	free(iv);
	
	return output;
	
error:
	if(ctx != NULL){
		EVP_CIPHER_CTX_cleanup(ctx);
   		free(ctx);
	}
	if(encrypted_key != NULL)
		free(ciphertext);	
	if(pubkey != NULL)
		free(pubkey);
	if(iv != NULL)		
		free(iv);
	if(ciphertext != NULL)
		free(ciphertext);		
	if(output != NULL)
		free(output);
	return NULL;
}