From: kemal Date: Wed, 01 Sep 2021 00:13:21 +0000 Subject: [PATCH] ssh: use RSA/SHA-256 instead of RSA/SHA-1 as the public key algorithm openssh now disables RSA/SHA-1 by default, so using RSA/SHA-1 will eventually cause us problems: https://undeadly.org/cgi?action=article;sid=20210830113413 this patch modifies ssh.c to use RSA/SHA-256 (aka rsa-sha2-256) instead of RSA/SHA-1 (aka ssh-rsa) as the public key algorithm. NOTE: public rsa keys and thumbprints are ***NOT AFFECTED*** by this patch. --- diff 6c9462710539bd35ae5c51de27e7894522683bd7 44b3808acb09cbc39f4fdac2f285f7efa62cd0d0 --- a/sys/src/cmd/ssh.c Tue Aug 31 18:53:37 2021 +++ b/sys/src/cmd/ssh.c Wed Sep 1 03:13:21 2021 @@ -373,6 +373,7 @@ } static char sshrsa[] = "ssh-rsa"; +static char rsasha2_256[] = "rsa-sha2-256"; int rsapub2ssh(RSApub *rsa, uchar *data, int len) @@ -402,10 +403,10 @@ rsasig2ssh(RSApub *pub, mpint *S, uchar *data, int len) { int l = (mpsignif(pub->n)+7)/8; - if(4+7+4+l > len) + if(4+12+4+l > len) return -1; - mptober(S, data+4+7+4, l); - return pack(data, len, "ss", sshrsa, sizeof(sshrsa)-1, data+4+7+4, l); + mptober(S, data+4+12+4, l); + return pack(data, len, "ss", rsasha2_256, sizeof(rsasha2_256)-1, data+4+12+4, l); } mpint* @@ -417,7 +418,7 @@ m = mpnew(0); if(unpack(data, len, "sm", &s, &n, m) < 0 - || n != sizeof(sshrsa)-1 || memcmp(s, sshrsa, n) != 0){ + || n != sizeof(rsasha2_256)-1 || memcmp(s, rsasha2_256, n) != 0){ mpfree(m); return nil; } @@ -427,10 +428,10 @@ mpint* pkcs1digest(uchar *data, int len, RSApub *pub) { - uchar digest[SHA1dlen], buf[256]; + uchar digest[SHA2_256dlen], buf[256]; - sha1(data, len, digest, nil); - return pkcs1padbuf(buf, asn1encodedigest(sha1, digest, buf, sizeof(buf)), pub->n, 1); + sha2_256(data, len, digest, nil); + return pkcs1padbuf(buf, asn1encodedigest(sha2_256, digest, buf, sizeof(buf)), pub->n, 1); } int @@ -506,7 +507,7 @@ sendpkt("b[ssssssssssbu", MSG_KEXINIT, cookie, sizeof(cookie), kexalgs, sizeof(kexalgs)-1, - sshrsa, sizeof(sshrsa)-1, + rsasha2_256, sizeof(rsasha2_256)-1, cipheralgs, sizeof(cipheralgs)-1, cipheralgs, sizeof(cipheralgs)-1, macalgs, sizeof(macalgs)-1, @@ -744,7 +745,7 @@ service, strlen(service), authmeth, sizeof(authmeth)-1, 0, - sshrsa, sizeof(sshrsa)-1, + rsasha2_256, sizeof(rsasha2_256)-1, pk, npk); Next1: switch(recvpkt()){ default: @@ -767,7 +768,7 @@ service, strlen(service), authmeth, sizeof(authmeth)-1, 1, - sshrsa, sizeof(sshrsa)-1, + rsasha2_256, sizeof(rsasha2_256)-1, pk, npk); S = pkcs1digest(send.b, n, pub); n = snprint((char*)send.b, sizeof(send.b), "%B", S); @@ -788,7 +789,7 @@ service, strlen(service), authmeth, sizeof(authmeth)-1, 1, - sshrsa, sizeof(sshrsa)-1, + rsasha2_256, sizeof(rsasha2_256)-1, pk, npk, sig, nsig); Next2: switch(recvpkt()){