[OpenPGP:SDK svn] r341 - in openpgpsdk/trunk: examples include/openpgpsdk src

Subversion ben at algroup.co.uk
Mon Jan 30 13:08:27 GMT 2006


Author: ben
Date: 2006-01-30 13:08:26 +0000 (Mon, 30 Jan 2006)
New Revision: 341

Added:
   openpgpsdk/trunk/examples/create-crypted-gpg-key.sh
   openpgpsdk/trunk/src/symmetric.c
Modified:
   openpgpsdk/trunk/include/openpgpsdk/crypto.h
   openpgpsdk/trunk/include/openpgpsdk/packet-parse.h
   openpgpsdk/trunk/include/openpgpsdk/packet.h
   openpgpsdk/trunk/src/packet-parse.c
Log:
More decryption, missing file.


Added: openpgpsdk/trunk/examples/create-crypted-gpg-key.sh
===================================================================
--- openpgpsdk/trunk/examples/create-crypted-gpg-key.sh	2006-01-26 17:41:18 UTC (rev 340)
+++ openpgpsdk/trunk/examples/create-crypted-gpg-key.sh	2006-01-30 13:08:26 UTC (rev 341)
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Make a GPG keyring for testing purposes...
+
+rm -f ../test/t2.pub ../test/t2.sec
+
+gpg --gen-key --batch <<EOF
+#%dry-run
+%pubring ../test/t2.pub
+%secring ../test/t2.sec
+Key-Type: rsa
+Name-Real: OPS Test
+Name-Comment: This is a test
+Name-Email: ops at links.org
+Passphrase: xxx
+%commit
+EOF


Property changes on: openpgpsdk/trunk/examples/create-crypted-gpg-key.sh
___________________________________________________________________
Name: svn:executable
   + *

Modified: openpgpsdk/trunk/include/openpgpsdk/crypto.h
===================================================================
--- openpgpsdk/trunk/include/openpgpsdk/crypto.h	2006-01-26 17:41:18 UTC (rev 340)
+++ openpgpsdk/trunk/include/openpgpsdk/crypto.h	2006-01-30 13:08:26 UTC (rev 341)
@@ -26,6 +26,10 @@
     void *data;
     };
 
+typedef void ops_decrypt_set_iv_t(ops_decrypt_t *decrypt,
+				  const unsigned char *iv);
+typedef void ops_decrypt_set_key_t(ops_decrypt_t *decrypt,
+				   const unsigned char *key);
 typedef void ops_decrypt_init_t(ops_decrypt_t *decrypt);
 typedef size_t ops_decrypt_decrypt_t(ops_decrypt_t *decrypt,void *out,
 				     const void *in,int count);
@@ -34,9 +38,17 @@
 struct _ops_decrypt_t
     {
     ops_symmetric_algorithm_t algorithm;
+    size_t blocksize;
+    size_t keysize;
+    ops_decrypt_set_iv_t *set_iv; /* Call this before init! */
+    ops_decrypt_set_iv_t *set_key; /* Call this before init! */
     ops_decrypt_init_t *init;
     ops_decrypt_decrypt_t *decrypt;
     ops_decrypt_finish_t *finish;
+    unsigned char iv[OPS_MAX_BLOCK_SIZE];
+    unsigned char civ[OPS_MAX_BLOCK_SIZE];
+    unsigned char key[OPS_MAX_KEY_SIZE];
+    int num;
     void *data;
     };
 
@@ -66,7 +78,10 @@
 
 int ops_decrypt_data(ops_region_t *region,ops_parse_info_t *parse_info);
 
-void ops_decrypt_any(ops_decrypt_t *decrypt,
-		     ops_symmetric_algorithm_t algorithm);
+void ops_decrypt_any(ops_decrypt_t *decrypt,ops_symmetric_algorithm_t alg);
 
+void ops_reader_push_decrypt(ops_parse_info_t *pinfo,ops_decrypt_t *decrypt,
+			     ops_region_t *region);
+void ops_reader_pop_decrypt(ops_parse_info_t *pinfo);
+
 #endif

Modified: openpgpsdk/trunk/include/openpgpsdk/packet-parse.h
===================================================================
--- openpgpsdk/trunk/include/openpgpsdk/packet-parse.h	2006-01-26 17:41:18 UTC (rev 340)
+++ openpgpsdk/trunk/include/openpgpsdk/packet-parse.h	2006-01-30 13:08:26 UTC (rev 341)
@@ -71,6 +71,7 @@
 void *ops_parse_cb_get_arg(ops_parse_cb_info_t *cbinfo);
 void ops_reader_set(ops_parse_info_t *pinfo,ops_reader_t *reader,void *arg);
 void ops_reader_push(ops_parse_info_t *pinfo,ops_reader_t *reader,void *arg);
+void ops_reader_pop(ops_parse_info_t *pinfo);
 void *ops_reader_get_arg_from_pinfo(ops_parse_info_t *pinfo);
 
 void *ops_reader_get_arg(ops_reader_info_t *rinfo);

