root/openpgpsdk/trunk/src/build.c

Revision 136 (checked in by ben, 8 years ago)

Partial signature code, prior to refactor for verification.

Line 
1 /** \file
2  */
3
4 #include "packet.h"
5 #include "util.h"
6 #include "build.h"
7 #include <stdlib.h>
8 #include <openssl/bn.h>
9 #include <assert.h>
10 #include <string.h>
11
12 void ops_memory_make_packet(ops_memory_t *out,ops_content_tag_t tag)
13     {
14     size_t extra;
15
16     if(out->length < 192)
17         extra=1;
18     else if(out->length < 8384)
19         extra=2;
20     else
21         extra=5;
22
23     ops_memory_pad(out,extra+1);
24     memmove(out->buf+extra+1,out->buf,out->length);
25
26     out->buf[0]=OPS_PTAG_ALWAYS_SET|OPS_PTAG_NEW_FORMAT|tag;
27
28     if(out->length < 192)
29         out->buf[1]=out->length;
30     else if(out->length < 8384)
31         {
32         out->buf[1]=((out->length-192) >> 8)+192;
33         out->buf[2]=out->length-192;
34         }
35     else
36         {
37         out->buf[1]=0xff;
38         out->buf[2]=out->length >> 24;
39         out->buf[3]=out->length >> 16;
40         out->buf[4]=out->length >> 8;
41         out->buf[5]=out->length;
42         }
43
44     out->length+=extra+1;
45     }
46
47 // XXX: this should be refactored into a write
48 void ops_build_public_key(ops_memory_t *out,const ops_public_key_t *key,
49                           ops_boolean_t make_packet)
50     {
51     ops_memory_init(out,128);
52     ops_memory_add_int(out,key->version,1);
53     ops_memory_add_int(out,key->creation_time,4);
54     if(key->version != 4)
55         ops_memory_add_int(out,key->days_valid,2);
56     ops_memory_add_int(out,key->algorithm,1);
57
58     switch(key->algorithm)
59         {
60     case OPS_PKA_DSA:
61         ops_memory_add_mpi(out,key->key.dsa.p);
62         ops_memory_add_mpi(out,key->key.dsa.q);
63         ops_memory_add_mpi(out,key->key.dsa.g);
64         ops_memory_add_mpi(out,key->key.dsa.y);
65         break;
66
67     case OPS_PKA_RSA:
68     case OPS_PKA_RSA_ENCRYPT_ONLY:
69     case OPS_PKA_RSA_SIGN_ONLY:
70         ops_memory_add_mpi(out,key->key.rsa.n);
71         ops_memory_add_mpi(out,key->key.rsa.e);
72         break;
73
74     case OPS_PKA_ELGAMAL:
75         ops_memory_add_mpi(out,key->key.elgamal.p);
76         ops_memory_add_mpi(out,key->key.elgamal.g);
77         ops_memory_add_mpi(out,key->key.elgamal.y);
78         break;
79         }
80
81     if(make_packet)
82         ops_memory_make_packet(out,OPS_PTAG_CT_PUBLIC_KEY);
83     }
Note: See TracBrowser for help on using the browser.