root/openpgpsdk/trunk/src/standard/std_print.c

Revision 485 (checked in by rachel, 6 years ago)

RSA encryption produces packets which can be decrypted by GPG.
MDC error still to fix.
Some refactoring to re-use common code in tests.

Line 
1 /*! \file
2   \brief Standard API print functions
3 */
4
5 /** @defgroup StdPrint Print
6     \ingroup StandardAPI
7 */
8
9 #include <assert.h>
10 #include <string.h>
11 #include "openpgpsdk/crypto.h"
12 #include "openpgpsdk/keyring.h"
13 #include "keyring_local.h"
14 #include "openpgpsdk/packet-show.h"
15 #include "openpgpsdk/util.h"
16 #include "openpgpsdk/std_print.h"
17
18 static int indent=0;
19
20 void print_bn( const char *name,
21                       const BIGNUM *bn);
22 #ifdef NOTYETUSED
23 static void print_hash(const char *name,
24                        const unsigned char *data,
25                        unsigned int len);
26 #endif
27 static void print_hex(const unsigned char *src,
28                       size_t length);
29 static void print_hexdump(const char *name,
30                           const unsigned char *data,
31                           unsigned int len);
32 static void print_hexdump_data(const char *name,
33                                const unsigned char *data,
34                                unsigned int len);
35 static void print_indent();
36 static void print_name(const char *name);
37 static void print_string_and_value(char *name,
38                                    const char *str,
39                                    unsigned char value);
40 static void print_tagname(const char *str);
41 static void print_time( char *name,
42                         time_t time);
43 static void print_time_short(time_t time);
44 static void print_unsigned_int(char *name,
45                                unsigned int val);
46 static void showtime(const char *name,time_t t);
47 static void showtime_short(time_t t);
48
49 /**
50    \ingroup StdPrintKeyring
51
52    Prints a public key in succinct detail
53
54    \param key Ptr to public key
55 */
56
57 void 
58 ops_print_public_key(const ops_key_data_t *key)
59     {
60     printf("pub ");
61
62     ops_show_pka(key->key.pkey.algorithm);
63     printf(" ");
64
65     hexdump(key->key_id, OPS_KEY_ID_SIZE);
66     printf(" ");
67
68     print_time_short(key->key.pkey.creation_time);
69     printf(" ");
70
71     if (key->nuids==1)
72         {
73         // print on same line as other info
74         printf ("%s\n", key->uids[0].user_id);
75         }
76     else
77         {
78         // print all uids on separate line
79         unsigned int i;
80         printf("\n");
81         for (i=0; i<key->nuids; i++)
82             {
83             printf("uid                              %s\n",key->uids[i].user_id);
84             }
85         }
86     }
87
88 /**
89    \ingroup StdPrintKeyring
90
91    Prints a public key in full detail
92
93    \param key Ptr to public key
94 */
95
96 void 
97 ops_print_public_key_verbose(const ops_key_data_t *key)
98     {
99     const ops_public_key_t* pkey=&key->key.pkey;
100
101     print_unsigned_int("Version",pkey->version);
102     print_time("Creation Time", pkey->creation_time);
103     if(pkey->version == OPS_V3)
104         print_unsigned_int("Days Valid",pkey->days_valid);
105
106     print_string_and_value("Algorithm",ops_show_pka(pkey->algorithm),
107                            pkey->algorithm);
108
109     switch(pkey->algorithm)
110         {
111     case OPS_PKA_DSA:
112         print_bn("p",pkey->key.dsa.p);
113         print_bn("q",pkey->key.dsa.q);
114         print_bn("g",pkey->key.dsa.g);
115         print_bn("y",pkey->key.dsa.y);
116         break;
117
118     case OPS_PKA_RSA:
119     case OPS_PKA_RSA_ENCRYPT_ONLY:
120     case OPS_PKA_RSA_SIGN_ONLY:
121         print_bn("n",pkey->key.rsa.n);
122         print_bn("e",pkey->key.rsa.e);
123         break;
124
125     case OPS_PKA_ELGAMAL:
126     case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
127         print_bn("p",pkey->key.elgamal.p);
128         print_bn("g",pkey->key.elgamal.g);
129         print_bn("y",pkey->key.elgamal.y);
130         break;
131
132     default:
133         assert(0);
134         }
135     }
136
137 /**
138    \ingroup StdPrintKeyring
139
140    Prints a secret key
141
142    \param key Ptr to public key
143 */
144
145 void 
146 ops_print_secret_key(const ops_key_data_t* key)
147     {
148     const ops_secret_key_t* skey=&key->key.skey;
149     if(key->type == OPS_PTAG_CT_SECRET_KEY)
150         print_tagname("SECRET_KEY");
151     else
152         print_tagname("ENCRYPTED_SECRET_KEY");
153     ops_print_public_key(key);
154     printf("S2K Usage: %d\n",skey->s2k_usage);
155     if(skey->s2k_usage != OPS_S2KU_NONE)
156         {
157         printf("S2K Specifier: %d\n",skey->s2k_specifier);
158         printf("Symmetric algorithm: %d (%s)\n",skey->algorithm,
159                ops_show_symmetric_algorithm(skey->algorithm));
160         printf("Hash algorithm: %d (%s)\n",skey->hash_algorithm,
161                ops_show_hash_algorithm(skey->hash_algorithm));
162         if(skey->s2k_specifier != OPS_S2KS_SIMPLE)
163             print_hexdump("Salt",skey->salt,sizeof skey->salt);
164         if(skey->s2k_specifier == OPS_S2KS_ITERATED_AND_SALTED)
165             printf("Octet count: %d\n",skey->octet_count);
166         print_hexdump("IV",skey->iv,ops_block_size(skey->algorithm));
167         }
168
169     /* no more set if encrypted */
170     if(key->type == OPS_PTAG_CT_ENCRYPTED_SECRET_KEY)
171         return;
172
173     switch(skey->public_key.algorithm)
174         {
175     case OPS_PKA_RSA:
176         print_bn("d",skey->key.rsa.d);
177         print_bn("p",skey->key.rsa.p);
178         print_bn("q",skey->key.rsa.q);
179         print_bn("u",skey->key.rsa.u);
180         break;
181
182     case OPS_PKA_DSA:
183         print_bn("x",skey->key.dsa.x);
184         break;
185
186     default:
187         assert(0);
188         }
189
190     if(skey->s2k_usage == OPS_S2KU_ENCRYPTED_AND_HASHED)
191         print_hexdump("Checkhash",skey->checkhash,OPS_CHECKHASH_SIZE);
192     else
193         printf("Checksum: %04x\n",skey->checksum);
194     }
195
196 // static functions
197
198 static void print_unsigned_int(char *name, unsigned int val)
199     {
200     print_name(name);
201     printf("%d\n", val);
202     }
203
204 static void print_time( char *name, time_t time)
205     {
206     print_indent();
207     printf("%s: ",name);
208     showtime("time",time);
209     printf("\n");
210     }
211
212 static void print_time_short(time_t time)
213     {
214     showtime_short(time);
215     }
216
217 static void print_string_and_value(char *name,const char *str,
218                                    unsigned char value)
219     {
220     print_name(name);
221
222     printf("%s", str);
223     printf(" (0x%x)", value);
224     printf("\n");
225     }
226
227 void print_bn( const char *name, const BIGNUM *bn)
228     {
229     print_indent();
230     printf("%s=",name);
231     if(bn)
232         {
233         BN_print_fp(stdout,bn);
234         putchar('\n');
235         }
236     else
237         puts("(unset)");
238     }
239
240 static void print_tagname(const char *str)
241     {
242     print_indent();
243     printf("%s packet\n", str);
244     }
245
246 #ifdef NOTYETUSED
247 static void print_hash(const char *name,
248                           const unsigned char *data,
249                           unsigned int len)
250     {
251         unsigned int i=0;
252     print_name(name);
253     printf("len=%d, data=0x", len);
254         for (i=0; i<len; i++)
255                 {
256                 printf("0x%2x ",data[i]);
257                 }
258         printf("\n");
259     }
260 #endif
261
262 static void print_hexdump(const char *name,
263                           const unsigned char *data,
264                           unsigned int len)
265     {
266     print_name(name);
267
268     printf("len=%d, data=0x", len);
269     print_hex(data,len);
270     printf("\n");
271     }
272
273 static void print_hexdump_data(const char *name,
274                                const unsigned char *data,
275                                unsigned int len)
276     {
277     print_name(name);
278
279     printf("0x");
280     print_hex(data,len);
281     printf("\n");
282     }
283
284 static void print_data(const char *name,const ops_data_t *data)
285     {
286     print_hexdump(name,data->contents,data->len);
287     }
288
289
290 static void print_name(const char *name)
291     {
292     print_indent();
293     if(name)
294         printf("%s: ",name);
295     }
296
297 static void print_indent()
298     {
299     int i=0;
300
301     for(i=0 ; i < indent ; i++)
302         printf("  ");
303     }
304
305 /* printhex is now print_hex for consistency */
306 static void print_hex(const unsigned char *src,size_t length)
307     {
308     while(length--)
309         printf("%02X",*src++);
310     }
311
312 static void showtime(const char *name,time_t t)
313     {
314     printf("%s=" TIME_T_FMT " (%.24s)",name,t,ctime(&t));
315     }
316 static void showtime_short(time_t t)
317     {
318     struct tm* tm;
319     /*
320     const int maxbuf=512;
321     char buf[maxbuf+1];
322     buf[maxbuf]='\0';
323     // this needs to be tm struct
324     strftime(buf,maxbuf,"%F",&t);
325     printf(buf);
326     */
327     tm=gmtime(&t);
328     printf ("%04d-%02d-%02d", tm->tm_year+1900, tm->tm_mon, tm->tm_mday);
329     }
330
331
332 static void print_packet_hex(const ops_packet_t *packet)
333     {
334     unsigned char *cur;
335     int i;
336     int rem;
337     int blksz=4;
338
339     printf("\nhexdump of packet contents follows:\n");
340
341
342     for (i=1,cur=packet->raw; cur<(packet->raw+packet->length); cur+=blksz,i++)
343         {
344         rem = packet->raw+packet->length-cur;
345         hexdump(cur,rem<=blksz ? rem : blksz);
346         printf(" ");
347         if (!(i%8))
348             printf("\n");
349        
350         }
351    
352     printf("\n");
353     }
354
355 static void print_escaped(const unsigned char *data,size_t length)
356     {
357     while(length-- > 0)
358         {
359         if((*data >= 0x20 && *data < 0x7f && *data != '%') || *data == '\n')
360             putchar(*data);
361         else
362             printf("%%%02x",*data);
363         ++data;
364         }
365     }
366
367 static void print_string(const char *name,const char *str)
368     {
369     print_name(name);
370     print_escaped((unsigned char *)str,strlen(str));
371     putchar('\n');
372     }
373
374 static void print_utf8_string(const char *name,const unsigned char *str)
375     {
376     // \todo Do this better for non-English character sets
377     print_string(name,(const char *)str);
378     }
379
380 static void print_duration(char *name, time_t time)
381     {
382     int mins, hours, days, years;
383
384     print_indent();
385     printf("%s: ",name);
386     printf("duration " TIME_T_FMT " seconds",time);
387
388     mins=time/60;
389     hours=mins/60;
390     days=hours/24;
391     years=days/365;
392
393     printf(" (approx. ");
394     if (years)
395         printf("%d %s",years,years==1?"year":"years");
396     else if (days)
397         printf("%d %s",days,days==1?"day":"days");
398     else if (hours)
399         printf("%d %s", hours, hours==1?"hour":"hours");
400
401     printf(")");
402     printf("\n");
403     }
404
405 static void print_boolean(const char *name, unsigned char bool)
406     {
407     print_name(name);
408
409     if(bool)
410         printf("Yes");
411     else
412         printf("No");
413     printf("\n");
414     }
415
416 static void print_text_breakdown( ops_text_t *text)
417     {
418     unsigned i;
419     char *prefix=".. ";
420
421     /* these were recognised */
422
423     for(i=0 ; i<text->known.used ; i++)
424         {
425         print_indent();
426         printf(prefix);
427         printf("%s\n",text->known.strings[i]);
428         }
429
430     /* these were not recognised. the strings will contain the hex value
431        of the unrecognised value in string format - see process_octet_str()
432     */
433
434     if(text->unknown.used)
435         {
436         printf("\n");
437         print_indent();
438         printf("Not Recognised: ");
439         }
440     for( i=0; i < text->unknown.used; i++)
441         {
442         print_indent();
443         printf(prefix);
444         printf("%s\n",text->unknown.strings[i]);
445         }
446        
447     }
448
449 static void print_headers(const ops_headers_t *headers)
450     {
451     unsigned n;
452
453     for(n=0 ; n < headers->nheaders ; ++n)
454         printf("%s=%s\n",headers->headers[n].key,headers->headers[n].value);
455     }
456
457 static void print_block(const char *name,const unsigned char *str,
458                         size_t length)
459     {
460     int o=length;
461
462     print_indent();
463     printf(">>>>> %s >>>>>\n",name);
464
465     print_indent();
466     for( ; length > 0 ; --length)
467         {
468         if(*str >= 0x20 && *str < 0x7f && *str != '%')
469             putchar(*str);
470         else if(*str == '\n')
471             {
472             putchar(*str);
473             print_indent();
474             }
475         else
476             printf("%%%02x",*str);
477         ++str;
478         }
479     if(o && str[-1] != '\n')
480         {
481         putchar('\n');
482         print_indent();
483         fputs("[no newline]",stdout);
484         }
485     else
486         print_indent();
487     printf("<<<<< %s <<<<<\n",name);
488     }
489
490 void ops_print_pk_session_key(ops_content_tag_t tag,
491                                  const ops_pk_session_key_t *key)
492     {
493     if(tag == OPS_PTAG_CT_PK_SESSION_KEY)
494         print_tagname("PUBLIC KEY SESSION KEY");
495     else
496         print_tagname("ENCRYPTED PUBLIC KEY SESSION KEY");
497        
498     printf("Version: %d\n",key->version);
499     print_hexdump("Key ID",key->key_id,sizeof key->key_id);
500     printf("Algorithm: %d (%s)\n",key->algorithm,
501            ops_show_pka(key->algorithm));
502     switch(key->algorithm)
503         {
504     case OPS_PKA_RSA:
505         print_bn("encrypted_m",key->parameters.rsa.encrypted_m);
506         break;
507
508     case OPS_PKA_ELGAMAL:
509         print_bn("g_to_k",key->parameters.elgamal.g_to_k);
510         print_bn("encrypted_m",key->parameters.elgamal.encrypted_m);
511         break;
512
513     default:
514         assert(0);
515         }
516
517     if(tag != OPS_PTAG_CT_PK_SESSION_KEY)
518         return;
519
520     printf("Symmetric algorithm: %d (%s)\n",key->symmetric_algorithm,
521            ops_show_symmetric_algorithm(key->symmetric_algorithm));
522     print_hexdump("Key",key->key,ops_key_size(key->symmetric_algorithm));
523     printf("Checksum: %04x\n",key->checksum);
524     }
525
526 static void start_subpacket(unsigned type)
527     {
528     indent++;
529     print_indent();
530     printf("-- %s (type 0x%02x)\n",
531            ops_show_ss_type(type),
532            type-OPS_PTAG_SIGNATURE_SUBPACKET_BASE);
533     }
534  
535 static void end_subpacket()
536     {
537     indent--;
538     }
539
540 int ops_print_packet(const ops_parser_content_t *content_)
541     {
542     const ops_parser_content_union_t *content=&content_->content;
543     ops_text_t *text;
544     const char *str;
545 #ifdef XXX
546     const ops_key_data_t *decrypter;
547     const ops_secret_key_t *secret;
548 #endif
549     static ops_boolean_t unarmoured;
550
551     /*    OPS_USED(cbinfo);*/
552
553     if(unarmoured && content_->tag != OPS_PTAG_CT_UNARMOURED_TEXT)
554         {
555         unarmoured=ops_false;
556         puts("UNARMOURED TEXT ends");
557         }
558
559     if (content_->tag==OPS_PARSER_PTAG)
560         {
561         printf("=> OPS_PARSER_PTAG: %s\n", ops_show_packet_tag(content->ptag.content_tag));
562         }
563     else
564         {
565         printf("=> %s\n", ops_show_packet_tag(content_->tag));
566         }
567
568     switch(content_->tag)
569         {
570     case OPS_PARSER_ERROR:
571         printf("parse error: %s\n",content->error.error);
572         break;
573
574     case OPS_PARSER_ERRCODE:
575         printf("parse error: %s\n",
576                ops_errcode(content->errcode.errcode));
577         break;
578
579     case OPS_PARSER_PACKET_END:
580         print_packet_hex(&content->packet);
581         break;
582
583     case OPS_PARSER_PTAG:
584         if(content->ptag.content_tag == OPS_PTAG_CT_PUBLIC_KEY)
585             {
586             indent=0;
587             printf("\n*** NEXT KEY ***\n");
588             }
589
590         printf("\n");
591         print_indent();
592         printf("==== ptag new_format=%d content_tag=%d length_type=%d"
593                " length=0x%x (%d) position=0x%x (%d)\n",content->ptag.new_format,
594                content->ptag.content_tag,content->ptag.length_type,
595                content->ptag.length,content->ptag.length,
596                content->ptag.position,content->ptag.position);
597         print_tagname(ops_show_packet_tag(content->ptag.content_tag));
598         break;
599
600     case OPS_PTAG_CT_SE_DATA_HEADER:
601         print_tagname("SYMMETRIC ENCRYPTED DATA");
602         break;
603
604     case OPS_PTAG_CT_SE_IP_DATA_HEADER:
605         print_tagname("SYMMETRIC ENCRYPTED INTEGRITY PROTECTED DATA HEADER");
606         printf("Version: %d\n",content->se_ip_data_header.version);
607         break;
608
609     case OPS_PTAG_CT_SE_IP_DATA_BODY:
610         print_tagname("SYMMETRIC ENCRYPTED INTEGRITY PROTECTED DATA BODY");
611         printf("  data body length=%d\n",
612                content->se_data_body.length);
613         printf("    data=");
614         hexdump(content->se_data_body.data,
615                 content->se_data_body.length);
616         printf("\n");
617         break;
618
619     case OPS_PTAG_CT_PUBLIC_KEY:
620     case OPS_PTAG_CT_PUBLIC_SUBKEY:
621         if (content_->tag == OPS_PTAG_CT_PUBLIC_KEY)
622             print_tagname("PUBLIC KEY");
623         else
624             print_tagname("PUBLIC SUBKEY");
625
626         ops_print_public_key((const ops_key_data_t *) &content->public_key);
627         break;
628
629     case OPS_PTAG_CT_TRUST:
630         print_tagname("TRUST");
631         print_data("Trust",&content->trust.data);
632         break;
633        
634     case OPS_PTAG_CT_USER_ID:
635         /* XXX: how do we print UTF-8? */
636         print_tagname("USER ID");
637         print_utf8_string("user_id",content->user_id.user_id);
638         break;
639
640     case OPS_PTAG_CT_SIGNATURE:
641         print_tagname("SIGNATURE");
642         print_indent(indent);
643         print_unsigned_int("Signature Version",
644                content->signature.version);
645         if (content->signature.creation_time_set)
646             print_time("Signature Creation Time",
647                        content->signature.creation_time);
648
649         print_string_and_value("Signature Type",
650                                ops_show_sig_type(content->signature.type),
651                                content->signature.type);
652
653         if(content->signature.signer_id_set)
654             print_hexdump_data("Signer ID",
655                                content->signature.signer_id,
656                                sizeof content->signature.signer_id);
657
658         print_string_and_value("Public Key Algorithm",
659                                ops_show_pka(content->signature.key_algorithm),
660                                content->signature.key_algorithm);
661         print_string_and_value("Hash Algorithm",
662                                ops_show_hash_algorithm(content->signature.hash_algorithm),
663                                content->signature.hash_algorithm);
664
665         print_indent();
666         print_hexdump_data("hash2",&content->signature.hash2[0],2);
667
668         switch(content->signature.key_algorithm)
669             {
670         case OPS_PKA_RSA:
671         case OPS_PKA_RSA_SIGN_ONLY:
672             print_bn("sig",content->signature.signature.rsa.sig);
673             break;
674
675         case OPS_PKA_DSA:
676             print_bn("r",content->signature.signature.dsa.r);
677             print_bn("s",content->signature.signature.dsa.s);
678             break;
679
680         case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
681             print_bn("r",content->signature.signature.elgamal.r);
682             print_bn("s",content->signature.signature.elgamal.s);
683             break;
684
685         default:
686             assert(0);
687             }
688
689         if(content->signature.hash)
690             printf("data hash is set\n");
691
692         break;
693
694     case OPS_PTAG_CT_COMPRESSED:
695         print_tagname("COMPRESSED");
696         print_unsigned_int("Compressed Data Type", content->compressed.type);
697         break;
698
699     case OPS_PTAG_CT_ONE_PASS_SIGNATURE:
700         print_tagname("ONE PASS SIGNATURE");
701
702         print_unsigned_int("Version",content->one_pass_signature.version);
703         print_string_and_value("Signature Type",
704                                ops_show_sig_type(content->one_pass_signature.sig_type),
705                                content->one_pass_signature.sig_type);
706         print_string_and_value("Hash Algorithm",
707                                ops_show_hash_algorithm(content->one_pass_signature.hash_algorithm),
708                                content->one_pass_signature.hash_algorithm);
709         print_string_and_value("Public Key Algorithm",
710                                ops_show_pka(content->one_pass_signature.key_algorithm),
711                                content->one_pass_signature.key_algorithm);
712         print_hexdump_data("Signer ID",
713                            content->one_pass_signature.keyid,
714                            sizeof content->one_pass_signature.keyid);
715
716         print_unsigned_int("Nested",
717                            content->one_pass_signature.nested);
718         break;
719
720     case OPS_PTAG_CT_USER_ATTRIBUTE:
721         print_tagname("USER ATTRIBUTE");
722         print_hexdump("User Attribute",
723                       content->user_attribute.data.contents,
724                       content->user_attribute.data.len);
725         break;
726
727     case OPS_PTAG_RAW_SS:
728         assert(!content_->critical);
729         start_subpacket(content_->tag);
730         print_unsigned_int("Raw Signature Subpacket: tag",
731                            content->ss_raw.tag-OPS_PTAG_SIGNATURE_SUBPACKET_BASE);
732         print_hexdump("Raw Data",
733                       content->ss_raw.raw,
734                       content->ss_raw.length);
735         break;
736
737     case OPS_PTAG_SS_CREATION_TIME:
738         start_subpacket(content_->tag);
739         print_time("Signature Creation Time",content->ss_time.time);
740         end_subpacket();
741         break;
742
743     case OPS_PTAG_SS_EXPIRATION_TIME:
744         start_subpacket(content_->tag);
745         print_duration("Signature Expiration Time",content->ss_time.time);
746         end_subpacket();
747         break;
748
749     case OPS_PTAG_SS_KEY_EXPIRATION_TIME:
750         start_subpacket(content_->tag);
751         print_duration("Key Expiration Time", content->ss_time.time);
752         end_subpacket();
753         break;
754
755     case OPS_PTAG_SS_TRUST:
756         start_subpacket(content_->tag);
757         print_string("Trust Signature","");
758         print_unsigned_int("Level",
759                            content->ss_trust.level);
760         print_unsigned_int("Amount",
761                            content->ss_trust.amount);
762         end_subpacket();
763         break;
764                
765     case OPS_PTAG_SS_REVOCABLE:
766         start_subpacket(content_->tag);
767         print_boolean("Revocable",content->ss_revocable.revocable);
768         end_subpacket();
769         break;     
770
771     case OPS_PTAG_SS_REVOCATION_KEY:
772         start_subpacket(content_->tag);
773         /* not yet tested */
774         printf ("  revocation key: class=0x%x",
775                 content->ss_revocation_key.class);
776         if (content->ss_revocation_key.class&0x40)
777             printf (" (sensitive)");
778         printf (", algid=0x%x",
779                 content->ss_revocation_key.algid);
780         printf(", fingerprint=");
781         hexdump(content->ss_revocation_key.fingerprint,20);
782         printf("\n");
783         end_subpacket();
784         break;
785    
786     case OPS_PTAG_SS_ISSUER_KEY_ID:
787         start_subpacket(content_->tag);
788         print_hexdump("Issuer Key Id",
789                       &content->ss_issuer_key_id.key_id[0],
790                       sizeof content->ss_issuer_key_id.key_id);
791         end_subpacket();
792         break;
793
794     case OPS_PTAG_SS_PREFERRED_SKA:
795         start_subpacket(content_->tag);
796         print_data( "Preferred Symmetric Algorithms",
797                    &content->ss_preferred_ska.data);
798
799         text = ops_showall_ss_preferred_ska(content->ss_preferred_ska);
800         print_text_breakdown(text);
801         ops_text_free(text);
802
803         end_subpacket();
804         break;
805
806     case OPS_PTAG_SS_PRIMARY_USER_ID:
807         start_subpacket(content_->tag);
808         print_boolean("Primary User ID",
809                       content->ss_primary_user_id.primary_user_id);
810         end_subpacket();
811         break;     
812
813     case OPS_PTAG_SS_PREFERRED_HASH:
814         start_subpacket(content_->tag);
815         print_data("Preferred Hash Algorithms",
816                    &content->ss_preferred_hash.data);
817
818         text = ops_showall_ss_preferred_hash(content->ss_preferred_hash);
819         print_text_breakdown(text);
820         ops_text_free(text);
821         end_subpacket();
822         break;
823
824     case OPS_PTAG_SS_PREFERRED_COMPRESSION:
825         start_subpacket(content_->tag);
826         print_data( "Preferred Compression Algorithms",
827                    &content->ss_preferred_compression.data);
828
829         text = ops_showall_ss_preferred_compression(content->ss_preferred_compression);
830         print_text_breakdown(text);
831         ops_text_free(text);
832         end_subpacket();
833         break;
834        
835     case OPS_PTAG_SS_KEY_FLAGS:
836         start_subpacket(content_->tag);
837         print_data( "Key Flags", &content->ss_key_flags.data);
838
839         text = ops_showall_ss_key_flags(content->ss_key_flags);
840         print_text_breakdown( text);
841         ops_text_free(text);
842
843         end_subpacket();
844         break;
845        
846     case OPS_PTAG_SS_KEY_SERVER_PREFS:
847         start_subpacket(content_->tag);
848         print_data( "Key Server Preferences",
849                    &content->ss_key_server_prefs.data);
850
851         text = ops_showall_ss_key_server_prefs(content->ss_key_server_prefs);
852         print_text_breakdown( text);
853         ops_text_free(text);
854
855         end_subpacket();
856         break;
857        
858     case OPS_PTAG_SS_FEATURES:
859         start_subpacket(content_->tag);
860         print_data( "Features",
861                    &content->ss_features.data);
862
863         text = ops_showall_ss_features(content->ss_features);
864         print_text_breakdown( text);
865         ops_text_free(text);
866
867         end_subpacket();
868         break;
869
870     case OPS_PTAG_SS_NOTATION_DATA:
871         start_subpacket(content_->tag);
872         print_indent();
873         printf("Notation Data:\n");
874
875         indent++;
876         print_data( "Flags",
877                    &content->ss_notation_data.flags);
878         text = ops_showall_ss_notation_data_flags(content->ss_notation_data);
879         print_text_breakdown( text);
880         ops_text_free(text);
881
882         /* xxx - TODO: print out UTF - rachel */
883
884         print_data( "Name",
885                    &content->ss_notation_data.name);
886
887         print_data( "Value",
888                    &content->ss_notation_data.value);
889
890         indent--;
891         end_subpacket();
892         break;
893
894     case OPS_PTAG_SS_REGEXP:
895         start_subpacket(content_->tag);
896         print_hexdump("Regular Expression",
897                       (unsigned char *)content->ss_regexp.text,
898                       strlen(content->ss_regexp.text));
899         print_string(NULL,
900                      content->ss_regexp.text);
901         end_subpacket();
902         break;
903
904     case OPS_PTAG_SS_POLICY_URL:
905         start_subpacket(content_->tag);
906         print_string("Policy URL",
907                      content->ss_policy_url.text);
908         end_subpacket();
909         break;
910
911     case OPS_PTAG_SS_SIGNERS_USER_ID:
912         start_subpacket(content_->tag);
913         print_utf8_string("Signer's User ID",content->ss_signers_user_id.user_id);
914         end_subpacket();
915         break;
916
917     case OPS_PTAG_SS_PREFERRED_KEY_SERVER:
918         start_subpacket(content_->tag);
919         print_string("Preferred Key Server",
920                      content->ss_preferred_key_server.text);
921         end_subpacket();
922         break;
923
924     case OPS_PTAG_SS_USERDEFINED00:
925     case OPS_PTAG_SS_USERDEFINED01:
926     case OPS_PTAG_SS_USERDEFINED02:
927     case OPS_PTAG_SS_USERDEFINED03:
928     case OPS_PTAG_SS_USERDEFINED04:
929     case OPS_PTAG_SS_USERDEFINED05:
930     case OPS_PTAG_SS_USERDEFINED06:
931     case OPS_PTAG_SS_USERDEFINED07:
932     case OPS_PTAG_SS_USERDEFINED08:
933     case OPS_PTAG_SS_USERDEFINED09:
934     case OPS_PTAG_SS_USERDEFINED10:
935         start_subpacket(content_->tag);
936         print_hexdump("Internal or user-defined",
937                       content->ss_userdefined.data.contents,
938                       content->ss_userdefined.data.len);
939         end_subpacket();
940         break;
941
942     case OPS_PTAG_SS_RESERVED:
943         start_subpacket(content_->tag);
944         print_hexdump("Reserved",
945                       content->ss_userdefined.data.contents,
946                       content->ss_userdefined.data.len);
947         end_subpacket();
948         break;
949
950     case OPS_PTAG_SS_REVOCATION_REASON:
951         start_subpacket(content_->tag);
952         print_hexdump("Revocation Reason",
953                       &content->ss_revocation_reason.code,
954                       1);
955         str=ops_show_ss_rr_code(content->ss_revocation_reason.code);
956         print_string(NULL,str);
957         /* xxx - todo : output text as UTF-8 string */
958         end_subpacket();
959         break;
960
961     case OPS_PTAG_CT_LITERAL_DATA_HEADER:
962         print_tagname("LITERAL DATA HEADER");
963         printf("  literal data header format=%c filename='%s'\n",
964                content->literal_data_header.format,
965                content->literal_data_header.filename);
966         showtime("    modification time",
967                  content->literal_data_header.modification_time);
968         printf("\n");
969         break;
970
971     case OPS_PTAG_CT_LITERAL_DATA_BODY:
972         print_tagname("LITERAL DATA BODY");
973         printf("  literal data body length=%d\n",
974                content->literal_data_body.length);
975         printf("    data=");
976         print_escaped(content->literal_data_body.data,
977                       content->literal_data_body.length);
978         printf("\n");
979         break;
980
981     case OPS_PTAG_CT_SIGNATURE_HEADER:
982         print_tagname("SIGNATURE");
983         print_indent(indent);
984         print_unsigned_int("Signature Version",
985                content->signature.version);
986         if(content->signature.creation_time_set)
987             print_time("Signature Creation Time", content->signature.creation_time);
988
989         print_string_and_value("Signature Type",
990                                ops_show_sig_type(content->signature.type),
991                                content->signature.type);
992
993         if(content->signature.signer_id_set)
994             print_hexdump_data("Signer ID",
995                                content->signature.signer_id,
996                                sizeof content->signature.signer_id);
997
998         print_string_and_value("Public Key Algorithm",
999                                ops_show_pka(content->signature.key_algorithm),
1000                                content->signature.key_algorithm);
1001         print_string_and_value("Hash Algorithm",
1002                                ops_show_hash_algorithm(content->signature.hash_algorithm),
1003                                content->signature.hash_algorithm);
1004
1005         break;
1006
1007     case OPS_PTAG_CT_SIGNATURE_FOOTER:
1008         print_indent();
1009         print_hexdump_data("hash2",&content->signature.hash2[0],2);
1010
1011         switch(content->signature.key_algorithm)
1012             {
1013         case OPS_PKA_RSA:
1014             print_bn("sig",content->signature.signature.rsa.sig);
1015             break;
1016
1017         case OPS_PKA_DSA:
1018             print_bn("r",content->signature.signature.dsa.r);
1019             print_bn("s",content->signature.signature.dsa.s);
1020             break;
1021
1022         case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
1023             print_bn("r",content->signature.signature.elgamal.r);
1024             print_bn("s",content->signature.signature.elgamal.s);
1025             break;
1026
1027         case OPS_PKA_PRIVATE00:
1028         case OPS_PKA_PRIVATE01:
1029         case OPS_PKA_PRIVATE02:
1030         case OPS_PKA_PRIVATE03:
1031         case OPS_PKA_PRIVATE04:
1032         case OPS_PKA_PRIVATE05:
1033         case OPS_PKA_PRIVATE06:
1034         case OPS_PKA_PRIVATE07:
1035         case OPS_PKA_PRIVATE08:
1036         case OPS_PKA_PRIVATE09:
1037         case OPS_PKA_PRIVATE10:
1038             print_data("Private/Experimental",
1039                        &content->signature.signature.unknown.data);
1040             break;
1041
1042         default:
1043             assert(0);
1044             }
1045         break;
1046
1047     case OPS_PARSER_CMD_GET_SK_PASSPHRASE:
1048         print_tagname("OPS_PARSER_CMD_GET_SK_PASSPHRASE");
1049         /*
1050         if(passphrase_prompt)
1051             {
1052             print_secret_key(OPS_PTAG_CT_ENCRYPTED_SECRET_KEY,
1053                              content->secret_key_passphrase.secret_key);
1054             *content->secret_key_passphrase.passphrase=ops_get_passphrase();
1055             if(!**content->secret_key_passphrase.passphrase)
1056                 break;
1057             return OPS_KEEP_MEMORY;
1058             }
1059         else
1060             printf(">>> ASKED FOR PASSPHRASE <<<\n");
1061         */
1062
1063         break;
1064
1065     case OPS_PTAG_CT_SECRET_KEY:
1066         print_tagname("OPS_PTAG_CT_SECRET_KEY");
1067         ops_print_secret_key((const ops_key_data_t *)&content->secret_key);
1068         break;
1069
1070     case OPS_PTAG_CT_ENCRYPTED_SECRET_KEY:
1071         //      print_secret_key(content_->tag,&content->secret_key);
1072         print_tagname("OPS_PTAG_CT_ENCRYPTED_SECRET_KEY");
1073         ops_print_secret_key((const ops_key_data_t *)&content->secret_key);
1074         break;
1075
1076     case OPS_PTAG_CT_ARMOUR_HEADER:
1077         print_tagname("ARMOUR HEADER");
1078         print_string("type",content->armour_header.type);
1079         break;
1080
1081     case OPS_PTAG_CT_SIGNED_CLEARTEXT_HEADER:
1082         print_tagname("SIGNED CLEARTEXT HEADER");
1083         print_headers(&content->signed_cleartext_header.headers);
1084         break;
1085
1086     case OPS_PTAG_CT_SIGNED_CLEARTEXT_BODY:
1087         print_tagname("SIGNED CLEARTEXT BODY");
1088         print_block("signed cleartext",content->signed_cleartext_body.data,
1089                     content->signed_cleartext_body.length);
1090         break;
1091
1092     case OPS_PTAG_CT_SIGNED_CLEARTEXT_TRAILER:
1093         print_tagname("SIGNED CLEARTEXT TRAILER");
1094         printf("hash algorithm: %d\n",
1095                content->signed_cleartext_trailer.hash->algorithm);
1096         printf("\n");
1097         break;
1098
1099     case OPS_PTAG_CT_UNARMOURED_TEXT:
1100         if(!unarmoured)
1101             {
1102             print_tagname("UNARMOURED TEXT");
1103             unarmoured=ops_true;
1104             }
1105         putchar('[');
1106         print_escaped(content->unarmoured_text.data,
1107                       content->unarmoured_text.length);
1108         putchar(']');
1109         break;
1110
1111     case OPS_PTAG_CT_ARMOUR_TRAILER:
1112         print_tagname("ARMOUR TRAILER");
1113         print_string("type",content->armour_header.type);
1114         break;
1115
1116     case OPS_PTAG_CT_PK_SESSION_KEY:
1117     case OPS_PTAG_CT_ENCRYPTED_PK_SESSION_KEY:
1118         ops_print_pk_session_key(content_->tag,&content->pk_session_key);
1119         break;
1120
1121     case OPS_PARSER_CMD_GET_SECRET_KEY:
1122         ops_print_pk_session_key(OPS_PTAG_CT_ENCRYPTED_PK_SESSION_KEY,
1123                              content->get_secret_key.pk_session_key);
1124
1125 #ifdef XXX
1126         decrypter=ops_keyring_find_key_by_id(&keyring,
1127                                              content->get_secret_key.pk_session_key->key_id);
1128         if(!decrypter || !ops_key_is_secret(decrypter))
1129             break;
1130
1131         puts("[Decryption key found in keyring]");
1132
1133         secret=ops_get_secret_key_from_data(decrypter);
1134         while(!secret)
1135             {
1136             /* then it must be encrypted */
1137             char *phrase=ops_get_passphrase();
1138             secret=ops_decrypt_secret_key_from_data(decrypter,phrase);
1139             free(phrase);
1140             }
1141
1142         *content->get_secret_key.secret_key=secret;
1143 #endif 
1144         break;
1145
1146     default:
1147         print_tagname("UNKNOWN PACKET TYPE");
1148         fprintf(stderr,"packet-dump: unknown tag=%d (0x%x)\n",content_->tag,
1149                 content_->tag);
1150         exit(1);
1151         }
1152  return 1;
1153     }
Note: See TracBrowser for help on using the browser.