Modified: openpgpsdk/trunk/include/openpgpsdk/packet.h
===================================================================
--- openpgpsdk/trunk/include/openpgpsdk/packet.h	2006-01-26 17:41:18 UTC (rev 340)
+++ openpgpsdk/trunk/include/openpgpsdk/packet.h	2006-01-30 13:08:26 UTC (rev 341)
@@ -415,6 +415,9 @@
 // Maximum block size for symmetric crypto
 #define OPS_MAX_BLOCK_SIZE	16
 
+// Maximum key size for symmetric crypto
+#define OPS_MAX_KEY_SIZE	32
+
 // Salt size for hashing
 #define OPS_SALT_SIZE		8
 

Modified: openpgpsdk/trunk/src/packet-parse.c
===================================================================
--- openpgpsdk/trunk/src/packet-parse.c	2006-01-26 17:41:18 UTC (rev 340)
+++ openpgpsdk/trunk/src/packet-parse.c	2006-01-30 13:08:26 UTC (rev 341)
@@ -1788,6 +1788,10 @@
     {
     ops_parser_content_t content;
     unsigned char c[1];
+    ops_decrypt_t decrypt;
+    int ret=1;
+    ops_region_t encregion;
+    ops_region_t *saved_region=NULL;
 
     memset(&content,'\0',sizeof content);
     if(!parse_public_key_data(&C.secret_key.public_key,region,parse_info))
@@ -1862,6 +1866,19 @@
 
 	ops_hash(hash,C.secret_key.hash_algorithm,passphrase,
 		 strlen(passphrase));
+
+	ops_decrypt_any(&decrypt,C.secret_key.algorithm);
+	decrypt.set_iv(&decrypt,C.secret_key.iv);
+	decrypt.set_key(&decrypt,hash);
+
+	ops_reader_push_decrypt(parse_info,&decrypt,region);
+
+	/* Since all known encryption for PGP doesn't compress, we can limit
+	   to the same length as the current region (for now) */
+	ops_init_subregion(&encregion,NULL);
+	encregion.length=region->length-region->length_read;
+	saved_region=region;
+	region=&encregion;
 	}
 
     switch(C.secret_key.public_key.algorithm)
@@ -1873,21 +1890,31 @@
 	   || !limited_read_mpi(&C.secret_key.key.rsa.p,region,parse_info)
 	   || !limited_read_mpi(&C.secret_key.key.rsa.q,region,parse_info)
 	   || !limited_read_mpi(&C.secret_key.key.rsa.u,region,parse_info))
-	    return 0;
+	    ret=0;
 	break;
 
 
     case OPS_PKA_DSA:
 	if(!limited_read_mpi(&C.secret_key.key.dsa.x,region,parse_info))
-	    return 0;
+	    ret=0;
 	break;
 
     default:
 	fprintf(stderr,"Unexpected aglorithm: %d\n",
 		C.secret_key.public_key.algorithm);
+	ret=0;
 	assert(0);
 	}
 
+    if(saved_region)
+	{
+	ops_reader_pop_decrypt(parse_info);
+	region=saved_region;
+	}
+
+    if(!ret)
+	return 0;
+
     if(!limited_read_scalar(&C.secret_key.checksum,2,region,parse_info))
 	return 0;
     // XXX: check the checksum
@@ -2317,6 +2344,14 @@
     ops_reader_set(pinfo,reader,arg);
     }
 
+void ops_reader_pop(ops_parse_info_t *pinfo)
+    { 
+    ops_reader_info_t *next=pinfo->rinfo.next;
+
+    pinfo->rinfo=*next;
+    free(next);
+    }
+
 void *ops_reader_get_arg(ops_reader_info_t *rinfo)
     { return rinfo->arg; }
 

