immunio 1.0.12 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15b0dfa60eb5dc43c942e4d0329d592343e6c4cb
4
- data.tar.gz: 74713b51655c5ab55152a5b671ad99c377fe6bdd
3
+ metadata.gz: d5de4fe5e22b12a72cb97953b87a947c447f0803
4
+ data.tar.gz: 3c004b6a90391a8b23fe5d54b48bf770adbd4c01
5
5
  SHA512:
6
- metadata.gz: 0210c5e5ecea34b100d68becaab8bd150a3e4399403297669ea2ce967a393a26c8c1f5cfce03fbede1fcb38954b43beba6a229c2af3ad7441b9f65197fa54129
7
- data.tar.gz: c5e51ce49246eedb93a88a79ba9599c1e97f2c527b6a7a90f7ad570b1edd336f5e6c0c778c72e12a91cee5e3ea245c2b1c7f32c52534ff8544293893554e39d2
6
+ metadata.gz: 5a94e59b6b6e0defbdb18aa08b955de7ce3700c053b2f8f247db61931dd67ff788379584c791503d844d47c220e394aa93e753d7f40953220683199e6a05be1c
7
+ data.tar.gz: 83ad5fc59f7bd320e2881f11bcbdad261c21a2734645921c4df4ab58e5849b167c0d6e2905d5eb242c6fee76711bb9d215b7ba1a2c37fd6ecfe4c65bb3b00868
@@ -1,5 +1,5 @@
1
1
  module Immunio
2
2
  AGENT_TYPE = "agent-ruby"
3
- VERSION = "1.0.12"
3
+ VERSION = "1.0.13"
4
4
  VM_VERSION = "2.2.0"
5
5
  end
data/lua-hooks/Makefile CHANGED
@@ -20,8 +20,8 @@ LUA_SRC = \
20
20
  lib/date.lua \
21
21
  lib/defence.lua \
22
22
  lib/diag.lua \
23
- lib/escape.lua \
24
23
  lib/extensions.lua \
24
+ lib/hmac.lua \
25
25
  lib/hooks.lua \
26
26
  lib/idn.lua \
27
27
  lib/lexgraph.lua \
@@ -59,12 +59,15 @@ LUA_SRC = \
59
59
  lib/hooks/http_response_start.lua \
60
60
  lib/hooks/should_report.lua \
61
61
  lib/hooks/sql_execute.lua \
62
- lib/hooks/template_render_done.lua
62
+ lib/hooks/template_render_done.lua \
63
+ lib/hooks/xss/escape.lua \
64
+ lib/hooks/xss/escape_js.lua
63
65
 
64
66
  OBJ = ${SRC:.c=.o}
65
67
 
66
68
  SHA1OBJ = ext/sha1/sha1.o
67
- OBJ = ${SRC:.c=.o} ${SHA1OBJ}
69
+ SHA2OBJ = ext/sha2/sha256.o
70
+ OBJ = ${SRC:.c=.o} ${SHA1OBJ} ${SHA2OBJ}
68
71
 
69
72
  # Library archive. Used for compiling along agent bindings.
70
73
  SO_OUT = libimmunio.so
@@ -99,7 +102,7 @@ endif
99
102
  # Build lua, run tests, and create hooks archive
100
103
  all: ${CLI} ${INIT_HOOK} ${HOOKS_TARBALL} ${HOOKS_SRCS_TARBALL}
101
104
 
102
- .c.o:
105
+ %.o: %.c
103
106
  MACOSX_DEPLOYMENT_TARGET="10.9" ${CC} ${CFLAGS} -c ${INCS} -o $@ $<
104
107
 
105
108
  # There is a huge performance advantage compiling sha1.o with just -O
@@ -107,6 +110,9 @@ all: ${CLI} ${INIT_HOOK} ${HOOKS_TARBALL} ${HOOKS_SRCS_TARBALL}
107
110
  ${SHA1OBJ}:
108
111
  ${CC} -O -c ${INCS} -o ${SHA1OBJ} ${SHA1OBJ:.o=.c}
109
112
 
