Skip to content

Commit 11590de

Browse files
committed
add SSH-style padding
Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent cee9569 commit 11590de

4 files changed

Lines changed: 35 additions & 2 deletions

File tree

src/headers/tomcrypt_misc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ enum padding_type {
146146
LTC_PAD_ISO_10126 = 0x1000U,
147147
#endif
148148
LTC_PAD_ANSI_X923 = 0x2000U,
149+
LTC_PAD_SSH = 0x3000U,
149150
/* The following padding modes don't contain the padding
150151
* length as last byte of the padding.
151152
*/

src/misc/padding/padding_depad.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ int padding_depad(const unsigned char *data, unsigned long *length, unsigned lon
5353
/* nop */
5454
break;
5555
#endif
56+
case LTC_PAD_SSH:
57+
pad = 0x1;
58+
for (n = unpadded_length; n < padded_length; ++n) {
59+
if (data[n] != pad++) return CRYPT_INVALID_PACKET;
60+
}
61+
break;
5662
case LTC_PAD_ONE_AND_ZERO:
5763
while (unpadded_length > 0 && data[unpadded_length - 1] != 0x80) {
5864
if (data[unpadded_length - 1] != 0x0) return CRYPT_INVALID_PACKET;

src/misc/padding/padding_pad.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ static int s_padding_padded_length(unsigned long *length, unsigned long mode)
3232
case LTC_PAD_PKCS7:
3333
case LTC_PAD_ONE_AND_ZERO:
3434
case LTC_PAD_ZERO_ALWAYS:
35+
case LTC_PAD_SSH:
3536
t = 1;
3637
break;
3738
#ifdef LTC_RNG_GET_BYTES
@@ -78,10 +79,10 @@ static int s_padding_padded_length(unsigned long *length, unsigned long mode)
7879
*/
7980
int padding_pad(unsigned char *data, unsigned long length, unsigned long* padded_length, unsigned long mode)
8081
{
81-
unsigned long l;
82+
unsigned long l, n;
8283
enum padding_type type;
8384
int err;
84-
unsigned char diff;
85+
unsigned char diff, pad;
8586

8687
LTC_ARGCHK(data != NULL);
8788
LTC_ARGCHK(padded_length != NULL);
@@ -125,6 +126,12 @@ int padding_pad(unsigned char *data, unsigned long length, unsigned long* padded
125126
XMEMSET(&data[length], 0, diff-1);
126127
data[l-1] = diff;
127128
break;
129+
case LTC_PAD_SSH:
130+
pad = 0x1;
131+
for (n = length; n < l; ++n) {
132+
data[n] = pad++;
133+
}
134+
break;
128135
case LTC_PAD_ONE_AND_ZERO:
129136
XMEMSET(&data[length + 1], 0, diff);
130137
data[length] = 0x80;

tests/padding_test.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,18 @@ static int s_cmp_zero(const padding_testcase* t, const unsigned char* p, unsigne
8888
return CRYPT_OK;
8989
}
9090

91+
static int s_cmp_ssh(const padding_testcase* t, const unsigned char* p, unsigned long len)
92+
{
93+
unsigned long n, diff = len - t->is;
94+
unsigned char pad = 0x1;
95+
DOX(EQ(len, t->should), t->name);
96+
for (n = len - diff; n < len; ++n) {
97+
DOX(EQ(p[n], pad), t->name);
98+
pad++;
99+
}
100+
return CRYPT_OK;
101+
}
102+
91103
static int s_padding_testrun(const padding_testcase* t)
92104
{
93105
unsigned long len;
@@ -126,6 +138,13 @@ int padding_test(void)
126138
{ 255, 256, 0, LTC_PAD_ANSI_X923 | 16, "255-x923", s_cmp_x923 },
127139
{ 256, 272, 0, LTC_PAD_ANSI_X923 | 16, "256-x923", s_cmp_x923 },
128140

141+
{ 0, 16, 0, LTC_PAD_SSH | 16, "0-ssh", s_cmp_ssh },
142+
{ 1, 16, 0, LTC_PAD_SSH | 16, "1-ssh", s_cmp_ssh },
143+
{ 15, 16, 0, LTC_PAD_SSH | 16, "15-ssh", s_cmp_ssh },
144+
{ 16, 32, 0, LTC_PAD_SSH | 16, "16-ssh", s_cmp_ssh },
145+
{ 255, 256, 0, LTC_PAD_SSH | 16, "255-ssh", s_cmp_ssh },
146+
{ 256, 272, 0, LTC_PAD_SSH | 16, "256-ssh", s_cmp_ssh },
147+
129148
{ 0, 16, 0, LTC_PAD_ONE_AND_ZERO | 16, "0-one-and-zero", s_cmp_oaz },
130149
{ 1, 16, 0, LTC_PAD_ONE_AND_ZERO | 16, "1-one-and-zero", s_cmp_oaz },
131150
{ 15, 16, 0, LTC_PAD_ONE_AND_ZERO | 16, "15-one-and-zero", s_cmp_oaz },

0 commit comments

Comments
 (0)