Tasmota/lib/libesp32/berry/default/be_md5_lib.c

101 lines
2.5 KiB
C

/********************************************************************
* Berry module `webserver`
*
* To use: `import webserver`
*
* Allows to respond to HTTP request
*******************************************************************/
#include "be_constobj.h"
#include "be_mem.h"
#include "be_exec.h"
#include "esp_rom_md5.h"
int free_ctx(bvm* vm) {
int argc = be_top(vm);
if (argc > 0) {
be_getmember(vm, 1, ".p");
md5_context_t * ctx = (md5_context_t *) be_tocomptr(vm, -1);
if (ctx != NULL) {
be_os_free(ctx);
}
}
be_return_nil(vm);
}
// `Md5.init() -> `
int32_t m_md5_init(struct bvm *vm);
int32_t m_md5_init(struct bvm *vm) {
md5_context_t * ctx = (md5_context_t *) be_os_malloc(sizeof(md5_context_t));
if (!ctx) {
be_throw(vm, BE_MALLOC_FAIL);
}
esp_rom_md5_init(ctx);
be_newcomobj(vm, ctx, &free_ctx);
be_setmember(vm, 1, ".p");
be_return_nil(vm);
}
// `Md5.update(content:bytes()) -> nil`
//
// Add raw bytes to the MD5 calculation
int32_t m_md5_update(struct bvm *vm);
int32_t m_md5_update(struct bvm *vm) {
int32_t argc = be_top(vm); // Get the number of arguments
if (argc >= 2 && be_isinstance(vm, 2)) {
do {
be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */
if (!be_isderived(vm, 2)) break;
size_t length = 0;
const void * bytes = be_tobytes(vm, 2, &length);
if (!bytes) break;
be_getmember(vm, 1, ".p");
md5_context_t * ctx;
ctx = (md5_context_t *) be_tocomptr(vm, -1);
if (!ctx) break;
if (length > 0) {
esp_rom_md5_update(ctx, (const uint8_t*) bytes, length);
}
be_return_nil(vm);
// success
} while (0);
}
be_raise(vm, "value_error", NULL);
}
// `Md5.update(content:bytes()) -> nil`
//
// Add raw bytes to the MD5 calculation
int32_t m_md5_finish(struct bvm *vm);
int32_t m_md5_finish(struct bvm *vm) {
be_getmember(vm, 1, ".p");
md5_context_t * ctx;
ctx = (md5_context_t *) be_tocomptr(vm, -1);
uint8_t output[16];
esp_rom_md5_final(output, ctx);
be_pushbytes(vm, output, sizeof(output));
be_return(vm);
}
#include "../generate/be_fixed_be_class_md5.h"
void be_load_md5_lib(bvm *vm) {
be_pushntvclass(vm, &be_class_md5);
be_setglobal(vm, "MD5");
be_pop(vm, 1);
}
/* @const_object_info_begin
class be_class_md5 (scope: global, name: MD5) {
.p, var
init, func(m_md5_init)
update, func(m_md5_update)
finish, func(m_md5_finish)
}
@const_object_info_end */