8000 feat: add customizeable layouts by dni · Pull Request #24 · lnbits/fossa · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat: add customizeable layouts #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions fossa/100_config.ino
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ void setDefaultValues() {
Serial.println("Max amount: " + String(maxamount));
maxBeforeReset = MAX_BEFORE_RESET;
Serial.println("Max before reset: " + String(maxBeforeReset));
convertStringToFloatArray(COIN_AMOUNTS, coinAmountFloat);
Serial.println("Coin amounts: " + String(COIN_AMOUNTS));
}

void readFiles() {
Expand Down
4 changes: 2 additions & 2 deletions fossa/101_translations.ino
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ String translate(String key, String language) {
[en]
usbT = USB config mode
tapScreenT = TAP SCREEN WHEN FINISHED
scanMeT = SCAN ME TAP SCREEN WHEN FINISHED
totalT = Total:
scanMeT = SCAN ME
totalT = Total:
fossaT = FOSSA! Bitcoin ATM
satsT = SATS
forT = FOR
Expand Down
4 changes: 2 additions & 2 deletions fossa/102_helpers.ino
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ void splitSettings(String str) {
}

void convertStringToFloatArray(const char* str, float* floatArray) {
char buffer[20]; // Temporary buffer to hold each substring
char buffer[30]; // Temporary buffer to hold each substring
int index = 0; // Index for the float array
int bufferIndex = 0; // Index for the buffer

Expand All @@ -55,7 +55,7 @@ void convertStringToFloatArray(const char* str, float* floatArray) {
buffer[bufferIndex++] = str[i]; // Copy characters to buffer
}
}

// Don't forget to convert the last number in the string
buffer[bufferIndex] = '\0'; // Null-terminate the buffer
floatArray[index] = atof(buffer); // Convert buffer to float
Expand Down
112 changes: 47 additions & 65 deletions fossa/103_lnurl.ino
Original file line number Diff line number Diff line change
@@ -1,23 +1,53 @@
////////////////////////////////////////////
///////////////LNURL STUFF//////////////////
////USING STEPAN SNIGREVS GREAT CRYTPO//////
////////////THANK YOU STEPAN////////////////
////////////////////////////////////////////

void makeLNURL() {
int randomPin = random(1000, 9999);
byte nonce[8];
for (int i = 0; i < 8; i++) {
nonce[i] = random(256);
void encrypt(const char* key, unsigned char* iv, int length, const char* plainText, unsigned char* outputBuffer){
if (strlen(key) != 16) {
Serial.println("Key must be 16 bytes long. not " + String(strlen(key)) + " bytes.");
return;
}
mbedtls_aes_context aes;
mbedtls_aes_init(&aes);
mbedtls_aes_setkey_enc(&aes, (const unsigned char*)key, strlen(key)*8);
mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, length, iv, (const unsigned char*)plainText, outputBuffer);
mbedtls_aes_free(&aes);
}

byte payload[51]; // 51 bytes is max one can get with xor-encryption

size_t payload_len = xor_encrypt(payload, sizeof(payload), (uint8_t *)secretATM.c_str(), secretATM.length(), nonce, sizeof(nonce), randomPin, float(total));
String preparedURL = baseURLATM + "?atm=1&p=";
preparedURL += toBase64(payload, payload_len, BASE64_URLSAFE | BASE64_NOPADDING);
bool makeLNURL() {

unsigned char iv_init[16];
unsigned char iv[16];
for (int i = 0; i < 16; i++) {
iv[i] = random(0, 255);
iv_init[i] = iv[i];
}
int randomPin = random(1000, 9999);
String payload = String(randomPin) + String(":") + String(total);
size_t payload_len = payload.length();
int padding = 16 - (payload_len % 16);
unsigned char encrypted[payload_len + padding] = {0};
encrypt(secretATM.c_str(), iv, payload_len + padding, payload.c_str(), encrypted);
String preparedURL = baseURLATM + "?p=";
String s;
for (int i = 0; i < sizeof(encrypted); i++) {
s = String(encrypted[i], HEX);
if (s.length() == 1) {
s = "0" + s;
}
preparedURL += s;
}
preparedURL += "&iv=";
for (int i = 0; i < sizeof(iv_init); i++) {
s = String(iv_init[i], HEX);
if (s.length() == 1) {
s = "0" + s;
}
preparedURL += s;
}
Serial.println(preparedURL);
lnurl_encode(preparedURL);
return true;
}

void lnurl_encode(String preparedURL) {
char Buf[200];
preparedURL.toCharArray(Buf, 200);
char *url = Buf;
Expand All @@ -27,54 +57,6 @@ void makeLNURL() {
char *charLnurl = (char *)calloc(strlen(url) * 2, sizeof(byte));
bech32_encode(charLnurl, "lnurl", data, len);
to_upper(charLnurl);
qrData = baseURLATM.substring(0, baseURLATM.length() - 18) + "atm" + "?lightning=" + charLnurl;
qrData = charLnurl;
Serial.println(qrData);
}

int xor_encrypt(uint8_t *output, size_t outlen, uint8_t *key, size_t keylen, uint8_t *nonce, size_t nonce_len, uint64_t pin, uint64_t amount_in_cents) {
// check we have space for all the data:
// <variant_byte><len|nonce><len|payload:{pin}{amount}><hmac>
if (outlen < 2 + nonce_len + 1 + lenVarInt(pin) + 1 + lenVarInt(amount_in_cents) + 8) {
return 0;
}

int cur = 0;
output[cur] = 1; // variant: XOR encryption
cur++;

// nonce_len | nonce
output[cur] = nonce_len;
cur++;
memcpy(output + cur, nonce, nonce_len);
cur += nonce_len;

// payload, unxored first - <pin><currency byte><amount>
int payload_len = lenVarInt(pin) + 1 + lenVarInt(amount_in_cents);
output[cur] = (uint8_t)payload_len;
cur++;
uint8_t *payload = output + cur; // pointer to the start of the payload
cur += writeVarInt(pin, output + cur, outlen - cur); // pin code
cur += writeVarInt(amount_in_cents, output + cur, outlen - cur); // amount
cur++;

// xor it with round key
uint8_t hmacresult[32];
SHA256 h;
h.beginHMAC(key, keylen);
h.write((uint8_t *)"Round secret:", 13);
h.write(nonce, nonce_len);
h.endHMAC(hmacresult);
for (int i = 0; i < payload_len; i++) {
payload[i] = payload[i] ^ hmacresult[i];
}

// add hmac to authenticate
h.beginHMAC(key, keylen);
h.write((uint8_t *)"Data:", 5);
h.write(output, cur);
h.endHMAC(hmacresult);
memcpy(output + cur, hmacresult, 8);
cur += 8;

// return number of bytes written to the output
return cur;
}
80 changes: 55 additions & 25 deletions fossa/105_display.ino
Original file line number Diff line number Diff line change
@@ -1,66 +1,101 @@
#ifdef LAYOUT_1
int horizontalOffset = 480;
int verticalOffset = 40;
int qrPixelSize = 4;
int qrHorizontalOffset = 120;
int qrVerticalOffset = 20;
int qrTextHorizontalOffset = 40;
int qrTextVerticalOffset = 290;
#endif
#ifdef LAYOUT_2
int horizontalOffset = 240;
int verticalOffset = 20;
int qrPixelSize = 3;
int qrHorizontalOffset = 28;
int qrVerticalOffset = 28;
int qrTextHorizontalOffset = 10;
int qrTextVerticalOffset = 220;
#endif

void printMessage(String text1, String text2, String text3, int ftcolor, int bgcolor) {
tft.fillScreen(bgcolor);
tft.setTextColor(ftcolor, bgcolor);
tft.setTextSize(4);
tft.setCursor((480 - textWidth(text1, 4)) / 2, 40);
tft.setTextSize(3);
tft.setCursor((horizontalOffset - tft.textWidth(text1)) / 2, verticalOffset);
tft.println(text1);
tft.setCursor((480 - textWidth(text2, 4)) / 2, 120);
tft.setCursor((horizontalOffset - tft.textWidth(text2)) / 2, verticalOffset + 60);
tft.println(text2);
tft.setTextSize(3);
tft.setCursor((480 - textWidth(text3, 3)) / 2, 200);
tft.setCursor((horizontalOffset - tft.textWidth(text3)) / 2, verticalOffset + 140);
tft.println(text3);
}

void feedmefiat() {
tft.setTextColor(TFT_WHITE);
tft.setCursor((480 - textWidth(fossaT, 2)) / 2, 40);
tft.setTextSize(2);
tft.setCursor((horizontalOffset - tft.textWidth(fossaT)) / 2, verticalOffset);
tft.println(fossaT);
tft.setCursor((480 - textWidth(feedT + " " + String(charge) + chargeT, 2)) / 2, 280);
tft.setTextSize(2);
tft.println(feedT + " " + String(charge) + chargeT);
#ifdef LAYOUT_1
String printFeedT = feedT + " " + String(charge) + chargeT;
tft.setCursor((horizontalOffset - tft.textWidth(printFeedT)) / 2, verticalOffset + 260);
tft.println(printFeedT);
#endif
#ifdef LAYOUT_2
tft.setCursor((horizontalOffset - tft.textWidth(feedT)) / 2, verticalOffset + 240);
tft.println(feedT);
tft.setCursor((horizontalOffset - tft.textWidth(String(charge) + chargeT)) / 2, verticalOffset + 260);
tft.println(String(charge) + chargeT);
#endif
}

void feedmefiatloop() {
tft.setTextColor(homeScreenColors[homeScreenNumColorCount]);
tft.setTextSize(8);
tft.setCursor((480 - textWidth(satsT, 8)) / 2, 80);
tft.setCursor((horizontalOffset - tft.textWidth(satsT)) / 2, verticalOffset + 40);
tft.println(satsT);
tft.setCursor((480 - textWidth(forT, 8)) / 2, 140);
tft.setCursor((horizontalOffset - tft.textWidth(forT)) / 2, verticalOffset + 100);
tft.println(forT);
tft.setCursor((480 - textWidth(fiatT, 8)) / 2, 200);
tft.setCursor((horizontalOffset - tft.textWidth(fiatT)) / 2, verticalOffset + 160);
tft.println(fiatT);
delay(100);
}

void qrShowCodeLNURL(String message) {
void qrShowCodeLNURL() {
#ifdef PRINTER
printMessage(printingT, waitT, "", TFT_WHITE, TFT_BLACK);
delay(3000);
printReceipt();
#endif
Serial.println(qrData);
tft.fillScreen(TFT_WHITE);
const char *qrDataChar = qrData.c_str();
QRCode qrcoded;
uint8_t qrcodeData[qrcode_getBufferSize(20)];
uint8_t qrcodeData[qrcode_getBufferSize(30)];
qrcode_initText(&qrcoded, qrcodeData, 11, 0, qrDataChar);

for (uint8_t y = 0; y < qrcoded.size; y++) {
for (uint8_t x = 0; x < qrcoded.size; x++) {
if (qrcode_getModule(&qrcoded, x, y)) {
tft.fillRect(120 + 4 * x, 20 + 4 * y, 4, 4, TFT_BLACK);
tft.fillRect(qrHorizontalOffset + qrPixelSize * x, qrVerticalOffset + qrPixelSize * y, qrPixelSize, qrPixelSize, TFT_BLACK);
} else {
tft.fillRect(120 + 4 * x, 20 + 4 * y, 4, 4, TFT_WHITE);
tft.fillRect(qrHorizontalOffset + qrPixelSize * x, qrVerticalOffset + qrPixelSize * y, qrPixelSize, qrPixelSize, TFT_WHITE);
}
}
}

tft.setCursor(40, 290);
tft.setTextSize(2);
tft.setTextColor(TFT_BLACK, TFT_WHITE);
tft.println(message);
tft.setTextSize(2);
#ifdef LAYOUT_1
tft.setCursor(qrTextHorizontalOffset, qrTextVerticalOffset);
tft.println(scanMeT + " " + tapScreenT);
#endif
#ifdef LAYOUT_2
tft.setCursor(qrTextHorizontalOffset, qrTextVerticalOffset);
tft.println(scanMeT);
tft.setCursor(qrTextHorizontalOffset, qrTextVerticalOffset + 20);
tft.println(tapScreenT);
#endif

delay(2000);

waitForTap = true;
while (waitForTap) {
BTNA.read();
Expand All @@ -69,8 +104,3 @@ void qrShowCodeLNURL(String message) {
}
}
}

int textWidth(String text, int textSize) {
tft.setTextSize(textSize);
return tft.textWidth(text);
}
Loading
0