/home/mip/mip/public/img/credit/datatables/Zip64.tar
EndOfCentralDirectoryTest.php000064400000003413151521003360012303 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Test\Zip64;

use PHPUnit\Framework\TestCase;
use ZipStream\Zip64\EndOfCentralDirectory;

class EndOfCentralDirectoryTest extends TestCase
{
    public function testSerializesCorrectly(): void
    {
        $descriptor = EndOfCentralDirectory::generate(
            versionMadeBy: 0x3333,
            versionNeededToExtract: 0x4444,
            numberOfThisDisk: 0x55555555,
            numberOfTheDiskWithCentralDirectoryStart: 0x66666666,
            numberOfCentralDirectoryEntriesOnThisDisk: (0x77777777 << 32) + 0x88888888,
            numberOfCentralDirectoryEntries: (0x99999999 << 32) + 0xAAAAAAAA,
            sizeOfCentralDirectory: (0xBBBBBBBB << 32) + 0xCCCCCCCC,
            centralDirectoryStartOffsetOnDisk: (0xDDDDDDDD << 32) + 0xEEEEEEEE,
            extensibleDataSector: 'foo',
        );

        $this->assertSame(
            bin2hex($descriptor),
            '504b0606' . // 4 bytes;zip64 end of central dir signature - 0x06064b50
            '2f00000000000000' . // 8 bytes; size of zip64 end of central directory record
            '3333' . // 2 bytes; version made by
            '4444' . // 2 bytes; version needed to extract
            '55555555' . // 4 bytes; number of this disk
            '66666666' . // 4 bytes; number of the disk with the start of the central directory
            '8888888877777777' . // 8 bytes; total number of entries in the central directory on this disk
            'aaaaaaaa99999999' . // 8 bytes; total number of entries in the central directory
            'ccccccccbbbbbbbb' . // 8 bytes; size of the central directory
            'eeeeeeeedddddddd' . // 8 bytes; offset of start of central directory with respect to the starting disk number
            bin2hex('foo')
        );
    }
}
EndOfCentralDirectoryLocatorTest.php000064400000001730151521003360013627 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Test\Zip64;

use PHPUnit\Framework\TestCase;
use ZipStream\Zip64\EndOfCentralDirectoryLocator;

class EndOfCentralDirectoryLocatorTest extends TestCase
{
    public function testSerializesCorrectly(): void
    {
        $descriptor = EndOfCentralDirectoryLocator::generate(
            numberOfTheDiskWithZip64CentralDirectoryStart: 0x11111111,
            zip64centralDirectoryStartOffsetOnDisk: (0x22222222 << 32) + 0x33333333,
            totalNumberOfDisks: 0x44444444,
        );

        $this->assertSame(
            bin2hex($descriptor),
            '504b0607' . // 4 bytes; zip64 end of central dir locator signature - 0x07064b50
            '11111111' . // 4 bytes; number of the disk with the start of the zip64 end of central directory
            '3333333322222222' . // 28 bytes; relative offset of the zip64 end of central directory record
            '44444444' // 4 bytes;total number of disks
        );
    }
}
ExtendedInformationExtraFieldTest.php000064400000002577151521003360014042 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Test\Zip64;

use PHPUnit\Framework\TestCase;
use ZipStream\Zip64\ExtendedInformationExtraField;

class ExtendedInformationExtraFieldTest extends TestCase
{
    public function testSerializesCorrectly(): void
    {
        $extraField = ExtendedInformationExtraField::generate(
            originalSize: (0x77777777 << 32) + 0x66666666,
            compressedSize: (0x99999999 << 32) + 0x88888888,
            relativeHeaderOffset: (0x22222222 << 32) + 0x11111111,
            diskStartNumber: 0x33333333,
        );

        $this->assertSame(
            bin2hex($extraField),
            '0100' . // 2 bytes; Tag for this "extra" block type
            '1c00' . // 2 bytes; Size of this "extra" block
            '6666666677777777' . // 8 bytes; Original uncompressed file size
            '8888888899999999' . // 8 bytes; Size of compressed data
            '1111111122222222' . // 8 bytes; Offset of local header record
            '33333333' // 4 bytes; Number of the disk on which this file starts
        );
    }

    public function testSerializesEmptyCorrectly(): void
    {
        $extraField = ExtendedInformationExtraField::generate();

        $this->assertSame(
            bin2hex($extraField),
            '0100' . // 2 bytes; Tag for this "extra" block type
            '0000' // 2 bytes; Size of this "extra" block
        );
    }
}
DataDescriptorTest.php000064400000001465151521003360011027 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Test\Zip64;

use PHPUnit\Framework\TestCase;
use ZipStream\Zip64\DataDescriptor;

