int isns_dsa_init_params(const char *filename) { FILE *fp; DSA *dsa; #if OPENSSL_VERSION_NUMBER >= 0x10002000L BN_GENCB *cb; #endif const int dsa_key_bits = 1024; if (access(filename, R_OK) == 0) return 1; isns_mkdir_recursive(isns_dirname(filename)); if (!(fp = fopen(filename, "w"))) { isns_error("Unable to open %s: %m\n", filename); return 0; } isns_notice("Generating DSA parameters; this may take a while\n"); #if OPENSSL_VERSION_NUMBER >= 0x10002000L cb = BN_GENCB_new(); BN_GENCB_set(cb, (int (*)(int, int, BN_GENCB *)) isns_dsa_param_gen_callback, NULL); dsa = DSA_new(); if (!DSA_generate_parameters_ex(dsa, dsa_key_bits, NULL, 0, NULL, NULL, cb)) { DSA_free(dsa); dsa = NULL; } BN_GENCB_free(cb); #else dsa = DSA_generate_parameters(dsa_key_bits, NULL, 0, NULL, NULL, isns_dsa_param_gen_callback, NULL); #endif write(1, "\n", 1); if (dsa == NULL) { isns_dsasig_report_errors("Error generating DSA parameters", isns_error); fclose(fp); return 0; } if (!PEM_write_DSAparams(fp, dsa)) { isns_dsasig_report_errors("Error writing DSA parameters", isns_error); DSA_free(dsa); fclose(fp); return 0; } DSA_free(dsa); fclose(fp); return 1; }
inline void dsa_key::write_parameters(file _file) const { error::throw_error_if_not(PEM_write_DSAparams(_file.raw(), ptr().get()) != 0); }