22#if PC_SSH_ZLIB_IN_PSRAM && defined(ARDUINO)
24#if !defined(CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY)
26 "PC_SSH_ZLIB_IN_PSRAM needs a framework built with CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y. The stock arduino-esp32 core ships it OFF, so EXT_RAM_BSS_ATTR silently no-ops and the compressor pool would overflow internal DRAM. Rebuild the core (tools/psram/README.md) or unset PC_SSH_ZLIB_IN_PSRAM."
28#if defined(EXT_RAM_BSS_ATTR)
29#define PC_SSH_COMP_ATTR EXT_RAM_BSS_ATTR
30#elif defined(EXT_RAM_ATTR)
31#define PC_SSH_COMP_ATTR EXT_RAM_ATTR
33#define PC_SSH_COMP_ATTR
36#define PC_SSH_COMP_ATTR
43 uint8_t work[SSH_ZLIB_WORK_SIZE];
44 uint16_t head[SSH_ZLIB_HASH_SIZE];
45 uint16_t prev[SSH_ZLIB_WORK_SIZE];
46 uint16_t ll_code[288];
51 uint8_t inf_window[SSH_INFLATE_WINDOW];
64static PC_SSH_COMP_ATTR SshCompCtx s_ssh_comp;
66static void start_s2c(SshCompState *c)
68 ssh_deflate_init(&c->z, c->work, c->head, c->prev, c->ll_code, c->ll_len, c->d_code, c->d_len);
72static void start_c2s(SshCompState *c)
74 ssh_inflate_init(&c->inf, c->inf_window);
78void ssh_comp_reset(uint8_t i)
84 SshCompState *c = &s_ssh_comp.comp[i];
85 c->s2c_alg = SshCompAlg::SSH_COMP_NONE;
86 c->s2c_active =
false;
87 c->c2s_alg = SshCompAlg::SSH_COMP_NONE;
88 c->c2s_active =
false;
91void ssh_comp_set_s2c(uint8_t i, SshCompAlg alg)
97 s_ssh_comp.comp[i].s2c_alg = alg;
100void ssh_comp_set_c2s(uint8_t i, SshCompAlg alg)
106 s_ssh_comp.comp[i].c2s_alg = alg;
110void ssh_comp_on_newkeys(uint8_t i)
116 SshCompState *c = &s_ssh_comp.comp[i];
117 if (c->s2c_alg == SshCompAlg::SSH_COMP_ZLIB && !c->s2c_active)
121 if (c->c2s_alg == SshCompAlg::SSH_COMP_ZLIB && !c->c2s_active)
127void ssh_comp_on_auth_success(uint8_t i)
133 SshCompState *c = &s_ssh_comp.comp[i];
134 if (c->s2c_alg == SshCompAlg::SSH_COMP_ZLIB_DELAYED && !c->s2c_active)
138 if (c->c2s_alg == SshCompAlg::SSH_COMP_ZLIB_DELAYED && !c->c2s_active)
144bool ssh_comp_s2c_active(uint8_t i)
149int ssh_comp_s2c(uint8_t i,
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_cap,
size_t *out_len)
155 return ssh_deflate_packet(&s_ssh_comp.comp[i].z, src, src_len, dst, dst_cap, out_len);
158bool ssh_comp_c2s_active(uint8_t i)
163int ssh_comp_c2s(uint8_t i,
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_cap,
size_t *out_len)
169 return ssh_inflate_packet(&s_ssh_comp.comp[i].inf, src, src_len, dst, dst_cap, out_len);
SSH per-connection compression owner (server-to-client zlib / zlib@openssh.com).
SSH client-to-server decompression: a resumable, context-takeover INFLATE (no heap).
SSH server-to-client compression: a context-takeover DEFLATE stream (no heap).