Mostrando entradas con la etiqueta training. Mostrar todas las entradas
Mostrando entradas con la etiqueta training. Mostrar todas las entradas

2023/12/03

Para leer Emerging Topics in Hardware Security - General

Esta nota es el resultado de la lectura atenta del libro Emerging Topics in Hardware Security, registro mis opiniones, inquietudes y hallazgos, apuntando a que sea útil para mí como memoria y para tí como disparador.

Desde hace meses sino años, tengo una pila de libros para leer, pero todos tienen alguna parte que es mejor practicar, incompatible con vacaciones, transporte público. Al ser este libro muy teórico, me basta con la lectura atenta y tomar notas... estas son las notas.

 

Empecemos con que no es un libro, es un compendio de papers.

En general, los artículos son, tal como insinúa el título, temas en la cresta de la ola y además de un nivel técnico muy alto y de temas muy específicos. Eso hace que el lector, Charly, por momentos quede un poco afuera. No es que no haya ocurrido con otros libros, pero en los otros no tuve la siguiente sensación:

Parecen escritos por personas que no dominan el idioma inglés, no lo digo porque los nombres de todos los autores parezcan ser de la India, sino porque efectivamente hay expresiones, formas de armar la frase y algunas cosas que me parecen que son errores gramaticales. También hay errores de sintaxis.

No señalaría esta superficialidad, pero como no conozco algunos de los temas, me produce una cierta desconfianza. No mucha, conozco gente del grupo de embebidos que me consta que saben un montón pero no escribir.

No sé cual es la tasa de entradas bibliográficas normal para un paper, pero con respecto a algunos libros conocidos, es mayor y en algunos capítulos muy mayor:




páginasnotasn / p
1Blockchain-Enabled Electronics Supply Chain Assurance25481.9
2Digital Twin with a Perspective from Manufacturing Industry351454.1
3Trillion Sensors Security341514.4
4Security of AI Hardware Systems16372.3
5Machine Learning in Hardware Security36852.4
6Security Assessment of High-Level Synthesis24401.7
7CAD for Side-Channel Leakage Assessment28451.6
8Post-Quantum Hardware Security301013.4
9Post-Quantum Cryptographic Hardware and Embedded Systems28531.9
10Neuromorphic Security24612.5
11Homomorphic Encryption28642.3
12Software Security with Hardware in Mind26612.3
13Firmware Protection22211.0
14Security of Emerging Memory Chips34762.2
15Security of Analog, Mixed-Signal, and RF Devices28632.3
16Analog IP Protection and Evaluation52671.3
17Application of Optical Techniques to Hardware Assurance22602.7
18Computer Vision for Hardware Security34752.2
19Asynchronous Circuits and Their Applications in Hardware Security28682.4
20Microfluidic Device Security24682.8

Total57813892.4

 


páginasnotasn / p
Artificial Intelligence - Russel/Norvig10009000.9
Object Oriented Software Construction - Meyer12003600.3
Security Engineering - Anderson89013801.6
Computer Architecture - Hennessy/Patterson6306401.0
Hardware Security - Tehranipoor/Bhunia4507481.7

 

El último es especialmente interesante pues Tehranipoor es el editor del libro en cuestión.

Las cuentas no están del todo bien hechas pues no estoy considerando al cantidad de palabras por página, OOSC en particular tiene la letra grande. No estoy seguro que estos números sean indicadores de calidad o de su falta.

¿Por qué me molesta esto de la bibliografía? Se debe a que estoy más acostumbrado a leer textos donde la mayor parte es explicación, no "tal xxx hizo tal prueba" sin dar ningún otro detalle.

Dejando de lado este aspecto superficial, pasemos a lo importante.


El contexto general de la seguridad de hardware, que es el hilo conductor de algunos artículos de modo explícito y afecta de modo implícto a todos es la protección durante la cadena de suministro del hardware (esto sale del capítulo 1):

  • IP Owner y la fábrica
  • Ensamblado del PCB
  • Integración del sistema
  • Usuario final
  • Disposición final o reciclado

Existiendo estos ataques más comunes:

  • Sobreproducción, para venta no declarada
  • Ingeniería reversa, para falsificación, copia o ahorrarse parte del diseño
  • Reutilización en lugar de disposición final
  • Falsificación, es hacer algo copiado y ponerle una marca ajena
  • Reclasificación, tipo remarcar un componente común como industrial


Mi opinión


Dejando de lado lo superficial y la calidad despareja, es un libro muy rellenador de detalles de los temas que ya conocía de antes y más aún disparador de los que ni estaba al tanto de la existencia, como:


  • Neuromorphic y sus memristores
  • Microfluidic devices
  • El nicho de los circuitos asincrónicos.


Si prestaste atención al título, "General", da a entender que puede haber otra nota. No te prometo, me llevó cuatro meses leerlo, como estoy un poco traumatizado y con más ganas de pasar al siguiente libro que de revisar este para dejar registradas mis notas.



2022/04/29

Buscando capacitación introductoria de SQL

En el marco de las cosas que estoy haciendo de IOT, andaba necesitando hallar capacitación gratuita de SQL para recomendar y lo primero que se me ocurrió fue buscar en Oracle, ya que tiene OracleDB y también MySQL. De paso busqué en Udemy filtrando con free, esta es mi experiencia. Aclaro que mi visión de todos estos cursos es un tanto limitada pues yo ya sé SQL, como que sólo puedo decir más o menos que tan completos o comprensibles son, destacando cuando hay algo interesante.

 

Oracle