class DataDescriptorTest extends TestCase
{
    public function testSerializesCorrectly(): void
    {
        $descriptor = DataDescriptor::generate(
            crc32UncompressedData: 0x11111111,
            compressedSize: (0x77777777 << 32) +  0x66666666,
            uncompressedSize: (0x99999999 << 32) + 0x88888888,
        );

        $this->assertSame(
            bin2hex($descriptor),
            '504b0708' . // 4 bytes; Optional data descriptor signature = 0x08074b50
            '11111111' . // 4 bytes; CRC-32 of uncompressed data
            '6666666677777777' . // 8 bytes; Compressed size
            '8888888899999999' // 8 bytes; Uncompressed size
        );
    }
}
EndOfCentralDirectoryLocator.php000064400000001451151521130330012765 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Zip64;

use ZipStream\PackField;

/**
 * @internal
 */
abstract class EndOfCentralDirectoryLocator
{
    private const SIGNATURE = 0x07064b50;

    public static function generate(
        int $numberOfTheDiskWithZip64CentralDirectoryStart,
        int $zip64centralDirectoryStartOffsetOnDisk,
        int $totalNumberOfDisks,
    ): string {
        /** @psalm-suppress MixedArgument */
        return PackField::pack(
            new PackField(format: 'V', value: static::SIGNATURE),
            new PackField(format: 'V', value: $numberOfTheDiskWithZip64CentralDirectoryStart),
            new PackField(format: 'P', value: $zip64centralDirectoryStartOffsetOnDisk),
            new PackField(format: 'V', value: $totalNumberOfDisks),
        );
    }
}
EndOfCentralDirectory.php000064400000003046151521130330011443 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Zip64;

use ZipStream\PackField;

/**
 * @internal
 */
abstract class EndOfCentralDirectory
{
    private const SIGNATURE = 0x06064b50;

    public static function generate(
        int $versionMadeBy,
        int $versionNeededToExtract,
        int $numberOfThisDisk,
        int $numberOfTheDiskWithCentralDirectoryStart,
        int $numberOfCentralDirectoryEntriesOnThisDisk,
        int $numberOfCentralDirectoryEntries,
        int $sizeOfCentralDirectory,
        int $centralDirectoryStartOffsetOnDisk,
        string $extensibleDataSector,
    ): string {
        $recordSize = 44 + strlen($extensibleDataSector); // (length of block - 12) = 44;

        /** @psalm-suppress MixedArgument */
        return PackField::pack(
            new PackField(format: 'V', value: static::SIGNATURE),
            new PackField(format: 'P', value: $recordSize),
            new PackField(format: 'v', value: $versionMadeBy),
            new PackField(format: 'v', value: $versionNeededToExtract),
            new PackField(format: 'V', value: $numberOfThisDisk),
            new PackField(format: 'V', value: $numberOfTheDiskWithCentralDirectoryStart),
            new PackField(format: 'P', value: $numberOfCentralDirectoryEntriesOnThisDisk),
            new PackField(format: 'P', value: $numberOfCentralDirectoryEntries),
            new PackField(format: 'P', value: $sizeOfCentralDirectory),
            new PackField(format: 'P', value: $centralDirectoryStartOffsetOnDisk),
        ) . $extensibleDataSector;
    }
}
DataDescriptor.php000064400000001210151521130330010151 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Zip64;

use ZipStream\PackField;

/**
 * @internal
 */
abstract class DataDescriptor
{
    private const SIGNATURE = 0x08074b50;

    public static function generate(
        int $crc32UncompressedData,
        int $compressedSize,
        int $uncompressedSize,
    ): string {
        return PackField::pack(
            new PackField(format: 'V', value: self::SIGNATURE),
            new PackField(format: 'V', value: $crc32UncompressedData),
            new PackField(format: 'P', value: $compressedSize),
            new PackField(format: 'P', value: $uncompressedSize),
        );
    }
}
ExtendedInformationExtraField.php000064400000002536151521130330013173 0ustar00<?php

declare(strict_types=1);

namespace ZipStream\Zip64;

use ZipStream\PackField;

/**
 * @internal
 */
abstract class ExtendedInformationExtraField
{
    private const TAG = 0x0001;

    public static function generate(
        ?int $originalSize = null,
        ?int $compressedSize = null,
        ?int $relativeHeaderOffset = null,
        ?int $diskStartNumber = null,
    ): string {
        return PackField::pack(
            new PackField(format: 'v', value: self::TAG),
            new PackField(
                format: 'v',
                value:
                    ($originalSize === null ? 0 : 8) +
                    ($compressedSize === null ? 0 : 8) +
                    ($relativeHeaderOffset === null ? 0 : 8) +
                    ($diskStartNumber === null ? 0 : 4)
            ),
            ...($originalSize === null ? [] : [
                new PackField(format: 'P', value: $originalSize),
            ]),
            ...($compressedSize === null ? [] : [
                new PackField(format: 'P', value: $compressedSize),
            ]),
            ...($relativeHeaderOffset === null ? [] : [
                new PackField(format: 'P', value: $relativeHeaderOffset),
            ]),
            ...($diskStartNumber === null ? [] : [
                new PackField(format: 'V', value: $diskStartNumber),
            ]),
        );
    }
}