113
+ ${SHA2OBJ}:
114
+ ${CC} -O -c ${INCS} -o ${SHA2OBJ} ${SHA2OBJ:.o=.c}
115
+
110
116
  ${SO_OUT}: ${OBJ} ${LUAJIT_OBJ}
111
117
  ${CC} -shared ${CFLAGS} ${LIBS} -o $@ -lc $^
112
118
 
@@ -121,7 +127,7 @@ ${LUAJIT_OBJ}:
121
127
 
122
128
  # Build lua executable for testing and compilation
123
129
  # Seperate compilation as we need the LUA_UNSAFE_MODE flag set...
124
- ${CLI}: ${CLI_SRC} ${LUAJIT_OBJ} ${SHA1OBJ}
130
+ ${CLI}: ${CLI_SRC} ${LUAJIT_OBJ} ${SHA1OBJ} ${SHA2OBJ}
125
131
  ${CC} ${CFLAGS} -DLUA_UNSAFE_MODE ${INCS} -o $@ $^ ${LIBS}
126
132
 
127
133
  # Concatenate init hooks into one __init__.lua hook with two newlines in between
@@ -146,7 +152,7 @@ cleanhooks:
146
152
  rm -f build/*.lua
147
153
 
148
154
  clean: cleanhooks
149
- rm -f ${CLI} ${OBJ} ${SO_OUT} ${A_OUT} ${LUAJIT_OUT} ${SHA1OBJ}
155
+ rm -f ${CLI} ${OBJ} ${SO_OUT} ${A_OUT} ${LUAJIT_OUT} ${SHA1OBJ} ${SHA2OBJ}
150
156
  cd ext/luajit && make clean
151
157
  rm -f test_failed
152
158
  rm -rf build
data/lua-hooks/ext/all.c CHANGED
@@ -16,6 +16,7 @@
16
16
  #include "lua-cmsgpack/lua_cmsgpack.c"
17
17
  #include "lua-snapshot/snapshot.c"
18
18
  #include "sha1/luasha1.c"
19
+ #include "sha2/luasha256.c"
19
20
 
20
21
  static const luaL_Reg lj_lib_load[] = {
21
22
  // Default Lua modules
@@ -44,6 +45,7 @@ static const luaL_Reg lj_lib_load[] = {
44
45
  {LUACMSGPACK_NAME, luaopen_cmsgpack},
45
46
  {"snapshot", luaopen_snapshot},
46
47
  {"sha1", luaopen_sha1},
48
+ {"sha2", luaopen_sha256},
47
49
 
48
50
  { NULL, NULL }
49
51
  };
@@ -1,3 +1,5 @@
1
+ #include <stdlib.h>
2
+
1
3
  #define LUA_LIB
2
4
  #include "lua.h"
3
5
  #include "lauxlib.h"
@@ -5,7 +7,7 @@
5
7
  #include "libinjection.h"
6
8
  #include "libinjection_sqli.h"
7
9
 
8
- #define MAX_FINGERPRINT_SIZE 4096
10
+ #define MAX_FINGERPRINT_STACK_SIZE 4096
9
11
 
10
12
  int sqli(lua_State *L) {
11
13
  sfilter state;
@@ -22,16 +24,31 @@ int sqli(lua_State *L) {
22
24
  }
23
25
 
24
26
  int fingerprint(lua_State *L) {
25
- char result[MAX_FINGERPRINT_SIZE + 1];
27
+ char stack_result[MAX_FINGERPRINT_STACK_SIZE];
28
+ char *result = stack_result;
26
29
  struct libinjection_sqli_state state;
27
30
  size_t slen = 0;
28
31
  const char *input = luaL_checklstring(L, 1, &slen);
29
32
 
30
33
  libinjection_sqli_init(&state, input, slen, 0);
31
34
 
32
- // This is some ugly code, but that's how libinjection works...
35
+ // libinjection tokenizes in a streaming fashion, meaning we won't know until
36
+ // the end of the process how long the resulting string of tokens will be. But
37
+ // we do know that it will be less than or equal to the length of the SQL
38
+ // string.
39
+ //
40
+ // For speed, use stack-allocated fingerprint result strings unless we need
41
+ // more than 4KB.
42
+ if (slen > sizeof(stack_result)) {
43
+ result = malloc(slen + 1);
44
+ if (!result) {
45
+ lua_pushstring(L, ""); // Push something at least...
46
+ return 1;
47
+ }
48
+ }
49
+
33
50
  int fp_idx = 0;
34
- while (fp_idx < (sizeof(result) - 1) && state.pos < state.slen) {
51
+ while (state.pos < state.slen) {
35
52
  libinjection_sqli_tokenize(&state);
36
53
  result[fp_idx++] = state.tokenvec[0].type;
37
54
  }
@@ -39,6 +56,9 @@ int fingerprint(lua_State *L) {
39
56
 
40
57
  lua_pushstring(L, result);
41
58
 
59
+ // If we dynamically allocated the result above, free it
60
+ if (result != stack_result) free(result);
61
+
42
62
  return 1;
43
63
  }
44
64
 
@@ -0,0 +1,75 @@
1
+ #include <stdio.h>
2
+
3
+ #define LUA_LIB
4
+ #include "lua.h"
5
+ #include "lauxlib.h"
6
+
7
+ // Link this program with an external C or x86 compression function
8
+ extern void sha256_compress(uint32_t state[8], const uint8_t block[64]);
9
+
10
+ /* This function is implements the padding and blocking around the SHA2 compression function
11
+ *
12
+ * Copyright (c) 2014 Project Nayuki
13
+ * http://www.nayuki.io/page/fast-sha2-hashes-in-x86-assembly
14
+ */
15
+ static void
16
+ sha256_hash(const uint8_t *message, uint32_t len, uint32_t hash[8]) {
17
+ hash[0] = UINT32_C(0x6A09E667);
18
+ hash[1] = UINT32_C(0xBB67AE85);
19
+ hash[2] = UINT32_C(0x3C6EF372);
20
+ hash[3] = UINT32_C(0xA54FF53A);
21
+ hash[4] = UINT32_C(0x510E527F);
22
+ hash[5] = UINT32_C(0x9B05688C);
23
+ hash[6] = UINT32_C(0x1F83D9AB);
24
+ hash[7] = UINT32_C(0x5BE0CD19);
25
+
26
+ uint32_t i;
27
+ for (i = 0; len - i >= 64; i += 64)
28
+ sha256_compress(hash, message + i);
29
+
30
+ uint8_t block[64];
31
+ uint32_t rem = len - i;
32
+ memcpy(block, message + i, rem);
33
+
34
+ block[rem] = 0x80;
35
+ rem++;
36
+ if (64 - rem >= 8)
37
+ memset(block + rem, 0, 56 - rem);
38
+ else {
39
+ memset(block + rem, 0, 64 - rem);
40
+ sha256_compress(hash, block);
41
+ memset(block, 0, 56);
42
+ }
43
+
44
+ uint64_t longLen = ((uint64_t)len) << 3;
45
+ for (i = 0; i < 8; i++)
46
+ block[64 - 1 - i] = (uint8_t)(longLen >> (i * 8));
47
+ sha256_compress(hash, block);
48
+ }
49
+
50
+ /* Immunio Lua bindings */
51
+
52
+ static int
53
+ lua_sha256(lua_State *L) {
54
+ uint32_t hash[8] = {};
55
+ char buf[65];
56
+ size_t slen = 0;
57
+
58
+ const char *input = luaL_checklstring(L, 1, &slen);
59
+ sha256_hash(input, slen, hash);
60
+ sprintf(buf, "%08x%08x%08x%08x%08x%08x%08x%08x", hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7]);
61
+ lua_pushlstring(L, buf, 64);
62
+ return 1;
63
+ }
64
+
65
+ static const luaL_Reg libsha256[] = {
66
+ {"sha256", lua_sha256},
67
+ {NULL, NULL}
68
+ };
69
+
70
+ int
71
+ luaopen_sha256(lua_State *L) {
72
+ luaL_checkversion(L);
73
+ luaL_register(L, "sha2", libsha256);
74
+ return 1;
75
+ }
@@ -0,0 +1,196 @@
1
+ /*
2
+ * SHA-256 hash in C
3
+ *
4
+ * Copyright (c) 2014 Project Nayuki
5
+ * http://www.nayuki.io/page/fast-sha2-hashes-in-x86-assembly
6
+ *
7
+ * (MIT License)
8
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
9
+ * this software and associated documentation files (the "Software"), to deal in
10
+ * the Software without restriction, including without limitation the rights to
11
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
12
+ * the Software, and to permit persons to whom the Software is furnished to do so,
13
+ * subject to the following conditions:
14
+ * - The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ * - The Software is provided "as is", without warranty of any kind, express or
17
+ * implied, including but not limited to the warranties of merchantability,
18
+ * fitness for a particular purpose and noninfringement. In no event shall the
19
+ * authors or copyright holders be liable for any claim, damages or other
20
+ * liability, whether in an action of contract, tort or otherwise, arising from,
21
+ * out of or in connection with the Software or the use or other dealings in the
22
+ * Software.
23
+ */
24
+
25
+ #include <stdint.h>
26
+
27
+
28
+ void sha256_compress(uint32_t state[8], const uint8_t block[64]) {
29
+ // 32-bit right rotation
30
+ #define ROR(x, i) \
31
+ (((x) << (32 - (i))) | ((x) >> (i)))
32
+
33
+ #define LOADSCHEDULE(i) \
34
+ schedule[i] = \
35
+ (uint32_t)block[i * 4 + 0] << 24 \
36
+ | (uint32_t)block[i * 4 + 1] << 16 \
37
+ | (uint32_t)block[i * 4 + 2] << 8 \
38
+ | (uint32_t)block[i * 4 + 3];
39
+
40
+ #define SCHEDULE(i) \
41
+ schedule[i] = schedule[i - 16] + schedule[i - 7] \
42
+ + (ROR(schedule[i - 15], 7) ^ ROR(schedule[i - 15], 18) ^ (schedule[i - 15] >> 3)) \
43
+ + (ROR(schedule[i - 2], 17) ^ ROR(schedule[i - 2], 19) ^ (schedule[i - 2] >> 10));
44
+
45
+ #define ROUND(a, b, c, d, e, f, g, h, i, k) \
46
+ h += (ROR(e, 6) ^ ROR(e, 11) ^ ROR(e, 25)) + (g ^ (e & (f ^ g))) + UINT32_C(k) + schedule[i]; \
47
+ d += h; \
48
+ h += (ROR(a, 2) ^ ROR(a, 13) ^ ROR(a, 22)) + ((a & (b | c)) | (b & c));
49
+
50
+ uint32_t schedule[64];
51
+ LOADSCHEDULE( 0)
52
+ LOADSCHEDULE( 1)
53
+ LOADSCHEDULE( 2)
54
+ LOADSCHEDULE( 3)
55
+ LOADSCHEDULE( 4)
56
+ LOADSCHEDULE( 5)
57
+ LOADSCHEDULE( 6)
58
+ LOADSCHEDULE( 7)
59
+ LOADSCHEDULE( 8)
60
+ LOADSCHEDULE( 9)
61
+ LOADSCHEDULE(10)
62
+ LOADSCHEDULE(11)
63
+ LOADSCHEDULE(12)
64
+ LOADSCHEDULE(13)
65
+ LOADSCHEDULE(14)
66
+ LOADSCHEDULE(15)
67
+ SCHEDULE(16)
68
+ SCHEDULE(17)
69
+ SCHEDULE(18)
70
+ SCHEDULE(19)
71
+ SCHEDULE(20)
72
+ SCHEDULE(21)
73
+ SCHEDULE(22)
74
+ SCHEDULE(23)
75
+ SCHEDULE(24)
76
+ SCHEDULE(25)
77
+ SCHEDULE(26)
78
+ SCHEDULE(27)
79
+ SCHEDULE(28)
80
+ SCHEDULE(29)
81
+ SCHEDULE(30)
82
+ SCHEDULE(31)
83
+ SCHEDULE(32)
84
+ SCHEDULE(33)
85
+ SCHEDULE(34)
86
+ SCHEDULE(35)
87
+ SCHEDULE(36)
88
+ SCHEDULE(37)
89
+ SCHEDULE(38)
90
+ SCHEDULE(39)
91
+ SCHEDULE(40)
92
+ SCHEDULE(41)
93
+ SCHEDULE(42)
94
+ SCHEDULE(43)
95
+ SCHEDULE(44)
96
+ SCHEDULE(45)
97
+ SCHEDULE(46)
98
+ SCHEDULE(47)
99
+ SCHEDULE(48)
100
+ SCHEDULE(49)
101
+ SCHEDULE(50)
102
+ SCHEDULE(51)
103
+ SCHEDULE(52)
104
+ SCHEDULE(53)
105
+ SCHEDULE(54)
106
+ SCHEDULE(55)
107
+ SCHEDULE(56)
108
+ SCHEDULE(57)
109
+ SCHEDULE(58)
110
+ SCHEDULE(59)
111
+ SCHEDULE(60)
112
+ SCHEDULE(61)
113
+ SCHEDULE(62)
114
+ SCHEDULE(63)
115
+
116
+ uint32_t a = state[0];
117
+ uint32_t b = state[1];
118
+ uint32_t c = state[2];
119
+ uint32_t d = state[3];
120
+ uint32_t e = state[4];
121
+ uint32_t f = state[5];
122
+ uint32_t g = state[6];
123
+ uint32_t h = state[7];
124
+ ROUND(a, b, c, d, e, f, g, h, 0, 0x428A2F98)
125
+ ROUND(h, a, b, c, d, e, f, g, 1, 0x71374491)
126
+ ROUND(g, h, a, b, c, d, e, f, 2, 0xB5C0FBCF)
127
+ ROUND(f, g, h, a, b, c, d, e, 3, 0xE9B5DBA5)
128
+ ROUND(e, f, g, h, a, b, c, d, 4, 0x3956C25B)
129
+ ROUND(d, e, f, g, h, a, b, c, 5, 0x59F111F1)
130
+ ROUND(c, d, e, f, g, h, a, b, 6, 0x923F82A4)
131
+ ROUND(b, c, d, e, f, g, h, a, 7, 0xAB1C5ED5)
132
+ ROUND(a, b, c, d, e, f, g, h, 8, 0xD807AA98)
133
+ ROUND(h, a, b, c, d, e, f, g, 9, 0x12835B01)
134
+ ROUND(g, h, a, b, c, d, e, f, 10, 0x243185BE)
135
+ ROUND(f, g, h, a, b, c, d, e, 11, 0x550C7DC3)
136
+ ROUND(e, f, g, h, a, b, c, d, 12, 0x72BE5D74)
137
+ ROUND(d, e, f, g, h, a, b, c, 13, 0x80DEB1FE)
138
+ ROUND(c, d, e, f, g, h, a, b, 14, 0x9BDC06A7)
139
+ ROUND(b, c, d, e, f, g, h, a, 15, 0xC19BF174)
140
+ ROUND(a, b, c, d, e, f, g, h, 16, 0xE49B69C1)
141
+ ROUND(h, a, b, c, d, e, f, g, 17, 0xEFBE4786)
142
+ ROUND(g, h, a, b, c, d, e, f, 18, 0x0FC19DC6)
143
+ ROUND(f, g, h, a, b, c, d, e, 19, 0x240CA1CC)
144
+ ROUND(e, f, g, h, a, b, c, d, 20, 0x2DE92C6F)
145
+ ROUND(d, e, f, g, h, a, b, c, 21, 0x4A7484AA)
146
+ ROUND(c, d, e, f, g, h, a, b, 22, 0x5CB0A9DC)
147
+ ROUND(b, c, d, e, f, g, h, a, 23, 0x76F988DA)
148
+ ROUND(a, b, c, d, e, f, g, h, 24, 0x983E5152)
149
+ ROUND(h, a, b, c, d, e, f, g, 25, 0xA831C66D)
150
+ ROUND(g, h, a, b, c, d, e, f, 26, 0xB00327C8)
151
+ ROUND(f, g, h, a, b, c, d, e, 27, 0xBF597FC7)
152
+ ROUND(e, f, g, h, a, b, c, d, 28, 0xC6E00BF3)
153
+ ROUND(d, e, f, g, h, a, b, c, 29, 0xD5A79147)
154
+ ROUND(c, d, e, f, g, h, a, b, 30, 0x06CA6351)
155
+ ROUND(b, c, d, e, f, g, h, a, 31, 0x14292967)
156
+ ROUND(a, b, c, d, e, f, g, h, 32, 0x27B70A85)
157
+ ROUND(h, a, b, c, d, e, f, g, 33, 0x2E1B2138)
158
+ ROUND(g, h, a, b, c, d, e, f, 34, 0x4D2C6DFC)
159
+ ROUND(f, g, h, a, b, c, d, e, 35, 0x53380D13)
160
+ ROUND(e, f, g, h, a, b, c, d, 36, 0x650A7354)
161
+ ROUND(d, e, f, g, h, a, b, c, 37, 0x766A0ABB)
162
+ ROUND(c, d, e, f, g, h, a, b, 38, 0x81C2C92E)
163
+ ROUND(b, c, d, e, f, g, h, a, 39, 0x92722C85)
164
+ ROUND(a, b, c, d, e, f, g, h, 40, 0xA2BFE8A1)
165
+ ROUND(h, a, b, c, d, e, f, g, 41, 0xA81A664B)
166
+ ROUND(g, h, a, b, c, d, e, f, 42, 0xC24B8B70)
167
+ ROUND(f, g, h, a, b, c, d, e, 43, 0xC76C51A3)
168
+ ROUND(e, f, g, h, a, b, c, d, 44, 0xD192E819)
169
+ ROUND(d, e, f, g, h, a, b, c, 45, 0xD6990624)
170
+ ROUND(c, d, e, f, g, h, a, b, 46, 0xF40E3585)
171
+ ROUND(b, c, d, e, f, g, h, a, 47, 0x106AA070)
172
+ ROUND(a, b, c, d, e, f, g, h, 48, 0x19A4C116)
173
+ ROUND(h, a, b, c, d, e, f, g, 49, 0x1E376C08)
174
+ ROUND(g, h, a, b, c, d, e, f, 50, 0x2748774C)
175
+ ROUND(f, g, h, a, b, c, d, e, 51, 0x34B0BCB5)
176
+ ROUND(e, f, g, h, a, b, c, d, 52, 0x391C0CB3)
177
+ ROUND(d, e, f, g, h, a, b, c, 53, 0x4ED8AA4A)
178
+ ROUND(c, d, e, f, g, h, a, b, 54, 0x5B9CCA4F)
179
+ ROUND(b, c, d, e, f, g, h, a, 55, 0x682E6FF3)
180
+ ROUND(a, b, c, d, e, f, g, h, 56, 0x748F82EE)
181
+ ROUND(h, a, b, c, d, e, f, g, 57, 0x78A5636F)
182
+ ROUND(g, h, a, b, c, d, e, f, 58, 0x84C87814)
183
+ ROUND(f, g, h, a, b, c, d, e, 59, 0x8CC70208)
184
+ ROUND(e, f, g, h, a, b, c, d, 60, 0x90BEFFFA)
185
+ ROUND(d, e, f, g, h, a, b, c, 61, 0xA4506CEB)
186
+ ROUND(c, d, e, f, g, h, a, b, 62, 0xBEF9A3F7)
187
+ ROUND(b, c, d, e, f, g, h, a, 63, 0xC67178F2)
188
+ state[0] += a;
189
+ state[1] += b;
190
+ state[2] += c;
191
+ state[3] += d;
192
+ state[4] += e;
193
+ state[5] += f;
194
+ state[6] += g;
195
+ state[7] += h;
196
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: immunio
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.12
4
+ version: 1.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Immunio
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-16 00:00:00.000000000 Z
11
+ date: 2016-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -417,6 +417,8 @@ files:
417
417
  - lua-hooks/ext/luautf8/unidata.h
418
418
  - lua-hooks/ext/sha1/luasha1.c
419
419
  - lua-hooks/ext/sha1/sha1.c
420
+ - lua-hooks/ext/sha2/luasha256.c
421
+ - lua-hooks/ext/sha2/sha256.c
420
422
  - lua-hooks/lib/boot.lua
421
423
  homepage: http://immun.io/
422
424
  licenses: