{
    "content": [
        {
            "type": "text",
            "text": "# Crypt::PK::X25519 (perldoc)\n\n## NAME\n\nCrypt::PK::X25519 - Asymmetric cryptography based on X25519\n\n## SYNOPSIS\n\nuse Crypt::PK::X25519;\n#Shared secret\nmy $priv = Crypt::PK::X25519->new('Aliceprivx25519.der');\nmy $pub = Crypt::PK::X25519->new('Bobpubx25519.der');\nmy $sharedsecret = $priv->sharedsecret($pub);\n#Load key\nmy $pk = Crypt::PK::X25519->new;\nmy $pkhex = \"EA7806F721A8570512C8F6EFB4E8D620C49A529E4DF5EAA77DEC646FB1E87E41\";\n$pk->importkeyraw(pack(\"H*\", $pkhex), \"public\");\nmy $sk = Crypt::PK::X25519->new;\nmy $skhex = \"002F93D10BA5728D8DD8E9527721DABA3261C0BB1BEFDE7B4BBDAC631D454651\";\n$sk->importkeyraw(pack(\"H*\", $skhex), \"private\");\n#Key generation\nmy $pk = Crypt::PK::X25519->new->generatekey;\nmy $privateder = $pk->exportkeyder('private');\nmy $publicder  = $pk->exportkeyder('public');\nmy $privatepem = $pk->exportkeypem('private');\nmy $publicpem  = $pk->exportkeypem('public');\nmy $privateraw = $pk->exportkeyraw('private');\nmy $publicraw  = $pk->exportkeyraw('public');\nmy $privatejwk = $pk->exportkeyjwk('private');\nmy $publicjwk  = $pk->exportkeyjwk('public');\n\n## DESCRIPTION\n\n*Since: CryptX-0.067*\n\n## Sections\n\n- **NAME**\n- **SYNOPSIS**\n- **DESCRIPTION**\n- **METHODS**\n- **SEE ALSO**\n\nUse structuredContent.sections for detailed options, examples, and full documentation.\n"
        }
    ],
    "structuredContent": {
        "command": "Crypt::PK::X25519",
        "section": "",
        "mode": "perldoc",
        "summary": "Crypt::PK::X25519 - Asymmetric cryptography based on X25519",
        "synopsis": "use Crypt::PK::X25519;\n#Shared secret\nmy $priv = Crypt::PK::X25519->new('Aliceprivx25519.der');\nmy $pub = Crypt::PK::X25519->new('Bobpubx25519.der');\nmy $sharedsecret = $priv->sharedsecret($pub);\n#Load key\nmy $pk = Crypt::PK::X25519->new;\nmy $pkhex = \"EA7806F721A8570512C8F6EFB4E8D620C49A529E4DF5EAA77DEC646FB1E87E41\";\n$pk->importkeyraw(pack(\"H*\", $pkhex), \"public\");\nmy $sk = Crypt::PK::X25519->new;\nmy $skhex = \"002F93D10BA5728D8DD8E9527721DABA3261C0BB1BEFDE7B4BBDAC631D454651\";\n$sk->importkeyraw(pack(\"H*\", $skhex), \"private\");\n#Key generation\nmy $pk = Crypt::PK::X25519->new->generatekey;\nmy $privateder = $pk->exportkeyder('private');\nmy $publicder  = $pk->exportkeyder('public');\nmy $privatepem = $pk->exportkeypem('private');\nmy $publicpem  = $pk->exportkeypem('public');\nmy $privateraw = $pk->exportkeyraw('private');\nmy $publicraw  = $pk->exportkeyraw('public');\nmy $privatejwk = $pk->exportkeyjwk('private');\nmy $publicjwk  = $pk->exportkeyjwk('public');",
        "tldr_summary": null,
        "tldr_examples": [],
        "tldr_source": null,
        "flags": [],
        "examples": [],
        "see_also": [],
        "section_outline": [
            {
                "name": "NAME",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "SYNOPSIS",
                "lines": 26,
                "subsections": []
            },
            {
                "name": "DESCRIPTION",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "METHODS",
                "lines": 201,
                "subsections": []
            },
            {
                "name": "SEE ALSO",
                "lines": 4,
                "subsections": []
            }
        ],
        "sections": {
            "NAME": {
                "content": "Crypt::PK::X25519 - Asymmetric cryptography based on X25519\n",
                "subsections": []
            },
            "SYNOPSIS": {
                "content": "use Crypt::PK::X25519;\n\n#Shared secret\nmy $priv = Crypt::PK::X25519->new('Aliceprivx25519.der');\nmy $pub = Crypt::PK::X25519->new('Bobpubx25519.der');\nmy $sharedsecret = $priv->sharedsecret($pub);\n\n#Load key\nmy $pk = Crypt::PK::X25519->new;\nmy $pkhex = \"EA7806F721A8570512C8F6EFB4E8D620C49A529E4DF5EAA77DEC646FB1E87E41\";\n$pk->importkeyraw(pack(\"H*\", $pkhex), \"public\");\nmy $sk = Crypt::PK::X25519->new;\nmy $skhex = \"002F93D10BA5728D8DD8E9527721DABA3261C0BB1BEFDE7B4BBDAC631D454651\";\n$sk->importkeyraw(pack(\"H*\", $skhex), \"private\");\n\n#Key generation\nmy $pk = Crypt::PK::X25519->new->generatekey;\nmy $privateder = $pk->exportkeyder('private');\nmy $publicder  = $pk->exportkeyder('public');\nmy $privatepem = $pk->exportkeypem('private');\nmy $publicpem  = $pk->exportkeypem('public');\nmy $privateraw = $pk->exportkeyraw('private');\nmy $publicraw  = $pk->exportkeyraw('public');\nmy $privatejwk = $pk->exportkeyjwk('private');\nmy $publicjwk  = $pk->exportkeyjwk('public');\n",
                "subsections": []
            },
            "DESCRIPTION": {
                "content": "*Since: CryptX-0.067*\n",
                "subsections": []
            },
            "METHODS": {
                "content": "new\nmy $pk = Crypt::PK::X25519->new();\n#or\nmy $pk = Crypt::PK::X25519->new($privorpubkeyfilename);\n#or\nmy $pk = Crypt::PK::X25519->new(\\$buffercontainingprivorpubkey);\n\nSupport for password protected PEM keys\n\nmy $pk = Crypt::PK::X25519->new($privpemkeyfilename, $password);\n#or\nmy $pk = Crypt::PK::X25519->new(\\$buffercontainingprivpemkey, $password);\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;\n\nimportkey\nLoads private or public key in DER or PEM format.\n\n$pk->importkey($filename);\n#or\n$pk->importkey(\\$buffercontainingkey);\n\nSupport for password protected PEM keys:\n\n$pk->importkey($filename, $password);\n#or\n$pk->importkey(\\$buffercontainingkey, $password);\n\nLoading private or public keys form perl hash:\n\n$pk->importkey($hashref);\n\n# the $hashref is either a key exported via key2hash\n$pk->importkey({\ncurve => \"x25519\",\npub   => \"EA7806F721A8570512C8F6EFB4E8D620C49A529E4DF5EAA77DEC646FB1E87E41\",\npriv  => \"002F93D10BA5728D8DD8E9527721DABA3261C0BB1BEFDE7B4BBDAC631D454651\",\n});\n\n# or a hash with items corresponding to JWK (JSON Web Key)\n$pk->importkey({\nkty => \"OKP\",\ncrv => \"X25519\",\nd   => \"AC-T0Qulco2N2OlSdyHaujJhwLsb7957S72sYx1FRlE\",\nx   => \"6ngG9yGoVwUSyPbvtOjWIMSaUp5N9eqnfexkb7HofkE\",\n});\n\nSupported key formats:\n\n# all formats can be loaded from a file\nmy $pk = Crypt::PK::X25519->new($filename);\n\n# or from a buffer containing the key\nmy $pk = Crypt::PK::X25519->new(\\$bufferwithkey);\n\n*   X25519 private keys in PEM format\n\n-----BEGIN X25519 PRIVATE KEY-----\nMC4CAQAwBQYDK2VuBCIEIAAvk9ELpXKNjdjpUnch2royYcC7G+/ee0u9rGMdRUZR\n-----END X25519 PRIVATE KEY-----\n\n*   X25519 private keys in password protected PEM format\n\n-----BEGIN X25519 PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-CBC,DEEFD3D6B714E75A\n\ndfFWP5bKn49aZ993NVAhQQPdFWgsTb4j8CWhRjGBVTPl6ITstAL17deBIRBwZb7h\npAyIka81Kfs=\n-----END X25519 PRIVATE KEY-----\n\n*   X25519 public keys in PEM format\n\n-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VuAyEA6ngG9yGoVwUSyPbvtOjWIMSaUp5N9eqnfexkb7HofkE=\n-----END PUBLIC KEY-----\n\n*   PKCS#8 private keys\n\n-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VuBCIEIAAvk9ELpXKNjdjpUnch2royYcC7G+/ee0u9rGMdRUZR\n-----END PRIVATE KEY-----\n\n*   PKCS#8 encrypted private keys\n\n-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIGHMEsGCSqGSIb3DQEFDTA+MCkGCSqGSIb3DQEFDDAcBAiS0NOFZmjJswICCAAw\nDAYIKoZIhvcNAgkFADARBgUrDgMCBwQIGd40Hdso8Y4EONSRCTrqvftl9hl3zbH9\n2QmHF1KJ4HDMdLDRxD7EynonCw2SV7BO+XNRHzw2yONqiTybfte7nk9t\n-----END ENCRYPTED PRIVATE KEY-----\n\n*   X25519 private keys in JSON Web Key (JWK) format\n\nSee <https://tools.ietf.org/html/rfc8037>\n\n{\n\"kty\":\"OKP\",\n\"crv\":\"X25519\",\n\"x\":\"6ngG9yGoVwUSyPbvtOjWIMSaUp5N9eqnfexkb7HofkE\",\n\"d\":\"AC-T0Qulco2N2OlSdyHaujJhwLsb7957S72sYx1FRlE\",\n}\n\nBEWARE: For JWK support you need to have JSON module installed.\n\n*   X25519 public keys in JSON Web Key (JWK) format\n\n{\n\"kty\":\"OKP\",\n\"crv\":\"X25519\",\n\"x\":\"6ngG9yGoVwUSyPbvtOjWIMSaUp5N9eqnfexkb7HofkE\",\n}\n\nBEWARE: For JWK support you need to have JSON module installed.\n\nimportkeyraw\nImport raw public/private key - can load raw key data exported by \"exportkeyraw\".\n\n$pk->importkeyraw($key, 'public');\n$pk->importkeyraw($key, 'private');\n\nexportkeyder\nmy $privateder = $pk->exportkeyder('private');\n#or\nmy $publicder = $pk->exportkeyder('public');\n\nexportkeypem\nmy $privatepem = $pk->exportkeypem('private');\n#or\nmy $publicpem = $pk->exportkeypem('public');\n\nSupport for password protected PEM keys\n\nmy $privatepem = $pk->exportkeypem('private', $password);\n#or\nmy $privatepem = $pk->exportkeypem('private', $password, $cipher);\n\n# supported ciphers: 'DES-CBC'\n#                    'DES-EDE3-CBC'\n#                    'SEED-CBC'\n#                    'CAMELLIA-128-CBC'\n#                    'CAMELLIA-192-CBC'\n#                    'CAMELLIA-256-CBC'\n#                    'AES-128-CBC'\n#                    'AES-192-CBC'\n#                    'AES-256-CBC' (DEFAULT)\n\nexportkeyjwk\nExports public/private keys as a JSON Web Key (JWK).\n\nmy $privatejsontext = $pk->exportkeyjwk('private');\n#or\nmy $publicjsontext = $pk->exportkeyjwk('public');\n\nAlso exports public/private keys as a perl HASH with JWK structure.\n\nmy $jwkhash = $pk->exportkeyjwk('private', 1);\n#or\nmy $jwkhash = $pk->exportkeyjwk('public', 1);\n\nBEWARE: For JWK support you need to have JSON module installed.\n\nexportkeyraw\nExport raw public/private key\n\nmy $privatebytes = $pk->exportkeyraw('private');\n#or\nmy $publicbytes = $pk->exportkeyraw('public');\n\nsharedsecret\n# Alice having her priv key $pk and Bob's public key $pkb\nmy $pk  = Crypt::PK::X25519->new($privkeyfilename);\nmy $pkb = Crypt::PK::X25519->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::X25519->new($privkeyfilename);\nmy $pka = Crypt::PK::X25519->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\nkey2hash\nmy $hash = $pk->key2hash;\n\n# returns hash like this (or undef if no key loaded):\n{\ncurve => \"x25519\",\n# raw public key as a hexadecimal string\npub   => \"EA7806F721A8570512C8F6EFB4E8D620C49A529E4DF5EAA77DEC646FB1E87E41\",\n# raw private key as a hexadecimal string. undef if key is public only\npriv  => \"002F93D10BA5728D8DD8E9527721DABA3261C0BB1BEFDE7B4BBDAC631D454651\",\n}\n",
                "subsections": []
            },
            "SEE ALSO": {
                "content": "*   <https://en.wikipedia.org/wiki/Curve25519>\n\n*   <https://tools.ietf.org/html/rfc7748>\n",
                "subsections": []
            }
        }
    }
}