WIP websocket accept and hashlib
This commit is contained in:
parent
2ae791aa4e
commit
7589e53fea
|
@ -2199,6 +2199,10 @@ msgstr ""
|
||||||
msgid "Unsupported format"
|
msgid "Unsupported format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: shared-bindings/hashlib/__init__.c
|
||||||
|
msgid "Unsupported hash algorithm"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ports/espressif/common-hal/dualbank/__init__.c
|
#: ports/espressif/common-hal/dualbank/__init__.c
|
||||||
msgid "Update Failed"
|
msgid "Update Failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shared-bindings/hashlib/Hash.h"
|
||||||
|
|
||||||
|
#include "components/mbedtls/mbedtls/include/mbedtls/ssl.h"
|
||||||
|
|
||||||
|
void common_hal_hashlib_hash_update(hashlib_hash_obj_t *self, const uint8_t *data, size_t datalen) {
|
||||||
|
if (self->hash_type == MBEDTLS_SSL_HASH_SHA1) {
|
||||||
|
mbedtls_sha1_update_ret(&self->sha1, data, datalen);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void common_hal_hashlib_hash_digest(hashlib_hash_obj_t *self, uint8_t *data, size_t datalen) {
|
||||||
|
if (datalen < common_hal_hashlib_hash_get_digest_size(self)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (self->hash_type == MBEDTLS_SSL_HASH_SHA1) {
|
||||||
|
mbedtls_sha1_finish_ret(&self->sha1, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t common_hal_hashlib_hash_get_digest_size(hashlib_hash_obj_t *self) {
|
||||||
|
if (self->hash_type == MBEDTLS_SSL_HASH_SHA1) {
|
||||||
|
return 20;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_HASHLIB_HASH_H
|
||||||
|
#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_HASHLIB_HASH_H
|
||||||
|
|
||||||
|
#include "components/mbedtls/mbedtls/include/mbedtls/sha1.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
union {
|
||||||
|
mbedtls_sha1_context sha1;
|
||||||
|
};
|
||||||
|
// Of MBEDTLS_SSL_HASH_*
|
||||||
|
uint8_t hash_type;
|
||||||
|
} hashlib_hash_obj_t;
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_HASHLIB_HASH_H
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shared-bindings/hashlib/__init__.h"
|
||||||
|
|
||||||
|
#include "components/mbedtls/mbedtls/include/mbedtls/ssl.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool common_hal_hashlib_new(hashlib_hash_obj_t *self, const char *algorithm) {
|
||||||
|
if (strcmp(algorithm, "sha1") == 0) {
|
||||||
|
self->hash_type = MBEDTLS_SSL_HASH_SHA1;
|
||||||
|
mbedtls_sha1_init(&self->sha1);
|
||||||
|
mbedtls_sha1_starts_ret(&self->sha1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ CIRCUITPY_COUNTIO ?= 1
|
||||||
CIRCUITPY_DUALBANK ?= 1
|
CIRCUITPY_DUALBANK ?= 1
|
||||||
CIRCUITPY_FRAMEBUFFERIO ?= 1
|
CIRCUITPY_FRAMEBUFFERIO ?= 1
|
||||||
CIRCUITPY_FREQUENCYIO ?= 1
|
CIRCUITPY_FREQUENCYIO ?= 1
|
||||||
|
CIRCUITPY_HASHLIB ?= 1
|
||||||
CIRCUITPY_IMAGECAPTURE ?= 1
|
CIRCUITPY_IMAGECAPTURE ?= 1
|
||||||
CIRCUITPY_I2CPERIPHERAL ?= 1
|
CIRCUITPY_I2CPERIPHERAL ?= 1
|
||||||
CIRCUITPY_RGBMATRIX ?= 1
|
CIRCUITPY_RGBMATRIX ?= 1
|
||||||
|
|
|
@ -207,6 +207,9 @@ endif
|
||||||
ifeq ($(CIRCUITPY_GNSS),1)
|
ifeq ($(CIRCUITPY_GNSS),1)
|
||||||
SRC_PATTERNS += gnss/%
|
SRC_PATTERNS += gnss/%
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(CIRCUITPY_HASHLIB),1)
|
||||||
|
SRC_PATTERNS += hashlib/%
|
||||||
|
endif
|
||||||
ifeq ($(CIRCUITPY_I2CPERIPHERAL),1)
|
ifeq ($(CIRCUITPY_I2CPERIPHERAL),1)
|
||||||
SRC_PATTERNS += i2cperipheral/%
|
SRC_PATTERNS += i2cperipheral/%
|
||||||
endif
|
endif
|
||||||
|
@ -419,6 +422,8 @@ SRC_COMMON_HAL_ALL = \
|
||||||
gnss/GNSS.c \
|
gnss/GNSS.c \
|
||||||
gnss/PositionFix.c \
|
gnss/PositionFix.c \
|
||||||
gnss/SatelliteSystem.c \
|
gnss/SatelliteSystem.c \
|
||||||
|
hashlib/__init__.c \
|
||||||
|
hashlib/Hash.c \
|
||||||
i2cperipheral/I2CPeripheral.c \
|
i2cperipheral/I2CPeripheral.c \
|
||||||
i2cperipheral/__init__.c \
|
i2cperipheral/__init__.c \
|
||||||
microcontroller/Pin.c \
|
microcontroller/Pin.c \
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "shared-bindings/hashlib/Hash.h"
|
||||||
|
|
||||||
|
// #include "shared-bindings/util.h"
|
||||||
|
|
||||||
|
// #include "shared/runtime/buffer_helper.h"
|
||||||
|
// #include "shared/runtime/interrupt_char.h"
|
||||||
|
|
||||||
|
// #include "py/mperrno.h"
|
||||||
|
// #include "py/mphal.h"
|
||||||
|
#include "py/obj.h"
|
||||||
|
#include "py/objproperty.h"
|
||||||
|
#include "py/objstr.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
|
||||||
|
//| class Hash:
|
||||||
|
//| """In progress hash algorithm. This object is always created by a `hashlib.new()`. It has no
|
||||||
|
//| user-visible constructor."""
|
||||||
|
//|
|
||||||
|
|
||||||
|
//| digest_size: int
|
||||||
|
//| """Digest size in bytes"""
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t hashlib_hash_get_digest_size(mp_obj_t self_in) {
|
||||||
|
mp_check_self(mp_obj_is_type(self_in, &hashlib_hash_type));
|
||||||
|
hashlib_hash_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(common_hal_hashlib_hash_get_digest_size(self));
|
||||||
|
}
|
||||||
|
MP_PROPERTY_GETTER(hashlib_hash_digest_size_obj, hashlib_hash_get_digest_size);
|
||||||
|
|
||||||
|
//| def update(self, data: ReadableBuffer) -> None:
|
||||||
|
//| """Update the hash with the given bytes.
|
||||||
|
//|
|
||||||
|
//| :param ~circuitpython_typing.ReadableBuffer data: Update the hash from data in this buffer"""
|
||||||
|
//| ...
|
||||||
|
//|
|
||||||
|
mp_obj_t hashlib_hash_update(mp_obj_t self_in, mp_obj_t buf_in) {
|
||||||
|
mp_check_self(mp_obj_is_type(self_in, &hashlib_hash_type));
|
||||||
|
hashlib_hash_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
|
||||||
|
|
||||||
|
common_hal_hashlib_hash_update(self, bufinfo.buf, bufinfo.len);
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(hashlib_hash_update_obj, hashlib_hash_update);
|
||||||
|
|
||||||
|
//| def digest(self) -> bytes:
|
||||||
|
//| """Returns the current digest as bytes() with a length of `hashlib.Hash.digest_size`."""
|
||||||
|
//| ...
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t hashlib_hash_digest(mp_obj_t self_in) {
|
||||||
|
mp_check_self(mp_obj_is_type(self_in, &hashlib_hash_type));
|
||||||
|
hashlib_hash_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
size_t size = common_hal_hashlib_hash_get_digest_size(self);
|
||||||
|
mp_obj_t obj = mp_obj_new_bytes_of_zeros(size);
|
||||||
|
mp_obj_str_t *o = MP_OBJ_TO_PTR(obj);
|
||||||
|
|
||||||
|
common_hal_hashlib_hash_digest(self, (uint8_t *)o->data, size);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(hashlib_hash_digest_obj, hashlib_hash_digest);
|
||||||
|
|
||||||
|
STATIC const mp_rom_map_elem_t hashlib_hash_locals_dict_table[] = {
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_digest_size), MP_ROM_PTR(&hashlib_hash_digest_size_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&hashlib_hash_update_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_digest), MP_ROM_PTR(&hashlib_hash_digest_obj) },
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC MP_DEFINE_CONST_DICT(hashlib_hash_locals_dict, hashlib_hash_locals_dict_table);
|
||||||
|
|
||||||
|
const mp_obj_type_t hashlib_hash_type = {
|
||||||
|
{ &mp_type_type },
|
||||||
|
.name = MP_QSTR_Hash,
|
||||||
|
.locals_dict = (mp_obj_dict_t *)&hashlib_hash_locals_dict,
|
||||||
|
};
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_HASHLIB_HASH_H
|
||||||
|
#define MICROPY_INCLUDED_SHARED_BINDINGS_HASHLIB_HASH_H
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
|
||||||
|
#include "common-hal/hashlib/Hash.h"
|
||||||
|
|
||||||
|
extern const mp_obj_type_t hashlib_hash_type;
|
||||||
|
|
||||||
|
// So that new can call it when given data.
|
||||||
|
mp_obj_t hashlib_hash_update(mp_obj_t self_in, mp_obj_t buf_in);
|
||||||
|
|
||||||
|
void common_hal_hashlib_hash_update(hashlib_hash_obj_t *self, const uint8_t *data, size_t datalen);
|
||||||
|
void common_hal_hashlib_hash_digest(hashlib_hash_obj_t *self, uint8_t *data, size_t datalen);
|
||||||
|
size_t common_hal_hashlib_hash_get_digest_size(hashlib_hash_obj_t *self);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_HASHLIB_HASH_H
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the Micro Python project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "py/obj.h"
|
||||||
|
#include "py/mpconfig.h"
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "shared-bindings/hashlib/__init__.h"
|
||||||
|
#include "shared-bindings/hashlib/Hash.h"
|
||||||
|
#include "supervisor/shared/translate/translate.h"
|
||||||
|
|
||||||
|
//| """Hashing related functions
|
||||||
|
//|
|
||||||
|
//| |see_cpython_module| :mod:`cpython:hashlib`.
|
||||||
|
//| """
|
||||||
|
//|
|
||||||
|
//| def new(name, data=b"") -> hashlib.Hash:
|
||||||
|
//| """Returns a Hash object setup for the named algorithm. Raises ValueError when the named
|
||||||
|
//| algorithm is unsupported.
|
||||||
|
//|
|
||||||
|
//| :return: a hash object for the given algorithm
|
||||||
|
//| :rtype: hashlib.Hash"""
|
||||||
|
//| ...
|
||||||
|
//|
|
||||||
|
STATIC mp_obj_t hashlib_new(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
enum { ARG_name, ARG_data };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_name, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
||||||
|
{ MP_QSTR_data, MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
||||||
|
};
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
const char *algorithm = mp_obj_str_get_str(args[ARG_name].u_obj);
|
||||||
|
|
||||||
|
hashlib_hash_obj_t *self = m_new_obj(hashlib_hash_obj_t);
|
||||||
|
self->base.type = &hashlib_hash_type;
|
||||||
|
|
||||||
|
if (!common_hal_hashlib_new(self, algorithm)) {
|
||||||
|
mp_raise_ValueError(translate("Unsupported hash algorithm"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[ARG_data].u_obj != mp_const_none) {
|
||||||
|
hashlib_hash_update(self, args[ARG_data].u_obj);
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(hashlib_new_obj, 1, hashlib_new);
|
||||||
|
|
||||||
|
STATIC const mp_rom_map_elem_t hashlib_module_globals_table[] = {
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_hashlib) },
|
||||||
|
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_new), MP_ROM_PTR(&hashlib_new_obj) },
|
||||||
|
|
||||||
|
// Hash is deliberately omitted here because CPython doesn't expose the
|
||||||
|
// object on `hashlib` only the internal `_hashlib`.
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC MP_DEFINE_CONST_DICT(hashlib_module_globals, hashlib_module_globals_table);
|
||||||
|
|
||||||
|
const mp_obj_module_t hashlib_module = {
|
||||||
|
.base = { &mp_type_module },
|
||||||
|
.globals = (mp_obj_dict_t *)&hashlib_module_globals,
|
||||||
|
};
|
||||||
|
|
||||||
|
MP_REGISTER_MODULE(MP_QSTR_hashlib, hashlib_module, CIRCUITPY_HASHLIB);
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Scott Shawcroft for Adafruit Industries
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_HASHLIB___INIT___H
|
||||||
|
#define MICROPY_INCLUDED_SHARED_BINDINGS_HASHLIB___INIT___H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "shared-bindings/hashlib/Hash.h"
|
||||||
|
|
||||||
|
bool common_hal_hashlib_new(hashlib_hash_obj_t *self, const char *algorithm);
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_HASHLIB___INIT___H
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Simple client</title>
|
||||||
|
|
||||||
|
<script src="/serial.js" defer=true></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<pre id="log"></pre>
|
||||||
|
<form onsubmit="onSubmit(); return false;">
|
||||||
|
<input type="text" id="input">
|
||||||
|
<input type="submit" value="Send">
|
||||||
|
<button onclick="onCloseClick(); return false;">close</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
var ws;
|
||||||
|
|
||||||
|
function onSubmit() {
|
||||||
|
var input = document.getElementById("input");
|
||||||
|
// You can send message to the Web Socket using ws.send.
|
||||||
|
ws.send(input.value);
|
||||||
|
output("send: " + input.value);
|
||||||
|
input.value = "";
|
||||||
|
input.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onCloseClick() {
|
||||||
|
ws.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
function output(str) {
|
||||||
|
var log = document.getElementById("log");
|
||||||
|
log.innerHTML += str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect to Web Socket
|
||||||
|
ws = new WebSocket("ws://cpy-f57ce8.local/cp/serial/");
|
||||||
|
// ws = new WebSocket("ws://127.0.0.1:9001")
|
||||||
|
|
||||||
|
// Set event handlers.
|
||||||
|
ws.onopen = function() {
|
||||||
|
output("onopen");
|
||||||
|
};
|
||||||
|
|
||||||
|
ws.onmessage = function(e) {
|
||||||
|
// e.data contains received string.
|
||||||
|
output("onmessage: " + e.data);
|
||||||
|
};
|
||||||
|
|
||||||
|
ws.onclose = function() {
|
||||||
|
output("onclose");
|
||||||
|
};
|
||||||
|
|
||||||
|
ws.onerror = function(e) {
|
||||||
|
output("onerror");
|
||||||
|
console.log(e)
|
||||||
|
};
|
|
@ -3,8 +3,8 @@
|
||||||
<head>
|
<head>
|
||||||
<title>CircuitPython</title>
|
<title>CircuitPython</title>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
</head>
|
|
||||||
<script src="/welcome.js" defer=true></script>
|
<script src="/welcome.js" defer=true></script>
|
||||||
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1><a href="/"><img src="/favicon.ico"/></a> Welcome!</h1>
|
<h1><a href="/"><img src="/favicon.ico"/></a> Welcome!</h1>
|
||||||
Welcome to CircuitPython's Web API. Go to the <a href="/fs/">file browser</a> to work with files in the CIRCUITPY drive. Make sure you've set <code>CIRCUITPY_WEB_API_PASSWORD='somepassword'</code> in <code>/.env</code>. Provide the password when the browser prompts for it. Leave the username blank.
|
Welcome to CircuitPython's Web API. Go to the <a href="/fs/">file browser</a> to work with files in the CIRCUITPY drive. Make sure you've set <code>CIRCUITPY_WEB_API_PASSWORD='somepassword'</code> in <code>/.env</code>. Provide the password when the browser prompts for it. Leave the username blank.
|
||||||
|
|
|
@ -86,6 +86,10 @@ typedef struct {
|
||||||
bool authenticated;
|
bool authenticated;
|
||||||
bool expect;
|
bool expect;
|
||||||
bool json;
|
bool json;
|
||||||
|
bool websocket;
|
||||||
|
uint32_t websocket_version;
|
||||||
|
// RFC6455 for websockets says this header should be 24 base64 characters long.
|
||||||
|
char websocket_key[24 + 1];
|
||||||
} _request;
|
} _request;
|
||||||
|
|
||||||
static wifi_radio_error_t wifi_status = WIFI_RADIO_ERROR_NONE;
|
static wifi_radio_error_t wifi_status = WIFI_RADIO_ERROR_NONE;
|
||||||
|
@ -519,6 +523,7 @@ static void _reply_redirect(socketpool_socket_obj_t *socket, _request *request,
|
||||||
"Location: http://", hostname, ".local", path, "\r\n", NULL);
|
"Location: http://", hostname, ".local", path, "\r\n", NULL);
|
||||||
_cors_header(socket, request);
|
_cors_header(socket, request);
|
||||||
_send_str(socket, "\r\n");
|
_send_str(socket, "\r\n");
|
||||||
|
ESP_LOGI(TAG, "redirect");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _reply_directory_json(socketpool_socket_obj_t *socket, _request *request, FF_DIR *dir, const char *request_path, const char *path) {
|
static void _reply_directory_json(socketpool_socket_obj_t *socket, _request *request, FF_DIR *dir, const char *request_path, const char *path) {
|
||||||
|
@ -826,6 +831,8 @@ STATIC_FILE(directory_html);
|
||||||
STATIC_FILE(directory_js);
|
STATIC_FILE(directory_js);
|
||||||
STATIC_FILE(welcome_html);
|
STATIC_FILE(welcome_html);
|
||||||
STATIC_FILE(welcome_js);
|
STATIC_FILE(welcome_js);
|
||||||
|
STATIC_FILE(serial_html);
|
||||||
|
STATIC_FILE(serial_js);
|
||||||
STATIC_FILE(blinka_16x16_ico);
|
STATIC_FILE(blinka_16x16_ico);
|
||||||
|
|
||||||
static void _reply_static(socketpool_socket_obj_t *socket, _request *request, const uint8_t *response, size_t response_len, const char *content_type) {
|
static void _reply_static(socketpool_socket_obj_t *socket, _request *request, const uint8_t *response, size_t response_len, const char *content_type) {
|
||||||
|
@ -844,6 +851,13 @@ static void _reply_static(socketpool_socket_obj_t *socket, _request *request, co
|
||||||
|
|
||||||
#define _REPLY_STATIC(socket, request, filename) _reply_static(socket, request, filename, filename##_length, filename##_content_type)
|
#define _REPLY_STATIC(socket, request, filename) _reply_static(socket, request, filename, filename##_length, filename##_content_type)
|
||||||
|
|
||||||
|
static void _reply_websocket_upgrade(socketpool_socket_obj_t *socket, _request *request) {
|
||||||
|
ESP_LOGI(TAG, "websocket!");
|
||||||
|
// Compute accept key
|
||||||
|
// Reply with upgrade
|
||||||
|
// Copy socket state into websocket and mark given socket as closed even though it isn't actually.
|
||||||
|
}
|
||||||
|
|
||||||
static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
|
static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
|
||||||
if (request->redirect) {
|
if (request->redirect) {
|
||||||
_reply_redirect(socket, request, request->path);
|
_reply_redirect(socket, request, request->path);
|
||||||
|
@ -980,6 +994,22 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
|
||||||
_reply_with_devices_json(socket, request);
|
_reply_with_devices_json(socket, request);
|
||||||
} else if (strcmp(path, "/version.json") == 0) {
|
} else if (strcmp(path, "/version.json") == 0) {
|
||||||
_reply_with_version_json(socket, request);
|
_reply_with_version_json(socket, request);
|
||||||
|
} else if (strcmp(path, "/serial/") == 0) {
|
||||||
|
if (!request->authenticated) {
|
||||||
|
if (_api_password[0] != '\0') {
|
||||||
|
_reply_unauthorized(socket, request);
|
||||||
|
} else {
|
||||||
|
_reply_forbidden(socket, request);
|
||||||
|
}
|
||||||
|
} else if (request->websocket) {
|
||||||
|
ESP_LOGI(TAG, "websocket!");
|
||||||
|
_reply_websocket_upgrade(socket, request);
|
||||||
|
} else {
|
||||||
|
_REPLY_STATIC(socket, request, serial_html);
|
||||||
|
}
|
||||||
|
_reply_with_version_json(socket, request);
|
||||||
|
} else {
|
||||||
|
_reply_missing(socket, request);
|
||||||
}
|
}
|
||||||
} else if (strcmp(request->method, "GET") != 0) {
|
} else if (strcmp(request->method, "GET") != 0) {
|
||||||
_reply_method_not_allowed(socket, request);
|
_reply_method_not_allowed(socket, request);
|
||||||
|
@ -992,6 +1022,8 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
|
||||||
_REPLY_STATIC(socket, request, directory_js);
|
_REPLY_STATIC(socket, request, directory_js);
|
||||||
} else if (strcmp(request->path, "/welcome.js") == 0) {
|
} else if (strcmp(request->path, "/welcome.js") == 0) {
|
||||||
_REPLY_STATIC(socket, request, welcome_js);
|
_REPLY_STATIC(socket, request, welcome_js);
|
||||||
|
} else if (strcmp(request->path, "/serial.js") == 0) {
|
||||||
|
_REPLY_STATIC(socket, request, serial_js);
|
||||||
} else if (strcmp(request->path, "/favicon.ico") == 0) {
|
} else if (strcmp(request->path, "/favicon.ico") == 0) {
|
||||||
// TODO: Autogenerate this based on the blinka bitmap and change the
|
// TODO: Autogenerate this based on the blinka bitmap and change the
|
||||||
// palette based on MAC address.
|
// palette based on MAC address.
|
||||||
|
@ -1015,6 +1047,7 @@ static void _reset_request(_request *request) {
|
||||||
request->authenticated = false;
|
request->authenticated = false;
|
||||||
request->expect = false;
|
request->expect = false;
|
||||||
request->json = false;
|
request->json = false;
|
||||||
|
request->websocket = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _process_request(socketpool_socket_obj_t *socket, _request *request) {
|
static void _process_request(socketpool_socket_obj_t *socket, _request *request) {
|
||||||
|
@ -1111,6 +1144,13 @@ static void _process_request(socketpool_socket_obj_t *socket, _request *request)
|
||||||
strcpy(request->origin, request->header_value);
|
strcpy(request->origin, request->header_value);
|
||||||
} else if (strcmp(request->header_key, "X-Timestamp") == 0) {
|
} else if (strcmp(request->header_key, "X-Timestamp") == 0) {
|
||||||
request->timestamp_ms = strtoull(request->header_value, NULL, 10);
|
request->timestamp_ms = strtoull(request->header_value, NULL, 10);
|
||||||
|
} else if (strcmp(request->header_key, "Upgrade") == 0) {
|
||||||
|
request->websocket = strcmp(request->header_value, "websocket") == 0;
|
||||||
|
} else if (strcmp(request->header_key, "Sec-WebSocket-Version") == 0) {
|
||||||
|
request->websocket_version = strtoul(request->header_value, NULL, 10);
|
||||||
|
} else if (strcmp(request->header_key, "Sec-WebSocket-Key") == 0 &&
|
||||||
|
strlen(request->header_value) == 24) {
|
||||||
|
strcpy(request->websocket_key, request->header_value);
|
||||||
}
|
}
|
||||||
ESP_LOGI(TAG, "Header %s %s", request->header_key, request->header_value);
|
ESP_LOGI(TAG, "Header %s %s", request->header_key, request->header_value);
|
||||||
} else if (request->offset > sizeof(request->header_value) - 1) {
|
} else if (request->offset > sizeof(request->header_value) - 1) {
|
||||||
|
|
Loading…
Reference in New Issue