[OpenPGP:SDK svn] r326 - in openpgpsdk/trunk: examples include/openpgpsdk src
Subversion
ben at algroup.co.uk
Tue Jan 3 14:18:53 GMT 2006
Author: ben
Date: 2006-01-03 14:18:52 +0000 (Tue, 03 Jan 2006)
New Revision: 326
Modified:
openpgpsdk/trunk/examples/packet-dump.c
openpgpsdk/trunk/include/openpgpsdk/packet.h
openpgpsdk/trunk/src/packet-parse.c
Log:
Parse encrypted session key.
Modified: openpgpsdk/trunk/examples/packet-dump.c
===================================================================
--- openpgpsdk/trunk/examples/packet-dump.c 2006-01-03 13:42:52 UTC (rev 325)
+++ openpgpsdk/trunk/examples/packet-dump.c 2006-01-03 14:18:52 UTC (rev 326)
@@ -831,6 +831,31 @@
print_string("type",content->armour_header.type);
break;
+ case OPS_PTAG_CT_PK_SESSION_KEY:
+ print_tagname("PUBLIC KEY SESSION KEY");
+ printf("Version: %d\n",content->pk_session_key.version);
+ print_hexdump("key ID",content->pk_session_key.key_id,
+ sizeof content->pk_session_key.key_id);
+ printf("Algorithm: %d\n",content->pk_session_key.algorithm);
+ switch(content->pk_session_key.algorithm)
+ {
+ case OPS_PKA_RSA:
+ print_bn("encrypted_m",
+ content->pk_session_key.parameters.rsa.encrypted_m);
+ break;
+
+ case OPS_PKA_ELGAMAL:
+ print_bn("g_to_k",
+ content->pk_session_key.parameters.elgamal.g_to_k);
+ print_bn("encrypted_m",
+ content->pk_session_key.parameters.elgamal.encrypted_m);
+ break;
+
+ default:
+ assert(0);
+ }
+ break;
+
default:
print_tagname("UNKNOWN PACKET TYPE");
fprintf(stderr,"packet-dump: unknown tag=%d (0x%x)\n",content_->tag,
Modified: openpgpsdk/trunk/include/openpgpsdk/packet.h
===================================================================
--- openpgpsdk/trunk/include/openpgpsdk/packet.h 2006-01-03 13:42:52 UTC (rev 325)
+++ openpgpsdk/trunk/include/openpgpsdk/packet.h 2006-01-03 14:18:52 UTC (rev 326)
@@ -753,6 +753,36 @@
unsigned char *data;
} ops_unarmoured_text_t;
+typedef enum
+ {
+ OPS_PKSK_V3=3
+ } ops_pk_session_key_version_t;
+
+typedef struct
+ {
+ BIGNUM *encrypted_m;
+ } ops_pk_session_key_parameters_rsa_t;
+
+typedef struct
+ {
+ BIGNUM *g_to_k;
+ BIGNUM *encrypted_m;
+ } ops_pk_session_key_parameters_elgamal_t;
+
+typedef union
+ {
+ ops_pk_session_key_parameters_rsa_t rsa;
+ ops_pk_session_key_parameters_elgamal_t elgamal;
+ } ops_pk_session_key_parameters_t;
+
+typedef struct
+ {
+ ops_pk_session_key_version_t version;
+ unsigned char key_id[OPS_KEY_ID_SIZE];
+ ops_public_key_algorithm_t algorithm;
+ ops_pk_session_key_parameters_t parameters;
+ } ops_pk_session_key_t;
+
/** ops_parser_union_content_t */
typedef union
{
@@ -797,6 +827,7 @@
ops_signed_cleartext_body_t signed_cleartext_body;
ops_signed_cleartext_trailer_t signed_cleartext_trailer;
ops_unarmoured_text_t unarmoured_text;
+ ops_pk_session_key_t pk_session_key;
} ops_parser_content_union_t;
/** ops_parser_content_t */
@@ -840,6 +871,7 @@
void ops_packet_free(ops_packet_t *packet);
void ops_parser_content_free(ops_parser_content_t *c);
void ops_secret_key_free(ops_secret_key_t *key);
+void ops_pk_session_key_free(ops_pk_session_key_t *sk);
/* vim:set textwidth=120: */
/* vim:set ts=8: */
Modified: openpgpsdk/trunk/src/packet-parse.c
===================================================================
--- openpgpsdk/trunk/src/packet-parse.c 2006-01-03 13:42:52 UTC (rev 325)
+++ openpgpsdk/trunk/src/packet-parse.c 2006-01-03 14:18:52 UTC (rev 326)
@@ -730,6 +730,10 @@
ops_secret_key_free(&c->content.secret_key);
break;
+ case OPS_PTAG_CT_PK_SESSION_KEY:
+ ops_pk_session_key_free(&c->content.pk_session_key);
+ break;
+
default:
fprintf(stderr,"Can't free %d (0x%x)\n",c->tag,c->tag);
assert(0);
@@ -742,6 +746,24 @@
*pp=NULL;
}
+void ops_pk_session_key_free(ops_pk_session_key_t *sk)
+ {
+ switch(sk->algorithm)
+ {
+ case OPS_PKA_RSA:
+ free_BN(&sk->parameters.rsa.encrypted_m);
+ break;
+
+ case OPS_PKA_ELGAMAL:
+ free_BN(&sk->parameters.elgamal.g_to_k);
+ free_BN(&sk->parameters.elgamal.encrypted_m);
+ break;
+
+ default:
+ assert(0);
+ }
+ }
+
/*! Free the memory used when parsing a public key */
void ops_public_key_free(ops_public_key_t *p)
{
@@ -1757,6 +1779,56 @@
return 1;
}
+static int parse_pk_session_key(ops_region_t *region,
+ ops_parse_info_t *parse_info)
+ {
+ unsigned char c[1];
+ ops_parser_content_t content;
+
+ if(!limited_read(c,1,region,parse_info))
+ return 0;
+ C.pk_session_key.version=c[0];
+ if(C.pk_session_key.version != OPS_PKSK_V3)
+ ERR1P(parse_info,
+ "Bad public-key encrypted session key version (%d)",
+ C.pk_session_key.version);
+
+ if(!limited_read(C.pk_session_key.key_id,
+ sizeof C.pk_session_key.key_id,region,parse_info))
+ return 0;
+
+ if(!limited_read(c,1,region,parse_info))
+ return 0;
+ C.pk_session_key.algorithm=c[0];
+ switch(C.pk_session_key.algorithm)
+ {
+ case OPS_PKA_RSA:
+ if(!limited_read_mpi(&C.pk_session_key.parameters.rsa.encrypted_m,
+ region,parse_info))
+ return 0;
+ break;
+
+ case OPS_PKA_ELGAMAL:
+ if(!limited_read_mpi(&C.pk_session_key.parameters.elgamal.g_to_k,
+ region,parse_info)
+ || limited_read_mpi(&C.pk_session_key.parameters.elgamal.encrypted_m,
+ region,parse_info))
+ return 0;
+ break;
+
+ default:
+ ERR1P(parse_info,
+ "Unknown public key algorithm in session key (%d)",
+ C.pk_session_key.algorithm);
+ return 0;
+ }
+
+ CBP(parse_info,OPS_PTAG_CT_PK_SESSION_KEY,&content);
+
+ return 1;
+ }
+
+
/** Parse one packet.
*
* This function parses the packet tag. It computes the value of the
@@ -1874,6 +1946,10 @@
r=parse_secret_key(®ion,parse_info);
break;
+ case OPS_PTAG_CT_PK_SESSION_KEY:
+ r=parse_pk_session_key(®ion,parse_info);
+ break;
+
default:
format_error(&content,"Format error (unknown content tag %d)",
C.ptag.content_tag);
More information about the OpenPGPsdk-svn
mailing list