cryptal  latest
Cryptography Abstraction Layer
Binify.php
1 <?php
2 
4 
5 class Binify extends \php_user_filter
6 {
7  protected $buffer;
8 
9  public function onCreate()
10  {
11  $this->buffer = '';
12  }
13 
14  public function filter($in, $out, &$consumed, $closing)
15  {
16  $res = PSFS_FEED_ME;
17  while (true) {
18  $bucket = stream_bucket_make_writeable($in);
19  if ($bucket) {
20  $this->buffer .= $bucket->data;
21  }
22 
23 
24  $available = strlen($this->buffer);
25  if ($available >= 2) {
26  $consume = $available - ($available % 2);
27  $data = substr($this->buffer, 0, $consume);
28 
29  if (strspn($data, '1234567890abcdefABCDEF') !== $consume) {
30  // The input contains non-hexadecimal data.
31  throw new \RuntimeException('Invalid data in input');
32  }
33 
34  $outBucket = stream_bucket_new($this->stream, pack('H*', $data));
35  stream_bucket_append($out, $outBucket);
36 
37  $this->buffer = (string) substr($this->buffer, $consume);
38  $consumed += $consume;
39  $res = PSFS_PASS_ON;
40  }
41 
42  if (!$bucket) {
43  if ($closing && $this->buffer !== '') {
44  // The input contains an odd number of bytes and is thus invalid.
45  throw new \RuntimeException('Odd number of bytes in input');
46  }
47 
48  return $res;
49  }
50  }
51  }
52 }