88 size_t keylen = strlen(optstr);
89 if (keylen % 2 == 1) {
90 SCLogError(
"XOR transform key's length must be an even number");
91 DetectTransformXorFree(
de_ctx, pxd);
94 if (keylen / 2 > UINT8_MAX) {
95 SCLogError(
"Key length too big for XOR transform");
96 DetectTransformXorFree(
de_ctx, pxd);
99 pxd->
length = (uint8_t)(keylen / 2);
101 if (pxd->
key == NULL) {
103 DetectTransformXorFree(
de_ctx, pxd);
106 for (
size_t i = 0; i < keylen / 2; i++) {
107 if ((isxdigit(optstr[2 * i])) && (isxdigit(optstr[2 * i + 1]))) {
108 pxd->
key[i] = (uint8_t)((optstr[2 * i] >=
'A' ? ((optstr[2 * i] & 0xdf) -
'A') + 10
109 : (optstr[2 * i] -
'0'))
111 pxd->
key[i] |= (optstr[2 * i + 1] >=
'A' ? ((optstr[2 * i + 1] & 0xdf) -
'A') + 10
112 : (optstr[2 * i + 1] -
'0'));
114 SCLogError(
"XOR transform key must be hexadecimal characters only");
115 DetectTransformXorFree(
de_ctx, pxd);
122 DetectTransformXorFree(
de_ctx, pxd);
130 const uint8_t *input = buffer->
inspect;
133 if (input_len == 0) {
136 uint8_t output[input_len];
138 for (uint32_t i = 0; i < input_len; i++) {
139 output[i] = input[i] ^ pxd->
key[i % pxd->
length];