El curso que hallé es https://devgym.oracle.com/pls/apex/dg/class/databases-for-developers-foundations.html dice que se puede hacer en unas 6 horas. Al comienzo me agarró una sensación de que aunque simpático era medio inusable, recién en el tercer bloque entré en sintonía. y empecé a considerarlo útil.

Tenés que darte de alta en:

  • https://www.oracle.com/index.html
  • view accounts
  • Oracle account
  • Create account

no hace falta cloud account, se puede usar gmail.

 

Tuve algunas dificultades con el SSO pero creo que fué más de capa ocho. Utilicé el método de preparar el mejor mensaje de consulta posible, esto es revisar a conciencia cada paso imaginándo qué me iban a preguntar y llegué a que tenía mal puesta la dirección en el keepass, lo cual me daba un comportamiento errático porque a veces copiaba esta dirección y a veces la llenaba a mano, muy confuso y difícil de diagnosticar.

Seguramente el comportamiento errático fue 100% por lo mío, pero como quedé medio traumatizado,  hago el login en oracle.com y luego voy a cada subsistema.

Cada módulo tiene varias secciones:
 

El video

 
Es muy simpático y aparentemente superficial, pero si prestás antención son muy didácticos.
 

Take live sql tutorial

 
Para los ejercicios tenés tres opciones, copio y pego:
 
 
 
Sólo probé la última. Cuando entrás en la sección  arriba a la derecha te ofrece login al laboraratorio
 
login
login

 
 
Luego a la derecha te replica los enunciados que tenías, asi no tenés que estar yendo y viniendo de tab.
 
enunciados
enunciados


 
Algunos tiene un botón de prerequistos. Todas las instrucciones las podés copiar y pegar o enviar directamente al editor, yo te recomiendo que las transcribas, es una manera de ir memorizando.
 

Further study

 
Respecto a esta sección, si estuviera corto de tiempo y tuviera que priorizar, les prestaría atencion a estos:
 

https://blog.jooq.org/say-no-to-venn-diagrams-when-explaining-joins/
https://blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations

 
En general, cuando te referencia a From Oracle Database 11g Release 2 Documentation Library y From Oracle-BASE son algo heavy, es el manual.
 

No relacionales

 
Menciona modelos no relacionales como Document Storage pero medio para apalearlos, obviamente son los amigos relaciones.
 

Si tu objetivo es el mismo que yo exploré, que es tener una idea de cómo operar sin meterte en detalles finos como los distintos tipos de bases de datos, o sea, si con
  • create table
  • insert
  • select
  • update
  • delete
  • una idea básica de cómo modelar y normalizar
te contenta y no partís completamente de cero, te puede servir. No le prestaría mucha atención al módulo de multi insert. Si lo tomás por favor dejame un comentario.

Cursos de Udemy


Udemy no es gratis, pero hay algunos cursos en algunos momentos que lo son, paso a detallar mi experiencia.

A beginner's guide to MySQL


https://www.udemy.com/course/mysql-basics

Media hora, inglés no nativo, mediocre.

Me hizo notar un detalle, que si no estás en embebidos ni se te pasa por la cabeza:

Para ejecutar MySQL necesitás un sistema operativo, al igual que con Erlang. Resultaría interesante saber que opciones hay para un sistema embebido baremetal o con FreeRTOS. Es difícil de buscar pues "database server bare metal" te lleva a la definión en el contexto de bases de datos que es tener el sistema operativo y nada más que el servidor de base de datos.
 
Otra dificultad es que al buscar "embedded database" ser refiere a un servidor que se puede incluir en la aplicación, por ejemplo para un servidor web en java existe  Jetty, https://github.com/cpantel/boxControl.

Busquemos entonces con "sqlite freertos" y tras varios saltos llegamos a https://sqlite.org/custombuild.html, mmh, podría... hacerlo otra persona, olvidemos el asunto pero sin olvidar que existe una opción comercial https://www.ittia.com/products/ittia-db-iot que parece interesante.

Volviendo al curso, empieza horrible, leyendo las presentación, luego mejora, va mostrando ejemplos de operaciones sin entrar en mucho detalle conceptual.


Lo que más me sirvió de toda esta experiencia es que repasé que para comparar con NULL es no es valor = NULL sino isnull valor, que de algún modo asocié en clase de Testing de Sistemas IoT que alguien había puesto en javascript:

if (value != NaN)

y cuando falló le pude sugerir que era

if ( isNaN(value) )



Me quedaron pendientes para otra vida:


2022/02/21

Primer contacto real con PIC16

Tras haber asistido a un seminario introductorio a PIC16, debido a que los kits fueron entregados tras éste, me quedaron pendientes dos actividades: el blinky y ver si unas instrucciones muy específicas bcf y bsf, no serían reemplazables por unos ingeniosos ands y ors.

 

El blinky

 

Hasta donde entendí, a diferencia de los AVR, estos PIC siempre necesitan una referencia externa para el clock, hay que ponerle un cristal y unos capacitores... no tan fácil, en el curso no hay ningún diagrama de conexión, como que está asumido que vos ya sabés electrónica digital y lo que no conocés es PIC. Menciona por un lado que sólo se van a usar dos pines para programar (TX y RX) y luego dice "Comparte el control del pin MCLR", ¿mmh, qué querrá decir? Obviamente pedí el diagrama pero para hacer más interesante esta experiencia lo voy a recibir cuando haya tenido éxito o fracaso.

