[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(&region,parse_info);
 	break;
 
+    case OPS_PTAG_CT_PK_SESSION_KEY:
+	r=parse_pk_session_key(&region,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