aboutsummaryrefslogtreecommitdiffstats
path: root/g10/free-packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/free-packet.c')
-rw-r--r--g10/free-packet.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/g10/free-packet.c b/g10/free-packet.c
index 9d623ec30..14a466556 100644
--- a/g10/free-packet.c
+++ b/g10/free-packet.c
@@ -55,7 +55,7 @@ void
free_seckey_enc( PKT_signature *sig )
{
int n, i;
- n = pubkey_get_nenc( sig->pubkey_algo );
+ n = pubkey_get_nsig( sig->pubkey_algo );
if( !n ) {
m_free(sig->data[0]);
sig->data[0] = NULL;
@@ -107,6 +107,20 @@ cp_fake_data( MPI a )
return d;
}
+static void *
+cp_data_block( byte *s )
+{
+ byte *d;
+ u16 len;
+
+ if( !s )
+ return NULL;
+ len = (s[0] << 8) | s[1];
+ d = m_alloc( len+2 );
+ memcpy(d, s, len+2);
+ return d;
+}
+
PKT_public_key *
copy_public_key( PKT_public_key *d, PKT_public_key *s )
@@ -126,6 +140,39 @@ copy_public_key( PKT_public_key *d, PKT_public_key *s )
return d;
}
+
+PKT_signature *
+copy_signature( PKT_signature *d, PKT_signature *s )
+{
+ int n, i;
+
+ if( !d )
+ d = m_alloc(sizeof *d);
+ memcpy( d, s, sizeof *d );
+ n = pubkey_get_nsig( s->pubkey_algo );
+ if( !n )
+ d->data[0] = cp_fake_data(s->data[0]);
+ else {
+ for(i=0; i < n; i++ )
+ d->data[i] = mpi_copy( s->data[i] );
+ }
+ d->hashed_data = cp_data_block(s->hashed_data);
+ d->unhashed_data = cp_data_block(s->unhashed_data);
+ return d;
+}
+
+
+PKT_user_id *
+copy_user_id( PKT_user_id *d, PKT_user_id *s )
+{
+ if( !d )
+ d = m_alloc(sizeof *d + s->len - 1 );
+ memcpy( d, s, sizeof *d + s->len - 1 );
+ return d;
+}
+
+
+
void
release_secret_key_parts( PKT_secret_key *sk )
{