[{"data":1,"prerenderedAt":699},["ShallowReactive",2],{"navigation_docs":3,"-math-p521":80,"-math-p521-surround":694},[4,24],{"title":5,"path":6,"stem":7,"children":8,"icon":23},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19],{"title":10,"path":6,"stem":7},"Getting started",{"title":12,"path":13,"stem":14},"CLI","\u002Fguide\u002Fcli","1.guide\u002F02.cli",{"title":16,"path":17,"stem":18},"Agents","\u002Fguide\u002Fagents","1.guide\u002F03.agents",{"title":20,"path":21,"stem":22},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F04.playground","i-lucide-book-open",{"title":25,"path":26,"stem":27,"children":28,"icon":79},"Math","\u002Fmath","2.math\u002F00.index",[29,31,35,39,43,47,51,55,59,63,67,71,75],{"title":30,"path":26,"stem":27},"Overview",{"title":32,"path":33,"stem":34},"Curves and points","\u002Fmath\u002Fcurves","2.math\u002F01.curves",{"title":36,"path":37,"stem":38},"Orders and logs","\u002Fmath\u002Fgroups","2.math\u002F02.groups",{"title":40,"path":41,"stem":42},"secp256k1","\u002Fmath\u002Fsecp256k1","2.math\u002F03.secp256k1",{"title":44,"path":45,"stem":46},"sr25519","\u002Fmath\u002Fsr25519","2.math\u002F04.sr25519",{"title":48,"path":49,"stem":50},"ed25519","\u002Fmath\u002Fed25519","2.math\u002F05.ed25519",{"title":52,"path":53,"stem":54},"P-256","\u002Fmath\u002Fp256","2.math\u002F06.p256",{"title":56,"path":57,"stem":58},"P-384","\u002Fmath\u002Fp384","2.math\u002F07.p384",{"title":60,"path":61,"stem":62},"P-521","\u002Fmath\u002Fp521","2.math\u002F08.p521",{"title":64,"path":65,"stem":66},"brainpoolP256r1","\u002Fmath\u002Fbrainpoolp256r1","2.math\u002F09.brainpoolp256r1",{"title":68,"path":69,"stem":70},"brainpoolP384r1","\u002Fmath\u002Fbrainpoolp384r1","2.math\u002F10.brainpoolp384r1",{"title":72,"path":73,"stem":74},"brainpoolP512r1","\u002Fmath\u002Fbrainpoolp512r1","2.math\u002F11.brainpoolp512r1",{"title":76,"path":77,"stem":78},"Ed448","\u002Fmath\u002Fed448","2.math\u002F12.ed448","i-lucide-sigma",{"id":81,"title":60,"body":82,"description":686,"extension":687,"links":688,"meta":689,"navigation":142,"path":61,"seo":691,"stem":62,"__hash__":693},"docs\u002F2.math\u002F08.p521.md",{"type":83,"value":84,"toc":676},"minimark",[85,90,94,104,199,210,214,221,385,388,391,396,399,409,413,421,424,442,446,455,491,494,500,552,556,563,605,614,617,620,624,640,643,646,649,656,663,666,672],[86,87,89],"h2",{"id":88},"p-521-also-called-secp521r1","P-521, also called secp521r1",[91,92,93],"p",{},"P-521 handles points and signatures for ES512, OpenPGP keys and TLS certificates. SEC 2 v2 calls it secp521r1 in section 2.6.1. OpenSSL uses that name too.",[91,95,96,97,100,101,103],{},"The curve is y² = x³ - 3x + b over p = 2^521 - 1. That's a Mersenne prime. The cofactor is 1. Like ",[98,99,56],"a",{"href":57}," and ",[98,102,52],{"href":53},", it uses a = -3.",[105,106,111],"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-ts shiki shiki-themes compressions compressions compressions","import { isOnCurve, multiplyGenerator } from \"@agntn\u002Fcurves\u002Fp521\";\n\nmultiplyGenerator(1n); \u002F\u002F \"0200c6858e06b704…7e31c2e5bd66\"\nisOnCurve(`02${\"3\".padStart(132, \"0\")}`); \u002F\u002F false\n","ts","",[112,113,114,137,144,164],"code",{"__ignoreMap":110},[115,116,119,123,127,130,134],"span",{"class":117,"line":118},"line",1,[115,120,122],{"class":121},"skH_V","import",[115,124,126],{"class":125},"s38Sx"," { isOnCurve, multiplyGenerator } ",[115,128,129],{"class":121},"from",[115,131,133],{"class":132},"shU9J"," \"@agntn\u002Fcurves\u002Fp521\"",[115,135,136],{"class":125},";\n",[115,138,140],{"class":117,"line":139},2,[115,141,143],{"emptyLinePlaceholder":142},true,"\n",[115,145,147,151,154,157,160],{"class":117,"line":146},3,[115,148,150],{"class":149},"sK71F","multiplyGenerator",[115,152,153],{"class":125},"(1",[115,155,156],{"class":121},"n",[115,158,159],{"class":125},"); ",[115,161,163],{"class":162},"scIB-","\u002F\u002F \"0200c6858e06b704…7e31c2e5bd66\"\n",[115,165,167,170,173,176,179,182,185,188,191,194,196],{"class":117,"line":166},4,[115,168,169],{"class":149},"isOnCurve",[115,171,172],{"class":125},"(",[115,174,175],{"class":132},"`02${\"3\"",[115,177,178],{"class":132},".",[115,180,181],{"class":149},"padStart",[115,183,184],{"class":132},"(132, ",[115,186,187],{"class":132},"\"0\"",[115,189,190],{"class":132},")",[115,192,193],{"class":132},"}`",[115,195,159],{"class":125},[115,197,198],{"class":162},"\u002F\u002F false\n",[91,200,201,202,205,206,209],{},"Coordinates and scalars take 66 bytes, or 132 hex digits. That's 528 bits for a 521-bit number. The top byte is ",[112,203,204],{},"00"," or ",[112,207,208],{},"01",". Its other seven bits stay zero. Compressed points take 67 bytes. Uncompressed points take 133.",[86,211,213],{"id":212},"verify-a-p-521-ecdsa-signature","Verify a P-521 ECDSA signature",[91,215,216,217,220],{},"Checking an ES512 token or a certificate? Hash the signed bytes, then give ",[112,218,219],{},"verify"," the digest, signature and public key.",[105,222,224],{"className":107,"code":223,"language":109,"meta":110,"style":110},"import { verify } from \"@agntn\u002Fcurves\u002Fp521\";\n\nconst publicKey =\n  \"0401894550d0785932e00eaa23b694f213f8c3121f86dc97a04e5a7167db4e5bcd371123d46e45db6b5d5370a7f20fb633\" +\n  \"155d38ffa16d2bd761dcac474b9a2f5023a400493101c962cd4d2fddf782285e64584139c2f91b47f87ff82354d6630f74\" +\n  \"6a28a0db25741b5b34a828008b22acc23f924faafbd4d33f81ea66956dfeaa2bfdfcf5\";\nconst digest =\n  \"39a5e04aaff7455d9850c605364f514c11324ce64016960d23d5dc57d3ffd8f4\" +\n  \"9a739468ab8049bf18eef820cdb1ad6c9015f838556bc7fad4138b23fdf986c7\"; \u002F\u002F SHA-512 of \"sample\"\nconst signature =\n  \"00c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add152b5349\" +\n  \"31d7d4e8455cc91f9b15bf05ec36e377fa00617cce7cf5064806c467f678d3b4080d6f1cc50af26ca209417308281b68af\" +\n  \"282623eaa63e5b5c0723d8b8c37ff0777b1a20f8ccb1dccc43997f1ee0e44da4a67a\";\n\nverify(signature, { digest, publicKey }); \u002F\u002F true\nverify(signature, { digest: `00${digest.slice(2)}`, publicKey }); \u002F\u002F false\n",[112,225,226,239,243,254,262,270,278,288,296,308,318,326,334,342,347,358],{"__ignoreMap":110},[115,227,228,230,233,235,237],{"class":117,"line":118},[115,229,122],{"class":121},[115,231,232],{"class":125}," { verify } ",[115,234,129],{"class":121},[115,236,133],{"class":132},[115,238,136],{"class":125},[115,240,241],{"class":117,"line":139},[115,242,143],{"emptyLinePlaceholder":142},[115,244,245,248,251],{"class":117,"line":146},[115,246,247],{"class":121},"const",[115,249,250],{"class":125}," publicKey ",[115,252,253],{"class":121},"=\n",[115,255,256,259],{"class":117,"line":166},[115,257,258],{"class":132},"  \"0401894550d0785932e00eaa23b694f213f8c3121f86dc97a04e5a7167db4e5bcd371123d46e45db6b5d5370a7f20fb633\"",[115,260,261],{"class":121}," +\n",[115,263,265,268],{"class":117,"line":264},5,[115,266,267],{"class":132},"  \"155d38ffa16d2bd761dcac474b9a2f5023a400493101c962cd4d2fddf782285e64584139c2f91b47f87ff82354d6630f74\"",[115,269,261],{"class":121},[115,271,273,276],{"class":117,"line":272},6,[115,274,275],{"class":132},"  \"6a28a0db25741b5b34a828008b22acc23f924faafbd4d33f81ea66956dfeaa2bfdfcf5\"",[115,277,136],{"class":125},[115,279,281,283,286],{"class":117,"line":280},7,[115,282,247],{"class":121},[115,284,285],{"class":125}," digest ",[115,287,253],{"class":121},[115,289,291,294],{"class":117,"line":290},8,[115,292,293],{"class":132},"  \"39a5e04aaff7455d9850c605364f514c11324ce64016960d23d5dc57d3ffd8f4\"",[115,295,261],{"class":121},[115,297,299,302,305],{"class":117,"line":298},9,[115,300,301],{"class":132},"  \"9a739468ab8049bf18eef820cdb1ad6c9015f838556bc7fad4138b23fdf986c7\"",[115,303,304],{"class":125},"; ",[115,306,307],{"class":162},"\u002F\u002F SHA-512 of \"sample\"\n",[115,309,311,313,316],{"class":117,"line":310},10,[115,312,247],{"class":121},[115,314,315],{"class":125}," signature ",[115,317,253],{"class":121},[115,319,321,324],{"class":117,"line":320},11,[115,322,323],{"class":132},"  \"00c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add152b5349\"",[115,325,261],{"class":121},[115,327,329,332],{"class":117,"line":328},12,[115,330,331],{"class":132},"  \"31d7d4e8455cc91f9b15bf05ec36e377fa00617cce7cf5064806c467f678d3b4080d6f1cc50af26ca209417308281b68af\"",[115,333,261],{"class":121},[115,335,337,340],{"class":117,"line":336},13,[115,338,339],{"class":132},"  \"282623eaa63e5b5c0723d8b8c37ff0777b1a20f8ccb1dccc43997f1ee0e44da4a67a\"",[115,341,136],{"class":125},[115,343,345],{"class":117,"line":344},14,[115,346,143],{"emptyLinePlaceholder":142},[115,348,350,352,355],{"class":117,"line":349},15,[115,351,219],{"class":149},[115,353,354],{"class":125},"(signature, { digest, publicKey }); ",[115,356,357],{"class":162},"\u002F\u002F true\n",[115,359,361,363,366,369,372,375,378,380,383],{"class":117,"line":360},16,[115,362,219],{"class":149},[115,364,365],{"class":125},"(signature, { digest: ",[115,367,368],{"class":132},"`00${",[115,370,371],{"class":132},"digest.",[115,373,374],{"class":149},"slice",[115,376,377],{"class":132},"(2)",[115,379,193],{"class":132},[115,381,382],{"class":125},", publicKey }); ",[115,384,198],{"class":162},[91,386,387],{},"The key and signature are from RFC 6979 appendix A.2.7. The digest is SHA-512 over \"sample\". The second call replaces the digest's first byte. It doesn't just add a leading zero.",[91,389,390],{},"A signature holds r followed by s. That's 132 bytes, or 264 hex digits. Better get comfortable pasting. The public key is compressed or uncompressed SEC1 hex.",[392,393,395],"h3",{"id":394},"what-about-der-and-the-digest","What about DER and the digest?",[91,397,398],{},"A JWS ES512 signature already has r followed by s. X.509 uses DER and OpenPGP uses two MPIs. Unpack r and s first. Pad each to 132 hex digits.",[91,400,401,402,405,406,408],{},"The digest is 1 to 64 bytes of hex without ",[112,403,404],{},"0x",". P-521's n has 521 bits. SHA-512 has 512, so the whole digest counts. For once, nothing gets cut. A shorter digest like SHA-256 counts whole too. Adding a leading ",[112,407,204],{}," byte doesn't change its value.",[392,410,412],{"id":411},"what-does-it-refuse","What does it refuse?",[105,414,419],{"className":415,"code":417,"language":418,"meta":110},[416],"language-text","verify(\"00\", { digest, publicKey })                   \u002F\u002F Signature must be 264 hex digits without 0x, r then s\nverify(signature, { digest: \"0x00\", publicKey })      \u002F\u002F Digest must be hex without 0x, 1 to 64 bytes\nverify(signature, { digest, publicKey: p384G })       \u002F\u002F Invalid SEC1 P-521 public key\nliftX(\"3\".padStart(132, \"0\"))                         \u002F\u002F No point of P-521 has this x\n","text",[112,420,417],{"__ignoreMap":110},[91,422,423],{},"Wrong shapes throw. A compressed P-384 point is 49 bytes. P-521 needs 67.",[91,425,426,427,430,431,434,435,437,438,441],{},"An r or s outside 1 to n - 1 returns ",[112,428,429],{},"false",". The ",[112,432,433],{},"lowS"," option defaults to ",[112,436,429],{},". Set it to ",[112,439,440],{},"true"," to refuse s above n \u002F 2.",[392,443,445],{"id":444},"cli-and-agent-tool","CLI and agent tool",[91,447,448,449,452,453,178],{},"The CLI uses ",[112,450,451],{},"curves p521 \u003Coperation>",". Here's the same signature through ",[112,454,219],{},[105,456,460],{"className":457,"code":458,"language":459,"meta":110,"style":110},"language-bash shiki shiki-themes compressions compressions compressions","curves p521 verify --point 0401894550d0785932e00eaa23b694f213f8c3121f86dc97a04e5a7167db4e5bcd371123d46e45db6b5d5370a7f20fb633155d38ffa16d2bd761dcac474b9a2f5023a400493101c962cd4d2fddf782285e64584139c2f91b47f87ff82354d6630f746a28a0db25741b5b34a828008b22acc23f924faafbd4d33f81ea66956dfeaa2bfdfcf5 --digest 39a5e04aaff7455d9850c605364f514c11324ce64016960d23d5dc57d3ffd8f49a739468ab8049bf18eef820cdb1ad6c9015f838556bc7fad4138b23fdf986c7 --signature 00c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add152b534931d7d4e8455cc91f9b15bf05ec36e377fa00617cce7cf5064806c467f678d3b4080d6f1cc50af26ca209417308281b68af282623eaa63e5b5c0723d8b8c37ff0777b1a20f8ccb1dccc43997f1ee0e44da4a67a\n","bash",[112,461,462],{"__ignoreMap":110},[115,463,464,467,470,473,476,479,482,485,488],{"class":117,"line":118},[115,465,466],{"class":149},"curves",[115,468,469],{"class":132}," p521",[115,471,472],{"class":132}," verify",[115,474,475],{"class":132}," --point",[115,477,478],{"class":132}," 0401894550d0785932e00eaa23b694f213f8c3121f86dc97a04e5a7167db4e5bcd371123d46e45db6b5d5370a7f20fb633155d38ffa16d2bd761dcac474b9a2f5023a400493101c962cd4d2fddf782285e64584139c2f91b47f87ff82354d6630f746a28a0db25741b5b34a828008b22acc23f924faafbd4d33f81ea66956dfeaa2bfdfcf5",[115,480,481],{"class":132}," --digest",[115,483,484],{"class":132}," 39a5e04aaff7455d9850c605364f514c11324ce64016960d23d5dc57d3ffd8f49a739468ab8049bf18eef820cdb1ad6c9015f838556bc7fad4138b23fdf986c7",[115,486,487],{"class":132}," --signature",[115,489,490],{"class":132}," 00c328fafcbd79dd77850370c46325d987cb525569fb63c5d3bc53950e6d4c5f174e25a1ee9017b5d450606add152b534931d7d4e8455cc91f9b15bf05ec36e377fa00617cce7cf5064806c467f678d3b4080d6f1cc50af26ca209417308281b68af282623eaa63e5b5c0723d8b8c37ff0777b1a20f8ccb1dccc43997f1ee0e44da4a67a\n",[91,492,493],{},"It prints:",[105,495,498],{"className":496,"code":497,"language":418,"meta":110},[416],"{\"operation\":\"verify\",\"valid\":true}\n",[112,499,497],{"__ignoreMap":110},[91,501,502,503,506,507,506,510,506,513,506,516,506,519,100,522,524,525,528,529,506,532,506,535,506,538,506,541,506,544,506,547,100,549,178],{},"The CLI offers ",[112,504,505],{},"add",", ",[112,508,509],{},"subtract",[112,511,512],{},"negate",[112,514,515],{},"multiply",[112,517,518],{},"lift",[112,520,521],{},"check",[112,523,219],{},". The agent tool ",[112,526,527],{},"curves_p521_compute"," has the same operations. Its arguments are ",[112,530,531],{},"point",[112,533,534],{},"other",[112,536,537],{},"scalar",[112,539,540],{},"x",[112,542,543],{},"digest",[112,545,546],{},"signature",[112,548,433],{},[112,550,551],{},"compressed",[86,553,555],{"id":554},"p-521-point-math","P-521 point math",[91,557,558,559,562],{},"The ",[112,560,561],{},"@agntn\u002Fcurves\u002Fp521"," entry exports:",[564,565,566,578,585,595],"ul",{},[567,568,569,506,572,100,575],"li",{},[112,570,571],{},"addPoints",[112,573,574],{},"subtractPoints",[112,576,577],{},"negatePoint",[567,579,580,100,583],{},[112,581,582],{},"multiplyPoint",[112,584,150],{},[567,586,587,506,590,100,592],{},[112,588,589],{},"liftX",[112,591,169],{},[112,593,594],{},"convertPoint",[567,596,597,506,599,100,602],{},[112,598,219],{},[112,600,601],{},"p521",[112,603,604],{},"INVALID_POINT",[91,606,607,608,610,611,613],{},"Those names match P-256 and P-384. The ",[112,609,601],{}," export holds the domain parameters. Give ",[112,612,589],{}," an x as 132 hex digits.",[91,615,616],{},"Try x = 0, 1 or 2. Each has points on P-521. The first empty x is 3. On P-256 and P-384, x = 1 is already empty.",[91,618,619],{},"There's no signing, key recovery or scalar math on P-521. Like P-256 and P-384, it verifies signatures.",[86,621,623],{"id":622},"written-from-the-specs","Written from the specs",[91,625,626,627,630,631,506,633,506,635,100,637,639],{},"P-521 shares ",[112,628,629],{},"src\u002Fcore\u002Fsec1.ts"," with P-256, P-384, ",[98,632,64],{"href":65},[98,634,68],{"href":69},[98,636,72],{"href":73},[98,638,40],{"href":41},". Seven curves, one implementation. Widths come from the curve. That's better than keeping seven copies in sync.",[91,641,642],{},"The shared code wants n and p of the same bit length. Here, both have 521 bits. Digest cuts follow those 521 bits, not the 528 bits in 66 bytes.",[91,644,645],{},"Multiplication walks 132 hex digits on P-521. P-384 walks 96, and the 32-byte curves walk 64. The comb for secret multiplies has four rows, 33 steps apart. The verification table has 132 rows of 15 points.",[91,647,648],{},"Addition and doubling use algorithms 4 and 6 from Renes, Costello and Batina (2016). They're the same a = -3 formulas used by P-256 and P-384. Square roots take one power because p is 3 mod 4.",[91,650,651,652,655],{},"A secret multiply takes the same steps for every scalar. ",[112,653,654],{},"test\u002Fp521.test.ts"," times 1 against n - 1. But JavaScript bigints promise nothing about time. The library is unaudited. Keep real money away.",[91,657,658,659,662],{},"In a local run, G multiplication took about 2.4 ms. Another point took about 5.5 ms. Verification took about 5.6 ms. ",[112,660,661],{},"@noble\u002Fcurves"," 2.4.0 took about 7.4 ms on the same 50 signatures. In another local run, the generic code for curves you define took about 49 ms for one P-521 multiplication.",[91,664,665],{},"All 318 Wycheproof ECDSA P-521 SHA-512 vectors pass in P1363 form. That's r followed by s. The tests also check RFC 6979 appendix A.2.7 signatures for SHA-256, SHA-384 and SHA-512 over \"sample\" and \"test\". Those are checks worth having.",[91,667,668,669,671],{},"Multiples of G are frozen from ",[112,670,661],{}," 2.4.0. OpenSSL agreed on every one when they were frozen. In a local run, noble agreed on 300 random cases and 50 signatures. OpenSSL agreed on 200 random keys.",[673,674,675],"style",{},"html pre.shiki code .skH_V, html code.shiki .skH_V{--shiki-light:var(--shiki-token-keyword);--shiki-default:var(--shiki-token-keyword);--shiki-dark:var(--shiki-token-keyword)}html pre.shiki code .s38Sx, html code.shiki .s38Sx{--shiki-light:var(--ui-text-highlighted);--shiki-default:var(--ui-text-highlighted);--shiki-dark:var(--ui-text-highlighted)}html pre.shiki code .shU9J, html code.shiki .shU9J{--shiki-light:var(--shiki-token-string);--shiki-default:var(--shiki-token-string);--shiki-dark:var(--shiki-token-string)}html pre.shiki code .sK71F, html code.shiki .sK71F{--shiki-light:var(--shiki-token-function);--shiki-default:var(--shiki-token-function);--shiki-dark:var(--shiki-token-function)}html pre.shiki code .scIB-, html code.shiki .scIB-{--shiki-light:var(--shiki-token-comment);--shiki-default:var(--shiki-token-comment);--shiki-dark:var(--shiki-token-comment)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":110,"searchDepth":139,"depth":139,"links":677},[678,679,684,685],{"id":88,"depth":139,"text":89},{"id":212,"depth":139,"text":213,"children":680},[681,682,683],{"id":394,"depth":146,"text":395},{"id":411,"depth":146,"text":412},{"id":444,"depth":146,"text":445},{"id":554,"depth":139,"text":555},{"id":622,"depth":139,"text":623},"P-521 point math and ECDSA verification for ES512 and certificates","md",null,{"icon":690},"i-lucide-shield-plus",{"title":692,"description":686},"P-521 ECDSA verification and SEC1 points in TypeScript","tqXTbp0Our1bXdPyY13TTc00_aF_IpwvZXwx5s6nFr4",[695,697],{"title":56,"path":57,"stem":58,"description":696,"children":-1},"P-384 point math and ECDSA verification for ES384 and certificates",{"title":64,"path":65,"stem":66,"description":698,"children":-1},"brainpoolP256r1 point math and ECDSA verification for OpenPGP keys and Brainpool certificates",1793795813679]