aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Cooper2017-11-10 21:57:34 +0000
committerPaul Sokolovsky2017-11-12 21:46:23 +0200
commit7413b3ce3e344a6a916cd55508dfda8f009df598 (patch)
tree1cf7a179e0d7f92e10327ba261e6c21d169f74fd
parent0535d0337042e2c33352aa58ef3f685c0124acab (diff)
extmod/moduhashlib: Enable SHA1 hashing when using "mbedtls" library.
The SHA1 hashing functionality is provided via the "axtls" library's implementation, and hence is unavailable when the "axtls" library is not being used. This change provides the same SHA1 hashing functionality when using the "mbedtls" library by using its implementation instead.
-rw-r--r--extmod/moduhashlib.c55
-rw-r--r--ports/unix/mpconfigport.h2
2 files changed, 56 insertions, 1 deletions
diff --git a/extmod/moduhashlib.c b/extmod/moduhashlib.c
index 3fad69247..6469dcfa3 100644
--- a/extmod/moduhashlib.c
+++ b/extmod/moduhashlib.c
@@ -32,10 +32,19 @@
#if MICROPY_PY_UHASHLIB
#include "crypto-algorithms/sha256.h"
+
#if MICROPY_PY_UHASHLIB_SHA1
+
+#if MICROPY_SSL_AXTLS
#include "lib/axtls/crypto/crypto.h"
#endif
+#if MICROPY_SSL_MBEDTLS
+#include "mbedtls/sha1.h"
+#endif
+
+#endif
+
typedef struct _mp_obj_hash_t {
mp_obj_base_t base;
char state[0];
@@ -57,6 +66,7 @@ STATIC mp_obj_t hash_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
#if MICROPY_PY_UHASHLIB_SHA1
STATIC mp_obj_t sha1_update(mp_obj_t self_in, mp_obj_t arg);
+#if MICROPY_SSL_AXTLS
STATIC mp_obj_t sha1_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false);
mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(SHA1_CTX));
@@ -69,6 +79,22 @@ STATIC mp_obj_t sha1_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
}
#endif
+#if MICROPY_SSL_MBEDTLS
+STATIC mp_obj_t sha1_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+ mp_arg_check_num(n_args, n_kw, 0, 1, false);
+ mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(mbedtls_sha1_context));
+ o->base.type = type;
+ mbedtls_sha1_init((mbedtls_sha1_context*)o->state);
+ mbedtls_sha1_starts((mbedtls_sha1_context*)o->state);
+ if (n_args == 1) {
+ sha1_update(MP_OBJ_FROM_PTR(o), args[0]);
+ }
+ return MP_OBJ_FROM_PTR(o);
+}
+#endif
+
+#endif
+
STATIC mp_obj_t hash_update(mp_obj_t self_in, mp_obj_t arg) {
mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in);
mp_buffer_info_t bufinfo;
@@ -79,6 +105,8 @@ STATIC mp_obj_t hash_update(mp_obj_t self_in, mp_obj_t arg) {
MP_DEFINE_CONST_FUN_OBJ_2(hash_update_obj, hash_update);
#if MICROPY_PY_UHASHLIB_SHA1
+
+#if MICROPY_SSL_AXTLS
STATIC mp_obj_t sha1_update(mp_obj_t self_in, mp_obj_t arg) {
mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in);
mp_buffer_info_t bufinfo;
@@ -86,6 +114,18 @@ STATIC mp_obj_t sha1_update(mp_obj_t self_in, mp_obj_t arg) {
SHA1_Update((SHA1_CTX*)self->state, bufinfo.buf, bufinfo.len);
return mp_const_none;
}
+#endif
+
+#if MICROPY_SSL_MBEDTLS
+STATIC mp_obj_t sha1_update(mp_obj_t self_in, mp_obj_t arg) {
+ mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(arg, &bufinfo, MP_BUFFER_READ);
+ mbedtls_sha1_update((mbedtls_sha1_context*)self->state, bufinfo.buf, bufinfo.len);
+ return mp_const_none;
+}
+#endif
+
MP_DEFINE_CONST_FUN_OBJ_2(sha1_update_obj, sha1_update);
#endif
@@ -99,6 +139,8 @@ STATIC mp_obj_t hash_digest(mp_obj_t self_in) {
MP_DEFINE_CONST_FUN_OBJ_1(hash_digest_obj, hash_digest);
#if MICROPY_PY_UHASHLIB_SHA1
+
+#if MICROPY_SSL_AXTLS
STATIC mp_obj_t sha1_digest(mp_obj_t self_in) {
mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in);
vstr_t vstr;
@@ -106,6 +148,19 @@ STATIC mp_obj_t sha1_digest(mp_obj_t self_in) {
SHA1_Final((byte*)vstr.buf, (SHA1_CTX*)self->state);
return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
}
+#endif
+
+#if MICROPY_SSL_MBEDTLS
+STATIC mp_obj_t sha1_digest(mp_obj_t self_in) {
+ mp_obj_hash_t *self = MP_OBJ_TO_PTR(self_in);
+ vstr_t vstr;
+ vstr_init_len(&vstr, 20);
+ mbedtls_sha1_finish((mbedtls_sha1_context*)self->state, (byte*)vstr.buf);
+ mbedtls_sha1_free((mbedtls_sha1_context*)self->state);
+ return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
+}
+#endif
+
MP_DEFINE_CONST_FUN_OBJ_1(sha1_digest_obj, sha1_digest);
#endif
diff --git a/ports/unix/mpconfigport.h b/ports/unix/mpconfigport.h
index db382e0a7..a3d2bb7db 100644
--- a/ports/unix/mpconfigport.h
+++ b/ports/unix/mpconfigport.h
@@ -121,7 +121,7 @@
#define MICROPY_PY_UHEAPQ (1)
#define MICROPY_PY_UTIMEQ (1)
#define MICROPY_PY_UHASHLIB (1)
-#if MICROPY_PY_USSL && MICROPY_SSL_AXTLS
+#if MICROPY_PY_USSL
#define MICROPY_PY_UHASHLIB_SHA1 (1)
#endif
#define MICROPY_PY_UBINASCII (1)