{
    "content": [
        {
            "type": "text",
            "text": "# Crypt::PK::DH (perldoc)\n\n## NAME\n\nCrypt::PK::DH - Public key cryptography based on Diffie-Hellman\n\n## SYNOPSIS\n\n### OO interface\n#Shared secret\nmy $priv = Crypt::PK::DH->new('Aliceprivdh1.key');\nmy $pub = Crypt::PK::DH->new('Bobpubdh1.key');\nmy $sharedsecret = $priv->sharedsecret($pub);\n#Key generation\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey(128);\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\nor\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey('ike2048');\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\nor\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey({ p => $p, g => $g });\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\n### Functional interface\n#Shared secret\nmy $sharedsecret = dhsharedsecret('Aliceprivdh1.key', 'Bobpubdh1.key');\n\n## Sections\n\n- **NAME**\n- **SYNOPSIS**\n- **METHODS**\n- **FUNCTIONS**\n- **DEPRECATED INTERFACE**\n- **SEE ALSO**\n\nUse structuredContent.sections for detailed options, examples, and full documentation.\n"
        }
    ],
    "structuredContent": {
        "command": "Crypt::PK::DH",
        "section": "",
        "mode": "perldoc",
        "summary": "Crypt::PK::DH - Public key cryptography based on Diffie-Hellman",
        "synopsis": "### OO interface\n#Shared secret\nmy $priv = Crypt::PK::DH->new('Aliceprivdh1.key');\nmy $pub = Crypt::PK::DH->new('Bobpubdh1.key');\nmy $sharedsecret = $priv->sharedsecret($pub);\n#Key generation\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey(128);\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\nor\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey('ike2048');\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\nor\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey({ p => $p, g => $g });\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\n### Functional interface\n#Shared secret\nmy $sharedsecret = dhsharedsecret('Aliceprivdh1.key', 'Bobpubdh1.key');",
        "tldr_summary": null,
        "tldr_examples": [],
        "tldr_source": null,
        "flags": [],
        "examples": [],
        "see_also": [],
        "section_outline": [
            {
                "name": "NAME",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "SYNOPSIS",
                "lines": 32,
                "subsections": []
            },
            {
                "name": "METHODS",
                "lines": 118,
                "subsections": []
            },
            {
                "name": "FUNCTIONS",
                "lines": 9,
                "subsections": []
            },
            {
                "name": "DEPRECATED INTERFACE",
                "lines": 16,
                "subsections": []
            },
            {
                "name": "SEE ALSO",
                "lines": 2,
                "subsections": []
            }
        ],
        "sections": {
            "NAME": {
                "content": "Crypt::PK::DH - Public key cryptography based on Diffie-Hellman\n",
                "subsections": []
            },
            "SYNOPSIS": {
                "content": "### OO interface\n\n#Shared secret\nmy $priv = Crypt::PK::DH->new('Aliceprivdh1.key');\nmy $pub = Crypt::PK::DH->new('Bobpubdh1.key');\nmy $sharedsecret = $priv->sharedsecret($pub);\n\n#Key generation\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey(128);\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\n\nor\n\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey('ike2048');\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\n\nor\n\nmy $pk = Crypt::PK::DH->new();\n$pk->generatekey({ p => $p, g => $g });\nmy $private = $pk->exportkey('private');\nmy $public = $pk->exportkey('public');\n\n### Functional interface\n\n#Shared secret\nmy $sharedsecret = dhsharedsecret('Aliceprivdh1.key', 'Bobpubdh1.key');\n",
                "subsections": []
            },
            "METHODS": {
                "content": "new\nmy $pk = Crypt::PK::DH->new();\n#or\nmy $pk = Crypt::PK::DH->new($privorpubkeyfilename);\n#or\nmy $pk = Crypt::PK::DH->new(\\$buffercontainingprivorpubkey);\n\ngeneratekey\nUses Yarrow-based cryptographically strong random number generator seeded with random data taken\nfrom \"/dev/random\" (UNIX) or \"CryptGenRandom\" (Win32).\n\n$pk->generatekey($groupsize);\n### $groupsize (in bytes) corresponds to DH parameters (p, g) predefined by libtomcrypt\n# 96   =>  DH-768\n# 128  =>  DH-1024\n# 192  =>  DH-1536\n# 256  =>  DH-2048\n# 384  =>  DH-3072\n# 512  =>  DH-4096\n# 768  =>  DH-6144\n# 1024 =>  DH-8192\n\nThe following variants are available since CryptX-0.032\n\n$pk->generatekey($groupname)\n### $groupname corresponds to values defined in RFC7296 and RFC3526\n# 'ike768'  =>  768-bit MODP (Group 1)\n# 'ike1024' => 1024-bit MODP (Group 2)\n# 'ike1536' => 1536-bit MODP (Group 5)\n# 'ike2048' => 2048-bit MODP (Group 14)\n# 'ike3072' => 3072-bit MODP (Group 15)\n# 'ike4096' => 4096-bit MODP (Group 16)\n# 'ike6144' => 6144-bit MODP (Group 17)\n# 'ike8192' => 8192-bit MODP (Group 18)\n\n$pk->generatekey($paramhash)\n# $paramhash is { g => $g, p => $p }\n# where $g is the generator (base) in a hex string and $p is the prime in a hex string\n\n$pk->generatekey(\\$dhparam)\n# $dhparam is the content of DER or PEM file with DH parameters\n# e.g. openssl dhparam 2048\n\nimportkey\nLoads private or public key (exported by \"exportkey\").\n\n$pk->importkey($filename);\n#or\n$pk->importkey(\\$buffercontainingkey);\n\nimportkeyraw\n*Since: CryptX-0.032*\n\n$pk->importkeyraw($rawbytes, $type, $params)\n### $rawbytes is a binary string containing the key\n### $type is either 'private' or 'public'\n### $param is either a name ('ike2038') or hash containing the p,g values { g=>$g, p=>$p }\n### in hex strings\n\nexportkey\nBEWARE: DH key format change - since v0.049 it is compatible with libtomcrypt 1.18.\n\nmy $private = $pk->exportkey('private');\n#or\nmy $public = $pk->exportkey('public');\n\nexportkeyraw\n*Since: CryptX-0.032*\n\n$rawbytes = $dh->exportkeyraw('public')\n#or\n$rawbytes = $dh->exportkeyraw('private')\n\nsharedsecret\n# Alice having her priv key $pk and Bob's public key $pkb\nmy $pk  = Crypt::PK::DH->new($privkeyfilename);\nmy $pkb = Crypt::PK::DH->new($pubkeyfilename);\nmy $sharedsecret = $pk->sharedsecret($pkb);\n\n# Bob having his priv key $pk and Alice's public key $pka\nmy $pk = Crypt::PK::DH->new($privkeyfilename);\nmy $pka = Crypt::PK::DH->new($pubkeyfilename);\nmy $sharedsecret = $pk->sharedsecret($pka);  # same value as computed by Alice\n\nisprivate\nmy $rv = $pk->isprivate;\n# 1 .. private key loaded\n# 0 .. public key loaded\n# undef .. no key loaded\n\nsize\nmy $size = $pk->size;\n# returns key size in bytes or undef if no key loaded\n\nkey2hash\nmy $hash = $pk->key2hash;\n\n# returns hash like this (or undef if no key loaded):\n{\ntype => 0,   # integer: 1 .. private, 0 .. public\nsize => 256, # integer: key size in bytes\nx => \"FBC1062F73B9A17BB8473A2F5A074911FA7F20D28FB...\", #private key\ny => \"AB9AAA40774D3CD476B52F82E7EE2D8A8D40CD88BF4...\", #public key\ng => \"2\", # generator/base\np => \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80D...\", # prime\n}\n\nparams2hash\n*Since: CryptX-0.032*\n\nmy $params = $pk->params2hash;\n\n# returns hash like this (or undef if no key loaded):\n{\ng => \"2\", # generator/base\np => \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80D...\", # prime\n}\n",
                "subsections": []
            },
            "FUNCTIONS": {
                "content": "dhsharedsecret\nDH based shared secret generation. See method \"sharedsecret\" below.\n\n#on Alice side\nmy $sharedsecret = dhsharedsecret('Aliceprivdh1.key', 'Bobpubdh1.key');\n\n#on Bob side\nmy $sharedsecret = dhsharedsecret('Bobprivdh1.key', 'Alicepubdh1.key');\n",
                "subsections": []
            },
            "DEPRECATED INTERFACE": {
                "content": "The following functions/methods were removed in removed in v0.049:\n\nencrypt\ndecrypt\nsignmessage\nverifymessage\nsignhash\nverifyhash\n\ndhencrypt\ndhdecrypt\ndhsignmessage\ndhverifymessage\ndhsignhash\ndhverifyhash\n",
                "subsections": []
            },
            "SEE ALSO": {
                "content": "*   <https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellmankeyexchange>\n",
                "subsections": []
            }
        }
    }
}