Use hex2bin() instead of pack()
authorKevin Israel <pleasestand@live.com>
Sat, 20 Feb 2016 01:43:21 +0000 (20:43 -0500)
committerKevin Israel <pleasestand@live.com>
Sat, 20 Feb 2016 05:27:24 +0000 (00:27 -0500)
This function was added in PHP 5.4.0 and can be used now that MediaWiki
only works with PHP 5.5.9 or higher.

Also fixed a bug in ApiQueryCategoryMembers::validateHexSortkey() that
allowed a single line feed at the end of the string to pass.

Change-Id: I5b577e7dcc5fb6a06ab550429aae657dbcc79083

includes/api/ApiQueryCategoryMembers.php
tests/phpunit/includes/utils/MWCryptHKDFTest.php
tests/phpunit/includes/utils/MWCryptHashTest.php

index ef455b4..4865ad5 100644 (file)
@@ -53,7 +53,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
         */
        private function validateHexSortkey( $hexSortkey ) {
                // A hex sortkey has an unbound number of 2 letter pairs
-               return preg_match( '/^(?:[a-fA-F0-9]{2})*$/', $hexSortkey );
+               return preg_match( '/^(?:[a-fA-F0-9]{2})*$/D', $hexSortkey );
        }
 
        /**
@@ -138,8 +138,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
                                // Add a WHERE clause for sortkey and from
                                $this->dieContinueUsageIf( !$this->validateHexSortkey( $cont[1] ) );
-                               // pack( "H*", $foo ) is used to convert hex back to binary
-                               $escSortkey = $this->getDB()->addQuotes( pack( 'H*', $cont[1] ) );
+                               $escSortkey = $this->getDB()->addQuotes( hex2bin( $cont[1] ) );
                                $from = intval( $cont[2] );
                                $op = $dir == 'newer' ? '>' : '<';
                                // $contWhere is used further down
@@ -156,7 +155,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        if ( !$this->validateHexSortkey( $params['starthexsortkey'] ) ) {
                                                $this->dieUsage( 'The starthexsortkey provided is not valid', 'bad_starthexsortkey' );
                                        }
-                                       $startsortkey = pack( 'H*', $params['starthexsortkey'] );
+                                       $startsortkey = hex2bin( $params['starthexsortkey'] );
                                } else {
                                        $startsortkey = $params['startsortkey'];
                                }
@@ -166,7 +165,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        if ( !$this->validateHexSortkey( $params['endhexsortkey'] ) ) {
                                                $this->dieUsage( 'The endhexsortkey provided is not valid', 'bad_endhexsortkey' );
                                        }
-                                       $endsortkey = pack( 'H*', $params['endhexsortkey'] );
+                                       $endsortkey = hex2bin( $params['endhexsortkey'] );
                                } else {
                                        $endsortkey = $params['endsortkey'];
                                }
index 5dc0498..17442b8 100644 (file)
@@ -28,10 +28,10 @@ class MWCryptHKDFTest extends MediaWikiTestCase {
         * @dataProvider providerRfc5869
         */
        public function testRfc5869( $hash, $ikm, $salt, $info, $L, $prk, $okm ) {
-               $ikm = pack( 'H*', $ikm );
-               $salt = pack( 'H*', $salt );
-               $info = pack( 'H*', $info );
-               $okm = pack( 'H*', $okm );
+               $ikm = hex2bin( $ikm );
+               $salt = hex2bin( $salt );
+               $info = hex2bin( $info );
+               $okm = hex2bin( $okm );
                $result = MWCryptHKDF::HKDF( $hash, $ikm, $salt, $info, $L );
                $this->assertEquals( $okm, $result );
        }
index ad54e2f..4c85c3d 100644 (file)
@@ -26,7 +26,7 @@ class MWCryptHashTest extends MediaWikiTestCase {
                // @codingStandardsIgnoreEnd
 
                $this->assertEquals(
-                       pack( 'H*', $hash ),
+                       hex2bin( $hash ),
                        MWCryptHash::hash( $data ),
                        'Raw hash'
                );
@@ -49,7 +49,7 @@ class MWCryptHashTest extends MediaWikiTestCase {
                // @codingStandardsIgnoreEnd
 
                $this->assertEquals(
-                       pack( 'H*', $hash ),
+                       hex2bin( $hash ),
                        MWCryptHash::hmac( $data, $key ),
                        'Raw hmac'
                );