IoObject *IoZlibEncoder_process(IoZlibEncoder *self, IoObject *locals, IoMessage *m) { /*doc ZlibEncoder process Process the inputBuffer and appends the result to the outputBuffer. The processed inputBuffer is empties except for the spare bytes at the end which don't fit into a cipher block. */ z_stream *strm = DATA(self)->strm; UArray *input = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("inputBuffer")); UArray *output = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("outputBuffer")); uint8_t *inputBytes = (uint8_t *)UArray_bytes(input); size_t inputSize = UArray_sizeInBytes(input); if (inputSize) { int ret; size_t oldOutputSize = UArray_size(output); size_t outputRoom = (inputSize * 2); uint8_t *outputBytes; UArray_setSize_(output, oldOutputSize + outputRoom); outputBytes = (uint8_t *)UArray_bytes(output) + oldOutputSize; strm->next_in = inputBytes; strm->avail_in = inputSize; strm->next_out = outputBytes; strm->avail_out = outputRoom; ret = deflate(strm, Z_NO_FLUSH); //assert(ret != Z_STREAM_ERROR); { size_t outputSize = outputRoom - strm->avail_out; UArray_setSize_(output, oldOutputSize + outputSize); } UArray_setSize_(input, 0); } return self; }
IoObject *IoLZOEncoder_process(IoLZOEncoder *self, IoObject *locals, IoMessage *m) { /*doc LZOEncoder process Process the inputBuffer and appends the result to the outputBuffer. The processed inputBuffer is emptied except for the spare bytes at the end which don't fit into a cipher block. */ lzo_align_t __LZO_MMODEL *wrkmem = DATA(self)->wrkmem; UArray *input = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("inputBuffer")); UArray *output = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("outputBuffer")); unsigned char *inputBytes = (uint8_t *)UArray_bytes(input); size_t inputSize = UArray_sizeInBytes(input); if (inputSize) { int r; size_t oldOutputSize = UArray_size(output); lzo_uint outputRoom = (inputSize + inputSize / 64 + 16 + 3); unsigned char *outputBytes; UArray_setSize_(output, oldOutputSize + outputRoom); outputBytes = (uint8_t *)UArray_bytes(output) + oldOutputSize; r = lzo1x_1_compress(inputBytes, inputSize, outputBytes, &outputRoom, wrkmem); // r = lzo1x_decompress(in, in_len, out, &out_len, wrkmem); if (r != LZO_E_OK) { IoState_error_(IOSTATE, m, "LZO compression failed: %d", r); } UArray_setSize_(output, oldOutputSize + outputRoom); UArray_setSize_(input, 0); } return self; }
IoObject *IoBlowfish_process(IoBlowfish *self, IoObject *locals, IoMessage *m) { /*doc Blowfish process Process the inputBuffer and appends the result to the outputBuffer. The processed inputBuffer is empties except for the spare bytes at the end which don't fit into a cipher block. */ blowfish_ctx *context = &(DATA(self)->context); int isEncrypting = DATA(self)->isEncrypting; UArray *input = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("inputBuffer")); UArray *output = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("outputBuffer")); const unsigned char *inputBytes = (uint8_t *)UArray_bytes(input); size_t inputSize = UArray_sizeInBytes(input); unsigned long lr[2]; size_t i, runs = inputSize / sizeof(lr); for (i = 0; i < runs; i ++) { memcpy(lr, inputBytes, sizeof(lr)); inputBytes += sizeof(lr); if (isEncrypting) { blowfish_encrypt(context, &lr[0], &lr[1]); } else { blowfish_decrypt(context, &lr[0], &lr[1]); } UArray_appendBytes_size_(output, (unsigned char *)&lr, sizeof(lr)); } UArray_removeRange(input, 0, runs * sizeof(lr)); return self; }
IoObject *IoBlowfish_endProcessing(IoBlowfish *self, IoObject *locals, IoMessage *m) { /*doc Blowfish endProcessing Finish processing remaining bytes of inputBuffer. */ blowfish_ctx *context = &(DATA(self)->context); unsigned long lr[2]; IoBlowfish_process(self, locals, m); // process the full blocks first { int isEncrypting = DATA(self)->isEncrypting; UArray *input = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("inputBuffer")); UArray *output = IoObject_rawGetMutableUArraySlot(self, locals, m, IOSYMBOL("outputBuffer")); IOASSERT(UArray_sizeInBytes(input) < sizeof(lr), "internal error - too many bytes left in inputBuffer"); memset(lr, 0, sizeof(lr)); memcpy(lr, (uint8_t *)UArray_bytes(input), UArray_sizeInBytes(input)); if (isEncrypting) { blowfish_encrypt(context, &lr[0], &lr[1]); } else { blowfish_decrypt(context, &lr[0], &lr[1]); } UArray_appendBytes_size_(output, (unsigned char *)&lr, sizeof(lr)); UArray_setSize_(input, 0); } return self; }