SPARC T4 assembly pack: treat zero input length in CBC.
The problem is that OpenSSH calls EVP_Cipher, which is not as protective as EVP_CipherUpdate. Formally speaking we ought to do more checks in *_cipher methods, including rejecting lengths not divisible by block size (unless ciphertext stealing is in place). But for now I implement check for zero length in low-level based on precedent. PR: 3087, 2775
This commit is contained in:
parent
53e5161231
commit
5e44c144e6
@ -94,6 +94,9 @@ $code.=<<___;
|
|||||||
.globl des_t4_cbc_encrypt
|
.globl des_t4_cbc_encrypt
|
||||||
.align 32
|
.align 32
|
||||||
des_t4_cbc_encrypt:
|
des_t4_cbc_encrypt:
|
||||||
|
cmp $len, 0
|
||||||
|
be,pn $::size_t_cc, .Lcbc_abort
|
||||||
|
nop
|
||||||
ld [$ivec + 0], %f0 ! load ivec
|
ld [$ivec + 0], %f0 ! load ivec
|
||||||
ld [$ivec + 4], %f1
|
ld [$ivec + 4], %f1
|
||||||
|
|
||||||
@ -165,6 +168,9 @@ des_t4_cbc_encrypt:
|
|||||||
st %f0, [$ivec + 0] ! write out ivec
|
st %f0, [$ivec + 0] ! write out ivec
|
||||||
retl
|
retl
|
||||||
st %f1, [$ivec + 4]
|
st %f1, [$ivec + 4]
|
||||||
|
.Lcbc_abort:
|
||||||
|
retl
|
||||||
|
nop
|
||||||
|
|
||||||
.align 16
|
.align 16
|
||||||
2: ldxa [$inp]0x82, %g4 ! avoid read-after-write hazard
|
2: ldxa [$inp]0x82, %g4 ! avoid read-after-write hazard
|
||||||
@ -189,6 +195,9 @@ des_t4_cbc_encrypt:
|
|||||||
.globl des_t4_cbc_decrypt
|
.globl des_t4_cbc_decrypt
|
||||||
.align 32
|
.align 32
|
||||||
des_t4_cbc_decrypt:
|
des_t4_cbc_decrypt:
|
||||||
|
cmp $len, 0
|
||||||
|
be,pn $::size_t_cc, .Lcbc_abort
|
||||||
|
nop
|
||||||
ld [$ivec + 0], %f2 ! load ivec
|
ld [$ivec + 0], %f2 ! load ivec
|
||||||
ld [$ivec + 4], %f3
|
ld [$ivec + 4], %f3
|
||||||
|
|
||||||
@ -294,6 +303,9 @@ $code.=<<___;
|
|||||||
.globl des_t4_ede3_cbc_encrypt
|
.globl des_t4_ede3_cbc_encrypt
|
||||||
.align 32
|
.align 32
|
||||||
des_t4_ede3_cbc_encrypt:
|
des_t4_ede3_cbc_encrypt:
|
||||||
|
cmp $len, 0
|
||||||
|
be,pn $::size_t_cc, .Lcbc_abort
|
||||||
|
nop
|
||||||
ld [$ivec + 0], %f0 ! load ivec
|
ld [$ivec + 0], %f0 ! load ivec
|
||||||
ld [$ivec + 4], %f1
|
ld [$ivec + 4], %f1
|
||||||
|
|
||||||
@ -443,6 +455,9 @@ des_t4_ede3_cbc_encrypt:
|
|||||||
.globl des_t4_ede3_cbc_decrypt
|
.globl des_t4_ede3_cbc_decrypt
|
||||||
.align 32
|
.align 32
|
||||||
des_t4_ede3_cbc_decrypt:
|
des_t4_ede3_cbc_decrypt:
|
||||||
|
cmp $len, 0
|
||||||
|
be,pn $::size_t_cc, .Lcbc_abort
|
||||||
|
nop
|
||||||
ld [$ivec + 0], %f2 ! load ivec
|
ld [$ivec + 0], %f2 ! load ivec
|
||||||
ld [$ivec + 4], %f3
|
ld [$ivec + 4], %f3
|
||||||
|
|
||||||
|
@ -35,6 +35,8 @@ $::code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
${alg}${bits}_t4_cbc_encrypt:
|
${alg}${bits}_t4_cbc_encrypt:
|
||||||
save %sp, -$::frame, %sp
|
save %sp, -$::frame, %sp
|
||||||
|
cmp $len, 0
|
||||||
|
be,pn $::size_t_cc, .L${bits}_cbc_enc_abort
|
||||||
sub $inp, $out, $blk_init ! $inp!=$out
|
sub $inp, $out, $blk_init ! $inp!=$out
|
||||||
___
|
___
|
||||||
$::code.=<<___ if (!$::evp);
|
$::code.=<<___ if (!$::evp);
|
||||||
@ -123,6 +125,7 @@ $::code.=<<___ if (!$::evp);
|
|||||||
std %f2, [$ivec + 8]
|
std %f2, [$ivec + 8]
|
||||||
___
|
___
|
||||||
$::code.=<<___;
|
$::code.=<<___;
|
||||||
|
.L${bits}_cbc_enc_abort:
|
||||||
ret
|
ret
|
||||||
restore
|
restore
|
||||||
|
|
||||||
@ -249,6 +252,8 @@ $::code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
${alg}${bits}_t4_cbc_decrypt:
|
${alg}${bits}_t4_cbc_decrypt:
|
||||||
save %sp, -$::frame, %sp
|
save %sp, -$::frame, %sp
|
||||||
|
cmp $len, 0
|
||||||
|
be,pn $::size_t_cc, .L${bits}_cbc_dec_abort
|
||||||
sub $inp, $out, $blk_init ! $inp!=$out
|
sub $inp, $out, $blk_init ! $inp!=$out
|
||||||
___
|
___
|
||||||
$::code.=<<___ if (!$::evp);
|
$::code.=<<___ if (!$::evp);
|
||||||
@ -341,6 +346,7 @@ $::code.=<<___ if (!$::evp);
|
|||||||
std %f14, [$ivec + 8]
|
std %f14, [$ivec + 8]
|
||||||
___
|
___
|
||||||
$::code.=<<___;
|
$::code.=<<___;
|
||||||
|
.L${bits}_cbc_dec_abort:
|
||||||
ret
|
ret
|
||||||
restore
|
restore
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user