Added: openpgpsdk/trunk/src/symmetric.c
===================================================================
--- openpgpsdk/trunk/src/symmetric.c	2006-01-26 17:41:18 UTC (rev 340)
+++ openpgpsdk/trunk/src/symmetric.c	2006-01-30 13:08:26 UTC (rev 341)
@@ -0,0 +1,188 @@
+#include <openpgpsdk/crypto.h>
+#include <string.h>
+#include <assert.h>
+#include <openssl/cast.h>
+
+unsigned ops_block_size(ops_symmetric_algorithm_t alg)
+    {
+    // perhaps do this via the underlying algorithm later
+    switch(alg)
+	{
+    case OPS_SA_PLAINTEXT:
+	return 1;
+
+    case OPS_SA_IDEA:
+    case OPS_SA_TRIPLEDES:
+    case OPS_SA_CAST5:
+    case OPS_SA_BLOWFISH:
+    case OPS_SA_TWOFISH:
+	return 8;
+
+    case OPS_SA_AES_128:
+    case OPS_SA_AES_192:
+    case OPS_SA_AES_256:
+	return 16;
+	}
+
+    return 0;
+    }
+
+typedef struct
+    {
+    unsigned char decrypted[1024];
+    size_t decrypted_count;
+    ops_decrypt_t *decrypt;
+    ops_region_t *region;
+    } encrypted_arg_t;
+
+static ops_reader_ret_t encrypted_data_reader(unsigned char *dest,
+					      unsigned *plength,
+					      ops_reader_flags_t flags,
+					      ops_error_t **errors,
+					      ops_reader_info_t *rinfo,
+					      ops_parse_cb_info_t *cbinfo)
+    {
+    encrypted_arg_t *arg=ops_reader_get_arg(rinfo);
+    unsigned length=*plength;
+
+    OPS_USED(flags);
+
+    while(length > 0)
+	{
+	if(arg->decrypted_count)
+	    {
+	    unsigned n;
+
+	    if(length > arg->decrypted_count)
+		n=arg->decrypted_count;
+	    else
+		n=length;
+
+	    memcpy(dest,arg->decrypted,n);
+	    arg->decrypted_count-=n;
+	    length-=n;
+	    dest+=n;
+	    }
+	else
+	    {
+	    unsigned n=arg->region->length;
+	    unsigned char buffer[1024];
+
+	    if(!n)
+		return OPS_R_EARLY_EOF;
+
+	    if(!arg->region->indeterminate)
+		{
+		n-=arg->region->length_read;
+		if(n > sizeof buffer)
+		    n=sizeof buffer;
+		}
+	    else
+		n=sizeof buffer;
+
+	    if(!ops_stacked_limited_read(buffer,n,arg->region,errors,rinfo,
+					 cbinfo))
+		return OPS_R_EARLY_EOF;
+
+	    arg->decrypted_count=arg->decrypt->decrypt(arg->decrypt,
+						       arg->decrypted,
+						       buffer,n);
+	    assert(arg->decrypted_count > 0);
+	    }
+	}
+
+    return OPS_R_OK;
+    }
+
+void ops_reader_push_decrypt(ops_parse_info_t *pinfo,ops_decrypt_t *decrypt,
+			     ops_region_t *region)
+    {
+    encrypted_arg_t *arg=ops_mallocz(sizeof *arg);
+
+    arg->decrypt=decrypt;
+    arg->region=region;
+
+    arg->decrypt->init(arg->decrypt);
+
+    ops_reader_push(pinfo,encrypted_data_reader,arg);
+    }
+
+void ops_reader_pop_decrypt(ops_parse_info_t *pinfo)
+    {
+    encrypted_arg_t *arg=ops_reader_get_arg(ops_parse_get_rinfo(pinfo));
+
+    arg->decrypt->finish(arg->decrypt);
+    free(arg);
+    
+    ops_reader_pop(pinfo);
+    }
+
+int ops_decrypt_data(ops_region_t *region,ops_parse_info_t *pinfo)
+    {
+    int r;
+
+    ops_reader_push_decrypt(pinfo,ops_parse_get_decrypt(pinfo),region);
+    r=ops_parse(pinfo);
+    ops_reader_pop_decrypt(pinfo);
+
+    return r;
+    }
+
+static void std_set_iv(ops_decrypt_t *decrypt,const unsigned char *iv)
+    { memcpy(decrypt->iv,iv,decrypt->blocksize); }
+
+static void std_set_key(ops_decrypt_t *decrypt,const unsigned char *key)
+    { memcpy(decrypt->key,key,decrypt->keysize); }
+
+static void cast5_init(ops_decrypt_t *decrypt)
+    {
+    free(decrypt->data);
+    decrypt->data=malloc(sizeof(CAST_KEY));
+    CAST_set_key(decrypt->data,decrypt->keysize,decrypt->key);
+    memcpy(decrypt->civ,decrypt->iv,decrypt->blocksize);
+    decrypt->num=0;
+    }
+
+static size_t cast5_decrypt(ops_decrypt_t *decrypt,void *out,const void *in,
+			    int count)
+    {
+    CAST_cfb64_encrypt(in,out,count,decrypt->data,decrypt->civ,&decrypt->num,
+		       0);
+
+    return count;
+    }
+
+static void std_finish(ops_decrypt_t *decrypt)
+    {
+    free(decrypt->data);
+    decrypt->data=NULL;
+    }
+
+#define TRAILER		"","","",0,NULL
+
+static ops_decrypt_t cast5=
+    {
+    OPS_SA_CAST5,
+    CAST_BLOCK,
+    CAST_KEY_LENGTH,
+    std_set_iv,
+    std_set_key,
+    cast5_init,
+    cast5_decrypt,
+    std_finish,
+    TRAILER
+    };
+
+void ops_decrypt_any(ops_decrypt_t *decrypt,ops_symmetric_algorithm_t alg)
+    {
+    switch(alg)
+	{
+    case OPS_SA_CAST5:
+	*decrypt=cast5;
+	break;
+
+    default:
+	assert(0);
+	}
+    }
+



More information about the OpenPGPsdk-svn mailing list