File: hash.lua

package info (click to toggle)
lua-resty-core 0.1.32-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,268 kB
  • sloc: sh: 207; perl: 143; makefile: 26
file content (154 lines) | stat: -rw-r--r-- 4,009 bytes parent folder | download | duplicates (3)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
-- Copyright (C) Yichun Zhang (agentzh)


local ffi = require "ffi"
local base = require "resty.core.base"


local C = ffi.C
local ffi_new = ffi.new
local ffi_string = ffi.string
local ngx = ngx
local type = type
local error = error
local tostring = tostring
local subsystem = ngx.config.subsystem


local ngx_lua_ffi_md5
local ngx_lua_ffi_md5_bin
local ngx_lua_ffi_sha1_bin
local ngx_lua_ffi_crc32_long
local ngx_lua_ffi_crc32_short


if subsystem == "http" then
    ffi.cdef[[
    void ngx_http_lua_ffi_md5_bin(const unsigned char *src, size_t len,
                                  unsigned char *dst);

    void ngx_http_lua_ffi_md5(const unsigned char *src, size_t len,
                              unsigned char *dst);

    int ngx_http_lua_ffi_sha1_bin(const unsigned char *src, size_t len,
                                  unsigned char *dst);

    unsigned int ngx_http_lua_ffi_crc32_long(const unsigned char *src,
                                             size_t len);

    unsigned int ngx_http_lua_ffi_crc32_short(const unsigned char *src,
                                              size_t len);
    ]]

    ngx_lua_ffi_md5 = C.ngx_http_lua_ffi_md5
    ngx_lua_ffi_md5_bin = C.ngx_http_lua_ffi_md5_bin
    ngx_lua_ffi_sha1_bin = C.ngx_http_lua_ffi_sha1_bin
    ngx_lua_ffi_crc32_short = C.ngx_http_lua_ffi_crc32_short
    ngx_lua_ffi_crc32_long = C.ngx_http_lua_ffi_crc32_long

elseif subsystem == "stream" then
    ffi.cdef[[
    void ngx_stream_lua_ffi_md5_bin(const unsigned char *src, size_t len,
                                    unsigned char *dst);

    void ngx_stream_lua_ffi_md5(const unsigned char *src, size_t len,
                                unsigned char *dst);

    int ngx_stream_lua_ffi_sha1_bin(const unsigned char *src, size_t len,
                                    unsigned char *dst);

    unsigned int ngx_stream_lua_ffi_crc32_long(const unsigned char *src,
                                               size_t len);

    unsigned int ngx_stream_lua_ffi_crc32_short(const unsigned char *src,
                                                size_t len);
    ]]

    ngx_lua_ffi_md5 = C.ngx_stream_lua_ffi_md5
    ngx_lua_ffi_md5_bin = C.ngx_stream_lua_ffi_md5_bin
    ngx_lua_ffi_sha1_bin = C.ngx_stream_lua_ffi_sha1_bin
    ngx_lua_ffi_crc32_short = C.ngx_stream_lua_ffi_crc32_short
    ngx_lua_ffi_crc32_long = C.ngx_stream_lua_ffi_crc32_long
end


local MD5_DIGEST_LEN = 16
local md5_buf = ffi_new("unsigned char[?]", MD5_DIGEST_LEN)

ngx.md5_bin = function (s)
    if type(s) ~= 'string' then
        if not s then
            s = ''
        else
            s = tostring(s)
        end
    end
    ngx_lua_ffi_md5_bin(s, #s, md5_buf)
    return ffi_string(md5_buf, MD5_DIGEST_LEN)
end


local MD5_HEX_DIGEST_LEN = MD5_DIGEST_LEN * 2
local md5_hex_buf = ffi_new("unsigned char[?]", MD5_HEX_DIGEST_LEN)

ngx.md5 = function (s)
    if type(s) ~= 'string' then
        if not s then
            s = ''
        else
            s = tostring(s)
        end
    end
    ngx_lua_ffi_md5(s, #s, md5_hex_buf)
    return ffi_string(md5_hex_buf, MD5_HEX_DIGEST_LEN)
end


local SHA_DIGEST_LEN = 20
local sha_buf = ffi_new("unsigned char[?]", SHA_DIGEST_LEN)

ngx.sha1_bin = function (s)
    if type(s) ~= 'string' then
        if not s then
            s = ''
        else
            s = tostring(s)
        end
    end
    local ok = ngx_lua_ffi_sha1_bin(s, #s, sha_buf)
    if ok == 0 then
        error("SHA-1 support missing in Nginx")
    end
    return ffi_string(sha_buf, SHA_DIGEST_LEN)
end


ngx.crc32_short = function (s)
    if type(s) ~= "string" then
        if not s then
            s = ""
        else
            s = tostring(s)
        end
    end

    return ngx_lua_ffi_crc32_short(s, #s)
end


ngx.crc32_long = function (s)
    if type(s) ~= "string" then
        if not s then
            s = ""
        else
            s = tostring(s)
        end
    end

    return ngx_lua_ffi_crc32_long(s, #s)
end


return {
    version = base.version
}