Changeset 326
- Timestamp:
- 01/03/06 14:18:52
- Files:
-
- openpgpsdk/trunk/examples/packet-dump.c (modified) (1 diff)
- openpgpsdk/trunk/include/openpgpsdk/packet.h (modified) (3 diffs)
- openpgpsdk/trunk/src/packet-parse.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
openpgpsdk/trunk/examples/packet-dump.c
r320 r326 832 832 break; 833 833 834 case OPS_PTAG_CT_PK_SESSION_KEY: 835 print_tagname("PUBLIC KEY SESSION KEY"); 836 printf("Version: %d\n",content->pk_session_key.version); 837 print_hexdump("key ID",content->pk_session_key.key_id, 838 sizeof content->pk_session_key.key_id); 839 printf("Algorithm: %d\n",content->pk_session_key.algorithm); 840 switch(content->pk_session_key.algorithm) 841 { 842 case OPS_PKA_RSA: 843 print_bn("encrypted_m", 844 content->pk_session_key.parameters.rsa.encrypted_m); 845 break; 846 847 case OPS_PKA_ELGAMAL: 848 print_bn("g_to_k", 849 content->pk_session_key.parameters.elgamal.g_to_k); 850 print_bn("encrypted_m", 851 content->pk_session_key.parameters.elgamal.encrypted_m); 852 break; 853 854 default: 855 assert(0); 856 } 857 break; 858 834 859 default: 835 860 print_tagname("UNKNOWN PACKET TYPE"); openpgpsdk/trunk/include/openpgpsdk/packet.h
r307 r326 753 753 unsigned char *data; 754 754 } ops_unarmoured_text_t; 755 756 typedef enum 757 { 758 OPS_PKSK_V3=3 759 } ops_pk_session_key_version_t; 760 761 typedef struct 762 { 763 BIGNUM *encrypted_m; 764 } ops_pk_session_key_parameters_rsa_t; 765 766 typedef struct 767 { 768 BIGNUM *g_to_k; 769 BIGNUM *encrypted_m; 770 } ops_pk_session_key_parameters_elgamal_t; 771 772 typedef union 773 { 774 ops_pk_session_key_parameters_rsa_t rsa; 775 ops_pk_session_key_parameters_elgamal_t elgamal; 776 } ops_pk_session_key_parameters_t; 777 778 typedef struct 779 { 780 ops_pk_session_key_version_t version; 781 unsigned char key_id[OPS_KEY_ID_SIZE]; 782 ops_public_key_algorithm_t algorithm; 783 ops_pk_session_key_parameters_t parameters; 784 } ops_pk_session_key_t; 755 785 756 786 /** ops_parser_union_content_t */ … … 798 828 ops_signed_cleartext_trailer_t signed_cleartext_trailer; 799 829 ops_unarmoured_text_t unarmoured_text; 830 ops_pk_session_key_t pk_session_key; 800 831 } ops_parser_content_union_t; 801 832 … … 841 872 void ops_parser_content_free(ops_parser_content_t *c); 842 873 void ops_secret_key_free(ops_secret_key_t *key); 874 void ops_pk_session_key_free(ops_pk_session_key_t *sk); 843 875 844 876 /* vim:set textwidth=120: */ openpgpsdk/trunk/src/packet-parse.c
r324 r326 731 731 break; 732 732 733 case OPS_PTAG_CT_PK_SESSION_KEY: 734 ops_pk_session_key_free(&c->content.pk_session_key); 735 break; 736 733 737 default: 734 738 fprintf(stderr,"Can't free %d (0x%x)\n",c->tag,c->tag); … … 741 745 BN_free(*pp); 742 746 *pp=NULL; 747 } 748 749 void ops_pk_session_key_free(ops_pk_session_key_t *sk) 750 { 751 switch(sk->algorithm) 752 { 753 case OPS_PKA_RSA: 754 free_BN(&sk->parameters.rsa.encrypted_m); 755 break; 756 757 case OPS_PKA_ELGAMAL: 758 free_BN(&sk->parameters.elgamal.g_to_k); 759 free_BN(&sk->parameters.elgamal.encrypted_m); 760 break; 761 762 default: 763 assert(0); 764 } 743 765 } 744 766 … … 1758 1780 } 1759 1781 1782 static int parse_pk_session_key(ops_region_t *region, 1783 ops_parse_info_t *parse_info) 1784 { 1785 unsigned char c[1]; 1786 ops_parser_content_t content; 1787 1788 if(!limited_read(c,1,region,parse_info)) 1789 return 0; 1790 C.pk_session_key.version=c[0]; 1791 if(C.pk_session_key.version != OPS_PKSK_V3) 1792 ERR1P(parse_info, 1793 "Bad public-key encrypted session key version (%d)", 1794 C.pk_session_key.version); 1795 1796 if(!limited_read(C.pk_session_key.key_id, 1797 sizeof C.pk_session_key.key_id,region,parse_info)) 1798 return 0; 1799 1800 if(!limited_read(c,1,region,parse_info)) 1801 return 0; 1802 C.pk_session_key.algorithm=c[0]; 1803 switch(C.pk_session_key.algorithm) 1804 { 1805 case OPS_PKA_RSA: 1806 if(!limited_read_mpi(&C.pk_session_key.parameters.rsa.encrypted_m, 1807 region,parse_info)) 1808 return 0; 1809 break; 1810 1811 case OPS_PKA_ELGAMAL: 1812 if(!limited_read_mpi(&C.pk_session_key.parameters.elgamal.g_to_k, 1813 region,parse_info) 1814 || limited_read_mpi(&C.pk_session_key.parameters.elgamal.encrypted_m, 1815 region,parse_info)) 1816 return 0; 1817 break; 1818 1819 default: 1820 ERR1P(parse_info, 1821 "Unknown public key algorithm in session key (%d)", 1822 C.pk_session_key.algorithm); 1823 return 0; 1824 } 1825 1826 CBP(parse_info,OPS_PTAG_CT_PK_SESSION_KEY,&content); 1827 1828 return 1; 1829 } 1830 1831 1760 1832 /** Parse one packet. 1761 1833 * … … 1875 1947 break; 1876 1948 1949 case OPS_PTAG_CT_PK_SESSION_KEY: 1950 r=parse_pk_session_key(®ion,parse_info); 1951 break; 1952 1877 1953 default: 1878 1954 format_error(&content,"Format error (unknown content tag %d)",
