Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
d8a8746b
Commit
d8a8746b
authored
May 29, 2015
by
Vowstar
Browse files
Merge pull request #447 from creationix/dev
Add crypto module.
parents
d9bb5855
2128c42f
Changes
4
Hide whitespace changes
Inline
Side-by-side
app/include/rom.h
0 → 100644
View file @
d8a8746b
// Headers to the various functions in the rom (as we discover them)
// SHA1 is assumed to match the netbsd sha1.h headers
#define SHA1_DIGEST_LENGTH 20
#define SHA1_DIGEST_STRING_LENGTH 41
typedef
struct
{
uint32_t
state
[
5
];
uint32_t
count
[
2
];
uint8_t
buffer
[
64
];
}
SHA1_CTX
;
extern
void
SHA1Transform
(
uint32_t
[
5
],
const
uint8_t
[
64
]);
extern
void
SHA1Init
(
SHA1_CTX
*
);
extern
void
SHA1Final
(
uint8_t
[
SHA1_DIGEST_LENGTH
],
SHA1_CTX
*
);
extern
void
SHA1Update
(
SHA1_CTX
*
,
const
uint8_t
*
,
unsigned
int
);
// base64_encode/decode derived by Cal
// Appears to match base64.h from netbsd wpa utils.
extern
unsigned
char
*
base64_encode
(
const
unsigned
char
*
src
,
size_t
len
,
size_t
*
out_len
);
extern
unsigned
char
*
base64_decode
(
const
unsigned
char
*
src
,
size_t
len
,
size_t
*
out_len
);
// Unfortunately it that seems to require the ROM memory management to be
// initialized because it uses mem_malloc
extern
void
mem_init
(
void
*
start_addr
);
app/include/user_modules.h
View file @
d8a8746b
...
@@ -31,6 +31,7 @@
...
@@ -31,6 +31,7 @@
#define LUA_USE_MODULES_U8G
#define LUA_USE_MODULES_U8G
#define LUA_USE_MODULES_WS2812
#define LUA_USE_MODULES_WS2812
#define LUA_USE_MODULES_CJSON
#define LUA_USE_MODULES_CJSON
#define LUA_USE_MODULES_CRYPTO
#endif
/* LUA_USE_MODULES */
#endif
/* LUA_USE_MODULES */
#endif
/* __USER_MODULES_H__ */
#endif
/* __USER_MODULES_H__ */
app/modules/crypto.c
0 → 100644
View file @
d8a8746b
// Module for cryptography
//#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include "platform.h"
#include "auxmods.h"
#include "lrotable.h"
#include "c_types.h"
#include "c_stdlib.h"
#include "user_interface.h"
#include "rom.h"
/**
* hash = crypto.sha1(input)
*
* Calculates raw SHA1 hash of input string.
* Input is arbitrary string, output is raw 20-byte hash as string.
*/
static
int
crypto_sha1
(
lua_State
*
L
)
{
SHA1_CTX
ctx
;
uint8_t
digest
[
20
];
// Read the string from lua (with length)
int
len
;
const
char
*
msg
=
luaL_checklstring
(
L
,
1
,
&
len
);
// Use the SHA* functions in the rom
SHA1Init
(
&
ctx
);
SHA1Update
(
&
ctx
,
msg
,
len
);
SHA1Final
(
digest
,
&
ctx
);
// Push the result as a lua string
lua_pushlstring
(
L
,
digest
,
20
);
return
1
;
}
static
const
char
*
bytes64
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
;
/**
* encoded = crypto.base64Encode(raw)
*
* Encodes raw binary string as base64 string.
*/
static
int
crypto_base64_encode
(
lua_State
*
L
)
{
int
len
;
const
char
*
msg
=
luaL_checklstring
(
L
,
1
,
&
len
);
int
blen
=
(
len
+
2
)
/
3
*
4
;
char
*
out
=
(
char
*
)
c_malloc
(
blen
);
int
j
=
0
,
i
;
for
(
i
=
0
;
i
<
len
;
i
+=
3
)
{
int
a
=
msg
[
i
];
int
b
=
(
i
+
1
<
len
)
?
msg
[
i
+
1
]
:
0
;
int
c
=
(
i
+
2
<
len
)
?
msg
[
i
+
2
]
:
0
;
out
[
j
++
]
=
bytes64
[
a
>>
2
];
out
[
j
++
]
=
bytes64
[((
a
&
3
)
<<
4
)
|
(
b
>>
4
)];
out
[
j
++
]
=
(
i
+
1
<
len
)
?
bytes64
[((
b
&
15
)
<<
2
)
|
(
c
>>
6
)]
:
61
;
out
[
j
++
]
=
(
i
+
2
<
len
)
?
bytes64
[(
c
&
63
)]
:
61
;
}
lua_pushlstring
(
L
,
out
,
j
);
c_free
(
out
);
return
1
;
}
static
const
char
*
byteshex
=
"0123456789abcdef"
;
/**
* encoded = crypto.hexEncode(raw)
*
* Encodes raw binary string as hex string.
*/
static
int
crypto_hex_encode
(
lua_State
*
L
)
{
int
len
;
const
char
*
msg
=
luaL_checklstring
(
L
,
1
,
&
len
);
char
*
out
=
(
char
*
)
c_malloc
(
len
*
2
);
int
i
,
j
=
0
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
out
[
j
++
]
=
byteshex
[
msg
[
i
]
>>
4
];
out
[
j
++
]
=
byteshex
[
msg
[
i
]
&
0xf
];
}
lua_pushlstring
(
L
,
out
,
len
*
2
);
c_free
(
out
);
return
1
;
}
/**
* masked = crypto.mask(message, mask)
*
* Apply a mask (repeated if shorter than message) as XOR to each byte.
*/
static
int
crypto_mask
(
lua_State
*
L
)
{
int
len
,
mask_len
;
const
char
*
msg
=
luaL_checklstring
(
L
,
1
,
&
len
);
const
char
*
mask
=
luaL_checklstring
(
L
,
2
,
&
mask_len
);
int
i
;
char
*
copy
=
(
char
*
)
c_malloc
(
len
);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
copy
[
i
]
=
msg
[
i
]
^
mask
[
i
%
4
];
}
lua_pushlstring
(
L
,
copy
,
len
);
c_free
(
copy
);
return
1
;
}
// Module function map
#define MIN_OPT_LEVEL 2
#include "lrodefs.h"
const
LUA_REG_TYPE
crypto_map
[]
=
{
{
LSTRKEY
(
"sha1"
),
LFUNCVAL
(
crypto_sha1
)
},
{
LSTRKEY
(
"toBase64"
),
LFUNCVAL
(
crypto_base64_encode
)
},
{
LSTRKEY
(
"toHex"
),
LFUNCVAL
(
crypto_hex_encode
)
},
{
LSTRKEY
(
"mask"
),
LFUNCVAL
(
crypto_mask
)
},
#if LUA_OPTIMIZE_MEMORY > 0
#endif
{
LNILKEY
,
LNILVAL
}
};
LUALIB_API
int
luaopen_crypto
(
lua_State
*
L
)
{
#if LUA_OPTIMIZE_MEMORY > 0
return
0
;
#else // #if LUA_OPTIMIZE_MEMORY > 0
luaL_register
(
L
,
AUXLIB_CRYPTO
,
crypto_map
);
// Add constants
return
1
;
#endif // #if LUA_OPTIMIZE_MEMORY > 0
}
app/modules/modules.h
View file @
d8a8746b
...
@@ -149,6 +149,14 @@
...
@@ -149,6 +149,14 @@
#define ROM_MODULES_CJSON
#define ROM_MODULES_CJSON
#endif
#endif
#if defined(LUA_USE_MODULES_CRYPTO)
#define MODULES_CRYPTO "crypto"
#define ROM_MODULES_CRYPTO \
_ROM(MODULES_CRYPTO, luaopen_crypto, crypto_map)
#else
#define ROM_MODULES_CRYPTO
#endif
#define LUA_MODULES_ROM \
#define LUA_MODULES_ROM \
ROM_MODULES_GPIO \
ROM_MODULES_GPIO \
ROM_MODULES_PWM \
ROM_MODULES_PWM \
...
@@ -167,7 +175,8 @@
...
@@ -167,7 +175,8 @@
ROM_MODULES_OW \
ROM_MODULES_OW \
ROM_MODULES_BIT \
ROM_MODULES_BIT \
ROM_MODULES_WS2812 \
ROM_MODULES_WS2812 \
ROM_MODULES_CJSON
ROM_MODULES_CJSON \
ROM_MODULES_CRYPTO
#endif
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment