Changeset 138
- Timestamp:
- 05/20/05 17:45:32
- Files:
-
- openpgpsdk/trunk/examples/create-signed-key.c (modified) (2 diffs)
- openpgpsdk/trunk/examples/packet-dump.c (modified) (1 diff)
- openpgpsdk/trunk/include/create.h (modified) (1 diff)
- openpgpsdk/trunk/include/packet.h (modified) (3 diffs)
- openpgpsdk/trunk/src/create.c (modified) (2 diffs)
- openpgpsdk/trunk/src/packet-parse.c (modified) (6 diffs)
- openpgpsdk/trunk/src/signature.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
openpgpsdk/trunk/examples/create-signed-key.c
r136 r138 19 19 unsigned char keyid[OPS_KEY_ID_SIZE]; 20 20 21 if(argc != 4)21 if(argc != 2) 22 22 { 23 fprintf(stderr,"%s < n> <e> <user id>\n",argv[0]);23 fprintf(stderr,"%s <public key file> <secret key file>\n",argv[0]); 24 24 exit(1); 25 25 } … … 43 43 44 44 ops_signature_start(&sig,&key,&id); 45 //ops_signature_add_creation_time(&sig,time(NULL));45 ops_signature_add_creation_time(&sig,time(NULL)); 46 46 47 47 ops_keyid(keyid,&key); 48 //ops_signature_add_issuer_key_id(&sig,keyid);48 ops_signature_add_issuer_key_id(&sig,keyid); 49 49 50 //ops_signature_add_primary_user_id(&sig,ops_true);50 ops_signature_add_primary_user_id(&sig,ops_true); 51 51 52 52 ops_signature_hashed_subpackets_end(&sig); openpgpsdk/trunk/examples/packet-dump.c
r134 r138 467 467 break; 468 468 469 case OPS_PTAG_CT_SECRET_KEY: 470 // XXX: fix me 471 printf("***RACHEL DO YOUR THING HERE***\n"); 472 break; 473 469 474 default: 470 475 fprintf(stderr,"packet-dump: unknown tag=%d\n",content_->tag); openpgpsdk/trunk/include/create.h
r136 r138 46 46 ops_boolean_t ops_write_scalar(unsigned n,unsigned length, 47 47 ops_create_options_t *opt); 48 ops_boolean_t ops_write_ss_header(unsigned length,ops_content_tag_t type, 49 ops_create_options_t *opt); 48 50 49 51 void ops_fast_create_rsa_public_key(ops_public_key_t *key,time_t time, openpgpsdk/trunk/include/packet.h
r136 r138 290 290 } ops_secret_key_union_t; 291 291 292 typedef struct 293 { 294 ops_secret_key_union_t key; 292 typedef enum 293 { 294 OPS_S2K_NONE=0, 295 } s2k_usage_t; 296 297 typedef struct 298 { 299 ops_public_key_t public_key; 300 s2k_usage_t s2k_usage; 301 unsigned checksum; 302 ops_secret_key_union_t key; 295 303 } ops_secret_key_t; 296 304 … … 633 641 ops_ss_features_t ss_features; 634 642 ops_ss_revocation_reason_t ss_revocation_reason; 643 ops_secret_key_t secret_key; 635 644 } ops_parser_content_union_t; 636 645 … … 672 681 void ops_packet_free(ops_packet_t *packet); 673 682 void ops_parser_content_free(ops_parser_content_t *c); 683 void ops_secret_key_free(ops_secret_key_t *key); 674 684 675 685 /* vim:set textwidth=120: */ openpgpsdk/trunk/src/create.c
r137 r138 56 56 ops_boolean_t ops_write_length(unsigned length,ops_create_options_t *opt) 57 57 { 58 unsigned char c[ 5];58 unsigned char c[2]; 59 59 60 60 if(length < 192) … … 69 69 return base_write(c,2,opt); 70 70 } 71 c[0]=0xff; 72 return ops_write_scalar(length,4,opt); 71 return ops_write_scalar(0xff,1,opt) && ops_write_scalar(length,4,opt); 72 } 73 74 ops_boolean_t ops_write_ss_header(unsigned length,ops_content_tag_t type, 75 ops_create_options_t *opt) 76 { 77 return ops_write_length(length,opt) 78 && ops_write_scalar(type-OPS_PTAG_SIGNATURE_SUBPACKET_BASE,1,opt); 73 79 } 74 80 openpgpsdk/trunk/src/packet-parse.c
r134 r138 536 536 break; 537 537 538 case OPS_PTAG_CT_SECRET_KEY: 539 ops_secret_key_free(&c->content.secret_key); 540 break; 541 538 542 default: 539 543 fprintf(stderr,"Can't free %d (0x%x)\n",c->tag,c->tag); … … 578 582 } 579 583 584 static int parse_public_key_data(ops_public_key_t *key,ops_region_t *region, 585 ops_parse_options_t *opt) 586 { 587 ops_parser_content_t content; 588 unsigned char c[1]; 589 590 assert (region->length_read == 0); /* We should not have read anything so far */ 591 592 if(!ops_limited_read(c,1,region,opt)) 593 return 0; 594 key->version=c[0]; 595 if(key->version < 2 || key->version > 4) 596 ERR1("Bad public key version (0x%02x)",key->version); 597 598 if(!limited_read_time(&key->creation_time,region,opt)) 599 return 0; 600 601 key->days_valid=0; 602 if((key->version == 2 || key->version == 3) 603 && !limited_read_scalar(&key->days_valid,2,region,opt)) 604 return 0; 605 606 if(!ops_limited_read(c,1,region,opt)) 607 return 0; 608 609 key->algorithm=c[0]; 610 611 switch(key->algorithm) 612 { 613 case OPS_PKA_DSA: 614 if(!limited_read_mpi(&key->key.dsa.p,region,opt) 615 || !limited_read_mpi(&key->key.dsa.q,region,opt) 616 || !limited_read_mpi(&key->key.dsa.g,region,opt) 617 || !limited_read_mpi(&key->key.dsa.y,region,opt)) 618 return 0; 619 break; 620 621 case OPS_PKA_RSA: 622 case OPS_PKA_RSA_ENCRYPT_ONLY: 623 case OPS_PKA_RSA_SIGN_ONLY: 624 if(!limited_read_mpi(&key->key.rsa.n,region,opt) 625 || !limited_read_mpi(&key->key.rsa.e,region,opt)) 626 return 0; 627 break; 628 629 case OPS_PKA_ELGAMAL: 630 if(!limited_read_mpi(&key->key.elgamal.p,region,opt) 631 || !limited_read_mpi(&key->key.elgamal.g,region,opt) 632 || !limited_read_mpi(&key->key.elgamal.y,region,opt)) 633 return 0; 634 break; 635 636 default: 637 ERR1("Unknown public key algorithm (%d)",key->algorithm); 638 } 639 640 return 1; 641 } 642 643 580 644 /** Parse a public key packet. 581 645 * … … 595 659 { 596 660 ops_parser_content_t content; 597 unsigned char c[1]; 598 599 assert (region->length_read == 0); /* We should not have read anything so far */ 600 601 if(!ops_limited_read(c,1,region,opt)) 602 return 0; 603 C.public_key.version=c[0]; 604 if(C.public_key.version < 2 || C.public_key.version > 4) 605 ERR1("Bad public key version (0x%02x)",C.public_key.version); 606 607 if(!limited_read_time(&C.public_key.creation_time,region,opt)) 608 return 0; 609 610 C.public_key.days_valid=0; 611 if((C.public_key.version == 2 || C.public_key.version == 3) 612 && !limited_read_scalar(&C.public_key.days_valid,2,region,opt)) 613 return 0; 614 615 if(!ops_limited_read(c,1,region,opt)) 616 return 0; 617 618 C.public_key.algorithm=c[0]; 619 620 switch(C.public_key.algorithm) 621 { 622 case OPS_PKA_DSA: 623 if(!limited_read_mpi(&C.public_key.key.dsa.p,region,opt) 624 || !limited_read_mpi(&C.public_key.key.dsa.q,region,opt) 625 || !limited_read_mpi(&C.public_key.key.dsa.g,region,opt) 626 || !limited_read_mpi(&C.public_key.key.dsa.y,region,opt)) 627 return 0; 628 break; 629 630 case OPS_PKA_RSA: 631 case OPS_PKA_RSA_ENCRYPT_ONLY: 632 case OPS_PKA_RSA_SIGN_ONLY: 633 if(!limited_read_mpi(&C.public_key.key.rsa.n,region,opt) 634 || !limited_read_mpi(&C.public_key.key.rsa.e,region,opt)) 635 return 0; 636 break; 637 638 case OPS_PKA_ELGAMAL: 639 if(!limited_read_mpi(&C.public_key.key.elgamal.p,region,opt) 640 || !limited_read_mpi(&C.public_key.key.elgamal.g,region,opt) 641 || !limited_read_mpi(&C.public_key.key.elgamal.y,region,opt)) 642 return 0; 643 break; 644 645 default: 646 ERR1("Unknown public key algorithm (%d)",C.public_key.algorithm); 647 } 648 661 662 if(!parse_public_key_data(&C.public_key,region,opt)) 663 return 0; 664 665 // XXX: this test should be done for all packets, surely? 649 666 if(region->length_read != region->length) 650 667 ERR1("Unconsumed data (%d)", region->length-region->length_read); … … 1397 1414 } 1398 1415 1416 void ops_secret_key_free(ops_secret_key_t *key) 1417 { 1418 switch(key->public_key.algorithm) 1419 { 1420 case OPS_PKA_RSA: 1421 case OPS_PKA_RSA_ENCRYPT_ONLY: 1422 case OPS_PKA_RSA_SIGN_ONLY: 1423 free_BN(&key->key.rsa.d); 1424 free_BN(&key->key.rsa.p); 1425 free_BN(&key->key.rsa.q); 1426 free_BN(&key->key.rsa.u); 1427 break; 1428 1429 default: 1430 assert(0); 1431 } 1432 1433 ops_public_key_free(&key->public_key); 1434 } 1435 1436 static int parse_secret_key(ops_region_t *region,ops_parse_options_t *opt) 1437 { 1438 ops_parser_content_t content; 1439 unsigned char c[1]; 1440 1441 if(!parse_public_key_data(&C.secret_key.public_key,region,opt)) 1442 return 0; 1443 if(!ops_limited_read(c,1,region,opt)) 1444 return 0; 1445 C.secret_key.s2k_usage=c[0]; 1446 assert(C.secret_key.s2k_usage == 0); 1447 1448 switch(C.secret_key.public_key.algorithm) 1449 { 1450 case OPS_PKA_RSA: 1451 case OPS_PKA_RSA_ENCRYPT_ONLY: 1452 case OPS_PKA_RSA_SIGN_ONLY: 1453 if(!limited_read_mpi(&C.secret_key.key.rsa.d,region,opt) 1454 || !limited_read_mpi(&C.secret_key.key.rsa.p,region,opt) 1455 || !limited_read_mpi(&C.secret_key.key.rsa.q,region,opt) 1456 || !limited_read_mpi(&C.secret_key.key.rsa.u,region,opt)) 1457 return 0; 1458 break; 1459 1460 default: 1461 assert(0); 1462 } 1463 1464 if(!limited_read_scalar(&C.secret_key.checksum,2,region,opt)) 1465 return 0; 1466 // XXX: check the checksum 1467 1468 CB(OPS_PTAG_CT_SECRET_KEY,&content); 1469 1470 return 1; 1471 } 1472 1399 1473 /** Parse one packet. 1400 1474 * … … 1505 1579 break; 1506 1580 1581 case OPS_PTAG_CT_SECRET_KEY: 1582 r=parse_secret_key(®ion,opt); 1583 break; 1584 1507 1585 default: 1508 1586 format_error(&content,"Format error (unknown content tag %d)", … … 1511 1589 r=0; 1512 1590 } 1591 // XXX: shouldn't we check that the entire packet has been consumed? 1513 1592 if(opt->accumulate) 1514 1593 { openpgpsdk/trunk/src/signature.c
r137 r138 299 299 rsa_sign(&sig->hash,&key->key.rsa,&skey->key.rsa); 300 300 } 301 302 void ops_signature_add_creation_time(ops_create_signature_t *sig,time_t when) 303 { 304 ops_write_ss_header(5,OPS_PTAG_SS_CREATION_TIME,&sig->opt); 305 ops_write_scalar(when,4,&sig->opt); 306 } 307 308 void ops_signature_add_issuer_key_id(ops_create_signature_t *sig, 309 const unsigned char keyid[OPS_KEY_ID_SIZE]) 310 { 311 ops_write_ss_header(OPS_KEY_ID_SIZE+1,OPS_PTAG_SS_ISSUER_KEY_ID,&sig->opt); 312 ops_write(keyid,OPS_KEY_ID_SIZE,&sig->opt); 313 } 314 315 void ops_signature_add_primary_user_id(ops_create_signature_t *sig, 316 ops_boolean_t primary) 317 { 318 ops_write_ss_header(2,OPS_PTAG_SS_PRIMARY_USER_ID,&sig->opt); 319 ops_write_scalar(primary,1,&sig->opt); 320 }
