Hi Openssl,
Recently we identified a following issue when snmpwalk is being done on
some tables:
$ snmpwalk -t 100 -v3 -l authpriv -u snmpsha -a SHA -A otci1234 -x DES
-X otci1234 10.72.181.53 .1.3.6.1.4.1.789.1.5.11.1.1
snmpwalk: Decryption error
The problem is in freebsd crypto function - EVP_DecryptFinal_ex().
I have pasted the problem piece of code:
/freebsd/crypto/openssl/crypto/evp/evp_enc.c:
458 n=ctx->final[b-1];
459 if (n == 0 || n > (int)b)
460 {
461
EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
462 return(0);
463 }
(n == 0) is a valid case for some OIDs.
I have instrumented the code (Added these lines) in file
/smf/src/snmp/security/Snmpv3Security.cc.
780 int finalBlkLen = 0;
781
782 cout << "Rakesh blk size" << cipherCtx.cipher->block_size;
783 for (int i=0; i< 8; i++) {
784 int x = cipherCtx.final[i];
785 cout <<"Rakesh final:" << x << endl;
786 x = cipherCtx.buf[i];
787 cout << "Rakesh buf:" << x << endl;
788 }
789
790 if (!EVP_DecryptFinal(&cipherCtx, *plain + *plainLen,
&finalBlkLen)) {
............
.........
Tables returning decrypt error:
==============================
OID: .1.3.6.1.4.1.789.1.25.1.1.0
Rakesh blk size8
Rakesh final:21
Rakesh buf:0
Rakesh final:1
Rakesh buf:0
Rakesh final:25
Rakesh buf:0
Rakesh final:1
Rakesh buf:0
Rakesh final:1
Rakesh buf:0
Rakesh final:0
Rakesh buf:0
Rakesh final:5
Rakesh buf:0
Rakesh final:0 <---- last byte (n==0)
Rakesh buf:0
Rakesh blk size8
Rakesh final:21
Rakesh buf:0
Rakesh final:1
Rakesh buf:0
Rakesh final:25
Rakesh buf:0
Rakesh final:1
Rakesh buf:0
Rakesh final:1
Rakesh buf:0
Rakesh final:0
Rakesh buf:0
Rakesh final:5
Rakesh buf:0
Rakesh final:0 <---- last byte (n==0)
Rakesh buf:0
This is working tables :
=============================
OID:.1.3.6.1.4.1.789.1.5.8.1.1.1028
Rakesh blk size8
Rakesh final:5
Rakesh buf:0
Rakesh final:0
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6 <---- (n==6)
Rakesh buf:0
Rakesh blk size8
Rakesh final:5
Rakesh buf:0
Rakesh final:0
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6
Rakesh buf:0
Rakesh final:6 <--- (n==6)
Rakesh buf:0
Hence the check (n==0) needs to be removed in EVP_DecryptFinal_ex()
function.
Your thoughts?
Regards,
Rakesh