Changeset 138

Show
Ignore:
Timestamp:
05/20/05 17:45:32
Author:
ben
Message:

Closer to signing, and parse secret key.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openpgpsdk/trunk/examples/create-signed-key.c

    r136 r138  
    1919    unsigned char keyid[OPS_KEY_ID_SIZE]; 
    2020 
    21     if(argc != 4
     21    if(argc != 2
    2222        { 
    23         fprintf(stderr,"%s <n> <e> <user id>\n",argv[0]); 
     23        fprintf(stderr,"%s <public key file> <secret key file>\n",argv[0]); 
    2424        exit(1); 
    2525        } 
     
    4343 
    4444    ops_signature_start(&sig,&key,&id); 
    45     //    ops_signature_add_creation_time(&sig,time(NULL)); 
     45    ops_signature_add_creation_time(&sig,time(NULL)); 
    4646 
    4747    ops_keyid(keyid,&key); 
    48     //    ops_signature_add_issuer_key_id(&sig,keyid); 
     48    ops_signature_add_issuer_key_id(&sig,keyid); 
    4949 
    50     //    ops_signature_add_primary_user_id(&sig,ops_true); 
     50    ops_signature_add_primary_user_id(&sig,ops_true); 
    5151 
    5252    ops_signature_hashed_subpackets_end(&sig); 
  • openpgpsdk/trunk/examples/packet-dump.c

    r134 r138  
    467467        break; 
    468468 
     469    case OPS_PTAG_CT_SECRET_KEY: 
     470        // XXX: fix me 
     471        printf("***RACHEL DO YOUR THING HERE***\n"); 
     472        break; 
     473 
    469474    default: 
    470475        fprintf(stderr,"packet-dump: unknown tag=%d\n",content_->tag); 
  • openpgpsdk/trunk/include/create.h

    r136 r138  
    4646ops_boolean_t ops_write_scalar(unsigned n,unsigned length, 
    4747                               ops_create_options_t *opt); 
     48ops_boolean_t ops_write_ss_header(unsigned length,ops_content_tag_t type, 
     49                                  ops_create_options_t *opt); 
    4850 
    4951void ops_fast_create_rsa_public_key(ops_public_key_t *key,time_t time, 
  • openpgpsdk/trunk/include/packet.h

    r136 r138  
    290290    } ops_secret_key_union_t; 
    291291 
    292 typedef struct 
    293     { 
    294     ops_secret_key_union_t key; 
     292typedef enum 
     293    { 
     294    OPS_S2K_NONE=0, 
     295    } s2k_usage_t; 
     296 
     297typedef 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; 
    295303    } ops_secret_key_t; 
    296304 
     
    633641    ops_ss_features_t           ss_features; 
    634642    ops_ss_revocation_reason_t  ss_revocation_reason; 
     643    ops_secret_key_t            secret_key; 
    635644    } ops_parser_content_union_t; 
    636645 
     
    672681void ops_packet_free(ops_packet_t *packet); 
    673682void ops_parser_content_free(ops_parser_content_t *c); 
     683void ops_secret_key_free(ops_secret_key_t *key); 
    674684 
    675685/* vim:set textwidth=120: */ 
  • openpgpsdk/trunk/src/create.c

    r137 r138  
    5656ops_boolean_t ops_write_length(unsigned length,ops_create_options_t *opt) 
    5757    { 
    58     unsigned char c[5]; 
     58    unsigned char c[2]; 
    5959 
    6060    if(length < 192) 
     
    6969        return base_write(c,2,opt); 
    7070        } 
    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 
     74ops_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); 
    7379    } 
    7480 
  • openpgpsdk/trunk/src/packet-parse.c

    r134 r138  
    536536        break; 
    537537 
     538    case OPS_PTAG_CT_SECRET_KEY: 
     539        ops_secret_key_free(&c->content.secret_key); 
     540        break; 
     541 
    538542    default: 
    539543        fprintf(stderr,"Can't free %d (0x%x)\n",c->tag,c->tag); 
     
    578582    } 
    579583 
     584static 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 
    580644/** Parse a public key packet. 
    581645 * 
     
    595659    { 
    596660    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? 
    649666    if(region->length_read != region->length) 
    650667        ERR1("Unconsumed data (%d)", region->length-region->length_read); 
     
    13971414    } 
    13981415 
     1416void 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 
     1436static 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 
    13991473/** Parse one packet. 
    14001474 * 
     
    15051579        break; 
    15061580 
     1581    case OPS_PTAG_CT_SECRET_KEY: 
     1582        r=parse_secret_key(&region,opt); 
     1583        break; 
     1584 
    15071585    default: 
    15081586        format_error(&content,"Format error (unknown content tag %d)", 
     
    15111589        r=0; 
    15121590        } 
     1591    // XXX: shouldn't we check that the entire packet has been consumed? 
    15131592    if(opt->accumulate) 
    15141593        { 
  • openpgpsdk/trunk/src/signature.c

    r137 r138  
    299299    rsa_sign(&sig->hash,&key->key.rsa,&skey->key.rsa); 
    300300    } 
     301 
     302void 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 
     308void 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 
     315void 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    }