chemezov / i2crm-test
Requires
- php: >=8.1
- guzzlehttp/psr7: 3.0.x-dev
- phpseclib/phpseclib: dev-master
This package is auto-updated.
Last update: 2025-03-03 21:51:18 UTC
README
Требуется реализовать декораторы для PSR-7 потоков, которые будут зашифровывать и расшифровывать их по алгоритмам, используемым WhatsApp. Текстовые описания алгоритмов можно будет найти ниже.
Код необходимо оформить в виде пакета для composer. От реализации ожидается промышленное качество кода.
Тестовые файлы можно найти в папке samples
:
*.original
- оригинальный файл;*.key
- ключ для шифрования (дешифрования) -mediaKey
;*.encrypted
- зашифрованный файл;*.sidecar
- информация для стриминга.
В качестве задания со звёздочкой можно реализовать генерацию информации для стриминга. Эта генерация не должна делать дополнительных чтений из потока-исходника.
Шифрование
- Generate your own
mediaKey
, which needs to be 32 bytes, or use an existing one when available. - Expand it to 112 bytes using HKDF with SHA-256 and type-specific application info (see below). Call this value
mediaKeyExpanded
. - Split
mediaKeyExpanded
into:iv
:mediaKeyExpanded[:16]
cipherKey
:mediaKeyExpanded[16:48]
macKey
:mediaKeyExpanded[48:80]
refKey
:mediaKeyExpanded[80:]
(not used)
- Encrypt the file with AES-CBC using
cipherKey
andiv
, pad it and call itenc
. - Sign
iv + enc
withmacKey
using HMAC SHA-256 and store the first 10 bytes of the hash asmac
. - Append
mac
to theenc
to obtain the result.
Дешифрование
- Obtain
mediaKey
. - Expand it to 112 bytes using HKDF with SHA-256 and type-specific application info (see below). Call this value
mediaKeyExpanded
. - Split
mediaKeyExpanded
into:iv
:mediaKeyExpanded[:16]
cipherKey
:mediaKeyExpanded[16:48]
macKey
:mediaKeyExpanded[48:80]
refKey
:mediaKeyExpanded[80:]
(not used)
- Obtain encrypted media data and split it into:
file
:mediaData[:-10]
mac
:mediaData[-10:]
- Validate media data with HMAC by signing
iv + file
withmacKey
using SHA-256. Take in mind thatmac
is truncated to 10 bytes, so you should compare only the first 10 bytes. - Decrypt
file
with AES-CBC usingcipherKey
andiv
, and unpad it to obtain the result.
Информационные строки для HKDF
HKDF позволяет указывать информационные строки, специфичные для контекста/приложения. В данном случае контекстом является тип файла, для каждого из которых своя информационная строка:
Media Type | Application Info |
---|---|
IMAGE | WhatsApp Image Keys |
VIDEO | WhatsApp Video Keys |
AUDIO | WhatsApp Audio Keys |
DOCUMENT | WhatsApp Document Keys |
Информация для стриминга
This step is required only for streamable media, e.g. video and audio.
As CBC mode allows to decrypt a data from random offset (block-size aligned), it is possible to play and seek the media without the need to fully download it.
That said, we have to generate a sidecar
.
Do it by signing every [n*64K, (n+1)*64K+16]
chunk with macKey
, truncating the result to the first 10 bytes.
Then combine everything in one piece.
Полезные пакеты
- jsq/psr7-stream-encryption - декораторы для шифрования, дешифрования и хеширования;
- guzzlehttp/psr7 - одна из реализаций PSR-7.