Entonces, al buscar diagramas relacionados a cosas como "pic16f tiny bootloader circuit diagram and usb uart adapter" lo segundo mejor que encontré fué un proyecto donde muestra que se usa RTS para pegarle a MCLR (a.k.a. RESET), pero eso es a la salida de un MAX232, la idea es usar el adaptador USB-UART provisto en el kit (dicho sea de paso, ese kit debería haber traido el cristal, los capacitores...)

 

Usando RTS para el RESET
Usando RTS para el RESET


Finalmente, llegúe a un tutorial que al final dice:

 

Download the complete project folder from the below link:
Hardware design Files and Code Library 

 

Sin RTS
Sin RTS


perfecto, es lo más sencillo posible que parecería funcionar, al reset habría que darle con el dedo.

 

Ahora, a tomar posesión del chip, lo primero es identificar las patitas:

 

Pinout colorizado por función
Pinout colorizado por función

Cada color es un puerto, en grís los mínimos necesarios para programarlo.


A pensar un poco, muy poco, el diagrama del tutorial es lo que hay que hacer.


Circuito armado
Circuito armado

A la derecha Tx y Rx al USB-TTL. Lo alimento con una fuente externa.


Antes de investigar nada más, a ver si funciona. Hay que bajar el tinybootloader para linux y probar...

 

En la versión 0.6 al bajar el .deb falla por dependencia imposible de satisfacer, python-gtk2,buscando, hallamos https://osdn.net/projects/sfnet_tinybldlin/releases/ que dice tener la versión 0.8.1, veamos... nop, tambien necesita python-gtk2

              Depends: python-gtk2 but it is not installable
              Depends: python-cairo but it is not installed
              Depends: python-gobject but it is not installed
              Depends: python-serial but it is not installable

Veamos de instalarlo basándonos en https://techviewleo.com/install-python-with-virtualenv-on-linux-mint/

sudo apt-get update

sudo apt-get upgrade

sudo add-apt-repository universe

sudo apt-get update

con algunos

apt-cache search python 

determinamos que python-cairo y python-gobject estan disponibles, hay que usar pip para el resto

curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py

sudo python2 get-pip.py

ok, pero luego no puedo hallar los paquetes faltantes con pip


Hay varios caminos: 

  • resolver las dependencias
    • es en lo que vengo fallando
  • buscar otro programa
    • no está apareciendo
  • instanciar una virtual con una distro antigua que soporte python2
    • quizás tampoco pueda resolver las dependencias
    • puede ser que mplab no funcione ahí
      • no importa, sólo la usaría para flashear
  • usar wine
    • seguramente se me complique el acceso al puerto serial
    • chicken
  • instanciar una virtual con windows
    • se me puede complicar el acceso al puerto serial
    • chicken
  • actualizar el programa a python3
    • y hacer un aporte a la humanidad...
    • pero puede ser mucho tiempo
  • evitar el bootloader
    • esto significa faltar al espíritu de la experiencia original
    • tendría que armar o comprar el programador
      • no me interesa volver a hacer nada con PIC, quizás programar otro que tengo en un cajón

o mucho mejor aun, buscar un poco más hasta encontrar que 


https://github.com/lcgamboa/tinybldlin

y un

sudo apt install python3-serial


abre el programa, pero... siempre hay un pero, dice que:


Tiny PIC BootLoader
Tiny PIC BootLoader

...no lo encuentra. Mirá fijo la captura y vas a ver que en la terminal desde donde lo abriste, dice que aprietes el reset. Esta captura no es sobre la primera iteración, donde esa terminal había quedado oculta.

Lo aprieto y nada...

Siguiento mi método de armar un mail para no mandarlo, donde fuí documentando todo lo hecho para solicitar ayuda, descubrí que había conectado mal Rx, así que a desoldar... y anda.

Situación: hay que apretar el reset ante cada operación, ok, razonable.

Puede hacer falta por única vez:

  •  Tools -> Options -> Embedded -> Build Tools -> Scan for Build Tools 

Luego, para cada proyecto:

  • New project -> Microchip Embedded -> Standalone project
  • family -> Baseline 8-bit MCUs (PIC10/12/16)
  • device -> PIC16F874A
  • tool -> simulator
  • header -> none
  • compiler -> XC8 (v2.32) o similar
  • new file -> main.c

#include <xc.h>
#include <pic16f877a.h>
#include <stdio.h>

#define _XTAL_FREQ 4000000

void main(void) {
    TRISB = 0;
    PORTB=0;
    while(1) {
        PORTBbits.RB0=0;
        PORTBbits.RB1=0;
        PORTBbits.RB7=0;
        __delay_ms(500);
        PORTBbits.RB0=1;
        PORTBbits.RB1=1;
        PORTBbits.RB7=1;
        __delay_ms(500);
    }
    return;
}

  • Build
  • copiar a tinypicbootloader la ruta tipo:

/home/carlos/Desktop/blinky.X/dist/default/production/blinky.X.production.hex

  • write flash
  • reset
Listo, el blinky funciona.

La parte ingeniosa del análisis bcf -> andwf queda para otro día,


2021/12/27

Diplomatura de Desarrollo Seguro de Aplicaciones de la UNSTA 2021

En estos tres o cuatro meses he tenido el placer de ser alumno y docente de la Diplomatura de Desarrollo Seguro de Aplicaciones de la UNSTA.

 

La convocatoria

 

La organización me contactó para ver si podía dar una "charla magistral" de una hora y media de algún tema interesante y llamativo. Pensé un rato y ofrecí, en consonancia con lo que vengo haciendo últimamente, algo de seguridad de hardware. En la conversación fue creciendo y finalmente se convirtió en una materia de 9 horas.

 

