File: xormask.pyx

package info (click to toggle)
python-wsaccel 0.6.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 160 kB
  • sloc: python: 370; makefile: 41; ansic: 16
file content (57 lines) | stat: -rw-r--r-- 1,241 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from cpython.buffer cimport *
from cpython.bytes cimport *

cdef class XorMaskerNull:

    cdef Py_ssize_t ptr

    def __init__(self, mask=None):
        self.ptr = 0

    def pointer(self):
        return self.ptr

    def reset(self):
        self.ptr = 0

    def process(self, data):
        self.ptr += len(data)
        return data


cdef class XorMaskerSimple:

    cdef Py_ssize_t ptr
    cdef char mask[4]

    def __init__(self, const unsigned char[:] mask):
        self.ptr = 0
        if len(mask) != 4:
            raise ValueError("mask should be 4byte.")
        self.mask[0] = mask[0]
        self.mask[1] = mask[1]
        self.mask[2] = mask[2]
        self.mask[3] = mask[3]

    def pointer(self):
        return self.ptr

    def reset(self):
        self.ptr = 0

    def process(self, const unsigned char[:] data):
        cdef Py_ssize_t dlen = len(data)
        cdef Py_ssize_t i
        cdef char* out

        payload = PyBytes_FromStringAndSize(NULL, dlen)
        out = <char*>PyBytes_AsString(payload)

        for i in range(dlen):
            out[i] = data[i] ^ self.mask[self.ptr & 3]
            self.ptr += 1
        return payload


def createXorMasker(mask, len=None):
    return XorMaskerSimple(mask)