569
575
                 safer_gnutls_strerror(ret));
 
 
578
  if(mc->dh_bits == 0){
 
 
579
    /* Find out the optimal number of DH bits */
 
 
580
    /* Try to read the private key file */
 
 
581
    gnutls_datum_t buffer = { .data = NULL, .size = 0 };
 
 
583
      int secfile = open(seckeyfilename, O_RDONLY);
 
 
584
      size_t buffer_capacity = 0;
 
 
586
        buffer_capacity = incbuffer((char **)&buffer.data,
 
 
588
                                    (size_t)buffer_capacity);
 
 
589
        if(buffer_capacity == 0){
 
 
590
          perror_plus("incbuffer");
 
 
595
        ssize_t bytes_read = read(secfile, buffer.data + buffer.size,
 
 
601
        /* check bytes_read for failure */
 
 
608
        buffer.size += (unsigned int)bytes_read;
 
 
612
    /* If successful, use buffer to parse private key */
 
 
613
    gnutls_sec_param_t sec_param = GNUTLS_SEC_PARAM_ULTRA;
 
 
614
    if(buffer.data != NULL){
 
 
616
        gnutls_openpgp_privkey_t privkey = NULL;
 
 
617
        ret = gnutls_openpgp_privkey_init(&privkey);
 
 
618
        if(ret != GNUTLS_E_SUCCESS){
 
 
619
          fprintf_plus(stderr, "Error initializing OpenPGP key"
 
 
620
                       " structure: %s", safer_gnutls_strerror(ret));
 
 
624
          ret = gnutls_openpgp_privkey_import(privkey, &buffer,
 
 
625
                                            GNUTLS_OPENPGP_FMT_BASE64,
 
 
627
          if(ret != GNUTLS_E_SUCCESS){
 
 
628
            fprintf_plus(stderr, "Error importing OpenPGP key : %s",
 
 
629
                         safer_gnutls_strerror(ret));
 
 
635
            /* Use private key to suggest an appropriate sec_param */
 
 
636
            sec_param = gnutls_openpgp_privkey_sec_param(privkey);
 
 
637
            gnutls_openpgp_privkey_deinit(privkey);
 
 
639
              fprintf_plus(stderr, "This OpenPGP key implies using a"
 
 
640
                           " GnuTLS security parameter \"%s\".\n",
 
 
641
                           safe_string(gnutls_sec_param_get_name
 
 
647
      if(sec_param == GNUTLS_SEC_PARAM_UNKNOWN){
 
 
648
        /* Err on the side of caution */
 
 
649
        sec_param = GNUTLS_SEC_PARAM_ULTRA;
 
 
651
          fprintf_plus(stderr, "Falling back to security parameter"
 
 
653
                       safe_string(gnutls_sec_param_get_name
 
 
658
    uret = gnutls_sec_param_to_pk_bits(GNUTLS_PK_DH, sec_param);
 
 
662
        fprintf_plus(stderr, "A \"%s\" GnuTLS security parameter"
 
 
663
                     " implies %u DH bits; using that.\n",
 
 
664
                     safe_string(gnutls_sec_param_get_name
 
 
669
      fprintf_plus(stderr, "Failed to get implied number of DH"
 
 
670
                   " bits for security parameter \"%s\"): %s\n",
 
 
671
                   safe_string(gnutls_sec_param_get_name(sec_param)),
 
 
672
                   safer_gnutls_strerror(ret));
 
 
676
    fprintf_plus(stderr, "DH bits explicitly set to %u\n",
 
572
679
  ret = gnutls_dh_params_generate2(mc->dh_params, mc->dh_bits);
 
573
680
  if(ret != GNUTLS_E_SUCCESS){
 
574
 
    fprintf_plus(stderr, "Error in GnuTLS prime generation: %s\n",
 
575
 
                 safer_gnutls_strerror(ret));
 
 
681
    fprintf_plus(stderr, "Error in GnuTLS prime generation (%u bits):"
 
 
682
                 " %s\n", mc->dh_bits, safer_gnutls_strerror(ret));