Evidencia en LinkedIn
Evidencia en LinkedIn

 

Todo un desafío, nunca había dictado algo así antes. Había conversado con la organización de los cursos del Laboratorio de Sistemas Embebidos de la Facultad de Ingeniería de la Universidad de Buenos Aires (CESE, CEIoT), donde soy docente de Ciberseguridad en IoT y, no sé si seguirá existiendo, Testing de Sistemas IoT, la posibilidad de organizar una materia optativa de esta misma naturaleza, pero medio que más que ofrecerlo lo estaba pidiendo. O mejor dicho, algún tipo de "colaboración", con algunas otras personas para armarlo y que mi rol sea más "seguridad pura" que de los aspectos más técnicos del hardware. Pero debido a que es un esfuerzo infernal, son cursos orientados a alumnos de posgrado, los docentes suelen estar extremadamente ocupados y en promedio son más responsables que yo, no se sentían capacitados y no prosperó.

En las diplomaturas la ventaja es que las condiciones de aceptación de alumnos es un tanto más relajada y la exigencia general también. Un indicador sencillo es que una diplomatura como ésta o como otra que he hecho de Seguridad Bancaria, tiene una carga de 100 horas, dos a cuatro clases por materia. 

Los otros cursos tienen 15 materias de 8 clases cada una, son 24 horas cada materia, 360 horas en total. Incluso la carga semanal es un 50% mayor, dos contra tres días por semana. Cada materia suele tener unos ejercicios heavies y se espera que el trabajo práctico consuma unas 600 horas/persona, aunque no necesariamente sean todas tuyas, vale dirigir el trabajo de otras personas.

Respecto a la carga horaria del TP de esta diplomatura, calculo que si estuviste haciendo los ejercicios durante la cursada debe ser leve, pero si lo hubiera hecho completo yo solo me hubiera llevado hasta 40 horas.

Volviendo a mi participación como docente, me encontré con el siguiente FODA, un poco retrospectivo pues en ese momento aunque intuitivamente lo apliqué no lo llegué a concientizar:

Fortalezas

Experiencia en dar clases, experiencia en investigar seguridad de hardware aunque quizás de un modo un tanto esotérico, experiencia en ciberseguridad. Equipamiento de hardware apropiado.

Oportunidades

Poner a prueba el conocimiento que vengo juntando desde hace décadas. Identificar baches.

Debilidades

Conocimiento fragmentario e incompleto, desconocimiento de normas y electrónica en general. Falta de orden.

Amenazas

No llegar en tiempo y/o forma y pasar vergüenza ante los alumnos y/o la organización.

 

Preparativos

 

En las H4CK3D y en muchas charlas internas del trabajo ya había expuesto del tema de modo fragmentario y continué haciéndolo hasta antes e incluso después de las clases.

Tomé en simultáneo la materia Micro Arquitecturas y Soft Cores del CESE, que aunque no tenía relación directa, forma parte del conocimiento de base.

 

Resultados 


Tuve muy poco feedback, sin sorpresas ("te falta un poco de orden"), no tuve la sensación de haber fallado en las dos primeras clases, quizás la tercera estuvo floja pero más por mis expectativas, no sé si se notó "para afuera". Me había propuesto mostrar una demo de Secure Boot con ESP32-S pero en parte por que no llegué a hacer las pruebas y en parte por que no le encontré que fuera realmente interesante, sólo lo expliqué en términos teóricos.

De algún modo no logré un "relato", el poder recorrer los temas de un modo hilvanado. En las charlas que doy pego saltos, que te obligan a prestar demasiada atención, imposible a lo largo de tres clases, te olvidaste. Las charlas son para gente que eligió ir específicamente (igual alguien se ha quejado), en las clases, aunque no falte a quien le interese mucho, hay que considerar que para la mayoría es una de diez materias y no precisamente la más útil o interesante.

Otra dificultad es que de todas las otras materias he recibido capacitación, tiene un poco del ¿Para qué hacés un curso de algo que ya mayormente sabés? que ya he mencionad en otro lado y para esta materia no, todo muy fragmentario y autodidacta.



Como alumno


En mi condición de docente tuve grandes facilidades económicas para ser alumno, con lo cual no fue una elección muy difícil, en todo caso si la experiencia era mala, salía con un título de utilidad moderada. La verdad es que no conocía a nadie, ni sus cualidades o defectos, es la primera edición, aposté y salió bien.

Siempre hay alguna clase que por el tema o el modo de quien la dicta es un poco más aburrida y otra más entretenida, pero no ocurrió ninguna vez que me arrepintiera. No hubieron clases malas y sí hubieron clases muy, muy buenas, lamentablemente no tomé nota, siempre confiando en que luego se puede acceder a las presentaciones y confiando de modo completamente injustificado en mi memoria.

Hubo una cierta falta de coordinación entre las materias, algunos temas se vieron repetidos, no es tan terrible, es bueno el repaso. Pero algunos temas como que se escaparon, igual nada grave.

Si se repite, si los tiempos me dan, si me dejan, probablemente asista como oyente, esta vez tomando notas.

Las clases quedan grabadas, pero la verdad es que no me gusta ver grabaciones.

 

El trabajo práctico

 

Para quienes no estamos programando todo el día y más web, fué bastante heavy. Además llegó un poco tarde y en mi caso coincidió con que como docente tenía que terminar de preparar las clases, como alumno de otra materia en otro lado tenía que terminar su trabajo práctico, un fondo de ojo que me dejó muerto justo el día de la entrega, log4shell me dejó agotado cada día de esa semana y la anterior, el día del asado del trabajo y que dí una charla de Chain of Trust y Secure Boot en el trabajo aprovechando parte del material que había usado para las clases.

