[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