{
    "content": [
        {
            "type": "text",
            "text": "# Crypt::PK::Ed25519 (perldoc)\n\n## NAME\n\nCrypt::PK::Ed25519 - Digital signature based on Ed25519\n\n## SYNOPSIS\n\nuse Crypt::PK::Ed25519;\n#Signature: Alice\nmy $priv = Crypt::PK::Ed25519->new('Aliceprived25519.der');\nmy $sig = $priv->signmessage($message);\n#Signature: Bob (received $message + $sig)\nmy $pub = Crypt::PK::Ed25519->new('Alicepubed25519.der');\n$pub->verifymessage($sig, $message) or die \"ERROR\";\n#Load key\nmy $pk = Crypt::PK::Ed25519->new;\nmy $pkhex = \"A05D1AEA5830AC9A65CDFB384660D497E3697C46B419CF2CEC85DE8BD245459D\";\n$pk->importkeyraw(pack(\"H*\", $pkhex), \"public\");\nmy $sk = Crypt::PK::Ed25519->new;\nmy $skhex = \"45C109BA6FD24E8B67D23EFB6B92D99CD457E2137172C0D749FE2B5A0C142DAD\";\n$sk->importkeyraw(pack(\"H*\", $skhex), \"private\");\n#Key generation\nmy $pk = Crypt::PK::Ed25519->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::Ed25519",
        "section": "",
        "mode": "perldoc",
        "summary": "Crypt::PK::Ed25519 - Digital signature based on Ed25519",
        "synopsis": "use Crypt::PK::Ed25519;\n#Signature: Alice\nmy $priv = Crypt::PK::Ed25519->new('Aliceprived25519.der');\nmy $sig = $priv->signmessage($message);\n#Signature: Bob (received $message + $sig)\nmy $pub = Crypt::PK::Ed25519->new('Alicepubed25519.der');\n$pub->verifymessage($sig, $message) or die \"ERROR\";\n#Load key\nmy $pk = Crypt::PK::Ed25519->new;\nmy $pkhex = \"A05D1AEA5830AC9A65CDFB384660D497E3697C46B419CF2CEC85DE8BD245459D\";\n$pk->importkeyraw(pack(\"H*\", $pkhex), \"public\");\nmy $sk = Crypt::PK::Ed25519->new;\nmy $skhex = \"45C109BA6FD24E8B67D23EFB6B92D99CD457E2137172C0D749FE2B5A0C142DAD\";\n$sk->importkeyraw(pack(\"H*\", $skhex), \"private\");\n#Key generation\nmy $pk = Crypt::PK::Ed25519->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": 29,
                "subsections": []
            },
            {
                "name": "DESCRIPTION",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "METHODS",
                "lines": 219,
                "subsections": []
            },
            {
                "name": "SEE ALSO",
                "lines": 6,
                "subsections": []
            }
        ],
        "sections": {
            "NAME": {
                "content": "Crypt::PK::Ed25519 - Digital signature based on Ed25519\n",
                "subsections": []
            },
            "SYNOPSIS": {
                "content": "use Crypt::PK::Ed25519;\n\n#Signature: Alice\nmy $priv = Crypt::PK::Ed25519->new('Aliceprived25519.der');\nmy $sig = $priv->signmessage($message);\n\n#Signature: Bob (received $message + $sig)\nmy $pub = Crypt::PK::Ed25519->new('Alicepubed25519.der');\n$pub->verifymessage($sig, $message) or die \"ERROR\";\n\n#Load key\nmy $pk = Crypt::PK::Ed25519->new;\nmy $pkhex = \"A05D1AEA5830AC9A65CDFB384660D497E3697C46B419CF2CEC85DE8BD245459D\";\n$pk->importkeyraw(pack(\"H*\", $pkhex), \"public\");\nmy $sk = Crypt::PK::Ed25519->new;\nmy $skhex = \"45C109BA6FD24E8B67D23EFB6B92D99CD457E2137172C0D749FE2B5A0C142DAD\";\n$sk->importkeyraw(pack(\"H*\", $skhex), \"private\");\n\n#Key generation\nmy $pk = Crypt::PK::Ed25519->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::Ed25519->new();\n#or\nmy $pk = Crypt::PK::Ed25519->new($privorpubkeyfilename);\n#or\nmy $pk = Crypt::PK::Ed25519->new(\\$buffercontainingprivorpubkey);\n\nSupport for password protected PEM keys\n\nmy $pk = Crypt::PK::Ed25519->new($privpemkeyfilename, $password);\n#or\nmy $pk = Crypt::PK::Ed25519->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 => \"ed25519\",\npub   => \"A05D1AEA5830AC9A65CDFB384660D497E3697C46B419CF2CEC85DE8BD245459D\",\npriv  => \"45C109BA6FD24E8B67D23EFB6B92D99CD457E2137172C0D749FE2B5A0C142DAD\",\n});\n\n# or a hash with items corresponding to JWK (JSON Web Key)\n$pk->importkey({\nkty => \"OKP\",\ncrv => \"Ed25519\",\nd   => \"RcEJumSTotn0j77a5LZnNRX4hNxcsDXSf4rWgwULa0\",\nx   => \"oF0a6lgwrJplzfs4RmDUl-NpfEa0Gc8s7IXei9JFRZ0\",\n});\n\nSupported key formats:\n\n# all formats can be loaded from a file\nmy $pk = Crypt::PK::Ed25519->new($filename);\n\n# or from a buffer containing the key\nmy $pk = Crypt::PK::Ed25519->new(\\$bufferwithkey);\n\n*   Ed25519 private keys in PEM format\n\n-----BEGIN ED25519 PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIEXBCbpv0k6LZ9I++2uS2ZzUV+ITcXLA10n+K1oMFC2t\n-----END ED25519 PRIVATE KEY-----\n\n*   Ed25519 private keys in password protected PEM format\n\n-----BEGIN ED25519 PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-CBC,6A64D756D49C1EFF\n\n8xQ7OyfQ10IITNEKcJGZA53Z1yk+NJQU7hrKqXwChZtgWNInhMBJRl9pozLKDSkH\nv7u6EOve8NY=\n-----END ED25519 PRIVATE KEY-----\n\n*   PKCS#8 private keys\n\n-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIEXBCbpv0k6LZ9I++2uS2ZzUV+ITcXLA10n+K1oMFC2t\n-----END PRIVATE KEY-----\n\n*   PKCS#8 encrypted private keys\n\n-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIGHMEsGCSqGSIb3DQEFDTA+MCkGCSqGSIb3DQEFDDAcBAjPx9JkdpRH2QICCAAw\nDAYIKoZIhvcNAgkFADARBgUrDgMCBwQIWWieQojaWTcEOGj43SxqHUys4Eb2M27N\nAkhqpmhosOxKrpGi0L3h8m8ipHE8EwI94NeOMsjfVw60aJuCrssY5vKN\n-----END ENCRYPTED PRIVATE KEY-----\n\n*   Ed25519 public keys in PEM format\n\n-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAoF0a6lgwrJplzfs4RmDUl+NpfEa0Gc8s7IXei9JFRZ0=\n-----END PUBLIC KEY-----\n\n*   Ed25519 public key from X509 certificate\n\n-----BEGIN CERTIFICATE-----\nMIIBODCB66ADAgECAhRWDU9FZBBUZ7KTdX8f7Bco8jsoaTAFBgMrZXAwETEPMA0G\nA1UEAwwGQ3J5cHRYMCAXDTIwMDExOTEzMDIwMloYDzIyOTMxMTAyMTMwMjAyWjAR\nMQ8wDQYDVQQDDAZDcnlwdFgwKjAFBgMrZXADIQCgXRrqWDCsmmXN+zhGYNSX42l8\nRrQZzyzshd6L0kVFnaNTMFEwHQYDVR0OBBYEFHCGFtVibAxxWYyRt5wazMpqSZDV\nMB8GA1UdIwQYMBaAFHCGFtVibAxxWYyRt5wazMpqSZDVMA8GA1UdEwEB/wQFMAMB\nAf8wBQYDK2VwA0EAqG/+98smzqF/wmFX3zHXSaA67as202HnBJod1Tiurw1f+lr3\nBX6OMtsDpgRq9O77IF1Qyx/MdJEwwErczOIbAA==\n-----END CERTIFICATE-----\n\n*   SSH public Ed25519 keys\n\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL0XsiFcRDp6Hpsoak8OdiiBMJhM2UKszNTxoGS7dJ++\n\n*   SSH public Ed25519 keys (RFC-4716 format)\n\n---- BEGIN SSH2 PUBLIC KEY ----\nComment: \"256-bit ED25519, converted from OpenSSH\"\nAAAAC3NzaC1lZDI1NTE5AAAAIL0XsiFcRDp6Hpsoak8OdiiBMJhM2UKszNTxoGS7dJ++\n---- END SSH2 PUBLIC KEY ----\n\n*   Ed25519 private keys in JSON Web Key (JWK) format\n\nSee <https://tools.ietf.org/html/rfc8037>\n\n{\n\"kty\":\"OKP\",\n\"crv\":\"Ed25519\",\n\"x\":\"oF0a6lgwrJplzfs4RmDUl-NpfEa0Gc8s7IXei9JFRZ0\",\n\"d\":\"RcEJumSTotn0j77a5LZnNRX4hNxcsDXSf4rWgwULa0\",\n}\n\nBEWARE: For JWK support you need to have JSON module installed.\n\n*   Ed25519 public keys in JSON Web Key (JWK) format\n\n{\n\"kty\":\"OKP\",\n\"crv\":\"Ed25519\",\n\"x\":\"oF0a6lgwrJplzfs4RmDUl-NpfEa0Gc8s7IXei9JFRZ0\",\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\nsignmessage\nmy $signature = $priv->signmessage($message);\n\nverifymessage\nmy $valid = $pub->verifymessage($signature, $message)\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 => \"ed25519\",\n# raw public key as a hexadecimal string\npub   => \"A05D1AEA5830AC9A65CDFB384660D497E3697C46B419CF2CEC85DE8BD245459D\",\n# raw private key as a hexadecimal string. undef if key is public only\npriv  => \"45C109BA6FD24E8B67D23EFB6B92D99CD457E2137172C0D749FE2B5A0C142DAD\",\n}\n",
                "subsections": []
            },
            "SEE ALSO": {
                "content": "*   <https://en.wikipedia.org/wiki/EdDSA#Ed25519>\n\n*   <https://en.wikipedia.org/wiki/Curve25519>\n\n*   <https://tools.ietf.org/html/rfc8032>\n",
                "subsections": []
            }
        }
    }
}