Tampoco ayudó, en mi caso, un poco de actitud liebre y tortuga, liebre en mi caso. Ya que cuento con experiencia tanto en desarrollo como en seguridad, medio que aflojé un poco. Pude haber canibalizado un trabajo práctico a medio hacer del CEIoT pero me dá un poco de vergüenza y además necesitaba hacer un reajuste mental de varios días, hace meses que no toco programación web y node.

Estaba compuesto de varias partes, una relacionada a bases de datos y enmascaramiento, otra de obtener información de una virtual vulnerable, la tercera corregir una aplicación y la cuarta,  más grande que las otra dos juntas, era hacer una API, agregarle autenticación y con tests de Postman mostrar su seguridad, todas cosas que sé hacer pero en este momento no estoy "sintonizado", mi cerebro está en FPGA.


Conclusión

 

Para decirlo del modo más corto posible, espero con ansia que se repita para que asistan las personas a las que invité en esta ocasión pero por haber sido con tan poco tiempo de aviso no pudieron asistir. Y por el lado docente, para tener la oportunidad de mejorar las clases. En términos de inversión, paga, quizás no como título pues es una Licenciatura, sujeto a interpretación, pero el resto está ok.

La profundidad y extensión de los temas fue correcta así como la calidad. Me hubiera gustado tener más feedback de mi materia.



2021/12/19

MAySC 2021 con el Forzador Brutal de MD5 en PYNQ-Z2 y Vivado 2018.2

He tenido el privilegio y placer de cursar Micro Arquitecturas y SoftCores a cargo de Nicolás Álvarez, excelente, no hay nada más que decir.

 

Había cursado la materia anterior también a su cargo, Circuitos Lógicos Programables, pero fué hace mucho y entre que olvidé algunas cosas como por ejemplo VHDL pues todos mis proyectos han sido en Verilog y que la materia incorporó algunos temas nuevos como VIO, ILA y uso de placas remotas, tuve unos ciertos apuros. Debido a que tengo una placa compatible con los laboratorios y no había exigencia en utilizar las placas remotas, había visto VIO e ILA en otro excelente curso Basic Digital Design con el Colo y Ariel Pola y ya había practicado algunos temas por mi parte de algunos libros y varios proyectos, no lo sufrí.

 

¿Para qué hacés un curso de algo que ya mayormente sabés?

 

Bueno, para empezar no sé tanto. Por un lado no trabajo de esto así que todo lo que aprendo lo voy olvidando paulatinamente por falta de uso, el "recursar" me lo refresca. Por otro lado, no es lo mismo lo que uno aprende de un libro, de un video, de experimentar en soledad que de una clase interactiva y más cuando quien enseña es del calibre de Nicolás.

 

El hardware


El curso se dicta con Vivado 2018.1 por que hay unas placas ArtyZ7-10 disponibles en el servidor que está con esa versión.


Yo ya tengo dos ZYNQs, una Parallella que es parecida a la Arty por el SoC (xc7z010clg400-1) pero no tiene nada de botones, switches y leds, sobre la cual intentaré publicar algo en un futuro cercano y una PYNQ-Z2, que vengo usando hace rato y su única diferencia a efectos prácticos del curso es que el SoC es xc7z020clg400-1, los ejercicios son menos que minúsculos como para que haga diferencia.

Respecto a Vivado 2018.1 vs Vivado 2018.2, no hallé diferencia...

 

El trabajo práctico

 

Los alumnos regulares tienen la posibilidad de hacer algo en el marco de su trábajo práctico de especialización. Eso me deja con hacer algo suficientemente difícil pero inútil o ver de reflotar alguna tarea del backlog y mirando mirando ¿qué mejor que tomar el queridísimo Forzador Brutal de MD5 y portarlo a la PYNQ aplicando las técnicas de encapsulamiento en IPs e interfaceando con los microprocesadores?

Durante la cursada de Basic Digital Design había fracasado en portar de Nexys4DDR a PYNQ-Z2 agregándole VIO e ILA. Lamentablemente no recuerdo bien cómo se manifestó ese fracaso, probé de usar un pipeline menos, la mitad. De hecho tomé esa versión con la mitad para este TP. Finalmente, como estaba trabado en un problema que no lograba resolver, reduje a dos pipelines para que Nicolás pudiera ayudarme. En el proceso de comprobar la correcta adaptación descubrí que no había hecho la adaptación correcta a cuatro pipelines y eso explica probablemente el fracaso anterior.

Otros errores que cometí fueron:

El reset lo invertí para dianosticar y me olvidé de revertirlo hasta que lo recordé.

Conecté un registro de entrada como uno de salida, mmh.

 

Un error no tan error 

 

No hice simulaciones desde el primer momento, pero de todos modos, el error más importante, el de la adaptación a menos pipelines, no saltaba en las simulaciones.

 

¿Qué me queda para hacer?

 

En las próximas notas explicaré como transité lo del hardware y el software del trabajo práctico. Luego intentaré parametrizar la cantidad de pipelines para poder usarlo indistintamente en la Nexy4DDR con 8, en la PYNQ con 4 y en la Parallella con 2, esto último tras haber tomado el control tanto tiempo postergado.


2021/11/27

Preparación para la certificación AWS Cloud Practitioner

Como ya he manifestado en otra ocasión, no soy amigo de las certificaciones y más las que no son las que me interesan muchisimo como CSSLP, CEH u otras que no me dá la cabeza para dar. Sin embargo, tengo sobrados motivos para AWS Cloud Practitioner:

