From 41895118bd5a73f5358d60ce89f337bec57f1d4d Mon Sep 17 00:00:00 2001
From: ushastoe <40743392+krolchonok@users.noreply.github.com>
Date: Fri, 28 Apr 2023 01:28:40 +0300
Subject: [PATCH 01/23] Update HowToInstall.md
46 version
---
documentation/HowToInstall.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/documentation/HowToInstall.md b/documentation/HowToInstall.md
index a650d97ee7..abbca0830f 100644
--- a/documentation/HowToInstall.md
+++ b/documentation/HowToInstall.md
@@ -23,7 +23,7 @@ after that on web updater page - press `Connect` button
- And wait, if all flashed
successfully - you will have all needed assets pre installed
- Done
-
+
@@ -40,7 +40,7 @@ after that on web updater page - press `Connect` button
- Error in ios app will show up, but flipper will be updated successfully
- And if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
@@ -56,7 +56,7 @@ after that on web updater page - press `Connect` button
- Wait until update is finished
- And if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
@@ -71,7 +71,7 @@ after that on web updater page - press `Connect` button
- Wait until update is finished
- And if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
@@ -90,7 +90,7 @@ after that on web updater page - press `Connect` button
- And wait, if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
@@ -111,7 +111,7 @@ after that on web updater page - press `Connect` button
- Update will start, wait for all stages
- Done
-
+
From b31e955744d329601b087c0099d7c1734f0980cc Mon Sep 17 00:00:00 2001
From: ushastoe <40743392+krolchonok@users.noreply.github.com>
Date: Fri, 28 Apr 2023 01:39:58 +0300
Subject: [PATCH 02/23] Update HowToInstall.md
---
documentation/HowToInstall.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/documentation/HowToInstall.md b/documentation/HowToInstall.md
index abbca0830f..9b762ea112 100644
--- a/documentation/HowToInstall.md
+++ b/documentation/HowToInstall.md
@@ -23,7 +23,7 @@ after that on web updater page - press `Connect` button
- And wait, if all flashed
successfully - you will have all needed assets pre installed
- Done
-
+
@@ -40,7 +40,7 @@ after that on web updater page - press `Connect` button
- Error in ios app will show up, but flipper will be updated successfully
- And if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
@@ -56,7 +56,8 @@ after that on web updater page - press `Connect` button
- Wait until update is finished
- And if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
+
@@ -71,7 +72,7 @@ after that on web updater page - press `Connect` button
- Wait until update is finished
- And if all flashed successfully - you will have all needed assets pre installed
- Done
-
+
@@ -89,8 +90,7 @@ after that on web updater page - press `Connect` button
- Update will start
- And wait, if all flashed successfully - you will have all needed assets pre installed
- Done
-
-
+
@@ -110,8 +110,8 @@ after that on web updater page - press `Connect` button
`update/f7-update-(CURRENT VERSION)/update.fuf`
- Update will start, wait for all stages
- Done
+
-
From 7b21dd7082fddf58542e1a06ebcd1a0ad711e845 Mon Sep 17 00:00:00 2001
From: ushastoe <40743392+krolchonok@users.noreply.github.com>
Date: Fri, 28 Apr 2023 01:41:03 +0300
Subject: [PATCH 03/23] Update HowToInstall.md
---
documentation/HowToInstall.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/documentation/HowToInstall.md b/documentation/HowToInstall.md
index 9b762ea112..d4dcc3bbcf 100644
--- a/documentation/HowToInstall.md
+++ b/documentation/HowToInstall.md
@@ -110,7 +110,8 @@ after that on web updater page - press `Connect` button
`update/f7-update-(CURRENT VERSION)/update.fuf`
- Update will start, wait for all stages
- Done
-
+
+
From c0de75367f7b4209585648a2506aaeec165c0b38 Mon Sep 17 00:00:00 2001
From: ushastoe <40743392+krolchonok@users.noreply.github.com>
Date: Fri, 28 Apr 2023 01:43:27 +0300
Subject: [PATCH 04/23] Update HowToInstall.md
---
documentation/HowToInstall.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/documentation/HowToInstall.md b/documentation/HowToInstall.md
index d4dcc3bbcf..656d4cc4bf 100644
--- a/documentation/HowToInstall.md
+++ b/documentation/HowToInstall.md
@@ -110,7 +110,7 @@ after that on web updater page - press `Connect` button
`update/f7-update-(CURRENT VERSION)/update.fuf`
- Update will start, wait for all stages
- Done
-
+
From 96375e8244a1e90bf6359e040677425dbc36968d Mon Sep 17 00:00:00 2001
From: MX <10697207+xMasterX@users.noreply.github.com>
Date: Fri, 28 Apr 2023 14:00:40 +0300
Subject: [PATCH 05/23] Version instead of branch
---
firmware/targets/f7/ble_glue/dev_info_service.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/firmware/targets/f7/ble_glue/dev_info_service.c b/firmware/targets/f7/ble_glue/dev_info_service.c
index 8bdb2eea84..d24058632f 100644
--- a/firmware/targets/f7/ble_glue/dev_info_service.c
+++ b/firmware/targets/f7/ble_glue/dev_info_service.c
@@ -33,7 +33,7 @@ void dev_info_svc_start() {
dev_info_svc->version_string = furi_string_alloc_printf(
"%s %s %s %s",
version_get_githash(NULL),
- version_get_gitbranch(NULL),
+ version_get_version(NULL),
version_get_gitbranchnum(NULL),
version_get_builddate(NULL));
snprintf(
From e87256e01f3e289c6eb60badd4ae88e190369da5 Mon Sep 17 00:00:00 2001
From: MX <10697207+xMasterX@users.noreply.github.com>
Date: Fri, 28 Apr 2023 14:04:16 +0300
Subject: [PATCH 06/23] Update TOTP
---
.../services/config/token_info_iterator.c | 16 ++++++--------
.../external/totp/services/hmac/hmac_common.h | 1 -
.../external/totp/services/hmac/hmac_sha256.c | 1 +
.../external/totp/services/hmac/sha1.c | 8 +++----
.../external/totp/services/hmac/sha256.c | 7 ++-----
.../external/totp/services/hmac/sha512.c | 7 ++-----
.../totp/services/hmac/sha_pad_buffer.c | 11 ++++++++++
.../totp/services/hmac/sha_pad_buffer.h | 4 ++++
applications/external/totp/types/token_info.c | 21 +++++++++++++++++++
applications/external/totp/types/token_info.h | 12 +++++++++--
10 files changed, 60 insertions(+), 28 deletions(-)
create mode 100644 applications/external/totp/services/hmac/sha_pad_buffer.c
create mode 100644 applications/external/totp/services/hmac/sha_pad_buffer.h
diff --git a/applications/external/totp/services/config/token_info_iterator.c b/applications/external/totp/services/config/token_info_iterator.c
index 9b7dd5550c..f8cd3c64e5 100644
--- a/applications/external/totp/services/config/token_info_iterator.c
+++ b/applications/external/totp/services/config/token_info_iterator.c
@@ -68,7 +68,9 @@ static bool seek_to_token(size_t token_index, TokenInfoIteratorContext* context)
direction = StreamDirectionBackward;
}
- stream_seek(stream, context->last_seek_offset, StreamOffsetFromStart);
+ if(!stream_seek(stream, context->last_seek_offset, StreamOffsetFromStart)) {
+ return false;
+ }
if(token_index_diff != 0) {
long i = 0;
@@ -89,10 +91,6 @@ static bool seek_to_token(size_t token_index, TokenInfoIteratorContext* context)
context->last_seek_offset = stream_tell(stream);
context->last_seek_index = token_index;
- } else {
- if(!stream_seek(stream, context->last_seek_offset, StreamOffsetFromStart)) {
- return false;
- }
}
return true;
@@ -495,11 +493,9 @@ bool totp_token_info_iterator_go_to(TokenInfoIteratorContext* context, size_t to
}
uint32_t temp_data32;
- if(flipper_format_read_uint32(
- context->config_file, TOTP_CONFIG_KEY_TOKEN_ALGO, &temp_data32, 1) &&
- temp_data32 <= STEAM) {
- tokenInfo->algo = (TokenHashAlgo)temp_data32;
- } else {
+ if(!flipper_format_read_uint32(
+ context->config_file, TOTP_CONFIG_KEY_TOKEN_ALGO, &temp_data32, 1) ||
+ !token_info_set_algo_from_int(tokenInfo, temp_data32)) {
tokenInfo->algo = SHA1;
}
diff --git a/applications/external/totp/services/hmac/hmac_common.h b/applications/external/totp/services/hmac/hmac_common.h
index 0cd56ed999..3499cb800b 100644
--- a/applications/external/totp/services/hmac/hmac_common.h
+++ b/applications/external/totp/services/hmac/hmac_common.h
@@ -1,5 +1,4 @@
#include
-#include "sha256.h"
#include "memxor.h"
#define IPAD 0x36
diff --git a/applications/external/totp/services/hmac/hmac_sha256.c b/applications/external/totp/services/hmac/hmac_sha256.c
index c51f24b4d7..00ac2a177c 100644
--- a/applications/external/totp/services/hmac/hmac_sha256.c
+++ b/applications/external/totp/services/hmac/hmac_sha256.c
@@ -15,6 +15,7 @@
along with this program. If not, see . */
#include "hmac_sha256.h"
+#include "sha256.h"
#define GL_HMAC_NAME 256
#define GL_HMAC_BLOCKSIZE 64
diff --git a/applications/external/totp/services/hmac/sha1.c b/applications/external/totp/services/hmac/sha1.c
index ecf22fc972..29f22e3c30 100644
--- a/applications/external/totp/services/hmac/sha1.c
+++ b/applications/external/totp/services/hmac/sha1.c
@@ -27,6 +27,8 @@
#include
#include
+#include "sha_pad_buffer.h"
+
#ifdef WORDS_BIGENDIAN
#define SWAP(n) (n)
#else
@@ -34,10 +36,6 @@
#define SWAP(n) swap_uint32(n)
#endif
-/* This array contains the bytes used to pad the buffer to the next
- 64-byte boundary. (RFC 1321, 3.1: Step 1) */
-static const unsigned char fillbuf[64] = {0x80, 0 /* , 0, 0, ... */};
-
/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
initialize it to the start constants of the SHA1 algorithm. This
must be called before using hash in the call to sha1_hash. */
@@ -87,7 +85,7 @@ void* sha1_finish_ctx(struct sha1_ctx* ctx, void* resbuf) {
ctx->buffer[size - 2] = SWAP((ctx->total[1] << 3) | (ctx->total[0] >> 29));
ctx->buffer[size - 1] = SWAP(ctx->total[0] << 3);
- memcpy(&((char*)ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+ sha_pad_buffer(&((uint8_t*)ctx->buffer)[bytes], (size - 2) * 4 - bytes);
/* Process last bytes. */
sha1_process_block(ctx->buffer, size * 4, ctx);
diff --git a/applications/external/totp/services/hmac/sha256.c b/applications/external/totp/services/hmac/sha256.c
index 89ca67c2be..09ba272e74 100644
--- a/applications/external/totp/services/hmac/sha256.c
+++ b/applications/external/totp/services/hmac/sha256.c
@@ -25,6 +25,7 @@
#include
#include
+#include "sha_pad_buffer.h"
#ifdef WORDS_BIGENDIAN
#define SWAP(n) (n)
@@ -33,10 +34,6 @@
#define SWAP(n) swap_uint32(n)
#endif
-/* This array contains the bytes used to pad the buffer to the next
- 64-byte boundary. */
-static const unsigned char fillbuf[64] = {0x80, 0 /* , 0, 0, ... */};
-
/*
Takes a pointer to a 256 bit block of data (eight 32 bit ints) and
initializes it to the start constants of the SHA256 algorithm. This
@@ -91,7 +88,7 @@ static void sha256_conclude_ctx(struct sha256_ctx* ctx) {
set_uint32((char*)&ctx->buffer[size - 2], SWAP((ctx->total[1] << 3) | (ctx->total[0] >> 29)));
set_uint32((char*)&ctx->buffer[size - 1], SWAP(ctx->total[0] << 3));
- memcpy(&((char*)ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+ sha_pad_buffer(&((uint8_t*)ctx->buffer)[bytes], (size - 2) * 4 - bytes);
/* Process last bytes. */
sha256_process_block(ctx->buffer, size * 4, ctx);
diff --git a/applications/external/totp/services/hmac/sha512.c b/applications/external/totp/services/hmac/sha512.c
index b56dd0f2eb..ffe2864fbd 100644
--- a/applications/external/totp/services/hmac/sha512.c
+++ b/applications/external/totp/services/hmac/sha512.c
@@ -27,13 +27,10 @@
#include
#include "byteswap.h"
+#include "sha_pad_buffer.h"
#define SWAP(n) swap_uint64(n)
-/* This array contains the bytes used to pad the buffer to the next
- 128-byte boundary. */
-static const unsigned char fillbuf[128] = {0x80, 0 /* , 0, 0, ... */};
-
/*
Takes a pointer to a 512 bit block of data (eight 64 bit ints) and
initializes it to the start constants of the SHA512 algorithm. This
@@ -90,7 +87,7 @@ static void sha512_conclude_ctx(struct sha512_ctx* ctx) {
SWAP(u64or(u64shl(ctx->total[1], 3), u64shr(ctx->total[0], 61))));
set_uint64((char*)&ctx->buffer[size - 1], SWAP(u64shl(ctx->total[0], 3)));
- memcpy(&((char*)ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
+ sha_pad_buffer(&((uint8_t*)ctx->buffer)[bytes], (size - 2) * 8 - bytes);
/* Process last bytes. */
sha512_process_block(ctx->buffer, size * 8, ctx);
diff --git a/applications/external/totp/services/hmac/sha_pad_buffer.c b/applications/external/totp/services/hmac/sha_pad_buffer.c
new file mode 100644
index 0000000000..badedbcc7d
--- /dev/null
+++ b/applications/external/totp/services/hmac/sha_pad_buffer.c
@@ -0,0 +1,11 @@
+#include "sha_pad_buffer.h"
+#include
+
+void sha_pad_buffer(uint8_t* buffer, size_t size) {
+ if(size > 0) {
+ buffer[0] = 0x80;
+ if(size > 1) {
+ memset(&buffer[1], 0, size - 1);
+ }
+ }
+}
\ No newline at end of file
diff --git a/applications/external/totp/services/hmac/sha_pad_buffer.h b/applications/external/totp/services/hmac/sha_pad_buffer.h
new file mode 100644
index 0000000000..7dba40fa96
--- /dev/null
+++ b/applications/external/totp/services/hmac/sha_pad_buffer.h
@@ -0,0 +1,4 @@
+#include
+#include
+
+void sha_pad_buffer(uint8_t* buffer, size_t size);
\ No newline at end of file
diff --git a/applications/external/totp/types/token_info.c b/applications/external/totp/types/token_info.c
index 2f108033be..6810d02110 100644
--- a/applications/external/totp/types/token_info.c
+++ b/applications/external/totp/types/token_info.c
@@ -117,6 +117,27 @@ bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString* str)
return false;
}
+bool token_info_set_algo_from_int(TokenInfo* token_info, uint8_t algo_code) {
+ switch(algo_code) {
+ case SHA1:
+ token_info->algo = SHA1;
+ break;
+ case SHA256:
+ token_info->algo = SHA256;
+ break;
+ case SHA512:
+ token_info->algo = SHA512;
+ break;
+ case STEAM:
+ token_info->algo = STEAM;
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
char* token_info_get_algo_as_cstr(const TokenInfo* token_info) {
switch(token_info->algo) {
case SHA1:
diff --git a/applications/external/totp/types/token_info.h b/applications/external/totp/types/token_info.h
index 138ad32b12..0d73dd0615 100644
--- a/applications/external/totp/types/token_info.h
+++ b/applications/external/totp/types/token_info.h
@@ -168,7 +168,7 @@ void token_info_free(TokenInfo* token_info);
/**
* @brief Encrypts & sets plain token secret to the given instance of \c TokenInfo
* @param token_info instance where secret should be updated
- * @param base32_token_secret plain token secret in Base32 format
+ * @param plain_token_secret plain token secret
* @param token_secret_length plain token secret length
* @param plain_token_secret_encoding plain token secret encoding
* @param iv initialization vecor (IV) to be used for encryption
@@ -201,10 +201,18 @@ bool token_info_set_duration_from_int(TokenInfo* token_info, uint8_t duration);
* @brief Sets token hashing algorithm from \c str value
* @param token_info instance whichs token hashing algorithm should be updated
* @param str desired token algorithm
- * @return \c true if token hahsing algorithm has been updated; \c false otherwise
+ * @return \c true if token hashing algorithm has been updated; \c false otherwise
*/
bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString* str);
+/**
+ * @brief Sets token hashing algorithm from \c algo_code code
+ * @param token_info instance whichs token hashing algorithm should be updated
+ * @param algo_code desired token algorithm code
+ * @return \c true if token hashing algorithm has been updated; \c false otherwise
+ */
+bool token_info_set_algo_from_int(TokenInfo* token_info, uint8_t algo_code);
+
/**
* @brief Gets token hahsing algorithm name as C-string
* @param token_info instance which token hahsing algorithm name should be returned
From 5085a17bcb6fbe74fc8d874ef371aedc45d71d2f Mon Sep 17 00:00:00 2001
From: ushastoe
Date: Sat, 29 Apr 2023 18:16:53 +0300
Subject: [PATCH 07/23] HID app refactor
---
.../external/hid_app/assets/OutCircles.png | Bin 0 -> 2469 bytes
.../hid_app/assets/Pause_icon_9x9.png | Bin 4559 -> 1743 bytes
.../hid_app/assets/Pin_back_arrow_10x10.png | Bin 0 -> 4575 bytes
.../hid_app/assets/Pressed_Button_19x19.png | Bin 0 -> 1790 bytes
.../external/hid_app/assets/S_DOWN.png | Bin 0 -> 1893 bytes
.../external/hid_app/assets/S_LEFT.png | Bin 0 -> 1906 bytes
.../external/hid_app/assets/S_RIGHT.png | Bin 0 -> 1902 bytes
applications/external/hid_app/assets/S_UP.png | Bin 0 -> 1886 bytes
.../external/hid_app/assets/Voldwn_6x6.png | Bin 3593 -> 4556 bytes
.../external/hid_app/assets/Volup_8x6.png | Bin 3595 -> 4564 bytes
.../external/hid_app/views/hid_media.c | 51 +++++++++++-------
.../external/hid_app/views/hid_mouse.c | 26 ++++-----
.../external/hid_app/views/hid_tiktok.c | 42 ++++++++-------
.../external/hid_app/views/hid_ytshorts.c | 33 +++++++-----
14 files changed, 86 insertions(+), 66 deletions(-)
create mode 100644 applications/external/hid_app/assets/OutCircles.png
create mode 100644 applications/external/hid_app/assets/Pin_back_arrow_10x10.png
create mode 100644 applications/external/hid_app/assets/Pressed_Button_19x19.png
create mode 100644 applications/external/hid_app/assets/S_DOWN.png
create mode 100644 applications/external/hid_app/assets/S_LEFT.png
create mode 100644 applications/external/hid_app/assets/S_RIGHT.png
create mode 100644 applications/external/hid_app/assets/S_UP.png
diff --git a/applications/external/hid_app/assets/OutCircles.png b/applications/external/hid_app/assets/OutCircles.png
new file mode 100644
index 0000000000000000000000000000000000000000..f34d2687a6b1c03b312899572ce3dc6c2fb7af13
GIT binary patch
literal 2469
zcmcIm32+lt7*6Xzu>~1H$_+b8NG&vlD9qT+?j~JHvLU;rX|*a)
zs8AWFWu$-{au?(nK~W9`idGl|vC5${fH*Bh1Um@jC`WypCIu9bVaCjC_U-0--~YY;
z|Ni$fJ3DJ+m-s&M8jYrlEz>d%+(&?m>=X;WSFikiIk-I?$b3cCXcD@sSBz%S;$9j}
z94tDViqk%Z;Uu4yFbEgq-OM=4h)6K-
zWP+4~o+?jba2!5C}jZa*i-+|E7;{iy
z6)EVDByY4*+0lp)L1}R)d4lNYr9wGHRTP;ZSXf0c!Juj+f>8*eb6_|q8AH;k7|CE*
z8`KVrz_SYb53tdJVQPs<-F;w*7u`jV1GU>3n_pH~KPT8MCK!m)iXzYOdW>dy%7xGb
z>qc}2%7D0Vy&Dl&(q$kyo~ML1U0}XN;tJGEsPo%=%S#;KXwN1?=}3-rQ5-_hm>bbk
zlpdj7f&rl@N=K8Fo7ItIc$I+d<)8>!hxOjes;c4vBgPqd4%3qeM;ToR##1z6Bv=kH
zP;MjPa=Qo&*TK-;xMs;K1?>_KvJ3cmj&Vyt9}D~=`dE*E2K*k?&43-m%@k!&x}r#b
zU9&$sYMoeIPzM2K=vL_XB%x{z5qxcQT#TTEV-3JHYj9xK&JoG
zT%{}<_zv~u~Z-y?vX
z6NR6AF^}is2iD==ef1=Dc<^FSb-!$L82V51-8FBt0Wv^qs@9YvH66}++N+x$?F_>R
z%t%?xdYzffz;UZN!%C3DjTns^F{1&)N2G;gdPOiZJZd9B9~~`>yl0<}P6mgEI&43-
zz(f1NC-_0lg5X%|-nVX+MiZN2vt&5(ryYHD@0NW~r=P~$X{{v9UJ
zdf=towjG;u{Pm3o>7m!thi*)$?)>%1^j6&0!?R;?-?M*ATQTqFhTa`*eRl1AN>_F+
zhE1?-=v8JWvz89&vZ!0x1#O1|302ABk?#AKl-+v&06cZgsxSN1^eF#+&sfv;qQzz<
znHt+~PII6`-P}qhXEHM1wzgA!O9eIXo#%5e*vfy~kz^Y@bkYaY2i7E=?e^JAxub8D
zY%;Tz&XXNac|V*~J}I6jrZokYjNY=aS4wRoeQa>ogEO5MQ!h1V`p$gZ^~CKh>xtd5
ziNPUPW;o#UDI+&rABkip5^*tj!_hPEZV+wzbH&&U^pa=Hl>QTh^w6I>500v@z0_Ej
zI;*;6!K&EmmZhtpthvp(HtYCi)@IEX=GT8wku$J(>#)K7L$}4$8z1$&IpgwL
z^Lv}U*LpiIp%u#uD^84ESJqHrxtUw}4oI0O_OR;l3sWd-MV>MdBcL;m5JV#(iu|X&A6Jzl|RhB?A;}_+@tDm{t;n}&l*S8-}
z{k)|9o7MrN&Yga44D{82+r#TRUranZF@JsMrmlJ7$o_ra>QpxYS-Y@$_3~vU-yU!(
zNrz&$TG6XzdBw%I$a52GoBp~p@k)6u(;8R&$%fv@*_6ZTA1RwP%d%;B-t@l#cgkqJ
literal 0
HcmV?d00001
diff --git a/applications/external/hid_app/assets/Pause_icon_9x9.png b/applications/external/hid_app/assets/Pause_icon_9x9.png
index d72d712bbaa47429793bddbab0096de8d95045b4..fe16dc03e2629da128e37a7b9e1ccb11b4c92b78 100644
GIT binary patch
delta 682
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