Gentoo Archives: gentoo-commits

From: Patrick McLean <chutzpah@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: net-misc/openssh/, net-misc/openssh/files/
Date: Fri, 25 Feb 2022 05:58:34
Message-Id: 1645768701.278ae0bb7097451190515c02794b96f7d253fcc0.chutzpah@gentoo
1 commit: 278ae0bb7097451190515c02794b96f7d253fcc0
2 Author: Patrick McLean <chutzpah <AT> gentoo <DOT> org>
3 AuthorDate: Fri Feb 25 05:57:55 2022 +0000
4 Commit: Patrick McLean <chutzpah <AT> gentoo <DOT> org>
5 CommitDate: Fri Feb 25 05:58:21 2022 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=278ae0bb
7
8 net-misc/openssh: Version bump to 8.9_p1
9
10 Package-Manager: Portage-3.0.30, Repoman-3.0.3
11 Signed-off-by: Patrick McLean <chutzpah <AT> gentoo.org>
12
13 net-misc/openssh/Manifest | 3 +
14 .../files/openssh-8.9_p1-X509-glue-13.3.patch | 63 +++
15 .../files/openssh-8.9_p1-hpn-15.2-X509-glue.patch | 431 ++++++++++++++++++
16 .../files/openssh-8.9_p1-hpn-15.2-glue.patch | 238 ++++++++++
17 net-misc/openssh/openssh-8.9_p1.ebuild | 480 +++++++++++++++++++++
18 5 files changed, 1215 insertions(+)
19
20 diff --git a/net-misc/openssh/Manifest b/net-misc/openssh/Manifest
21 index 883f7ee765bf..799f15e8b2a8 100644
22 --- a/net-misc/openssh/Manifest
23 +++ b/net-misc/openssh/Manifest
24 @@ -1,6 +1,9 @@
25 DIST openssh-8.8p1+x509-13.2.3.diff.gz 1071138 BLAKE2B dfbe53ccfdfe0a3da9bac927c5bb0ccfeb20f1ba69cef2ffb52999e6f6b0a3282e28a888aab40096fe9eed819f4c9b27592a8771d786580b8fa4f507f6b02557 SHA512 e55e9cdcde1b02b2799600083db8c3b85d207b251b99b4efabe8614bedf1daae28e5ed10cbe1f6a2e5ba766fe1eaf41be9e90fefdaae1352808c504fc0f4e7e6
26 DIST openssh-8.8p1-sctp-1.2.patch.xz 6744 BLAKE2B 9f99e0abfbfbda2cc1c7c2a465d044c900da862e5a38f01260f388ac089b2e66c5ea7664d71d18b924552ae177e5893cdcbfbccc20eeb3aaeae00b3d552379e3 SHA512 5290c5ef08a418dcc9260812d8e75ce266e22e2258514f11da6fb178e0ae2ef16046523f72a50f74ae7b98e7eb52d16143befc8ce2919041382d314aa05adda0
27 DIST openssh-8.8p1.tar.gz 1815060 BLAKE2B 3a054ce19781aceca5ab1a0839d7435d88aff4481e8c74b91ffd2046dc8b6f03d6bf584ecda066c0496acf43cea9ab4085f26a29e34e20736e752f204b8c76c3 SHA512 d44cd04445f9c8963513b0d5a7e8348985114ff2471e119a6e344498719ef40f09c61c354888a3be9dabcb5870e5cbe5d3aafbb861dfa1d82a4952f3d233a8df
28 +DIST openssh-8.9p1+x509-13.3.diff.gz 1109839 BLAKE2B 64bbb5afcffe11ae31fa9cb21a8668e50a08012079108cbb7444412eb05a0fbfd10fce82b347bfd9a68b765fffaa09eb30dd7d70801f723d79f45a3b5858fef9 SHA512 fb54ed71eb0c37236ea3fe6e5be77aba56d511d6d087e374059ddc21f42aa9b75d832b8a927d082b71ac41de8bc9760f3e6f6335a88af023d5618c74872f9611
29 +DIST openssh-8.9p1-sctp-1.2.patch.xz 6752 BLAKE2B 8f87a4e604ce412f45432ae29b6ccb5a10f6bd6ddc3c688b85d75c2126387dc5d4ed2b2396691db016cc0dee3e71a557611bcf34066dee075d62c9e69e887f14 SHA512 88a36e2d87bb8b6136885094729d001953e15799e06885ff1c489300458b6e412520f7a78c48dfd24df46e58f2561051212d7948f8af63082edcb85c33b4d32b
30 +DIST openssh-8.9p1.tar.gz 1820282 BLAKE2B 02934da7f7a2954141888e63e81e38fad4fb8558ddd1032de44f69684802c62771fdd7e9e470e0715059635999c8f9d2ab95f6351217e236573ead83a867f59b SHA512 04bd38ea6fe4be31acc8c4e83de7d3dda66fb7207be2e4ba25d3b8118d13d098a283769da9e8ce1fc4fba7edf739c14efcc6c9137132919261a7f882314b0f6b
31 DIST openssh-8_5_P1-hpn-AES-CTR-15.2.diff 30096 BLAKE2B f0c020dd2403806c79d4c37a019996d275655b04997301e247f5c4dd7fad35d12b3b7c25afb1b078d915ef2a4ae02f736f0aec9ba2a8c56a405d7ca303bcadf7 SHA512 4c2dbf99a9b5953fdb955f700272bbaeaa025f108a8860d2190197962b849f8385327af82c4d6a3a130a7fba35a74a8ec9437d642867601acb29817c49632a8f
32 DIST openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff 51428 BLAKE2B 370b88a7da7f148bf5a4d445f05cf593b486e9df53bba027e2e179726f534b68cf9d94edd6e53024e0b6ff5f20e568727bc9d26c94d0d415603602a80d3ad241 SHA512 2d8d887901164b33b2799ff3ec72e86a39ae4a1696e52bcee0872dbae7772fcc534351e6e7f87126ee71b164c74e9091350f14b782f4b242a09f09b4f50d047a
33 DIST openssh-8_5_P1-hpn-PeakTput-15.2.diff 2429 BLAKE2B 849bf3c313719ab7a25c75e82d5dc5ac98365a038b2a66fe58d01eae5b20c7777258b94b5830e799d6909e75c69753cda05a910f3bdab9606fb7d5efa68e05f1 SHA512 c4a56fab55fabd1d902d45f235b603708d43f969920e45c9a57e557dccfa9cade2ec61f26d1ace938f6f73e79f17b12f119b5aea9166cbda8e3435b910500914
34
35 diff --git a/net-misc/openssh/files/openssh-8.9_p1-X509-glue-13.3.patch b/net-misc/openssh/files/openssh-8.9_p1-X509-glue-13.3.patch
36 new file mode 100644
37 index 000000000000..91da09971acc
38 --- /dev/null
39 +++ b/net-misc/openssh/files/openssh-8.9_p1-X509-glue-13.3.patch
40 @@ -0,0 +1,63 @@
41 +diff -ur '--exclude=.*.un~' a/openssh-8.9p1+x509-13.3.diff b/openssh-8.9p1+x509-13.3.diff
42 +--- a/openssh-8.9p1+x509-13.3.diff 2022-02-24 17:19:30.830285922 -0800
43 ++++ b/openssh-8.9p1+x509-13.3.diff 2022-02-24 17:22:12.374625809 -0800
44 +@@ -993,15 +993,16 @@
45 + char b[512];
46 + - size_t len = ssh_digest_bytes(SSH_DIGEST_SHA512);
47 + - u_char *hash = xmalloc(len);
48 ++- double delay;
49 + + int digest_alg;
50 + + size_t len;
51 + + u_char *hash;
52 +- double delay;
53 +-
54 +++ double delay = 0;
55 +++
56 + + digest_alg = ssh_digest_maxbytes();
57 + + len = ssh_digest_bytes(digest_alg);
58 + + hash = xmalloc(len);
59 +-+
60 ++
61 + (void)snprintf(b, sizeof b, "%llu%s",
62 + (unsigned long long)options.timing_secret, user);
63 + - if (ssh_digest_memory(SSH_DIGEST_SHA512, b, strlen(b), hash, len) != 0)
64 +@@ -52711,12 +52712,11 @@
65 +
66 + install-files:
67 + $(MKDIR_P) $(DESTDIR)$(bindir)
68 +-@@ -396,6 +372,8 @@
69 ++@@ -396,6 +372,7 @@
70 + $(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)5
71 + $(MKDIR_P) $(DESTDIR)$(mandir)/$(mansubdir)8
72 + $(MKDIR_P) $(DESTDIR)$(libexecdir)
73 + + $(MKDIR_P) $(DESTDIR)$(sshcadir)
74 +-+ $(MKDIR_P) $(DESTDIR)$(piddir)
75 + $(MKDIR_P) -m 0755 $(DESTDIR)$(PRIVSEP_PATH)
76 + $(INSTALL) -m 0755 $(STRIP_OPT) ssh$(EXEEXT) $(DESTDIR)$(bindir)/ssh$(EXEEXT)
77 + $(INSTALL) -m 0755 $(STRIP_OPT) scp$(EXEEXT) $(DESTDIR)$(bindir)/scp$(EXEEXT)
78 +@@ -73508,7 +73508,7 @@
79 + +if test "$sshd_type" = "pkix" ; then
80 + + unset_arg=''
81 + +else
82 +-+ unset_arg=none
83 +++ unset_arg=
84 + +fi
85 + +
86 + cat > $OBJ/sshd_config.i << _EOF
87 +@@ -137555,16 +137555,6 @@
88 + +int asnmprintf(char **, size_t, int *, const char *, ...)
89 + __attribute__((format(printf, 4, 5)));
90 + void msetlocale(void);
91 +-diff -ruN openssh-8.9p1/version.h openssh-8.9p1+x509-13.3/version.h
92 +---- openssh-8.9p1/version.h 2022-02-23 13:31:11.000000000 +0200
93 +-+++ openssh-8.9p1+x509-13.3/version.h 2022-02-24 20:07:00.000000000 +0200
94 +-@@ -2,5 +2,4 @@
95 +-
96 +- #define SSH_VERSION "OpenSSH_8.9"
97 +-
98 +--#define SSH_PORTABLE "p1"
99 +--#define SSH_RELEASE SSH_VERSION SSH_PORTABLE
100 +-+#define SSH_RELEASE PACKAGE_STRING ", " SSH_VERSION "p1"
101 + diff -ruN openssh-8.9p1/version.m4 openssh-8.9p1+x509-13.3/version.m4
102 + --- openssh-8.9p1/version.m4 1970-01-01 02:00:00.000000000 +0200
103 + +++ openssh-8.9p1+x509-13.3/version.m4 2022-02-24 20:07:00.000000000 +0200
104
105 diff --git a/net-misc/openssh/files/openssh-8.9_p1-hpn-15.2-X509-glue.patch b/net-misc/openssh/files/openssh-8.9_p1-hpn-15.2-X509-glue.patch
106 new file mode 100644
107 index 000000000000..a98e1adcb54c
108 --- /dev/null
109 +++ b/net-misc/openssh/files/openssh-8.9_p1-hpn-15.2-X509-glue.patch
110 @@ -0,0 +1,431 @@
111 +diff -ur '--exclude=.*.un~' a/openssh-8_5_P1-hpn-AES-CTR-15.2.diff b/openssh-8_5_P1-hpn-AES-CTR-15.2.diff
112 +--- a/openssh-8_5_P1-hpn-AES-CTR-15.2.diff 2022-02-24 18:48:19.078457000 -0800
113 ++++ b/openssh-8_5_P1-hpn-AES-CTR-15.2.diff 2022-02-24 18:49:22.195632128 -0800
114 +@@ -3,9 +3,9 @@
115 + --- a/Makefile.in
116 + +++ b/Makefile.in
117 + @@ -46,7 +46,7 @@ CFLAGS=@CFLAGS@
118 +- CFLAGS_NOPIE=@CFLAGS_NOPIE@
119 +- CPPFLAGS=-I. -I$(srcdir) @CPPFLAGS@ $(PATHS) @DEFS@
120 +- PICFLAG=@PICFLAG@
121 ++ LD=@LD@
122 ++ CFLAGS=@CFLAGS@ $(CFLAGS_EXTRA)
123 ++ CPPFLAGS=-I. -I$(srcdir) @CPPFLAGS@ @LDAP_CPPFLAGS@ $(PATHS) @DEFS@
124 + -LIBS=@LIBS@
125 + +LIBS=@LIBS@ -lpthread
126 + K5LIBS=@K5LIBS@
127 +@@ -803,8 +803,8 @@
128 + ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out)
129 + {
130 + struct session_state *state;
131 +-- const struct sshcipher *none = cipher_by_name("none");
132 +-+ struct sshcipher *none = cipher_by_name("none");
133 ++- const struct sshcipher *none = cipher_none();
134 +++ struct sshcipher *none = cipher_none();
135 + int r;
136 +
137 + if (none == NULL) {
138 +@@ -894,24 +894,24 @@
139 + intptr = &options->compression;
140 + multistate_ptr = multistate_compression;
141 + @@ -2272,6 +2278,7 @@ initialize_options(Options * options)
142 +- options->revoked_host_keys = NULL;
143 + options->fingerprint_hash = -1;
144 + options->update_hostkeys = -1;
145 ++ options->known_hosts_command = NULL;
146 + + options->disable_multithreaded = -1;
147 +- options->hostbased_accepted_algos = NULL;
148 +- options->pubkey_accepted_algos = NULL;
149 +- options->known_hosts_command = NULL;
150 ++ }
151 ++
152 ++ /*
153 + @@ -2467,6 +2474,10 @@ fill_default_options(Options * options)
154 ++ options->update_hostkeys = 0;
155 + if (options->sk_provider == NULL)
156 + options->sk_provider = xstrdup("$SSH_SK_PROVIDER");
157 +- #endif
158 + + if (options->update_hostkeys == -1)
159 + + options->update_hostkeys = 0;
160 + + if (options->disable_multithreaded == -1)
161 + + options->disable_multithreaded = 0;
162 +
163 +- /* Expand KEX name lists */
164 +- all_cipher = cipher_alg_list(',', 0);
165 ++ /* expand KEX and etc. name lists */
166 ++ { char *all;
167 + diff --git a/readconf.h b/readconf.h
168 + index 2fba866e..7f8f0227 100644
169 + --- a/readconf.h
170 +@@ -950,9 +950,9 @@
171 + /* Portable-specific options */
172 + sUsePAM,
173 + + sDisableMTAES,
174 +- /* Standard Options */
175 +- sPort, sHostKeyFile, sLoginGraceTime,
176 +- sPermitRootLogin, sLogFacility, sLogLevel, sLogVerbose,
177 ++ /* X.509 Standard Options */
178 ++ sHostbasedAlgorithms,
179 ++ sPubkeyAlgorithms,
180 + @@ -662,6 +666,7 @@ static struct {
181 + { "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL },
182 + { "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL },
183 +diff -ur '--exclude=.*.un~' a/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff b/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff
184 +--- a/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff 2022-02-24 18:48:19.078457000 -0800
185 ++++ b/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff 2022-02-24 18:54:51.800546480 -0800
186 +@@ -157,6 +157,36 @@
187 + + Allan Jude provided the code for the NoneMac and buffer normalization.
188 + + This work was financed, in part, by Cisco System, Inc., the National
189 + + Library of Medicine, and the National Science Foundation.
190 ++diff --git a/auth2.c b/auth2.c
191 ++--- a/auth2.c 2021-03-15 19:30:45.404060786 -0700
192 +++++ b/auth2.c 2021-03-15 19:37:22.078476597 -0700
193 ++@@ -229,16 +229,17 @@
194 ++ double delay;
195 ++
196 ++ digest_alg = ssh_digest_maxbytes();
197 ++- len = ssh_digest_bytes(digest_alg);
198 ++- hash = xmalloc(len);
199 +++ if (len = ssh_digest_bytes(digest_alg) > 0) {
200 +++ hash = xmalloc(len);
201 ++
202 ++- (void)snprintf(b, sizeof b, "%llu%s",
203 ++- (unsigned long long)options.timing_secret, user);
204 ++- if (ssh_digest_memory(digest_alg, b, strlen(b), hash, len) != 0)
205 ++- fatal_f("ssh_digest_memory");
206 ++- /* 0-4.2 ms of delay */
207 ++- delay = (double)PEEK_U32(hash) / 1000 / 1000 / 1000 / 1000;
208 ++- freezero(hash, len);
209 +++ (void)snprintf(b, sizeof b, "%llu%s",
210 +++ (unsigned long long)options.timing_secret, user);
211 +++ if (ssh_digest_memory(digest_alg, b, strlen(b), hash, len) != 0)
212 +++ fatal_f("ssh_digest_memory");
213 +++ /* 0-4.2 ms of delay */
214 +++ delay = (double)PEEK_U32(hash) / 1000 / 1000 / 1000 / 1000;
215 +++ freezero(hash, len);
216 +++ }
217 ++ debug3_f("user specific delay %0.3lfms", delay/1000);
218 ++ return MIN_FAIL_DELAY_SECONDS + delay;
219 ++ }
220 + diff --git a/channels.c b/channels.c
221 + index b60d56c4..0e363c15 100644
222 + --- a/channels.c
223 +@@ -209,14 +239,14 @@
224 + static void
225 + channel_pre_open(struct ssh *ssh, Channel *c,
226 + fd_set *readset, fd_set *writeset)
227 +-@@ -2120,22 +2147,32 @@ channel_check_window(struct ssh *ssh, Channel *c)
228 ++@@ -2164,21 +2191,31 @@ channel_check_window(struct ssh *ssh, Channel *c)
229 +
230 + if (c->type == SSH_CHANNEL_OPEN &&
231 + !(c->flags & (CHAN_CLOSE_SENT|CHAN_CLOSE_RCVD)) &&
232 + - ((c->local_window_max - c->local_window >
233 + - c->local_maxpacket*3) ||
234 +-+ ((ssh_packet_is_interactive(ssh) &&
235 +-+ c->local_window_max - c->local_window > c->local_maxpacket*3) ||
236 +++ ((ssh_packet_is_interactive(ssh) &&
237 +++ c->local_window_max - c->local_window > c->local_maxpacket*3) ||
238 + c->local_window < c->local_window_max/2) &&
239 + c->local_consumed > 0) {
240 + + u_int addition = 0;
241 +@@ -235,9 +265,8 @@
242 + (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 ||
243 + - (r = sshpkt_put_u32(ssh, c->local_consumed)) != 0 ||
244 + + (r = sshpkt_put_u32(ssh, c->local_consumed + addition)) != 0 ||
245 +- (r = sshpkt_send(ssh)) != 0) {
246 +- fatal_fr(r, "channel %i", c->self);
247 +- }
248 ++ (r = sshpkt_send(ssh)) != 0)
249 ++ fatal_fr(r, "channel %d", c->self);
250 + - debug2("channel %d: window %d sent adjust %d", c->self,
251 + - c->local_window, c->local_consumed);
252 + - c->local_window += c->local_consumed;
253 +@@ -337,70 +366,92 @@
254 + index 70f492f8..5503af1d 100644
255 + --- a/clientloop.c
256 + +++ b/clientloop.c
257 +-@@ -1578,9 +1578,11 @@ client_request_x11(struct ssh *ssh, const char *request_type, int rchan)
258 ++@@ -1578,10 +1578,11 @@ client_request_x11(struct ssh *ssh, const char *request_type, int rchan)
259 + sock = x11_connect_display(ssh);
260 + if (sock < 0)
261 + return NULL;
262 + - c = channel_new(ssh, "x11",
263 + - SSH_CHANNEL_X11_OPEN, sock, sock, -1,
264 +-- CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, 0, "x11", 1);
265 +-+ c = channel_new(ssh, "x11",
266 +-+ SSH_CHANNEL_X11_OPEN, sock, sock, -1,
267 +-+ /* again is this really necessary for X11? */
268 +-+ options.hpn_disabled ? CHAN_TCP_WINDOW_DEFAULT : options.hpn_buffer_size,
269 +-+ CHAN_X11_PACKET_DEFAULT, 0, "x11", 1);
270 ++- CHAN_TCP_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT, 0, "x11",
271 ++- CHANNEL_NONBLOCK_SET);
272 +++ c = channel_new(ssh, "x11",
273 +++ SSH_CHANNEL_X11_OPEN, sock, sock, -1,
274 +++ /* again is this really necessary for X11? */
275 +++ options.hpn_disabled ? CHAN_TCP_WINDOW_DEFAULT : options.hpn_buffer_size,
276 +++ CHAN_X11_PACKET_DEFAULT, 0, "x11", CHANNEL_NONBLOCK_SET);
277 + c->force_drain = 1;
278 + return c;
279 + }
280 +-@@ -1608,9 +1610,10 @@ client_request_agent(struct ssh *ssh, const char *request_type, int rchan)
281 ++@@ -1608,9 +1609,10 @@ client_request_agent(struct ssh *ssh, const char *request_type, int rchan)
282 + return NULL;
283 + }
284 + c = channel_new(ssh, "authentication agent connection",
285 + - SSH_CHANNEL_OPEN, sock, sock, -1,
286 + - CHAN_X11_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0,
287 +-- "authentication agent connection", 1);
288 +-+ SSH_CHANNEL_OPEN, sock, sock, -1,
289 +-+ options.hpn_disabled ? CHAN_X11_WINDOW_DEFAULT : options.hpn_buffer_size,
290 +-+ CHAN_TCP_PACKET_DEFAULT, 0,
291 +-+ "authentication agent connection", 1);
292 ++- "authentication agent connection", CHANNEL_NONBLOCK_SET);
293 +++ SSH_CHANNEL_OPEN, sock, sock, -1,
294 +++ options.hpn_disabled ? CHAN_X11_WINDOW_DEFAULT : options.hpn_buffer_size,
295 +++ CHAN_TCP_PACKET_DEFAULT, 0,
296 +++ "authentication agent connection", CHANNEL_NONBLOCK_SET);
297 + c->force_drain = 1;
298 + return c;
299 + }
300 +-@@ -1635,10 +1638,13 @@ client_request_tun_fwd(struct ssh *ssh, int tun_mode,
301 ++@@ -1635,9 +1637,9 @@ client_request_tun_fwd(struct ssh *ssh, int tun_mode,
302 + }
303 + debug("Tunnel forwarding using interface %s", ifname);
304 +
305 + - c = channel_new(ssh, "tun", SSH_CHANNEL_OPENING, fd, fd, -1,
306 +-- CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, "tun", 1);
307 +-+ c = channel_new(ssh, "tun", SSH_CHANNEL_OPENING, fd, fd, -1,
308 ++- CHAN_TCP_WINDOW_DEFAULT, CHAN_TCP_PACKET_DEFAULT, 0, "tun",
309 ++- CHANNEL_NONBLOCK_SET);
310 +++ c = channel_new(ssh, "tun", SSH_CHANNEL_OPENING, fd, fd, -1,
311 + + options.hpn_disabled ? CHAN_TCP_WINDOW_DEFAULT : options.hpn_buffer_size,
312 +-+ CHAN_TCP_PACKET_DEFAULT, 0, "tun", 1);
313 +++ CHAN_TCP_PACKET_DEFAULT, 0, "tun", CHANNEL_NONBLOCK_SET);
314 + c->datagram = 1;
315 +
316 +-+
317 +-+
318 + #if defined(SSH_TUN_FILTER)
319 +- if (options.tun_open == SSH_TUNMODE_POINTOPOINT)
320 +- channel_register_filter(ssh, c->self, sys_tun_infilter,
321 + diff --git a/compat.c b/compat.c
322 + index 69befa96..90b5f338 100644
323 + --- a/compat.c
324 + +++ b/compat.c
325 +-@@ -149,6 +149,14 @@ compat_banner(struct ssh *ssh, const char *version)
326 +- debug_f("match: %s pat %s compat 0x%08x",
327 ++@@ -43,7 +43,7 @@ compat_datafellows(const char *version)
328 ++ static u_int
329 ++ compat_datafellows(const char *version)
330 ++ {
331 ++- int i;
332 +++ int i, bugs = 0;
333 ++ static struct {
334 ++ char *pat;
335 ++ int bugs;
336 ++@@ -147,11 +147,26 @@
337 ++ if (match_pattern_list(version, check[i].pat, 0) == 1) {
338 ++ debug("match: %s pat %s compat 0x%08x",
339 + version, check[i].pat, check[i].bugs);
340 +- ssh->compat = check[i].bugs;
341 + + /* Check to see if the remote side is OpenSSH and not HPN */
342 +-+ /* TODO: need to use new method to test for this */
343 + + if (strstr(version, "OpenSSH") != NULL) {
344 + + if (strstr(version, "hpn") == NULL) {
345 +-+ ssh->compat |= SSH_BUG_LARGEWINDOW;
346 +++ bugs |= SSH_BUG_LARGEWINDOW;
347 + + debug("Remote is NON-HPN aware");
348 + + }
349 + + }
350 +- return;
351 ++- return check[i].bugs;
352 +++ bugs |= check[i].bugs;
353 + }
354 + }
355 ++- debug("no match: %s", version);
356 ++- return 0;
357 +++ /* Check to see if the remote side is OpenSSH and not HPN */
358 +++ if (strstr(version, "OpenSSH") != NULL) {
359 +++ if (strstr(version, "hpn") == NULL) {
360 +++ bugs |= SSH_BUG_LARGEWINDOW;
361 +++ debug("Remote is NON-HPN aware");
362 +++ }
363 +++ }
364 +++ if (bugs == 0)
365 +++ debug("no match: %s", version);
366 +++ return bugs;
367 ++ }
368 ++
369 ++ char *
370 + diff --git a/compat.h b/compat.h
371 + index c197fafc..ea2e17a7 100644
372 + --- a/compat.h
373 +@@ -459,7 +510,7 @@
374 + @@ -890,6 +890,10 @@ kex_choose_conf(struct ssh *ssh)
375 + int nenc, nmac, ncomp;
376 + u_int mode, ctos, need, dh_need, authlen;
377 +- int r, first_kex_follows;
378 ++ int r, first_kex_follows = 0;
379 + + int auth_flag = 0;
380 + +
381 + + auth_flag = packet_authentication_state(ssh);
382 +@@ -553,10 +604,10 @@
383 + #define MAX_PACKETS (1U<<31)
384 + static int
385 + ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
386 +-@@ -1317,7 +1351,7 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
387 ++@@ -1317,7 +1336,7 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
388 ++ {
389 + struct session_state *state = ssh->state;
390 + int len, r, ms_remain;
391 +- struct pollfd pfd;
392 + - char buf[8192];
393 + + char buf[SSH_IOBUFSZ];
394 + struct timeval start;
395 +@@ -1072,7 +1123,7 @@
396 + + else
397 + + options.hpn_buffer_size = 2 * 1024 * 1024;
398 + +
399 +-+ if (ssh->compat & SSH_BUG_LARGEWINDOW) {
400 +++ if (ssh_compat_fellows(ssh, SSH_BUG_LARGEWINDOW)) {
401 + + debug("HPN to Non-HPN Connection");
402 + + } else {
403 + + int sock, socksize;
404 +@@ -1136,14 +1187,14 @@
405 + }
406 + @@ -2089,6 +2167,11 @@ ssh_session2_open(struct ssh *ssh)
407 + window, packetmax, CHAN_EXTENDED_WRITE,
408 +- "client-session", /*nonblock*/0);
409 ++ "client-session", CHANNEL_NONBLOCK_STDIO);
410 +
411 + + if ((options.tcp_rcv_buf_poll > 0) && !options.hpn_disabled) {
412 + + c->dynamic_window = 1;
413 + + debug("Enabled Dynamic Window Scaling");
414 + + }
415 + +
416 +- debug3_f("channel_new: %d", c->self);
417 ++ debug2_f("channel %d", c->self);
418 +
419 + channel_send_open(ssh, c->self);
420 + @@ -2105,6 +2188,13 @@ ssh_session2(struct ssh *ssh, const struct ssh_conn_info *cinfo)
421 +@@ -1314,7 +1365,29 @@
422 + /* Bind the socket to the desired port. */
423 + if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) == -1) {
424 + error("Bind to port %s on %s failed: %.200s.",
425 +-@@ -1727,6 +1734,19 @@ main(int ac, char **av)
426 ++@@ -1625,13 +1632,14 @@
427 ++ if (ssh_digest_update(ctx, sshbuf_ptr(server_cfg),
428 ++ sshbuf_len(server_cfg)) != 0)
429 ++ fatal_f("ssh_digest_update");
430 ++- len = ssh_digest_bytes(digest_alg);
431 ++- hash = xmalloc(len);
432 ++- if (ssh_digest_final(ctx, hash, len) != 0)
433 ++- fatal_f("ssh_digest_final");
434 ++- options.timing_secret = PEEK_U64(hash);
435 ++- freezero(hash, len);
436 ++- ssh_digest_free(ctx);
437 +++ if ((len = ssh_digest_bytes(digest_alg)) > 0) {
438 +++ hash = xmalloc(len);
439 +++ if (ssh_digest_final(ctx, hash, len) != 0)
440 +++ fatal_f("ssh_digest_final");
441 +++ options.timing_secret = PEEK_U64(hash);
442 +++ freezero(hash, len);
443 +++ ssh_digest_free(ctx);
444 +++ }
445 ++ ctx = NULL;
446 ++ return;
447 ++ }
448 ++@@ -1727,6 +1735,19 @@ main(int ac, char **av)
449 + fatal("AuthorizedPrincipalsCommand set without "
450 + "AuthorizedPrincipalsCommandUser");
451 +
452 +@@ -1334,7 +1407,7 @@
453 + /*
454 + * Check whether there is any path through configured auth methods.
455 + * Unfortunately it is not possible to verify this generally before
456 +-@@ -2166,6 +2186,9 @@ main(int ac, char **av)
457 ++@@ -2166,6 +2187,9 @@ main(int ac, char **av)
458 + rdomain == NULL ? "" : "\"");
459 + free(laddr);
460 +
461 +@@ -1344,7 +1417,7 @@
462 + /*
463 + * We don't want to listen forever unless the other side
464 + * successfully authenticates itself. So we set up an alarm which is
465 +-@@ -2343,6 +2366,12 @@ do_ssh2_kex(struct ssh *ssh)
466 ++@@ -2343,6 +2367,12 @@ do_ssh2_kex(struct ssh *ssh)
467 + struct kex *kex;
468 + int r;
469 +
470 +@@ -1384,14 +1457,3 @@
471 + # Example of overriding settings on a per-user basis
472 + #Match User anoncvs
473 + # X11Forwarding no
474 +-diff --git a/version.h b/version.h
475 +-index 6b4fa372..332fb486 100644
476 +---- a/version.h
477 +-+++ b/version.h
478 +-@@ -3,4 +3,5 @@
479 +- #define SSH_VERSION "OpenSSH_8.5"
480 +-
481 +- #define SSH_PORTABLE "p1"
482 +--#define SSH_RELEASE SSH_VERSION SSH_PORTABLE
483 +-+#define SSH_HPN "-hpn15v2"
484 +-+#define SSH_RELEASE SSH_VERSION SSH_PORTABLE SSH_HPN
485 +diff -ur '--exclude=.*.un~' a/openssh-8_5_P1-hpn-PeakTput-15.2.diff b/openssh-8_5_P1-hpn-PeakTput-15.2.diff
486 +--- a/openssh-8_5_P1-hpn-PeakTput-15.2.diff 2022-02-24 18:48:19.078457000 -0800
487 ++++ b/openssh-8_5_P1-hpn-PeakTput-15.2.diff 2022-02-24 18:49:22.196632131 -0800
488 +@@ -12,9 +12,9 @@
489 + static long stalled; /* how long we have been stalled */
490 + static int bytes_per_second; /* current speed in bytes per second */
491 + @@ -127,6 +129,7 @@ refresh_progress_meter(int force_update)
492 ++ off_t bytes_left;
493 + int cur_speed;
494 +- int hours, minutes, seconds;
495 +- int file_len;
496 ++ int len;
497 + + off_t delta_pos;
498 +
499 + if ((!force_update && !alarm_fired && !win_resized) || !can_output())
500 +@@ -30,15 +30,17 @@
501 + if (bytes_left > 0)
502 + elapsed = now - last_update;
503 + else {
504 +-@@ -166,7 +173,7 @@ refresh_progress_meter(int force_update)
505 +-
506 ++@@ -166,8 +173,8 @@ refresh_progress_meter(int force_update)
507 ++ buf[1] = '\0';
508 ++
509 + /* filename */
510 +- buf[0] = '\0';
511 +-- file_len = win_size - 36;
512 +-+ file_len = win_size - 45;
513 +- if (file_len > 0) {
514 +- buf[0] = '\r';
515 +- snmprintf(buf+1, sizeof(buf)-1, &file_len, "%-*s",
516 ++- if (win_size > 36) {
517 +++ if (win_size > 45) {
518 ++- int file_len = win_size - 36;
519 +++ int file_len = win_size - 45;
520 ++ snmprintf(buf+1, sizeof(buf)-1, &file_len, "%-*s ",
521 ++ file_len, file);
522 ++ }
523 + @@ -191,6 +198,15 @@ refresh_progress_meter(int force_update)
524 + (off_t)bytes_per_second);
525 + strlcat(buf, "/s ", win_size);
526 +@@ -63,15 +65,3 @@
527 + }
528 +
529 + /*ARGSUSED*/
530 +-diff --git a/ssh-keygen.c b/ssh-keygen.c
531 +-index cfb5f115..986ff59b 100644
532 +---- a/ssh-keygen.c
533 +-+++ b/ssh-keygen.c
534 +-@@ -2959,7 +2959,6 @@ do_download_sk(const char *skprovider, const char *device)
535 +-
536 +- if (skprovider == NULL)
537 +- fatal("Cannot download keys without provider");
538 +--
539 +- pin = read_passphrase("Enter PIN for authenticator: ", RP_ALLOW_STDIN);
540 +- if (!quiet) {
541 +- printf("You may need to touch your authenticator "
542
543 diff --git a/net-misc/openssh/files/openssh-8.9_p1-hpn-15.2-glue.patch b/net-misc/openssh/files/openssh-8.9_p1-hpn-15.2-glue.patch
544 new file mode 100644
545 index 000000000000..272270b7e985
546 --- /dev/null
547 +++ b/net-misc/openssh/files/openssh-8.9_p1-hpn-15.2-glue.patch
548 @@ -0,0 +1,238 @@
549 +diff -ur '--exclude=.*.un~' a/openssh-8_5_P1-hpn-AES-CTR-15.2.diff b/openssh-8_5_P1-hpn-AES-CTR-15.2.diff
550 +--- a/openssh-8_5_P1-hpn-AES-CTR-15.2.diff 2022-02-23 17:10:24.843395097 -0800
551 ++++ b/openssh-8_5_P1-hpn-AES-CTR-15.2.diff 2022-02-23 17:10:38.206451595 -0800
552 +@@ -1026,9 +1026,9 @@
553 + + }
554 + +#endif
555 + +
556 +- debug("Authentication succeeded (%s).", authctxt.method->name);
557 +- }
558 +-
559 ++ if (ssh_packet_connection_is_on_socket(ssh)) {
560 ++ verbose("Authenticated to %s ([%s]:%d) using \"%s\".", host,
561 ++ ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
562 + diff --git a/sshd.c b/sshd.c
563 + index 6277e6d6..bf3d6e4a 100644
564 + --- a/sshd.c
565 +diff -ur '--exclude=.*.un~' a/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff b/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff
566 +--- a/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff 2022-02-23 17:08:38.124943587 -0800
567 ++++ b/openssh-8_5_P1-hpn-DynWinNoneSwitch-15.2.diff 2022-02-23 17:20:59.432070316 -0800
568 +@@ -536,18 +536,10 @@
569 + if (state->rekey_limit)
570 + *max_blocks = MINIMUM(*max_blocks,
571 + state->rekey_limit / enc->block_size);
572 +-@@ -954,6 +963,24 @@ ssh_set_newkeys(struct ssh *ssh, int mode)
573 ++@@ -954,6 +963,16 @@ ssh_set_newkeys(struct ssh *ssh, int mode)
574 + return 0;
575 + }
576 +
577 +-+/* this supports the forced rekeying required for the NONE cipher */
578 +-+int rekey_requested = 0;
579 +-+void
580 +-+packet_request_rekeying(void)
581 +-+{
582 +-+ rekey_requested = 1;
583 +-+}
584 +-+
585 + +/* used to determine if pre or post auth when rekeying for aes-ctr
586 + + * and none cipher switch */
587 + +int
588 +@@ -561,27 +553,14 @@
589 + #define MAX_PACKETS (1U<<31)
590 + static int
591 + ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
592 +-@@ -980,6 +1007,13 @@ ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len)
593 +- if (state->p_send.packets == 0 && state->p_read.packets == 0)
594 +- return 0;
595 +-
596 +-+ /* used to force rekeying when called for by the none
597 +-+ * cipher switch methods -cjr */
598 +-+ if (rekey_requested == 1) {
599 +-+ rekey_requested = 0;
600 +-+ return 1;
601 +-+ }
602 +-+
603 +- /* Time-based rekeying */
604 +- if (state->rekey_interval != 0 &&
605 +- (int64_t)state->rekey_time + state->rekey_interval <= monotime())
606 + @@ -1317,7 +1351,7 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
607 + struct session_state *state = ssh->state;
608 + int len, r, ms_remain;
609 +- fd_set *setp;
610 ++ struct pollfd pfd;
611 + - char buf[8192];
612 + + char buf[SSH_IOBUFSZ];
613 +- struct timeval timeout, start, *timeoutp = NULL;
614 ++ struct timeval start;
615 ++ struct timespec timespec, *timespecp = NULL;
616 +
617 + DBG(debug("packet_read()"));
618 + diff --git a/packet.h b/packet.h
619 +@@ -598,12 +577,11 @@
620 + };
621 +
622 + typedef int (ssh_packet_hook_fn)(struct ssh *, struct sshbuf *,
623 +-@@ -155,6 +158,10 @@ int ssh_packet_inc_alive_timeouts(struct ssh *);
624 ++@@ -155,6 +158,9 @@ int ssh_packet_inc_alive_timeouts(struct ssh *);
625 + int ssh_packet_set_maxsize(struct ssh *, u_int);
626 + u_int ssh_packet_get_maxsize(struct ssh *);
627 +
628 + +/* for forced packet rekeying post auth */
629 +-+void packet_request_rekeying(void);
630 + +int packet_authentication_state(const struct ssh *);
631 + +
632 + int ssh_packet_get_state(struct ssh *, struct sshbuf *);
633 +@@ -627,9 +605,9 @@
634 + oLocalCommand, oPermitLocalCommand, oRemoteCommand,
635 + + oTcpRcvBufPoll, oTcpRcvBuf, oHPNDisabled, oHPNBufferSize,
636 + + oNoneEnabled, oNoneMacEnabled, oNoneSwitch,
637 ++ oDisableMTAES,
638 + oVisualHostKey,
639 + oKexAlgorithms, oIPQoS, oRequestTTY, oIgnoreUnknown, oProxyUseFdpass,
640 +- oCanonicalDomains, oCanonicalizeHostname, oCanonicalizeMaxDots,
641 + @@ -297,6 +300,9 @@ static struct {
642 + { "kexalgorithms", oKexAlgorithms },
643 + { "ipqos", oIPQoS },
644 +@@ -637,9 +615,9 @@
645 + + { "noneenabled", oNoneEnabled },
646 + + { "nonemacenabled", oNoneMacEnabled },
647 + + { "noneswitch", oNoneSwitch },
648 +- { "proxyusefdpass", oProxyUseFdpass },
649 +- { "canonicaldomains", oCanonicalDomains },
650 +- { "canonicalizefallbacklocal", oCanonicalizeFallbackLocal },
651 ++ { "sessiontype", oSessionType },
652 ++ { "stdinnull", oStdinNull },
653 ++ { "forkafterauthentication", oForkAfterAuthentication },
654 + @@ -317,6 +323,11 @@ static struct {
655 + { "securitykeyprovider", oSecurityKeyProvider },
656 + { "knownhostscommand", oKnownHostsCommand },
657 +@@ -717,9 +695,9 @@
658 + + options->hpn_buffer_size = -1;
659 + + options->tcp_rcv_buf_poll = -1;
660 + + options->tcp_rcv_buf = -1;
661 +- options->proxy_use_fdpass = -1;
662 +- options->ignored_unknown = NULL;
663 +- options->num_canonical_domains = 0;
664 ++ options->session_type = -1;
665 ++ options->stdin_null = -1;
666 ++ options->fork_after_authentication = -1;
667 + @@ -2426,6 +2484,41 @@ fill_default_options(Options * options)
668 + options->server_alive_interval = 0;
669 + if (options->server_alive_count_max == -1)
670 +@@ -778,9 +756,9 @@
671 + int ip_qos_bulk; /* IP ToS/DSCP/class for bulk traffic */
672 + SyslogFacility log_facility; /* Facility for system logging. */
673 + @@ -120,7 +124,11 @@ typedef struct {
674 +-
675 + int enable_ssh_keysign;
676 + int64_t rekey_limit;
677 ++ int disable_multithreaded; /*disable multithreaded aes-ctr*/
678 + + int none_switch; /* Use none cipher */
679 + + int none_enabled; /* Allow none cipher to be used */
680 + + int nonemac_enabled; /* Allow none MAC to be used */
681 +@@ -842,9 +820,9 @@
682 + /* Portable-specific options */
683 + if (options->use_pam == -1)
684 + @@ -424,6 +434,49 @@ fill_default_server_options(ServerOptions *options)
685 +- }
686 +- if (options->permit_tun == -1)
687 + options->permit_tun = SSH_TUNMODE_NO;
688 ++ if (options->disable_multithreaded == -1)
689 ++ options->disable_multithreaded = 0;
690 + + if (options->none_enabled == -1)
691 + + options->none_enabled = 0;
692 + + if (options->nonemac_enabled == -1)
693 +@@ -975,15 +953,6 @@
694 + index 306658cb..d4309903 100644
695 + --- a/serverloop.c
696 + +++ b/serverloop.c
697 +-@@ -322,7 +322,7 @@ static int
698 +- process_input(struct ssh *ssh, fd_set *readset, int connection_in)
699 +- {
700 +- int r, len;
701 +-- char buf[16384];
702 +-+ char buf[SSH_IOBUFSZ];
703 +-
704 +- /* Read and buffer any input data from the client. */
705 +- if (FD_ISSET(connection_in, readset)) {
706 + @@ -608,7 +608,8 @@ server_request_tun(struct ssh *ssh)
707 + debug("Tunnel forwarding using interface %s", ifname);
708 +
709 +@@ -1047,30 +1016,17 @@
710 + Note that
711 + diff --git a/sftp.c b/sftp.c
712 + index fb3c08d1..89bebbb2 100644
713 +---- a/sftp.c
714 +-+++ b/sftp.c
715 +-@@ -71,7 +71,7 @@ typedef void EditLine;
716 +- #include "sftp-client.h"
717 +-
718 +- #define DEFAULT_COPY_BUFLEN 32768 /* Size of buffer for up/download */
719 +--#define DEFAULT_NUM_REQUESTS 64 /* # concurrent outstanding requests */
720 +-+#define DEFAULT_NUM_REQUESTS 256 /* # concurrent outstanding requests */
721 +-
722 +- /* File to read commands from */
723 +- FILE* infile;
724 +-diff --git a/ssh-keygen.c b/ssh-keygen.c
725 +-index cfb5f115..36a6e519 100644
726 +---- a/ssh-keygen.c
727 +-+++ b/ssh-keygen.c
728 +-@@ -2971,7 +2971,7 @@ do_download_sk(const char *skprovider, const char *device)
729 +- freezero(pin, strlen(pin));
730 +- error_r(r, "Unable to load resident keys");
731 +- return -1;
732 +-- }
733 +-+ }
734 +- if (nkeys == 0)
735 +- logit("No keys to download");
736 +- if (pin != NULL)
737 ++--- a/sftp-client.c
738 +++++ b/sftp-client.c
739 ++@@ -65,7 +65,7 @@ typedef void EditLine;
740 ++ #define DEFAULT_COPY_BUFLEN 32768
741 ++
742 ++ /* Default number of concurrent outstanding requests */
743 ++-#define DEFAULT_NUM_REQUESTS 64
744 +++#define DEFAULT_NUM_REQUESTS 256
745 ++
746 ++ /* Minimum amount of data to read at a time */
747 ++ #define MIN_READ_SIZE 512
748 + diff --git a/ssh.c b/ssh.c
749 + index 53330da5..27b9770e 100644
750 + --- a/ssh.c
751 +@@ -1330,9 +1286,9 @@
752 + + }
753 + + }
754 + +
755 +- debug("Authentication succeeded (%s).", authctxt.method->name);
756 +- }
757 +
758 ++ #ifdef WITH_OPENSSL
759 ++ if (options.disable_multithreaded == 0) {
760 + diff --git a/sshd.c b/sshd.c
761 + index 6277e6d6..d66fa41a 100644
762 + --- a/sshd.c
763 +@@ -1359,8 +1315,8 @@
764 + if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) == -1) {
765 + error("Bind to port %s on %s failed: %.200s.",
766 + @@ -1727,6 +1734,19 @@ main(int ac, char **av)
767 +- /* Fill in default values for those options not explicitly set. */
768 +- fill_default_server_options(&options);
769 ++ fatal("AuthorizedPrincipalsCommand set without "
770 ++ "AuthorizedPrincipalsCommandUser");
771 +
772 + + if (options.none_enabled == 1) {
773 + + char *old_ciphers = options.ciphers;
774 +@@ -1375,9 +1331,9 @@
775 + + }
776 + + }
777 + +
778 +- /* challenge-response is implemented via keyboard interactive */
779 +- if (options.challenge_response_authentication)
780 +- options.kbd_interactive_authentication = 1;
781 ++ /*
782 ++ * Check whether there is any path through configured auth methods.
783 ++ * Unfortunately it is not possible to verify this generally before
784 + @@ -2166,6 +2186,9 @@ main(int ac, char **av)
785 + rdomain == NULL ? "" : "\"");
786 + free(laddr);
787
788 diff --git a/net-misc/openssh/openssh-8.9_p1.ebuild b/net-misc/openssh/openssh-8.9_p1.ebuild
789 new file mode 100644
790 index 000000000000..5b7b5d1c44db
791 --- /dev/null
792 +++ b/net-misc/openssh/openssh-8.9_p1.ebuild
793 @@ -0,0 +1,480 @@
794 +# Copyright 1999-2022 Gentoo Authors
795 +# Distributed under the terms of the GNU General Public License v2
796 +
797 +EAPI=7
798 +
799 +inherit user-info flag-o-matic autotools pam systemd toolchain-funcs
800 +
801 +# Make it more portable between straight releases
802 +# and _p? releases.
803 +PARCH=${P/_}
804 +
805 +# PV to USE for HPN patches
806 +#HPN_PV="${PV^^}"
807 +HPN_PV="8.5_P1"
808 +
809 +HPN_VER="15.2"
810 +HPN_PATCHES=(
811 + ${PN}-${HPN_PV/./_}-hpn-DynWinNoneSwitch-${HPN_VER}.diff
812 + ${PN}-${HPN_PV/./_}-hpn-AES-CTR-${HPN_VER}.diff
813 + ${PN}-${HPN_PV/./_}-hpn-PeakTput-${HPN_VER}.diff
814 +)
815 +
816 +SCTP_VER="1.2" SCTP_PATCH="${PARCH}-sctp-${SCTP_VER}.patch.xz"
817 +X509_VER="13.3" X509_PATCH="${PARCH}+x509-${X509_VER}.diff.gz"
818 +
819 +DESCRIPTION="Port of OpenBSD's free SSH release"
820 +HOMEPAGE="https://www.openssh.com/"
821 +SRC_URI="mirror://openbsd/OpenSSH/portable/${PARCH}.tar.gz
822 + ${SCTP_PATCH:+sctp? ( https://dev.gentoo.org/~chutzpah/dist/openssh/${SCTP_PATCH} )}
823 + ${HPN_VER:+hpn? ( $(printf "mirror://sourceforge/project/hpnssh/Patches/HPN-SSH%%20${HPN_VER/./v}%%20${HPN_PV/_P/p}/%s\n" "${HPN_PATCHES[@]}") )}
824 + ${X509_PATCH:+X509? ( https://roumenpetrov.info/openssh/x509-${X509_VER}/${X509_PATCH} )}
825 +"
826 +S="${WORKDIR}/${PARCH}"
827 +
828 +LICENSE="BSD GPL-2"
829 +SLOT="0"
830 +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
831 +# Probably want to drop ssl defaulting to on in a future version.
832 +IUSE="abi_mips_n32 audit debug hpn kerberos ldns libedit livecd pam +pie +scp sctp security-key selinux +ssl static test X X509 xmss"
833 +
834 +RESTRICT="!test? ( test )"
835 +
836 +REQUIRED_USE="
837 + hpn? ( ssl )
838 + ldns? ( ssl )
839 + pie? ( !static )
840 + static? ( !kerberos !pam )
841 + X509? ( !sctp ssl !xmss )
842 + xmss? ( ssl )
843 + test? ( ssl )
844 +"
845 +
846 +# tests currently fail with XMSS
847 +REQUIRED_USE+="test? ( !xmss )"
848 +
849 +LIB_DEPEND="
850 + audit? ( sys-process/audit[static-libs(+)] )
851 + ldns? (
852 + net-libs/ldns[static-libs(+)]
853 + net-libs/ldns[ecdsa(+),ssl(+)]
854 + )
855 + libedit? ( dev-libs/libedit:=[static-libs(+)] )
856 + sctp? ( net-misc/lksctp-tools[static-libs(+)] )
857 + security-key? ( >=dev-libs/libfido2-1.5.0:=[static-libs(+)] )
858 + selinux? ( >=sys-libs/libselinux-1.28[static-libs(+)] )
859 + ssl? ( >=dev-libs/openssl-1.1.1l-r1:0=[static-libs(+)] )
860 + virtual/libcrypt:=[static-libs(+)]
861 + >=sys-libs/zlib-1.2.3:=[static-libs(+)]
862 +"
863 +RDEPEND="
864 + acct-group/sshd
865 + acct-user/sshd
866 + !static? ( ${LIB_DEPEND//\[static-libs(+)]} )
867 + pam? ( sys-libs/pam )
868 + kerberos? ( virtual/krb5 )
869 +"
870 +DEPEND="${RDEPEND}
871 + virtual/os-headers
872 + kernel_linux? ( !prefix-guest? ( >=sys-kernel/linux-headers-5.1 ) )
873 + static? ( ${LIB_DEPEND} )
874 +"
875 +RDEPEND="${RDEPEND}
876 + pam? ( >=sys-auth/pambase-20081028 )
877 + !prefix? ( sys-apps/shadow )
878 + X? ( x11-apps/xauth )
879 +"
880 +BDEPEND="
881 + virtual/pkgconfig
882 + sys-devel/autoconf
883 +"
884 +
885 +pkg_pretend() {
886 + # this sucks, but i'd rather have people unable to `emerge -u openssh`
887 + # than not be able to log in to their server any more
888 + local missing=()
889 + check_feature() { use "${1}" && [[ -z ${!2} ]] && missing+=( "${1}" ); }
890 + check_feature hpn HPN_VER
891 + check_feature sctp SCTP_PATCH
892 + check_feature X509 X509_PATCH
893 + if [[ ${#missing[@]} -ne 0 ]] ; then
894 + eerror "Sorry, but this version does not yet support features"
895 + eerror "that you requested: ${missing[*]}"
896 + eerror "Please mask ${PF} for now and check back later:"
897 + eerror " # echo '=${CATEGORY}/${PF}' >> /etc/portage/package.mask"
898 + die "Missing requested third party patch."
899 + fi
900 +
901 + # Make sure people who are using tcp wrappers are notified of its removal. #531156
902 + if grep -qs '^ *sshd *:' "${EROOT}"/etc/hosts.{allow,deny} ; then
903 + ewarn "Sorry, but openssh no longer supports tcp-wrappers, and it seems like"
904 + ewarn "you're trying to use it. Update your ${EROOT}/etc/hosts.{allow,deny} please."
905 + fi
906 +}
907 +
908 +src_prepare() {
909 + sed -i \
910 + -e "/_PATH_XAUTH/s:/usr/X11R6/bin/xauth:${EPREFIX}/usr/bin/xauth:" \
911 + pathnames.h || die
912 +
913 + # don't break .ssh/authorized_keys2 for fun
914 + sed -i '/^AuthorizedKeysFile/s:^:#:' sshd_config || die
915 +
916 + eapply "${FILESDIR}"/${PN}-7.9_p1-include-stdlib.patch
917 + eapply "${FILESDIR}"/${PN}-8.7_p1-GSSAPI-dns.patch #165444 integrated into gsskex
918 + eapply "${FILESDIR}"/${PN}-6.7_p1-openssl-ignore-status.patch
919 + eapply "${FILESDIR}"/${PN}-7.5_p1-disable-conch-interop-tests.patch
920 + eapply "${FILESDIR}"/${PN}-8.0_p1-fix-putty-tests.patch
921 + eapply "${FILESDIR}"/${PN}-8.0_p1-deny-shmget-shmat-shmdt-in-preauth-privsep-child.patch
922 +
923 + [[ -d ${WORKDIR}/patches ]] && eapply "${WORKDIR}"/patches
924 +
925 + local PATCHSET_VERSION_MACROS=()
926 +
927 + if use X509 ; then
928 + pushd "${WORKDIR}" &>/dev/null || die
929 + eapply "${FILESDIR}/${P}-X509-glue-"${X509_VER}".patch"
930 + popd &>/dev/null || die
931 +
932 + eapply "${WORKDIR}"/${X509_PATCH%.*}
933 +
934 + # We need to patch package version or any X.509 sshd will reject our ssh client
935 + # with "userauth_pubkey: could not parse key: string is too large [preauth]"
936 + # error
937 + einfo "Patching package version for X.509 patch set ..."
938 + sed -i \
939 + -e "s/^AC_INIT(\[OpenSSH\], \[Portable\]/AC_INIT([OpenSSH], [${X509_VER}]/" \
940 + "${S}"/configure.ac || die "Failed to patch package version for X.509 patch"
941 +
942 + einfo "Patching version.h to expose X.509 patch set ..."
943 + sed -i \
944 + -e "/^#define SSH_PORTABLE.*/a #define SSH_X509 \"-PKIXSSH-${X509_VER}\"" \
945 + "${S}"/version.h || die "Failed to sed-in X.509 patch version"
946 + PATCHSET_VERSION_MACROS+=( 'SSH_X509' )
947 + fi
948 +
949 + if use sctp ; then
950 + eapply "${WORKDIR}"/${SCTP_PATCH%.*}
951 +
952 + einfo "Patching version.h to expose SCTP patch set ..."
953 + sed -i \
954 + -e "/^#define SSH_PORTABLE/a #define SSH_SCTP \"-sctp-${SCTP_VER}\"" \
955 + "${S}"/version.h || die "Failed to sed-in SCTP patch version"
956 + PATCHSET_VERSION_MACROS+=( 'SSH_SCTP' )
957 +
958 + einfo "Disabling known failing test (cfgparse) caused by SCTP patch ..."
959 + sed -i \
960 + -e "/\t\tcfgparse \\\/d" \
961 + "${S}"/regress/Makefile || die "Failed to disable known failing test (cfgparse) caused by SCTP patch"
962 + fi
963 +
964 + if use hpn ; then
965 + local hpn_patchdir="${T}/${P}-hpn${HPN_VER}"
966 + mkdir "${hpn_patchdir}" || die
967 + cp $(printf -- "${DISTDIR}/%s\n" "${HPN_PATCHES[@]}") "${hpn_patchdir}" || die
968 + pushd "${hpn_patchdir}" &>/dev/null || die
969 + eapply "${FILESDIR}"/${PN}-8.9_p1-hpn-${HPN_VER}-glue.patch
970 + use X509 && eapply "${FILESDIR}"/${PN}-8.9_p1-hpn-${HPN_VER}-X509-glue.patch
971 + use sctp && eapply "${FILESDIR}"/${PN}-8.5_p1-hpn-${HPN_VER}-sctp-glue.patch
972 + popd &>/dev/null || die
973 +
974 + eapply "${hpn_patchdir}"
975 +
976 + use X509 || eapply "${FILESDIR}/openssh-8.6_p1-hpn-version.patch"
977 +
978 + einfo "Patching Makefile.in for HPN patch set ..."
979 + sed -i \
980 + -e "/^LIBS=/ s/\$/ -lpthread/" \
981 + "${S}"/Makefile.in || die "Failed to patch Makefile.in"
982 +
983 + einfo "Patching version.h to expose HPN patch set ..."
984 + sed -i \
985 + -e "/^#define SSH_PORTABLE/a #define SSH_HPN \"-hpn${HPN_VER//./v}\"" \
986 + "${S}"/version.h || die "Failed to sed-in HPN patch version"
987 + PATCHSET_VERSION_MACROS+=( 'SSH_HPN' )
988 +
989 + if [[ -n "${HPN_DISABLE_MTAES}" ]] ; then
990 + einfo "Disabling known non-working MT AES cipher per default ..."
991 +
992 + cat > "${T}"/disable_mtaes.conf <<- EOF
993 +
994 + # HPN's Multi-Threaded AES CTR cipher is currently known to be broken
995 + # and therefore disabled per default.
996 + DisableMTAES yes
997 + EOF
998 + sed -i \
999 + -e "/^#HPNDisabled.*/r ${T}/disable_mtaes.conf" \
1000 + "${S}"/sshd_config || die "Failed to disabled MT AES ciphers in sshd_config"
1001 +
1002 + sed -i \
1003 + -e "/AcceptEnv.*_XXX_TEST$/a \\\tDisableMTAES\t\tyes" \
1004 + "${S}"/regress/test-exec.sh || die "Failed to disable MT AES ciphers in test config"
1005 + fi
1006 + fi
1007 +
1008 + if use X509 || use sctp || use hpn ; then
1009 + einfo "Patching sshconnect.c to use SSH_RELEASE in send_client_banner() ..."
1010 + sed -i \
1011 + -e "s/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_RELEASE/" \
1012 + "${S}"/sshconnect.c || die "Failed to patch send_client_banner() to use SSH_RELEASE (sshconnect.c)"
1013 +
1014 + einfo "Patching sshd.c to use SSH_RELEASE in sshd_exchange_identification() ..."
1015 + sed -i \
1016 + -e "s/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_RELEASE/" \
1017 + "${S}"/sshd.c || die "Failed to patch sshd_exchange_identification() to use SSH_RELEASE (sshd.c)"
1018 +
1019 + einfo "Patching version.h to add our patch sets to SSH_RELEASE ..."
1020 + sed -i \
1021 + -e "s/^#define SSH_RELEASE.*/#define SSH_RELEASE SSH_VERSION SSH_PORTABLE ${PATCHSET_VERSION_MACROS[*]}/" \
1022 + "${S}"/version.h || die "Failed to patch SSH_RELEASE (version.h)"
1023 + fi
1024 +
1025 + sed -i \
1026 + -e "/#UseLogin no/d" \
1027 + "${S}"/sshd_config || die "Failed to remove removed UseLogin option (sshd_config)"
1028 +
1029 + eapply_user #473004
1030 +
1031 + # These tests are currently incompatible with PORTAGE_TMPDIR/sandbox
1032 + sed -e '/\t\tpercent \\/ d' \
1033 + -i regress/Makefile || die
1034 +
1035 + tc-export PKG_CONFIG
1036 + local sed_args=(
1037 + -e "s:-lcrypto:$(${PKG_CONFIG} --libs openssl):"
1038 + # Disable PATH reset, trust what portage gives us #254615
1039 + -e 's:^PATH=/:#PATH=/:'
1040 + # Disable fortify flags ... our gcc does this for us
1041 + -e 's:-D_FORTIFY_SOURCE=2::'
1042 + )
1043 +
1044 + # The -ftrapv flag ICEs on hppa #505182
1045 + use hppa && sed_args+=(
1046 + -e '/CFLAGS/s:-ftrapv:-fdisable-this-test:'
1047 + -e '/OSSH_CHECK_CFLAG_LINK.*-ftrapv/d'
1048 + )
1049 + # _XOPEN_SOURCE causes header conflicts on Solaris
1050 + [[ ${CHOST} == *-solaris* ]] && sed_args+=(
1051 + -e 's/-D_XOPEN_SOURCE//'
1052 + )
1053 + sed -i "${sed_args[@]}" configure{.ac,} || die
1054 +
1055 + eautoreconf
1056 +}
1057 +
1058 +src_configure() {
1059 + addwrite /dev/ptmx
1060 +
1061 + use debug && append-cppflags -DSANDBOX_SECCOMP_FILTER_DEBUG
1062 + use static && append-ldflags -static
1063 + use xmss && append-cflags -DWITH_XMSS
1064 +
1065 + if [[ ${CHOST} == *-solaris* ]] ; then
1066 + # Solaris' glob.h doesn't have things like GLOB_TILDE, configure
1067 + # doesn't check for this, so force the replacement to be put in
1068 + # place
1069 + append-cppflags -DBROKEN_GLOB
1070 + fi
1071 +
1072 + # use replacement, RPF_ECHO_ON doesn't exist here
1073 + [[ ${CHOST} == *-darwin* ]] && export ac_cv_func_readpassphrase=no
1074 +
1075 + local myconf=(
1076 + --with-ldflags="${LDFLAGS}"
1077 + --disable-strip
1078 + --with-pid-dir="${EPREFIX}"$(usex kernel_linux '' '/var')/run
1079 + --sysconfdir="${EPREFIX}"/etc/ssh
1080 + --libexecdir="${EPREFIX}"/usr/$(get_libdir)/misc
1081 + --datadir="${EPREFIX}"/usr/share/openssh
1082 + --with-privsep-path="${EPREFIX}"/var/empty
1083 + --with-privsep-user=sshd
1084 + $(use_with audit audit linux)
1085 + $(use_with kerberos kerberos5 "${EPREFIX}"/usr)
1086 + # We apply the sctp patch conditionally, so can't pass --without-sctp
1087 + # unconditionally else we get unknown flag warnings.
1088 + $(use sctp && use_with sctp)
1089 + $(use_with ldns ldns "${EPREFIX}"/usr)
1090 + $(use_with libedit)
1091 + $(use_with pam)
1092 + $(use_with pie)
1093 + $(use_with selinux)
1094 + $(usex X509 '' "$(use_with security-key security-key-builtin)")
1095 + $(use_with ssl openssl)
1096 + $(use_with ssl ssl-engine)
1097 + $(use_with !elibc_Cygwin hardening) #659210
1098 + )
1099 +
1100 + if use elibc_musl; then
1101 + # musl defines bogus values for UTMP_FILE and WTMP_FILE
1102 + # https://bugs.gentoo.org/753230
1103 + myconf+=( --disable-utmp --disable-wtmp )
1104 + fi
1105 +
1106 + # The seccomp sandbox is broken on x32, so use the older method for now. #553748
1107 + use amd64 && [[ ${ABI} == "x32" ]] && myconf+=( --with-sandbox=rlimit )
1108 +
1109 + econf "${myconf[@]}"
1110 +}
1111 +
1112 +src_test() {
1113 + local tests=( compat-tests )
1114 + local shell=$(egetshell "${UID}")
1115 + if [[ ${shell} == */nologin ]] || [[ ${shell} == */false ]] ; then
1116 + ewarn "Running the full OpenSSH testsuite requires a usable shell for the 'portage'"
1117 + ewarn "user, so we will run a subset only."
1118 + tests+=( interop-tests )
1119 + else
1120 + tests+=( tests )
1121 + fi
1122 +
1123 + local -x SUDO= SSH_SK_PROVIDER= TEST_SSH_UNSAFE_PERMISSIONS=1
1124 + mkdir -p "${HOME}"/.ssh || die
1125 + emake -j1 "${tests[@]}" </dev/null
1126 +}
1127 +
1128 +# Gentoo tweaks to default config files.
1129 +tweak_ssh_configs() {
1130 + local locale_vars=(
1131 + # These are language variables that POSIX defines.
1132 + # http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_02
1133 + LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME
1134 +
1135 + # These are the GNU extensions.
1136 + # https://www.gnu.org/software/autoconf/manual/html_node/Special-Shell-Variables.html
1137 + LANGUAGE LC_ADDRESS LC_IDENTIFICATION LC_MEASUREMENT LC_NAME LC_PAPER LC_TELEPHONE
1138 + )
1139 +
1140 + # First the server config.
1141 + cat <<-EOF >> "${ED}"/etc/ssh/sshd_config
1142 +
1143 + # Allow client to pass locale environment variables. #367017
1144 + AcceptEnv ${locale_vars[*]}
1145 +
1146 + # Allow client to pass COLORTERM to match TERM. #658540
1147 + AcceptEnv COLORTERM
1148 + EOF
1149 +
1150 + # Then the client config.
1151 + cat <<-EOF >> "${ED}"/etc/ssh/ssh_config
1152 +
1153 + # Send locale environment variables. #367017
1154 + SendEnv ${locale_vars[*]}
1155 +
1156 + # Send COLORTERM to match TERM. #658540
1157 + SendEnv COLORTERM
1158 + EOF
1159 +
1160 + if use pam ; then
1161 + sed -i \
1162 + -e "/^#UsePAM /s:.*:UsePAM yes:" \
1163 + -e "/^#PasswordAuthentication /s:.*:PasswordAuthentication no:" \
1164 + -e "/^#PrintMotd /s:.*:PrintMotd no:" \
1165 + -e "/^#PrintLastLog /s:.*:PrintLastLog no:" \
1166 + "${ED}"/etc/ssh/sshd_config || die
1167 + fi
1168 +
1169 + if use livecd ; then
1170 + sed -i \
1171 + -e '/^#PermitRootLogin/c# Allow root login with password on livecds.\nPermitRootLogin Yes' \
1172 + "${ED}"/etc/ssh/sshd_config || die
1173 + fi
1174 +}
1175 +
1176 +src_install() {
1177 + emake install-nokeys DESTDIR="${D}"
1178 + fperms 600 /etc/ssh/sshd_config
1179 + dobin contrib/ssh-copy-id
1180 + newinitd "${FILESDIR}"/sshd-r1.initd sshd
1181 + newconfd "${FILESDIR}"/sshd-r1.confd sshd
1182 +
1183 + if use pam; then
1184 + newpamd "${FILESDIR}"/sshd.pam_include.2 sshd
1185 + fi
1186 +
1187 + tweak_ssh_configs
1188 +
1189 + doman contrib/ssh-copy-id.1
1190 + dodoc CREDITS OVERVIEW README* TODO sshd_config
1191 + use hpn && dodoc HPN-README
1192 + use X509 || dodoc ChangeLog
1193 +
1194 + diropts -m 0700
1195 + dodir /etc/skel/.ssh
1196 +
1197 + # https://bugs.gentoo.org/733802
1198 + if ! use scp; then
1199 + rm -f "${ED}"/usr/{bin/scp,share/man/man1/scp.1} \
1200 + || die "failed to remove scp"
1201 + fi
1202 +
1203 + rmdir "${ED}"/var/empty || die
1204 +
1205 + systemd_dounit "${FILESDIR}"/sshd.{service,socket}
1206 + systemd_newunit "${FILESDIR}"/sshd_at.service 'sshd@.service'
1207 +}
1208 +
1209 +pkg_preinst() {
1210 + if ! use ssl && has_version "${CATEGORY}/${PN}[ssl]"; then
1211 + show_ssl_warning=1
1212 + fi
1213 +}
1214 +
1215 +pkg_postinst() {
1216 + local old_ver
1217 + for old_ver in ${REPLACING_VERSIONS}; do
1218 + if ver_test "${old_ver}" -lt "5.8_p1"; then
1219 + elog "Starting with openssh-5.8p1, the server will default to a newer key"
1220 + elog "algorithm (ECDSA). You are encouraged to manually update your stored"
1221 + elog "keys list as servers update theirs. See ssh-keyscan(1) for more info."
1222 + fi
1223 + if ver_test "${old_ver}" -lt "7.0_p1"; then
1224 + elog "Starting with openssh-6.7, support for USE=tcpd has been dropped by upstream."
1225 + elog "Make sure to update any configs that you might have. Note that xinetd might"
1226 + elog "be an alternative for you as it supports USE=tcpd."
1227 + fi
1228 + if ver_test "${old_ver}" -lt "7.1_p1"; then #557388 #555518
1229 + elog "Starting with openssh-7.0, support for ssh-dss keys were disabled due to their"
1230 + elog "weak sizes. If you rely on these key types, you can re-enable the key types by"
1231 + elog "adding to your sshd_config or ~/.ssh/config files:"
1232 + elog " PubkeyAcceptedKeyTypes=+ssh-dss"
1233 + elog "You should however generate new keys using rsa or ed25519."
1234 +
1235 + elog "Starting with openssh-7.0, the default for PermitRootLogin changed from 'yes'"
1236 + elog "to 'prohibit-password'. That means password auth for root users no longer works"
1237 + elog "out of the box. If you need this, please update your sshd_config explicitly."
1238 + fi
1239 + if ver_test "${old_ver}" -lt "7.6_p1"; then
1240 + elog "Starting with openssh-7.6p1, openssh upstream has removed ssh1 support entirely."
1241 + elog "Furthermore, rsa keys with less than 1024 bits will be refused."
1242 + fi
1243 + if ver_test "${old_ver}" -lt "7.7_p1"; then
1244 + elog "Starting with openssh-7.7p1, we no longer patch openssh to provide LDAP functionality."
1245 + elog "Install sys-auth/ssh-ldap-pubkey and use OpenSSH's \"AuthorizedKeysCommand\" option"
1246 + elog "if you need to authenticate against LDAP."
1247 + elog "See https://wiki.gentoo.org/wiki/SSH/LDAP_migration for more details."
1248 + fi
1249 + if ver_test "${old_ver}" -lt "8.2_p1"; then
1250 + ewarn "After upgrading to openssh-8.2p1 please restart sshd, otherwise you"
1251 + ewarn "will not be able to establish new sessions. Restarting sshd over a ssh"
1252 + ewarn "connection is generally safe."
1253 + fi
1254 + done
1255 +
1256 + if [[ -n ${show_ssl_warning} ]]; then
1257 + elog "Be aware that by disabling openssl support in openssh, the server and clients"
1258 + elog "no longer support dss/rsa/ecdsa keys. You will need to generate ed25519 keys"
1259 + elog "and update all clients/servers that utilize them."
1260 + fi
1261 +
1262 + if use hpn && [[ -n "${HPN_DISABLE_MTAES}" ]] ; then
1263 + elog ""
1264 + elog "HPN's multi-threaded AES CTR cipher is currently known to be broken"
1265 + elog "and therefore disabled at runtime per default."
1266 + elog "Make sure your sshd_config is up to date and contains"
1267 + elog ""
1268 + elog " DisableMTAES yes"
1269 + elog ""
1270 + elog "Otherwise you maybe unable to connect to this sshd using any AES CTR cipher."
1271 + elog ""
1272 + fi
1273 +}