Me obliga a aprender, comprender y practicar cosas que vengo haciendo de modo esporádico desde hace diez años.

Aprovechar que recientemente hice los cursos de Architecting y Security. El tachado se debe a que escribí esto a fin de 2020 y no pude darla en ese entonces por motivos logísticos. Todo esto que estás leyendo, es del pasado.

Si tomás una certificación, la siguiente te sale la mitad y la verdad es que si logro hacerme tiempo, querría hacer la de Security, me parece que hay que dar la de Architecting antes, el tiempo dirá, tengo otras cosas que me interesan mucho más.

En lugar de pagar 150 por la siguiente, pagás 175 (100 + ( 150 / 2)) por dos certificaciones. Igual es un ahorro menor, lo que más me cuesta es practicar y estudiar.

Unos meses antes había creado mi cuenta gratuita, medio que por error, así que me conviene aprovechar el período para hacer todo lo que pueda.

Y finalmente, en estos tiempos tan Cloud, queda bien en el CV.

---

Como anécdota, en el trabajo anterior tipo 2011 teníamos unas techtalks, en una de ellas presenté una serie de scripts para desplegar instancias de EC2, no recuerdo si con bash o PHP.

Lo que hacía era de un conjunto de máquinas, apagar un tercio y actualizarlas. Luego tomar otro tercio y apagarlas, luego apagar el tercio restante y a la vez levantar el tercio actualizado, luego actualizar uno de los tercios restante y levantarlo y dejar el tercio restante apagado por si había que restaurar.

En la charla al comentar los resultados, me perdí un montón de puntos de marketing al decir, cito casi textualmente:

"De las ocho veces que lo hemos probado, sólo una vez funcionó... y no fué la última"

---


Otro motivo para usar Cloud en general, AWS en particular, no muy fuerte, es sólo una excusa, es que desde que cambié de proveedor estoy detras de un NAT impenetrable y he necesitado para algún taller exponer un servidor.


Recursos 


Tambien gracias al trabajo, tengo acceso a LinkedIn Learning, que antes se llamaba Lynda. Tomé unos cursos de una señorita, llamados Introduction to AWS for NonEngineers, del 1 al 4 (Cloud Concepts, Security, Core Services, Billing and Pricing), son superficiales, pero amenos e instructivos y ante la falta de práctica, la repetición de conceptos básicos van formando un terreno fértil. Duran entre 40 y 80 minutos cada uno.

Luego, como persona podés acceder a muchos cursos gratuitos de AWS, pero, otra vez gracias al trabajo, si la empresa es partner, con esa cuenta se pueden acceder a más cursos.

El criterio que utilicé fue dejar la instrucción oficial y más específica para más cerca del examen, así que la siguiente etapa fueron un montón de estos cursitos de AWS de poca duración, menos de media hora cada uno:

  • Amazon Simple Storage Service - Basics (AWS Support)
  • Amazon Simple Storage Service - Closer look - Part 1 (AWS Support)
  • Amazon Simple Storage Service - Closer look - Part 2 (AWS Support)
  • Identity and Access Management - Architecture and Terminology
  • Identity and Access Management - Basics (AWS Support)
  • Introduction to Amazon Elastic Compute Cloud

 Fuí mechando con un algunos labs gratuitos de qwiklabs:

  • Introduction to Amazon Simple Storage Service (S3) 
  • Introduction to AWS Identity and Access Management (IAM)

Si quisieras un certificado de completitud de qwiklabs, este tiene hay una especie de dashboard público pero no brinda detalle de los labs, sólo de los "quests". De todos modos te llega un lindo mail con tu nombre registrado y el detalle de la fecha y lo que hiciste.


Quedó entonces para el final el de seis horas

 

Y un agregado extra, en 2020 hubo un "challenge"  que te regalaban el curso "Cloud Practitioner Essentials Day" que viene a ser una versión lavada de "Cloud Practitioner Essentials Training", no labs, no materiales, no slides. Y un voucher para un examen de prueba y hubo algunos webinarcitos y por supuesto lo tomé todo.

A por acá es que retomo un año más tarde...

Y otro agregado extra, más que agregado el balde que rebalsó el vaso, ahora a fin de 2021 hubo una Rocket Journey o similar, para quienes por acuerdos empresariales pueden acceder a AWS Partnet Network, un montón de capacitación, incluso un día con instructor y un desafío final gracias al cual me conseguí un voucher por el %100.

Lo interesante es la fragmentación, no hubo ningún recurso completamente contenido dentro de los otros, incluso si nos limitamos a los de AWS, simpre hay algo que no está en ningún otro, más si dejás pasar tanto tiempo, todo va mutando.

Por un lado más personal, esto es una de las cosas más difíciles que he hecho en mi vida, no por que en sí sea difícil sino por mi mismo, no sé por qué. Pensá que empecé a escribir esto 2020-12-25 más o menos y el examen lo dí 2021-11-25.

 

El examen

 

Me facilitó mucho el que fuera presencial, la idea de tener que armar una máquina con windows, en un ambiente que no estuviera lleno de cosas prohibidas y garantizar evitar interrupciones, me supera.

Cuando me faltaba media hora para salir rumbo al examen, caí en cuenta que no habia leido The Well Architected Framework, por que la vista web no indica bien rápido que hay unos heavies pdf (entre 40 y 60 páginas). Aún así aprobé.

 

Retrospectivamente

 

