39 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
55 EVP_PKEY* JBXL_DH_new(OSSL_PARAM* params,
int mode)
57 EVP_PKEY *dhkey = NULL;
58 EVP_PKEY *param_key = NULL;
60 EVP_PKEY_CTX* ctx = NULL;
62 if (params!=NULL && mode>0) {
63 ctx = EVP_PKEY_CTX_new_from_name(NULL,
"DH", NULL);
64 if (!ctx)
return NULL;
66 if (EVP_PKEY_fromdata_init(ctx) <= 0) {
67 EVP_PKEY_CTX_free(ctx);
71 if (EVP_PKEY_fromdata(ctx, &dhkey, EVP_PKEY_KEYPAIR, params) <= 0) {
77 ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DH, NULL);
78 if (!ctx)
return NULL;
80 if (EVP_PKEY_paramgen_init(ctx) <= 0) {
81 EVP_PKEY_CTX_free(ctx);
86 if (mode!=512 && mode!=1024) mode = 2048;
87 if (EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, mode) <= 0) {
88 EVP_PKEY_CTX_free(ctx);
93 if (EVP_PKEY_CTX_set_params(ctx, params) <= 0) {
94 EVP_PKEY_CTX_free(ctx);
99 if (EVP_PKEY_paramgen(ctx, ¶m_key) <= 0) {
100 EVP_PKEY_CTX_free(ctx);
103 EVP_PKEY_CTX_free(ctx);
105 EVP_PKEY_CTX *key_ctx = EVP_PKEY_CTX_new(param_key, NULL);
107 EVP_PKEY_free(param_key);
111 if (EVP_PKEY_keygen_init(key_ctx) <= 0 || EVP_PKEY_keygen(key_ctx, &dhkey) <= 0) {
115 EVP_PKEY_CTX_free(key_ctx);
116 EVP_PKEY_free(param_key);
135 Buffer gen_DHspki(
int ks, EVP_PKEY** p_dhkey)
141 if (p_dhkey==NULL)
return pk;
142 if (*p_dhkey!=NULL) EVP_PKEY_free(*p_dhkey);
143 if (ks<=0) ks = 2048;
149 *p_dhkey = JBXL_DH_new(NULL, ks);
150 if (*p_dhkey==NULL) {
155 sz = i2d_PUBKEY(*p_dhkey, NULL);
157 EVP_PKEY_free(*p_dhkey);
163 unsigned char *p = pk.
buf;
164 pk.
vldsz = i2d_PUBKEY(*p_dhkey, &p);
189 if (p_dhkey==NULL)
return pk;
190 if (*p_dhkey != NULL) EVP_PKEY_free(*p_dhkey);
192 pkey = get_DHPkey(pki);
193 gkey = get_DHGkey(pki);
194 if (pkey.
buf==NULL || gkey.
buf==NULL) {
197 JBXL_DH_free(*p_dhkey);
202 BIGNUM* dhp_bn = BN_bin2bn((
const unsigned char*)(pkey.
buf), pkey.
vldsz, NULL);
203 BIGNUM* dhg_bn = BN_bin2bn((
const unsigned char*)(gkey.
buf), gkey.
vldsz, NULL);
205 if (dhp_bn==NULL || dhg_bn==NULL) {
208 if (dhp_bn!=NULL) BN_free(dhp_bn);
209 if (dhg_bn!=NULL) BN_free(dhg_bn);
213 OSSL_PARAM params[] = {
214 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_P, dhp_bn, BN_num_bytes(dhp_bn)),
215 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_G, dhg_bn, BN_num_bytes(dhg_bn)),
218 *p_dhkey = JBXL_DH_new(params, 1);
226 int sz = i2d_PUBKEY(*p_dhkey, NULL);
229 JBXL_DH_free(*p_dhkey);
233 unsigned char* p = pk.
buf;
234 pk.
vldsz = i2d_PUBKEY(*p_dhkey, &p);
249 Buffer read_DHspki_with_private(FILE* fp, EVP_PKEY** p_dhkey)
252 Buffer pp, pv, pk, gk, yk;
255 if (fp==NULL)
return pp;
256 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
260 if (pp.
buf==NULL)
return pp;
266 BIGNUM* dhp_bn = BN_bin2bn((
const unsigned char*)(pk.
buf), pk.
vldsz, NULL);
267 BIGNUM* dhg_bn = BN_bin2bn((
const unsigned char*)(gk.
buf), gk.
vldsz, NULL);
268 BIGNUM* dhy_bn = BN_bin2bn((
const unsigned char*)(yk.
buf), yk.
vldsz, NULL);
277 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
281 BIGNUM* prv_bn = BN_bin2bn((
const unsigned char*)(pv.
buf), pv.
vldsz, NULL);
284 OSSL_PARAM params[] = {
285 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_P, dhp_bn, BN_num_bytes(dhp_bn)),
286 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_G, dhg_bn, BN_num_bytes(dhg_bn)),
287 OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, dhy_bn, BN_num_bytes(dhy_bn)),
288 OSSL_PARAM_BN(OSSL_PKEY_PARAM_PRIV_KEY, prv_bn, BN_num_bytes(prv_bn)),
291 *p_dhkey = JBXL_DH_new(params, 1);
297 if (dhp_bn!=NULL) BN_free(dhp_bn);
298 if (dhg_bn!=NULL) BN_free(dhg_bn);
299 if (dhy_bn!=NULL) BN_free(dhy_bn);
300 if (prv_bn!=NULL) BN_free(prv_bn);
314 Buffer get_DHprivatekey(EVP_PKEY* dhkey)
317 BIGNUM* priv_key = NULL;
319 if (dhkey == NULL)
return pv;
321 if (EVP_PKEY_get_bn_param(dhkey, OSSL_PKEY_PARAM_PRIV_KEY, &priv_key) <= 0 || priv_key == NULL) {
325 int sz = BN_num_bytes(priv_key);
327 if (pv.
buf != NULL) {
328 pv.
vldsz = BN_bn2bin(priv_key, pv.
buf);
353 if (dhkey == NULL || ykey.
buf == NULL || ykey.
vldsz <= 0)
return buf;
355 EVP_PKEY_CTX* ctx = NULL;
356 EVP_PKEY* peerkey = NULL;
357 BIGNUM* dhy_bn = NULL;
360 dhy_bn = BN_bin2bn((
const unsigned char*)ykey.
buf, ykey.
vldsz, NULL);
361 if (dhy_bn == NULL)
return buf;
363 BIGNUM* dhp_bn = NULL;
364 BIGNUM* dhg_bn = NULL;
366 EVP_PKEY_get_bn_param(dhkey, OSSL_PKEY_PARAM_FFC_P, &dhp_bn);
367 EVP_PKEY_get_bn_param(dhkey, OSSL_PKEY_PARAM_FFC_G, &dhg_bn);
369 if (dhp_bn==NULL || dhg_bn==NULL) {
370 if (dhp_bn!=NULL) BN_free(dhp_bn);
371 if (dhg_bn!=NULL) BN_free(dhg_bn);
376 OSSL_PARAM peer_params[] = {
377 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_P, dhp_bn, BN_num_bytes(dhp_bn)),
378 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_G, dhg_bn, BN_num_bytes(dhg_bn)),
379 OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, dhy_bn, BN_num_bytes(dhy_bn)),
382 peerkey = JBXL_DH_new(peer_params, 1);
387 if (peerkey == NULL) {
392 ctx = EVP_PKEY_CTX_new(dhkey, NULL);
394 EVP_PKEY_free(peerkey);
398 if (EVP_PKEY_derive_init(ctx) <= 0 || EVP_PKEY_derive_set_peer(ctx, peerkey) <= 0) {
399 EVP_PKEY_CTX_free(ctx);
400 EVP_PKEY_free(peerkey);
405 if (EVP_PKEY_derive(ctx, NULL, &sz) <= 0) {
406 EVP_PKEY_CTX_free(ctx);
407 EVP_PKEY_free(peerkey);
412 if (
buf.buf == NULL) {
413 EVP_PKEY_CTX_free(ctx);
414 EVP_PKEY_free(peerkey);
418 if (EVP_PKEY_derive(ctx,
buf.buf, &sz) <= 0) {
426 EVP_PKEY_CTX_free(ctx);
427 EVP_PKEY_free(peerkey);
452 Buffer gen_DHspki(
int ks, JBXL_DH** p_dhkey)
458 if (p_dhkey==NULL)
return pk;
459 if (ks<=0) ks = 2048;
463 if (!RAND_load_file(
"/dev/urandom", 1024))
return pk;
467 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
470 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
471 n = DH_generate_parameters_ex(*p_dhkey, ks, DH_GENERATOR_2, NULL);
473 *p_dhkey = DH_generate_parameters(ks, DH_GENERATOR_2, NULL, NULL);
475 n = DH_check(*p_dhkey, &code);
476 }
while (n!=1 || code!=0);
479 sz = DH_generate_key(*p_dhkey);
481 JBXL_DH_free(*p_dhkey);
487 sz = i2d_DHparams(*p_dhkey, NULL);
490 JBXL_DH_free(*p_dhkey);
494 pp.
vldsz = i2d_DHparams(*p_dhkey, &(px.
buf));
497 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
498 const BIGNUM* pub_key = DH_get0_pub_key(*p_dhkey);
499 sz = BN_num_bytes(pub_key);
501 sz = BN_num_bytes((*p_dhkey)->pub_key);
506 JBXL_DH_free(*p_dhkey);
512 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
513 px.
vldsz = BN_bn2bin(pub_key, px.
buf);
515 px.
vldsz = BN_bn2bin((*p_dhkey)->pub_key, px.
buf);
518 pk = join_DHpubkey(pp, px);
547 if (p_dhkey==NULL)
return pk;
549 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
551 if (*p_dhkey==NULL)
return pk;
553 pkey = get_DHPkey(pki);
554 gkey = get_DHGkey(pki);
555 if (pkey.
buf==NULL || gkey.
buf==NULL) {
558 JBXL_DH_free(*p_dhkey);
563 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
564 BIGNUM* dhp_bn = BN_bin2bn((
const unsigned char*)(pkey.
buf), pkey.
vldsz, NULL);
565 BIGNUM* dhg_bn = BN_bin2bn((
const unsigned char*)(gkey.
buf), gkey.
vldsz, NULL);
567 if (dhp_bn!=NULL && dhg_bn!=NULL) {
568 DH_set0_pqg(*p_dhkey, dhp_bn, NULL, dhg_bn);
571 JBXL_DH_free(*p_dhkey);
577 (*p_dhkey)->p = BN_bin2bn((
const unsigned char*)(pkey.
buf), pkey.
vldsz, NULL);
578 (*p_dhkey)->g = BN_bin2bn((
const unsigned char*)(gkey.
buf), gkey.
vldsz, NULL);
585 if (*p_dhkey!=NULL) n = DH_check(*p_dhkey, &code);
586 if (n!=1 || code!=0) {
587 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
592 sz = DH_generate_key(*p_dhkey);
594 JBXL_DH_free(*p_dhkey);
600 sz = i2d_DHparams(*p_dhkey, NULL);
603 JBXL_DH_free(*p_dhkey);
607 pp.
vldsz = i2d_DHparams(*p_dhkey, &(px.
buf));
609 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
610 const BIGNUM* pub_key = DH_get0_pub_key(*p_dhkey);
611 sz = BN_num_bytes(pub_key);
613 sz = BN_num_bytes((*p_dhkey)->pub_key);
618 JBXL_DH_free(*p_dhkey);
624 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
625 px.
vldsz = BN_bn2bin(pub_key, px.
buf);
627 px.
vldsz = BN_bn2bin((*p_dhkey)->pub_key, px.
buf);
630 pk = join_DHpubkey(pp, px);
648 Buffer read_DHspki_with_private(FILE* fp, JBXL_DH** p_dhkey)
652 Buffer pp, pv, pk, gk, yk;
655 if (fp==NULL)
return pp;
659 if (pp.
buf==NULL)
return pp;
661 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
663 if (*p_dhkey==NULL) {
672 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
674 BIGNUM* dhp_bn = BN_bin2bn((
const unsigned char*)(pk.
buf), pk.
vldsz, NULL);
675 BIGNUM* dhg_bn = BN_bin2bn((
const unsigned char*)(gk.
buf), gk.
vldsz, NULL);
676 BIGNUM* dhy_bn = BN_bin2bn((
const unsigned char*)(yk.
buf), yk.
vldsz, NULL);
678 if (dhp_bn!=NULL && dhg_bn!=NULL && dhy_bn!=NULL) {
679 DH_set0_pqg(*p_dhkey, dhp_bn, NULL, dhg_bn);
680 DH_set0_key(*p_dhkey, dhy_bn, NULL);
683 JBXL_DH_free(*p_dhkey);
688 (*p_dhkey)->p = BN_bin2bn((
const unsigned char*)(pk.
buf), pk.
vldsz, NULL);
689 (*p_dhkey)->g = BN_bin2bn((
const unsigned char*)(gk.
buf), gk.
vldsz, NULL);
690 (*p_dhkey)->pub_key = BN_bin2bn((
const unsigned char*)(yk.
buf), yk.
vldsz, NULL);
698 if (*p_dhkey!=NULL) n = DH_check(*p_dhkey, &code);
699 if (n!=1 || code!=0) {
700 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
709 if (*p_dhkey!=NULL) JBXL_DH_free(*p_dhkey);
714 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
715 BIGNUM* priv_key = BN_bin2bn((
const unsigned char*)(pv.
buf), pv.
vldsz, NULL);
716 DH_set0_key(*p_dhkey, NULL, priv_key);
718 (*p_dhkey)->priv_key = BN_bin2bn((
const unsigned char*)(pv.
buf), pv.
vldsz, NULL);
735 Buffer get_DHprivatekey(JBXL_DH* dhkey)
740 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
741 const BIGNUM* priv_key = DH_get0_priv_key(dhkey);
742 sz = BN_num_bytes(priv_key);
744 sz = BN_num_bytes(dhkey->priv_key);
748 if (pv.
buf==NULL)
return pv;
750 #if OPENSSL_VERSION_NUMBER >= 0x10101000L
751 pv.
vldsz = BN_bn2bin(priv_key, pv.
buf);
753 pv.
vldsz = BN_bn2bin(dhkey->priv_key, pv.
buf);
778 if (dhkey == NULL || ykey.
buf == NULL || ykey.
vldsz <= 0)
return buf;
781 BIGNUM* yk = BN_bin2bn((
const unsigned char*)(ykey.
buf), ykey.
vldsz, NULL);
782 if (yk == NULL)
return buf;
785 sz = JBXL_DH_size(dhkey);
787 if (
buf.buf == NULL) {
793 buf.vldsz = DH_compute_key(
buf.buf, yk, dhkey);
798 if (
buf.vldsz <= 0) {
835 Buffer get_DHspki_ff(
char* filename,
int ks, JBXL_DH** p_dhkey)
841 if (filename==NULL || p_dhkey==NULL)
return pki;
845 fp = fopen(filename,
"rb");
846 pki = read_DHspki_with_private(fp, p_dhkey);
850 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
852 #elif OPENSSL_VERSION_NUMBER >= 0x10101000L
853 const BIGNUM* priv_key = DH_get0_priv_key(*p_dhkey);
854 if (DH_size(*p_dhkey)<(ks+7)/8 || priv_key==NULL)
free_Buffer(&pki);
856 if (DH_size(*p_dhkey)<(ks+7)/8 || (*p_dhkey)->priv_key==NULL)
free_Buffer(&pki);
863 pki = gen_DHspki(ks, p_dhkey);
868 save_DHspki_with_private(pki, fp, *p_dhkey);
897 int save_DHspki_with_private(
Buffer pki, FILE* fp, JBXL_DH* dhkey)
902 if (fp==NULL || dhkey==NULL)
return FALSE;
907 pv = get_DHprivatekey(dhkey);
937 ykey = get_DHYkey(pki);
938 if (ykey.
buf==NULL)
return skey;
940 skey = get_DHsharedkey_fY(ykey, dhkey);
988 if (pp.
buf==NULL)
return pp;
989 for (i=0; i<lp; i++) pp.
buf[i] = param.
buf[sz+i];
1022 if (sz<0)
return pp;
1025 if (sz<0)
return pp;
1028 if (sz<0)
return pp;
1032 if (sz<0)
return pp;
1035 if (sz<0)
return pp;
1038 if (pp.
buf==NULL)
return pp;
1039 for (i=0; i<lp; i++) pp.
buf[i] = param.
buf[sz+i];
1073 if (sz<0)
return pp;
1076 if (sz<0)
return pp;
1079 if (sz<0)
return pp;
1083 if (sz<0)
return pp;
1086 if (sz<0)
return pp;
1090 if (sz<0)
return pp;
1093 if (pp.
buf==NULL)
return pp;
1094 for (i=0; i<lp; i++) pp.
buf[i] = param.
buf[sz+i];
1127 if (sz<0)
return pp;
1130 if (sz<0)
return pp;
1133 if (sz<0)
return pp;
1136 if (pp.
buf==NULL)
return pp;
1137 for (i=0; i<lp; i++) pp.
buf[i] = param.
buf[sz+i];
1178 unsigned char dh_algor[]={0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x03,0x01};
1180 int len_dh_algor = 11;
1188 if (sz<0)
return pp;
1202 memcpy(px.
buf, pp.
buf, lp);
1203 memcpy(px.
buf+lp, pm.
buf, ls);
1213 memcpy(pp.
buf, dh_algor, la);
1214 memcpy(pp.
buf+la, pm.
buf, ls);
1227 memcpy(pm.
buf, px.
buf, ls);
1228 memcpy(pm.
buf+ls, pp.
buf, lp);
#define JBXL_ASN1_BIT
BIT_STRING.
#define JBXL_ASN1_INT
INTEGER.
#define JBXL_ASN1_OBJ
OBJECT_IDENTIFIER.
#define JBXL_ASN1_SEQ_CNSTRCTD
SEQUENCE + CONSTRUCTED (構造化フラグ)
Buffer make_Buffer(int sz)
Buffer型変数のバッファ部をつくり出す.
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Buffer init_Buffer()
初期化したBuffer型変数を返す.
int bufsz
確保してあるバッファの大きさ - 1.
int vldsz
データの長さ.バイナリデータの場合も使用可能.文字列の場合は 0x00 を含まない.
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.