pyblock/pybitblock/sha256.py
GaltRanch d79977ce00 Full security and code quality audit fixes across codebase
Security (Critical):
- Eliminate all shell=True command injection vectors (~95 instances in ppi.py, spvblock.py)
- Replace subprocess curl calls with requests library
- Add input validation (fiat code allowlist, IP address validation)
- Replace weak random.randint/choice with secrets module for crypto ops
- Remove token/credential exposure from print statements
- Add path traversal prevention in config.py
- Create .conf.example templates, scrub local credentials

Stability:
- Replace 63 bare except clauses with specific exceptions + logging
- Fix file handle leaks with context managers (lnd.py, apisnd.py)
- Add threading.Lock for race conditions in clock/data.py
- Cap unbounded list growth (MAX_HISTORY_LEN=50)
- Add timeout=10 to ~50 requests calls missing timeouts

Maintainability:
- Extract _load_macaroon() helper (dedup 69 instances in PyBlock.py)
- Extract _load_lnd_config() helper (dedup 33 instances in nodeconnection.py)
- Normalize json import (simplejson with stdlib fallback)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:57:20 -03:00

91 lines
3.6 KiB
Python

import hashlib
import random
import secrets
import string
import time
import curses
def sha256_hash(input_data):
sha256 = hashlib.sha256()
sha256.update(input_data.encode())
return sha256.hexdigest()
def binario_de_hexadecimal(hex_string):
"""Convierte una cadena hexadecimal en una cadena binaria."""
return bin(int(hex_string, 16))[2:].zfill(len(hex_string) * 4)
def binario_a_hex(binario):
"""Convierte una cadena binaria en una cadena hexadecimal."""
return hex(int(binario, 2))[2:].zfill(64)
def generar_cadena_aleatoria(longitud=6):
letras = string.ascii_lowercase
return ''.join(secrets.choice(letras) for i in range(longitud))
def mainSHA(stdscr):
curses.curs_set(0) # Oculta el cursor
input_data = generar_cadena_aleatoria()
ciclo = 1
curses.curs_set(0) # Oculta el cursor
curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_CYAN, curses.COLOR_BLACK)
curses.init_pair(4, curses.COLOR_MAGENTA, curses.COLOR_BLACK)
curses.init_pair(5, curses.COLOR_RED, curses.COLOR_BLACK)
while True:
stdscr.clear()
# Convertir input a ASCII y luego a binario
valores_ascii = [ord(c) for c in input_data]
valores_binarios = [bin(v)[2:].zfill(8) for v in valores_ascii]
mensaje_binario = ''.join(valores_binarios)
# Calcular hash SHA-256 del mensaje
hash_resultado = sha256_hash(input_data)
hash_binario = bin(int(hash_resultado, 16))[2:].zfill(256)
#script_sig_binario = binario_de_hexadecimal(hash_resultado[:128])
n_secuencia_binario = binario_de_hexadecimal(hash_resultado[:8])
# Crear diferentes "ventanas" para cada parte del proceso
altura, ancho = stdscr.getmaxyx()
# Ventana para el resultado
win_resultado = curses.newwin(altura // 3, ancho, 0, 0)
win_resultado.box()
win_resultado.addstr(1, 1, f"Hashing {ciclo}:", curses.color_pair(1)) # Posición de texto ajustada
win_resultado.addstr(2, 1, f"Hash SHA-256: {hash_resultado}", curses.color_pair(1))
win_resultado.addstr(3, 1, f"ScriptPubKey: {hash_resultado[:64]}", curses.color_pair(3))
win_resultado.addstr(4, 1, f"ScriptSig HEX: {hash_resultado[:32]}", curses.color_pair(3))
win_resultado.addstr(5, 1, f"nSeq BIN: {n_secuencia_binario}", curses.color_pair(4))
win_resultado.refresh()
# Ventana para el padding
win_padding = curses.newwin(altura // 3, ancho, altura // 3, 0)
win_padding.box()
win_padding.addstr(1, 1, "Padding:", curses.color_pair(1))
for i, linea in enumerate(mensaje_binario[j:j+64] for j in range(0, len(mensaje_binario), 64)):
win_padding.addstr(i + 2, 1, linea, curses.color_pair(4))
win_padding.refresh()
time.sleep(0.5)
win_padding.refresh()
# Ventana para el hash binario
win_hash_binario = curses.newwin(altura // 3, ancho, 2 * altura // 3, 0)
win_hash_binario.box()
win_hash_binario.addstr(1, 1, "BIN:", curses.color_pair(1))
for i, linea in enumerate(hash_binario[j:j+64] for j in range(0, len(hash_binario), 64)):
win_hash_binario.addstr(i + 2, 1, linea, curses.color_pair(5))
win_hash_binario.refresh()
time.sleep(1) # Esperar antes de continuar con el siguiente ciclo
# Preparar para el siguiente ciclo
input_data = hash_resultado
ciclo += 1
def ex():
# Ejecutar el proceso en un bucle de `curses`
curses.wrapper(mainSHA)