Con leer atentamente TWAF, recorrer un poco https://docs.aws.amazon.com/, tomarse todos esos cursitos gratuitos, tener visto para que sirven los, ponele 50 servicios principales y por qué no, algunas horas de práctica, debería alcanzar.






2021/11/17

Notas al seminario de MCU PIC16F

He asistido a un interesante seminario de explicaciones del PIC16F a cargo de Andrés Bruno Saravia que es Certified Trainer de Microchip, autor del libro "Arquitectura y Programación PIC16F1939 En Lenguaje C con XC8", comparto acá mis notas y la adaptación a linux.

 

Ideas


Un concepto que ya tenía aunque no recuerdo de donde ni tenerlo bien conciente es el de la compresión de instrucciones, me llevó un rato darme cuenta que no era una compresión real, sino a la manera de referirse a la relación entre el número de instrucciones en C y las necesarias en assembly.


Otro concepto que había sufrido antes sin darme cuenta es el de arquitectura cerrada vs abierta. Los 8051 tiene arquitectura abierta, esto es que se pueden tomar unos pines y exponer el bus de datos, direcciones y control para agregarle una memoria, por ejemplo. Los microcontroladores como los PIC y AVR que he usado son cerrados, no hay buses paralelos afuera.

Me llamó la atención que siendo uno de los objetivos que la ISA fuera bien chiquita, que existieran:


bcf f,b borra bit f
bsf f,b setea bit f

que según entiendo bien se podrían implementar con

 

andwf f, d AND W con f
iorwf f,d OR inclusiva W con f 

 

Cuando me junte con el kit, probaré. ¿Qué? ¿Que podría simular? Ni a palos, tengo otras cosas que hacer estos días, pero es una buena idea, lo probaré tanto con el chip como como excusa para aprender a simular.

 

El kit


Entiendo que el kit que recibiré no incluye los capacitores ni el cristal, evidentemente este seminario está más orientado a profesionales que a hobbystas como yo, que se asustan ante la más mínima insinuación de electrónica digital. No importa, son unos pesitos más, no pasa nada.

 

La adaptación a linux

 

Toolchain


Se trata de MPLAB-X, no hay nada que adaptar, sólo hay que bajarla del sitio oficial. Me pone un poco incómodo que tanto para la instalación de ésta como para la instalación de los compiladores haga falta hacerlo como root. Esto garantiza que siempre lo usaré en una virtual.

 

El tiny bootloader

 

¿Cómo hacés para cargarle un programa a una computadora? Lo bajás de internet, lo pasás por pendrive, diskette, lo que sea. Estos bichitos no tienen tantas posibilidades, en el caso de PIC se llama ICSP, que no es una certificación sino In-Circuit Serial Programming, parecido supongo a ISP (In System Programming) de los AVRs,  sólo le ocupan dos o tres pines y necesitan un programador, que son $$$ más y como yo sólo estoy de visita no lo pienso adquirir, con mis ATMega328p aún me sobra para lo que necesito.

Como hay otra gente a la que tampoco le cierra gastar esa plata ni perder N pines, existe un método que es cargar un programa que cuando arranca se fija si en el puerto serie hay unos ciertos códigos y si los encuentra considera que son el programa y lo carga en la flash. Si pasa un rato y no hay nada en el puerto serie, ejecuta lo que tenga de antes, supongo que nada si no hay nada.

 

En el seminario se utilizó tinybld198 que gentilmente fué provisto por Andrés y corre en windows. A buscar y lo primero que aparece es tinybldlin que ni siquiera hay que compilar pues funciona con python.

 

El adaptador


Ni hace falta que lo diga pero lo haré, no necesita agregar ningún driver, no entiendo por qué windows tiene esa tara, pasa lo mismo con edu-ciaa-fpga, usbasp, lo que sea.

Sí puede hacer falta toquetear udev y permisos. Los pasos ya los he registrado en otras entradas pero no me ofende volver a hacerlo...

 

Conclusión


A mi me encantó, no sé si tanto si ya hubiese sabido antes de PIC, tuvo quizás demasiado tiempo de no demo, pero el tiempo de demo fue bien respetado, al punto que el seminario duró como cuarenta minutos de más.

 

Cuando me junte con el kit, sigo... en https://seguridad-agile.blogspot.com/2022/02/primer-contacto-real-con-pic16.html




2021/08/27

Notas del curso Linux Device Drivers

En el marco de silenciar el cooler de una Raspberry Pi, vengo capacitándome tal como cuento en el curso anterior de linux "avanzado". Este, Linux Device Drivers , del mismo autor es de... drivers.

Los drivers en forma de módulos son la manera de no tener que estar recompilando y rebooteando al sistema operativo ante agregados y cambios.

El curso me ha servido mucho para comprender la arquitectura, estaba teniendo una idea equivocada del alcance de las responsabilidades del driver, cuando lo haga concretamente entraré en más detalles.

La parte de gestión está un poco repetida respecto al curso anterior, pero se vé con mayor profundidad, por ejemplo la parte de configuración para modprobe, el blacklisting, que en /sys/module/$MODULE/parameters están los parametros y serán legibles o incluso escribibles según los permisos de module_param().

Respecto a escribir módulos muy básicos el curso está ok, pero hay muchos temas muy interesantes que sólo menciona de modo muy superficial, por ejemplo:

  • debugfs
  • tracing
  • crash

Amerita cada uno de estos temas un buen tiempo, hoy no va a ser...

Me hubiera gustado que en el ejercicio de char devices, que es un dispositivo donde guardar un string, como parte del enunciado hubiera pedido que el tamaño del buffer se determinara en el momento de la carga en lugar del momento de compilación, pero eso hubiese significado usar memoria dinámica.

