--- /dev/null Thu Jan 1 00:00:00 1970 +++ /sys/src/libsec/port/secp384r1.mp Wed Jun 24 00:00:00 2026 @@ -0,0 +1,10 @@ +# E: y² = x³ + ax + b +secp384r1(p,a,b,x,y,n,h) { + p = 2^384 - 2^128 - 2^96 + 2^32 - 1; + a = p - 3; + b = 0xB3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF; + x = 0xAA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7; + y = 0x3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F; + n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973; + h = 1; +} --- /n/sources/plan9/sys/src/libsec/port/mkfile Sat Jun 14 00:00:00 2025 +++ /sys/src/libsec/port/mkfile Wed Jun 24 00:00:00 2026 @@ -22,9 +22,9 @@ hkdf.c\ tsmemcmp.c\ ccpoly.c\ - ecc.c jacobian.c secp256r1.c dh.c curve25519.c curve25519_dh.c\ + ecc.c jacobian.c secp256r1.c secp384r1.c dh.c curve25519.c curve25519_dh.c\ -CLEANFILES=secp256r1.c jacobian.c +CLEANFILES=secp256r1.c secp384r1.c jacobian.c ALLOFILES=${CFILES:%.c=%.$O} --- /n/sources/plan9/sys/include/libsec.h Sat Jun 14 00:00:00 2025 +++ /sys/include/libsec.h Wed Jun 24 00:00:00 2026 @@ -485,6 +485,7 @@ char* X509ecdsaverifydigest(uchar *sig, int siglen, uchar *edigest, int edigestlen, ECdomain *dom, ECpub *pub); void secp256r1(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h); +void secp384r1(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h); /* x25519 elliptic curve diffie-hellman */ void curve25519(uchar mypublic[32], uchar secret[32], uchar basepoint[32]); --- /n/sources/plan9/sys/include/ape/libsec.h Sat Jun 14 00:00:00 2025 +++ /sys/include/ape/libsec.h Wed Jun 24 00:00:00 2026 @@ -439,6 +439,7 @@ void ecpubfree(ECpub *); void secp256r1(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h); +void secp384r1(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h); /* x25519 elliptic curve diffie-hellman */ void curve25519(uchar mypublic[32], uchar secret[32], uchar basepoint[32]); --- /n/sources/plan9/sys/src/libsec/port/x509.c Sat Jun 14 00:00:00 2025 +++ /sys/src/libsec/port/x509.c Wed Jun 24 00:00:00 2026 @@ -1654,13 +1654,16 @@ static DigestFun digestalg[NUMALGS+1] = { md5, md5, md5, md5, sha1, sha1, sha2_256, sha2_384, sha2_512, sha2_224, md5, sha1, sha2_256, sha2_384, sha2_512, sha2_224, sha2_256, sha1, sha2_256, sha2_384, sha2_512, nil }; static Ints9 oid_secp256r1 = {7, 1, 2, 840, 10045, 3, 1, 7}; +static Ints9 oid_secp384r1 = {5, 1, 3, 132, 0, 34}; static Ints *namedcurves_oid_tab[] = { (Ints*)&oid_secp256r1, + (Ints*)&oid_secp384r1, nil, }; static void (*namedcurves[])(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h) = { secp256r1, + secp384r1, }; static void --- /n/sources/plan9/sys/src/libsec/port/tlshand.c Sat Jun 14 00:00:00 2025 +++ /sys/src/libsec/port/tlshand.c Wed Jun 24 00:00:00 2026 @@ -300,6 +300,7 @@ enum { X25519 = 0x001d, secp256r1Curve = 0x0017, + secp384r1Curve = 0x0018, }; // signature algorithms @@ -340,11 +341,13 @@ static Namedcurve namedcurves[] = { {X25519, nil}, {secp256r1Curve, secp256r1}, + {secp384r1Curve, secp384r1}, }; static int tlscurves[] = { X25519, secp256r1Curve, + secp384r1Curve, }; static TlsConnection *tlsServer2(int ctl, int hand, uchar *cert, int ncert, int (*trace)(char*fmt, ...), PEMChain *chain);