8000 Merge branch 'moosa-1.0' into moosa-2.0 · phpseclib/phpseclib@43eeb85 · GitHub
[go: up one dir, main page]

Skip to content

Commit 43eeb85

Browse files
committed
Merge branch 'moosa-1.0' into moosa-2.0
2 parents 730070b + 581fbdb commit 43eeb85

File tree

4 files changed

+108
-2
lines changed

4 files changed

+108
-2
lines changed

phpseclib/Crypt/RSA.php

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2917,6 +2917,56 @@ function _emsa_pkcs1_v1_5_encode($m, $emLen)
29172917
return $em;
29182918
}
29192919

2920+
/**
2921+
* EMSA-PKCS1-V1_5-ENCODE (without NULL)
2922+
*
2923+
* Quoting https://tools.ietf.org/html/rfc8017#page-65,
2924+
*
2925+
* "The parameters field associated with id-sha1, id-sha224, id-sha256,
2926+
* id-sha384, id-sha512, id-sha512/224, and id-sha512/256 should
2927+
* generally be omitted, but if present, it shall have a value of type
2928+
* NULL"
2929+
*
2930+
* @access private
2931+
* @param string $m
2932+
* @param int $emLen
2933+
* @return string
2934+
*/
2935+
function _emsa_pkcs1_v1_5_encode_without_null($m, $emLen)
2936+
{
2937+
$h = $this->hash->hash($m);
2938+
if ($h === false) {
2939+
return false;
2940+
}
2941+
2942+
switch ($this->hashName) {
2943+
case 'sha1':
2944+
$t = pack('H*', '301f300706052b0e03021a0414');
2945+
break;
2946+
case 'sha256':
2947+
$t = pack('H*', '302f300b06096086480165030402010420');
2948+
break;
2949+
case 'sha384':
2950+
$t = pack('H*', '303f300b06096086480165030402020430');
2951+
break;
2952+
case 'sha512':
2953+
$t = pack('H*', '304f300b06096086480165030402030440');
2954+
}
2955+
$t.= $h;
2956+
$tLen = strlen($t);
2957+
2958+
if ($emLen < $tLen + 11) {
2959+
user_error('Intended encoded message length too short');
2960+
return false;
2961+
}
2962+
2963+
$ps = str_repeat(chr(0xFF), $emLen - $tLen - 3);
2964+
2965+
$em = "\0\1$ps\0$t";
2966+
2967+
return $em;
2968+
}
2969+
29202970
/**
29212971
* RSASSA-PKCS1-V1_5-SIGN
29222972
*
@@ -2983,13 +3033,15 @@ function _rsassa_pkcs1_v1_5_verify($m, $s)
29833033
// EMSA-PKCS1-v1_5 encoding
29843034

29853035
$em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
2986-
if ($em2 === false) {
3036+
$em3 = $this->_emsa_pkcs1_v1_5_encode_without_null($m, $this->k);
3037+
3038+
if ($em2 === false && $em3 === false) {
29873039
user_error('RSA modulus too short');
29883040
return false;
29893041
}
29903042

29913043
// Compare
2992-
return $this->_equals($em, $em2);
3044+
return $this->_equals($em, $em2) || $this->_equals($em, $em3);
29933045
}
29943046

29953047
/**

phpseclib/File/ASN1.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,9 @@ function _decode_ber($encoded, $start = 0, $encoded_pos = 0)
494494
return false;
495495
}
496496
$current['content'] = $this->_decodeTime(substr($content, $content_pos), $tag);
497+
break;
497498
default:
499+
return false;
498500
}
499501

500502
$start+= $length;

tests/Unit/Crypt/RSA/ModeTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,26 @@ public function testPSSSigsWithNonPowerOf2Key()
115115
$payload = 'eyJraWQiOiJ0RkMyVUloRnBUTV9FYTNxY09kX01xUVQxY0JCbTlrRkxTRGZlSmhzUkc4IiwiYWxnIjoiUFMyNTYifQ.eyJhcHAiOiJhY2NvdW50cG9ydGFsIiwic3ViIjoiNTliOGM4YzA5NTVhNDA5MDg2MGRmYmM3ZGQwMjVjZWEiLCJjbGlkIjoiZTQ5ZTA2N2JiMTFjNDcyMmEzNGIyYjNiOGE2YTYzNTUiLCJhbSI6InBhc3N3b3JkIiwicCI6ImVOcDFrRUZQd3pBTWhmXC9QdEVOYU5kQkc2bUZDNHNpbENNNXU0aTNXMHFSS0hFVDU5V1JzcXpZRUp4XC84M3ZQbkIxcUg3Rm5CZVNabEtNME9saGVZVUVWTXlHOEVUOEZnWDI4dkdqWG4wWkcrV2hSK01rWVBicGZacHI2U3E0N0RFYjBLYkRFT21CSUZuOTZKN1ZDaWg1Q2p4dWNRZDJmdHJlMCt2cSthZFFObUluK0poWEl0UlBvQ0xya1wvZ05VV3N3T09vSVwva0Q5ZVk4c05jRHFPUzNkanFWb3RPU21oRUo5b0hZZmFqZmpSRzFGSWpGRFwvOExtT2pKbVF3d0tBMnQ0aXJBQ2NncHo0dzBuN3BtXC84YXV2T0dFM2twVFZ2d0IzdzlQZk1YZnJJUTBhejRsaEtIdVBUMU42XC9sb1FJPSIsImlhaSI6IjU5YjhjOGMwOTU1YTQwOTA4NjBkZmJjN2RkMDI1Y2VhIiwiY2xzdmMiOiJhY2NvdW50cG9ydGFsIiwibHB2IjoxNTQ3Njc1NDM4LCJ0IjoicyIsImljIjp0cnVlLCJleHAiOjE1NDc3MDQyMzgsImlhdCI6MTU0NzY3NTQzOCwianRpIjoiZTE0N2UzM2UzNzVhNDkyNWJjMzdjZTRjMDIwMmJjNDYifQ';
116116
$this->assertTrue($rsa->verify($payload, $sig));
117117
}
118+
119+
public function testPKCS1SigWithoutNull()
120+
{
121+
$rsa = new RSA();
122+
$rsa->loadKey(array(
123+
'n' => new BigInteger('0xE932AC92252F585B3A80A4DD76A897C8B7652952FE788F6EC8DD640587A1EE5647670A8AD
124+
4C2BE0F9FA6E49C605ADF77B5174230AF7BD50E5D6D6D6D28CCF0A886A514CC72E51D209CC7
125+
72A52EF419F6A953F3135929588EBE9B351FCA61CED78F346FE00DBB6306E5C2A4C6DFC3779
126+
AF85AB417371CF34D8387B9B30AE46D7A5FF5A655B8D8455F1B94AE736989D60A6F2FD5CADB
127+
FFBD504C5A756A2E6BB5CECC13BCA7503F6DF8B52ACE5C410997E98809DB4DC30D943DE4E81
128+
2A47553DCE54844A78E36401D13F77DC650619FED88D8B3926E3D8E319C80C744779AC5D6AB
129+
E252896950917476ECE5E8FC27D5F053D6018D91B502C4787558A002B9283DA7', 16),
130+
'e' => new BigInteger('3')
131+
));
132+
133+
$message = 'hello world!';
134+
$signature = pack('H*', 'a0073057133ff3758e7e111b4d7441f1d8cbe4b2dd5ee4316a14264290dee5ed7f175716639bd9bb43a14e4f9fcb9e84dedd35e2205caac04828b2c053f68176d971ea88534dd2eeec903043c3469fc69c206b2a8694fd262488441ed8852280c3d4994e9d42bd1d575c7024095f1a20665925c2175e089c0d731471f6cc145404edf5559fd2276e45e448086f71c78d0cc6628fad394a34e51e8c10bc39bfe09ed2f5f742cc68bee899d0a41e4c75b7b80afd1c321d89ccd9fe8197c44624d91cc935dfa48de3c201099b5b417be748aef29248527e8bbb173cab76b48478d4177b338fe1f1244e64d7d23f07add560d5ad50b68d6649a49d7bc3db686daaa7');
135+
136+
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
137+
$rsa->setHash('sha256');
138+
$this->assertTrue($rsa->verify($message, $signature));
139+
}
118140
}

tests/Unit/File/ASN1Test.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,4 +418,34 @@ public function testOIDGarbage()
418418
$decoded = $asn1->decodeBER($em);
419419
$this->assertFalse($decoded[0]);
420420
}
421+
422+
public function testConstructedMismatch()
423+
{
424+
$asn1 = new ASN1();
425+
426+
$em = pack('H*', '1031300d0609608648016503040201050004207509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9');
427+
$decoded = $asn1->decodeBER($em);
428+
$this->assertFalse($decoded[0]);
429+
430+
$em = pack('H*', '3031100d0609608648016503040201050004207509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9');
431+
$decoded = $asn1->decodeBER($em);
432+
$this->assertFalse($decoded[0]);
433+
434+
$em = pack('H*', '3031300d2609608648016503040201050004207509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9');
435+
$decoded = $asn1->decodeBER($em);
436+
$this->assertFalse($decoded[0]);
437+
438+
$em = pack('H*', '3031300d06096086480165030402012d0004207509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9');
439+
$decoded = $asn1->decodeBER($em);
440+
$this->assertFalse($decoded[0]);
441+
}
442+
443+
public function testBadTagSecondOctet()
444+
{
445+
$asn1 = new ASN1();
446+
447+
$em = pack('H*', '3033300f1f808080060960864801650304020104207509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9');
448+
$decoded = $asn1->decodeBER($em);
449+
$this->assertFalse($decoded[0]);
450+
}
421451
}

0 commit comments

Comments
 (0)
0