Tambien que se pudiera lidiar con >>, esto es, poder agregar información, el comportamiento actual es:

$ echo "hola" > /dev/charDevice

$ cat /dev/charDevice

hola

$ echo "chau" >> /dev/charDevice

$ cat /dev/charDevice

chau 

 

Y lo que deseo es:


$ echo "hola" > /dev/charDevice

$ cat /dev/charDevice

hola

$ echo "chau" >> /dev/charDevice

$ cat /dev/charDevice

hola

chau

 

Hagamos mi deseo realidad


La parte del append tiene dos aspectos, detectarlo y lidiar correctamente con el buffer.

Tras una caótica exploración de las estructuras en uso (léase, no recuerdo que hice) parecida a pensar que en el momento del write debería haber algún indicio de si estamos en el contexto de un > o un >>, hallé que file provee unos flags donde dice el modo de apertura. el campo se llama f_flags. y está en la struct file en fs.h y


struct file {
...
unsigned int f_flags;
...
}


con un if (filep->f_flags &O_APPEND) bien posicionado, ya podemos elegir el comportamiento.


Este es el código base:

 

ssize_t charDevice_write( struct file *filep,
                          const char *buf,
                          size_t nbytes, loff_t *ppos){
  int failed, transferred;
  if (debug)
    printk("WRITE : %d flags: %x\n",
           (int)nbytes, filep->f_flags);

  if (!nbytes)
    return 0;

  if (nbytes >= BUFFER_SIZE)
    nbytes =  BUFFER_SIZE-1;

  if (filep->f_flags & O_APPEND)
    printk("WRITE : Appending %ld bytes\n",nbytes);
  else
    printk("WRITE : Saving %ld bytes\n",nbytes);
    
  failed = copy_from_user(char_buffer, buf, nbytes);
  transferred = nbytes - failed;

  if (!transferred)
    return -EFAULT;

  char_buffer[transferred] = '\0';

  buffer_length = transferred;
  return transferred;

}

 

Este es el código intermedio ya funcionando:

 

ssize_t charDevice_write( struct file *filep,
                          const char *buf,
                          size_t nbytes, loff_t *ppos){
  int failed, transferred;
  if (debug)
    printk("WRITE : %d flags: %x\n",
           (int)nbytes, filep->f_flags);

  if (!nbytes)
    return 0;

  if (filep->f_flags & O_APPEND) {
    printk("WRITE : Appending %ld bytes\n",nbytes);
    if (nbytes >= BUFFER_SIZE - buffer_length)
      nbytes =  BUFFER_SIZE - buffer_length -1;

    failed = copy_from_user(
              char_buffer + buffer_length, buf, nbytes);
    transferred = nbytes - failed;

    if (!transferred)
      return -EFAULT;

    buffer_length += transferred;

    char_buffer[ buffer_length] = '\0';
  } else {
    printk("WRITE : Saving %ld bytes\n",nbytes);
    if (nbytes >= BUFFER_SIZE )
      nbytes =  BUFFER_SIZE-1;

    failed = copy_from_user(char_buffer, buf, nbytes);
    transferred = nbytes - failed;

    if (!transferred)
      return -EFAULT;

    buffer_length = transferred;
    char_buffer[transferred] = '\0';
  }
  return transferred;
}


Este es el código final refactorizado, notando que todo se trata de buffer_length:

 

ssize_t charDevice_write( struct file *filep,
                          const char *buf,
                          size_t nbytes, loff_t *ppos){
  int failed, transferred;
  if (debug)
    printk("WRITE : %d flags: %x\n",
            (int)nbytes, filep->f_flags);

  if (!nbytes)
    return 0;

  if (filep->f_flags & O_APPEND) {
    printk("WRITE : Appending %ld bytes\n",nbytes);
  } else {
    printk("WRITE : Saving %ld bytes\n",nbytes);
    buffer_length = 0;
  }

  if (nbytes >= BUFFER_SIZE - buffer_length)
    nbytes =  BUFFER_SIZE - buffer_length -1;

  failed = copy_from_user(
            char_buffer + buffer_length, buf, nbytes);
  transferred = nbytes - failed;

  if (!transferred)
    return -EFAULT;

  buffer_length += transferred;

  char_buffer[ buffer_length] = '\0';
  return transferred;
}

Este es mi script de prueba de mi script de prueba:

 

sudo rmmod charDevice
sudo insmod charDevice.ko debug=1 major=197
echo "one" > charDevice2
cat charDevice2
echo "two" >> charDevice2
cat charDevice2
dmesg | tail


Y esta es la traza de la ejecución:

 ./go.sh
[sudo] password for carlos:             
one
one
two
[971144.117183] WRITE : 4 flags: 8001
[971144.117187] WRITE : Saving 4 bytes
[971144.119726] READ     : 131072 bytes  ppos  : 0
[971144.119958] READ     : 131072 bytes  ppos  : 4
[971144.119959] READ     : 1
[971144.120169] WRITE : 4 flags: 8401
[971144.120171] WRITE : Appending 4 bytes
[971144.120987] READ     : 131072 bytes  ppos  : 0
[971144.125827] READ     : 131072 bytes  ppos  : 8
[971144.125831] READ     : 1


El código completo en github.

Conclusiones

El curso está bien, empieza mejor de lo que termina, en el tercer tema que es network devices como que pierde el foco, pues explica algo muy específico, quizás ya estaba cansado y la limitación fué mía.