Merge pull request #1 from adafruit/master

update fork
This commit is contained in:
DavePutz 2020-05-08 15:56:18 -05:00 committed by GitHub
commit d5671bdba5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 1928 additions and 150 deletions

@ -1 +1 @@
Subproject commit c411714cbdc05725e80398acb18c3c1fb6fa68a4
Subproject commit 9f71088d2c32206c6f0495704ae0c040426d5764

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -434,6 +434,10 @@ msgstr "buffers harus mempunyai panjang yang sama"
msgid "Bytes must be between 0 and 255."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -671,6 +675,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -682,7 +690,7 @@ msgstr "Channel EXTINT sedang digunakan"
msgid "Error in regex"
msgstr "Error pada regex"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -809,6 +817,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "operasi I2C tidak didukung"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -988,6 +1001,10 @@ msgstr ""
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "LHS dari keyword arg harus menjadi sebuah id"
@ -1121,6 +1138,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Tidak ada dukungan hardware untuk pin"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1302,6 +1323,10 @@ msgstr "sistem file (filesystem) bersifat Read-only"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Channel Kanan tidak didukung"
@ -1366,6 +1391,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Memisahkan dengan menggunakan sub-captures"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 20:38-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -429,6 +429,10 @@ msgstr ""
msgid "Bytes must be between 0 and 255."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -660,6 +664,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -671,7 +679,7 @@ msgstr ""
msgid "Error in regex"
msgstr ""
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -798,6 +806,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -977,6 +990,10 @@ msgstr ""
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1110,6 +1127,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1287,6 +1308,10 @@ msgstr ""
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr ""
@ -1350,6 +1375,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-26 14:46-0500\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2020-04-30 17:01+0000\n"
"Last-Translator: Jeff Epler <jepler@gmail.com>\n"
"Language-Team: German <https://later.unpythonic.net/projects/circuitpython/"
@ -440,6 +440,10 @@ msgstr "Der Puffer muss 16 Bytes lang sein"
msgid "Bytes must be between 0 and 255."
msgstr "Ein Bytes kann nur Werte zwischen 0 und 255 annehmen."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr "Rufe super().__init__() vor dem Zugriff auf ein natives Objekt auf."
@ -671,6 +675,10 @@ msgstr "Die Rotation der Anzeige muss in 90-Grad-Schritten erfolgen"
msgid "Drive mode not used when direction is input."
msgstr "Drive mode wird nicht verwendet, wenn die Richtung input ist."
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -682,7 +690,7 @@ msgstr "EXTINT Kanal ist schon in Benutzung"
msgid "Error in regex"
msgstr "Fehler in regex"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -811,6 +819,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "I2C-operation nicht unterstützt"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -992,6 +1005,10 @@ msgstr "Ungültige wave Datei"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "LHS des Schlüsselwortarguments muss eine id sein"
@ -1126,6 +1143,10 @@ msgstr "Keine Hardwareunterstützung am clk Pin"
msgid "No hardware support on pin"
msgstr "Keine Hardwareunterstützung an diesem Pin"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1311,6 +1332,10 @@ msgstr "Schreibgeschützte Objekt"
msgid "Refresh too soon"
msgstr "Zu früh neu geladen"
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Rechter Kanal wird nicht unterstützt"
@ -1374,6 +1399,10 @@ msgstr "Slice und Wert (value) haben unterschiedliche Längen."
msgid "Slices not supported"
msgstr "Slices werden nicht unterstützt"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Splitting mit sub-captures"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -429,6 +429,10 @@ msgstr ""
msgid "Bytes must be between 0 and 255."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -660,6 +664,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -671,7 +679,7 @@ msgstr ""
msgid "Error in regex"
msgstr ""
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -798,6 +806,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -977,6 +990,10 @@ msgstr ""
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1110,6 +1127,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1287,6 +1308,10 @@ msgstr ""
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr ""
@ -1350,6 +1375,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-03-20 17:57-0500\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2020-03-30 22:11+0000\n"
"Last-Translator: Tannewt <devnull@unpythonic.net>\n"
"Language-Team: English <https://later.unpythonic.net/projects/circuitpython/"
@ -438,6 +438,10 @@ msgstr ""
msgid "Bytes must be between 0 and 255."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -669,6 +673,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -680,7 +688,7 @@ msgstr "Avast! EXTINT channel already in use"
msgid "Error in regex"
msgstr ""
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -807,6 +815,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -986,6 +999,10 @@ msgstr ""
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1119,6 +1136,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1296,6 +1317,10 @@ msgstr ""
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr ""
@ -1359,6 +1384,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -435,6 +435,10 @@ msgstr "Byte buffer debe de ser 16 bytes"
msgid "Bytes must be between 0 and 255."
msgstr "Bytes debe estar entre 0 y 255."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -666,6 +670,10 @@ msgstr "Rotación de display debe ser en incrementos de 90 grados"
msgid "Drive mode not used when direction is input."
msgstr "Modo Drive no se usa cuando la dirección es input."
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -677,7 +685,7 @@ msgstr "El canal EXTINT ya está siendo utilizado"
msgid "Error in regex"
msgstr "Error en regex"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -804,6 +812,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "operación I2C no soportada"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -985,6 +998,10 @@ msgstr "Archivo wave inválido"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "LHS del agumento por palabra clave deberia ser un identificador"
@ -1118,6 +1135,10 @@ msgstr "Sin soporte de hardware en el pin clk"
msgid "No hardware support on pin"
msgstr "Sin soporte de hardware en pin"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1304,6 +1325,10 @@ msgstr "Solo-lectura"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Canal derecho no soportado"
@ -1367,6 +1392,10 @@ msgstr "Slice y value tienen diferentes longitudes"
msgid "Slices not supported"
msgstr "Rebanadas no soportadas"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Dividiendo con sub-capturas"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@ -436,6 +436,10 @@ msgstr "buffer ay dapat bytes-like object"
msgid "Bytes must be between 0 and 255."
msgstr "Sa gitna ng 0 o 255 dapat ang bytes."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -672,6 +676,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr "Drive mode ay hindi ginagamit kapag ang direksyon ay input."
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -683,7 +691,7 @@ msgstr "Ginagamit na ang EXTINT channel"
msgid "Error in regex"
msgstr "May pagkakamali sa REGEX"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -812,6 +820,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "Hindi supportado ang operasyong I2C"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -993,6 +1006,10 @@ msgstr "May hindi tama sa wave file"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "LHS ng keyword arg ay dapat na id"
@ -1126,6 +1143,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Walang support sa hardware ang pin"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1310,6 +1331,10 @@ msgstr "Basahin-lamang"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Hindi supportado ang kanang channel"
@ -1373,6 +1398,10 @@ msgstr "Slice at value iba't ibang haba."
msgid "Slices not supported"
msgstr "Hindi suportado ang Slices"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Binibiyak gamit ang sub-captures"

View File

@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-03-20 17:57-0500\n"
"PO-Revision-Date: 2020-03-29 17:02+0000\n"
"Last-Translator: Weblate Admin <jepler@unpythonic.net>\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2020-05-05 20:24+0000\n"
"Last-Translator: Jeff Epler <jepler@gmail.com>\n"
"Language-Team: French <https://later.unpythonic.net/projects/circuitpython/"
"circuitpython-master/fr/>\n"
"Language: fr\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.11.3\n"
"X-Generator: Weblate 4.1-dev\n"
#: main.c
msgid ""
@ -35,8 +35,8 @@ msgid ""
"https://github.com/adafruit/circuitpython/issues\n"
msgstr ""
"\n"
"Veuillez signaler un problème avec le contenu de votre lecteur CIRCUITPY à l'"
"adresse\n"
"Veuillez signaler un problème avec le contenu de votre lecteur CIRCUITPY à "
"l'adresse\n"
"https://github.com/adafruit/circuitpython/issues\n"
#: supervisor/shared/safe_mode.c
@ -120,7 +120,7 @@ msgid "'%s' expects an FPU register"
msgstr "'%s' attend un registre FPU"
#: py/emitinlinethumb.c
#, fuzzy, c-format
#, c-format
msgid "'%s' expects an address of the form [a, b]"
msgstr "'%s' attend une adresse de la forme [a, b]"
@ -447,6 +447,10 @@ msgstr "Le tampon d'octets doit être de 16 octets."
msgid "Bytes must be between 0 and 255."
msgstr "Les octets 'bytes' doivent être entre 0 et 255"
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -682,6 +686,10 @@ msgstr "La rotation d'affichage doit se faire par incréments de 90 degrés"
msgid "Drive mode not used when direction is input."
msgstr "Le mode Drive n'est pas utilisé quand la direction est 'input'."
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -693,7 +701,7 @@ msgstr "Canal EXTINT déjà utilisé"
msgid "Error in regex"
msgstr "Erreur dans l'expression régulière"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -822,6 +830,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "opération sur I2C non supportée"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -1007,6 +1020,10 @@ msgstr "Fichier WAVE invalide"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "La partie gauche de l'argument nommé doit être un identifiant"
@ -1140,6 +1157,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Pas de support matériel pour cette broche"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1330,6 +1351,10 @@ msgstr "Objet en lecture seule"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Canal droit non supporté"
@ -1394,6 +1419,10 @@ msgstr "Tranche et valeur de tailles différentes"
msgid "Slices not supported"
msgstr "Tranches non supportées"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Fractionnement avec des sous-captures"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@ -436,6 +436,10 @@ msgstr "i buffer devono essere della stessa lunghezza"
msgid "Bytes must be between 0 and 255."
msgstr "I byte devono essere compresi tra 0 e 255"
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -672,6 +676,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -683,7 +691,7 @@ msgstr "Canale EXTINT già in uso"
msgid "Error in regex"
msgstr "Errore nella regex"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -812,6 +820,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "operazione I2C non supportata"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -996,6 +1009,10 @@ msgstr "File wave non valido"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1130,6 +1147,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Nessun supporto hardware sul pin"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1319,6 +1340,10 @@ msgstr "Sola lettura"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Canale destro non supportato"
@ -1384,6 +1409,10 @@ msgstr ""
msgid "Slices not supported"
msgstr "Slice non supportate"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Suddivisione con sotto-catture"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2019-05-06 14:22-0700\n"
"Last-Translator: \n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -433,6 +433,10 @@ msgstr "잘못된 크기의 버퍼. 16 바이트 여야합니다."
msgid "Bytes must be between 0 and 255."
msgstr "바이트는 0에서 255 사이 여야합니다."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -664,6 +668,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -675,7 +683,7 @@ msgstr ""
msgid "Error in regex"
msgstr "Regex에 오류가 있습니다."
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -802,6 +810,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -981,6 +994,10 @@ msgstr ""
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1114,6 +1131,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1291,6 +1312,10 @@ msgstr ""
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr ""
@ -1354,6 +1379,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2019-03-19 18:37-0700\n"
"Last-Translator: Radomir Dopieralski <circuitpython@sheep.art.pl>\n"
"Language-Team: pl\n"
@ -432,6 +432,10 @@ msgstr "Bufor musi mieć 16 bajtów."
msgid "Bytes must be between 0 and 255."
msgstr "Bytes musi być między 0 a 255."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -663,6 +667,10 @@ msgstr "Wyświetlacz można obracać co 90 stopni"
msgid "Drive mode not used when direction is input."
msgstr "Tryb sterowania nieużywany w trybie wejścia."
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -674,7 +682,7 @@ msgstr "Kanał EXTINT w użyciu"
msgid "Error in regex"
msgstr "Błąd w regex"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -801,6 +809,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "Operacja I2C nieobsługiwana"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -982,6 +995,10 @@ msgstr "Zły plik wave"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "Lewa strona argumentu nazwanego musi być nazwą"
@ -1115,6 +1132,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr "Brak sprzętowej obsługi na nóżce"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1292,6 +1313,10 @@ msgstr "Obiekt tylko do odczytu"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Prawy kanał jest niewspierany"
@ -1355,6 +1380,10 @@ msgstr "Fragment i wartość są różnych długości."
msgid "Slices not supported"
msgstr "Fragmenty nieobsługiwane"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Podział z podgrupami"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -433,6 +433,10 @@ msgstr "buffers devem ser o mesmo tamanho"
msgid "Bytes must be between 0 and 255."
msgstr "Os bytes devem estar entre 0 e 255."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -667,6 +671,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -678,7 +686,7 @@ msgstr "Canal EXTINT em uso"
msgid "Error in regex"
msgstr "Erro no regex"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -807,6 +815,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr "I2C operação não suportada"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -989,6 +1002,10 @@ msgstr "Aqruivo de ondas inválido"
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1122,6 +1139,10 @@ msgstr "Sem suporte de hardware no pino de clock"
msgid "No hardware support on pin"
msgstr "Nenhum suporte de hardware no pino"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1304,6 +1325,10 @@ msgstr "Somente leitura"
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Canal direito não suportado"
@ -1367,6 +1392,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 20:38-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -429,6 +429,10 @@ msgstr ""
msgid "Bytes must be between 0 and 255."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr ""
@ -660,6 +664,10 @@ msgstr ""
msgid "Drive mode not used when direction is input."
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -671,7 +679,7 @@ msgstr ""
msgid "Error in regex"
msgstr ""
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -798,6 +806,11 @@ msgstr ""
msgid "I2C operation not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -977,6 +990,10 @@ msgstr ""
msgid "Invalid word/bit length"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr ""
@ -1110,6 +1127,10 @@ msgstr ""
msgid "No hardware support on pin"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr ""
@ -1287,6 +1308,10 @@ msgstr ""
msgid "Refresh too soon"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr ""
@ -1350,6 +1375,10 @@ msgstr ""
msgid "Slices not supported"
msgstr ""
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: circuitpython-cn\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-04 19:52-0400\n"
"POT-Creation-Date: 2020-05-06 17:47+0800\n"
"PO-Revision-Date: 2019-04-13 10:10-0700\n"
"Last-Translator: hexthat\n"
"Language-Team: Chinese Hanyu Pinyin\n"
@ -438,6 +438,10 @@ msgstr "Zì jié huǎnchōng qū bìxū shì 16 zì jié."
msgid "Bytes must be between 0 and 255."
msgstr "Zì jié bìxū jiè yú 0 dào 255 zhī jiān."
#: shared-bindings/aesio/aes.c
msgid "CBC blocks must be multiples of 16 bytes"
msgstr ""
#: py/objtype.c
msgid "Call super().__init__() before accessing native object."
msgstr "Zài fǎngwèn běn jī wùjiàn zhīqián diàoyòng super().__init__()"
@ -671,6 +675,10 @@ msgstr "Xiǎnshì xuánzhuǎn bìxū 90 dù jiā xīn"
msgid "Drive mode not used when direction is input."
msgstr "Fāngxiàng shūrù shí qūdòng móshì méiyǒu shǐyòng."
#: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
#: ports/atmel-samd/common-hal/ps2io/Ps2.c
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
@ -682,7 +690,7 @@ msgstr "EXTINT píndào yǐjīng shǐyòng"
msgid "Error in regex"
msgstr "Zhèngzé biǎodá shì cuòwù"
#: shared-bindings/microcontroller/Pin.c
#: shared-bindings/aesio/aes.c shared-bindings/microcontroller/Pin.c
#: shared-bindings/neopixel_write/__init__.c shared-bindings/pulseio/PulseOut.c
#: shared-bindings/terminalio/Terminal.c
msgid "Expected a %q"
@ -809,6 +817,11 @@ msgstr "I2C chūshǐhuà cuòwù"
msgid "I2C operation not supported"
msgstr "I2C cāozuò bù zhīchí"
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: py/persistentcode.c
msgid ""
"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/"
@ -990,6 +1003,10 @@ msgstr "Wúxiào de làng làngcháo wénjiàn"
msgid "Invalid word/bit length"
msgstr "Wúxiào de zì/wèi chángdù"
#: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long"
msgstr ""
#: py/compile.c
msgid "LHS of keyword arg must be an id"
msgstr "Guānjiàn zì arg de LHS bìxū shì id"
@ -1123,6 +1140,10 @@ msgstr "Shízhōng yǐn jiǎo wú yìngjiàn zhīchí"
msgid "No hardware support on pin"
msgstr "Méiyǒu zài yǐn jiǎo shàng de yìngjiàn zhīchí"
#: shared-bindings/aesio/aes.c
msgid "No key was specified"
msgstr ""
#: ports/stm/common-hal/pulseio/PWMOut.c
msgid "No more timers available on this pin."
msgstr "Gāi yǐn jiǎo shàng méiyǒu kěyòng de dìngshí qì."
@ -1306,6 +1327,10 @@ msgstr "Zhǐ dú duìxiàng"
msgid "Refresh too soon"
msgstr "Shuāxīn tài kuàile"
#: shared-bindings/aesio/aes.c
msgid "Requested AES mode is unsupported"
msgstr ""
#: ports/atmel-samd/common-hal/audioio/AudioOut.c
msgid "Right channel unsupported"
msgstr "Bù zhīchí yòu tōngdào"
@ -1369,6 +1394,10 @@ msgstr "Qiēpiàn hé zhí bùtóng chángdù."
msgid "Slices not supported"
msgstr "Qiēpiàn bù shòu zhīchí"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
msgstr ""
#: extmod/modure.c
msgid "Splitting with sub-captures"
msgstr "Yǔ zi bǔhuò fēnliè"

View File

@ -93,6 +93,10 @@ endif
CFLAGS += $(INC) -Wall -Wno-cast-align -std=gnu11 -nostdlib $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT)
# TODO: add these when -Werror is applied
# Disable some warnings, as do most ports. NXP SDK causes undef, tinyusb causes cast-align
# CFLAGS += -Wno-undef -Wno-cast-align
CFLAGS += \
-mthumb \
-mapcs \

View File

@ -25,7 +25,6 @@
* THE SOFTWARE.
*/
//TODO
#include "shared-bindings/busio/SPI.h"
#include "py/mperrno.h"
#include "py/runtime.h"
@ -35,48 +34,12 @@
#include <stdio.h>
//bool never_reset_sercoms[SERCOM_INST_NUM];
//
//void never_reset_sercom(Sercom* sercom) {
// // Reset all SERCOMs except the ones being used by on-board devices.
// Sercom *sercom_instances[SERCOM_INST_NUM] = SERCOM_INSTS;
// for (int i = 0; i < SERCOM_INST_NUM; i++) {
// if (sercom_instances[i] == sercom) {
// never_reset_sercoms[i] = true;
// break;
// }
// }
//}
//
//void allow_reset_sercom(Sercom* sercom) {
// // Reset all SERCOMs except the ones being used by on-board devices.
// Sercom *sercom_instances[SERCOM_INST_NUM] = SERCOM_INSTS;
// for (int i = 0; i < SERCOM_INST_NUM; i++) {
// if (sercom_instances[i] == sercom) {
// never_reset_sercoms[i] = false;
// break;
// }
// }
//}
//
//void reset_sercoms(void) {
// // Reset all SERCOMs except the ones being used by on-board devices.
// Sercom *sercom_instances[SERCOM_INST_NUM] = SERCOM_INSTS;
// for (int i = 0; i < SERCOM_INST_NUM; i++) {
// if (never_reset_sercoms[i]) {
// continue;
// }
// #ifdef MICROPY_HW_APA102_SERCOM
// if (sercom_instances[i] == MICROPY_HW_APA102_SERCOM) {
// continue;
// }
// #endif
// // SWRST is same for all modes of SERCOMs.
// sercom_instances[i]->SPI.CTRLA.bit.SWRST = 1;
// }
//}
//arrays use 0 based numbering: SPI1 is stored at index 0
#define MAX_SPI 4
STATIC bool reserved_spi[MAX_SPI];
STATIC bool never_reset_spi[MAX_SPI];
static void config_periph_pin(const mcu_periph_obj_t *periph) {
STATIC void config_periph_pin(const mcu_periph_obj_t *periph) {
IOMUXC_SetPinMux(
periph->pin->mux_reg, periph->mux_mode,
periph->input_reg, periph->input_idx,
@ -97,52 +60,117 @@ static void config_periph_pin(const mcu_periph_obj_t *periph) {
#define LPSPI_MASTER_CLK_FREQ (CLOCK_GetFreq(kCLOCK_Usb1PllPfd0Clk) / (CLOCK_GetDiv(kCLOCK_LpspiDiv)))
void spi_reset(void) {
for (int i = 0; i < MAX_SPI; i++) {
reserved_spi[i] = false;
}
}
void common_hal_busio_spi_construct(busio_spi_obj_t *self,
const mcu_pin_obj_t *clock, const mcu_pin_obj_t *mosi,
const mcu_pin_obj_t *miso) {
// TODO: Allow none mosi or miso
const uint32_t sck_count = MP_ARRAY_SIZE(mcu_spi_sck_list);
const uint32_t miso_count = MP_ARRAY_SIZE(mcu_spi_miso_list);
const uint32_t mosi_count = MP_ARRAY_SIZE(mcu_spi_mosi_list);
bool spi_taken = false;
const uint32_t sck_count = sizeof(mcu_spi_sck_list) / sizeof(mcu_periph_obj_t);
const uint32_t miso_count = sizeof(mcu_spi_miso_list) / sizeof(mcu_periph_obj_t);
const uint32_t mosi_count = sizeof(mcu_spi_mosi_list) / sizeof(mcu_periph_obj_t);
for (uint32_t i = 0; i < sck_count; ++i) {
if (mcu_spi_sck_list[i].pin != clock)
for (uint i = 0; i < sck_count; i++) {
if (mcu_spi_sck_list[i].pin != clock) {
continue;
for (uint32_t j = 0; j < miso_count; ++j) {
if (mcu_spi_miso_list[j].pin != miso)
continue;
if (mcu_spi_miso_list[j].bank_idx != mcu_spi_sck_list[i].bank_idx)
continue;
for (uint32_t k = 0; k < mosi_count; ++k) {
if (mcu_spi_mosi_list[k].pin != mosi)
}
//if both MOSI and MISO exist, loop search normally
if ((mosi != NULL) && (miso != NULL)) {
for (uint j = 0; j < mosi_count; j++) {
if ((mcu_spi_mosi_list[i].pin != mosi)
|| (mcu_spi_sck_list[i].bank_idx != mcu_spi_mosi_list[j].bank_idx)){
continue;
if (mcu_spi_mosi_list[k].bank_idx != mcu_spi_miso_list[j].bank_idx)
continue;
self->clock_pin = &mcu_spi_sck_list[i];
self->miso_pin = &mcu_spi_miso_list[j];
self->mosi_pin = &mcu_spi_mosi_list[k];
}
for (uint k = 0; k < miso_count; k++) {
if ((mcu_spi_miso_list[k].pin != miso) //everything needs the same index
|| (mcu_spi_sck_list[i].bank_idx != mcu_spi_miso_list[k].bank_idx)) {
continue;
}
//keep looking if the SPI is taken, edge case
if (reserved_spi[mcu_spi_sck_list[i].bank_idx - 1]) {
spi_taken = true;
continue;
}
//store pins if not
self->clock = &mcu_spi_sck_list[i];
self->mosi = &mcu_spi_mosi_list[j];
self->miso = &mcu_spi_miso_list[k];
break;
}
if (self->clock != NULL) {
break; // Multi-level break to pick lowest peripheral
}
}
if (self->clock != NULL) {
break;
}
// if just MISO, reduce search
} else if (miso != NULL) {
for (uint j = 0; j < miso_count; j++) {
if ((mcu_spi_miso_list[j].pin != miso) //only SCK and MISO need the same index
|| (mcu_spi_sck_list[i].bank_idx != mcu_spi_miso_list[j].bank_idx)) {
continue;
}
if (reserved_spi[mcu_spi_sck_list[i].bank_idx - 1]) {
spi_taken = true;
continue;
}
self->clock = &mcu_spi_sck_list[i];
self->mosi = NULL;
self->miso = &mcu_spi_miso_list[j];
break;
}
if (self->clock != NULL) {
break;
}
// if just MOSI, reduce search
} else if (mosi != NULL) {
for (uint j = 0; j < mosi_count; j++) {
if ((mcu_spi_mosi_list[j].pin != mosi) //only SCK and MOSI need the same index
|| (mcu_spi_sck_list[i].bank_idx != mcu_spi_mosi_list[j].bank_idx)) {
continue;
}
if (reserved_spi[mcu_spi_sck_list[i].bank_idx - 1]) {
spi_taken = true;
continue;
}
self->clock = &mcu_spi_sck_list[i];
self->mosi = &mcu_spi_mosi_list[j];
self->miso = NULL;
break;
}
if (self->clock != NULL) {
break;
}
} else {
//throw an error immediately
mp_raise_ValueError(translate("Must provide MISO or MOSI pin"));
}
}
if(self->clock_pin == NULL || self->mosi_pin == NULL || self->miso_pin == NULL) {
mp_raise_RuntimeError(translate("Invalid SPI pin selection"));
if (self->clock != NULL && (self->mosi != NULL || self->miso != NULL)) {
self->spi = mcu_spi_banks[self->clock->bank_idx - 1];
} else {
self->spi = mcu_spi_banks[self->clock_pin->bank_idx - 1];
if (spi_taken) {
mp_raise_ValueError(translate("Hardware busy, try alternative pins"));
} else {
mp_raise_ValueError(translate("Invalid SPI pin selection"));
}
}
config_periph_pin(self->mosi_pin);
config_periph_pin(self->miso_pin);
config_periph_pin(self->clock_pin);
config_periph_pin(self->clock);
if (self->mosi != NULL) {
config_periph_pin(self->mosi);
}
if (self->miso != NULL) {
config_periph_pin(self->miso);
}
reserved_spi[self->clock->bank_idx - 1] = true;
lpspi_master_config_t config = { 0 };
LPSPI_MasterGetDefaultConfig(&config);
@ -150,47 +178,27 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
// Always start at 250khz which is what SD cards need. They are sensitive to
// SPI bus noise before they are put into SPI mode.
config.baudRate = 250000;
LPSPI_MasterInit(self->spi, &config, LPSPI_MASTER_CLK_FREQ);
LPSPI_Enable(self->spi, false);
uint32_t tcrPrescaleValue;
self->baudrate = LPSPI_MasterSetBaudRate(self->spi, config.baudRate, LPSPI_MASTER_CLK_FREQ, &tcrPrescaleValue);
LPSPI_Enable(self->spi, true);
claim_pin(self->clock_pin->pin);
// if (mosi_none) {
// self->MOSI_pin = NO_PIN;
// } else {
// gpio_set_pin_direction(mosi->number, GPIO_DIRECTION_OUT);
// gpio_set_pin_pull_mode(mosi->number, GPIO_PULL_OFF);
// gpio_set_pin_function(mosi->number, mosi_pinmux);
// self->MOSI_pin = mosi->number;
claim_pin(self->mosi_pin->pin);
// }
// if (miso_none) {
// self->MISO_pin = NO_PIN;
// } else {
// gpio_set_pin_direction(miso->number, GPIO_DIRECTION_IN);
// gpio_set_pin_pull_mode(miso->number, GPIO_PULL_OFF);
// gpio_set_pin_function(miso->number, miso_pinmux);
// self->MISO_pin = miso->number;
claim_pin(self->miso_pin->pin);
// }
claim_pin(self->clock->pin);
if (self->mosi != NULL) {
claim_pin(self->mosi->pin);
}
if (self->miso != NULL) {
claim_pin(self->miso->pin);
}
}
void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) {
// never_reset_sercom(self->spi_desc.dev.prvt);
// never_reset_pin_number(self->clock_pin);
// never_reset_pin_number(self->MOSI_pin);
// never_reset_pin_number(self->MISO_pin);
// TODO
}
bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) {
return self->clock_pin == NULL;
return self->clock == NULL;
}
void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
@ -198,14 +206,7 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
return;
}
// allow_reset_sercom(self->spi_desc.dev.prvt);
// spi_m_sync_disable(&self->spi_desc);
// spi_m_sync_deinit(&self->spi_desc);
// reset_pin_number(self->clock_pin);
// reset_pin_number(self->MOSI_pin);
// reset_pin_number(self->MISO_pin);
self->clock_pin = NULL;
self->clock = NULL;
}
bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
@ -260,6 +261,9 @@ bool common_hal_busio_spi_write(busio_spi_obj_t *self,
if (len == 0) {
return true;
}
if (self->mosi == NULL) {
mp_raise_ValueError(translate("No MOSI Pin"));
}
lpspi_transfer_t xfer = { 0 };
xfer.txData = (uint8_t*)data;
@ -278,6 +282,9 @@ bool common_hal_busio_spi_read(busio_spi_obj_t *self,
if (len == 0) {
return true;
}
if (self->miso == NULL) {
mp_raise_ValueError(translate("No MISO Pin"));
}
LPSPI_SetDummyData(self->spi, write_value);
@ -296,6 +303,9 @@ bool common_hal_busio_spi_transfer(busio_spi_obj_t *self, uint8_t *data_out, uin
if (len == 0) {
return true;
}
if (self->miso == NULL || self->mosi == NULL) {
mp_raise_ValueError(translate("Missing MISO or MOSI Pin"));
}
LPSPI_SetDummyData(self->spi, 0xFF);

View File

@ -38,9 +38,11 @@ typedef struct {
LPSPI_Type *spi;
bool has_lock;
uint32_t baudrate;
const mcu_periph_obj_t *clock_pin;
const mcu_periph_obj_t *mosi_pin;
const mcu_periph_obj_t *miso_pin;
const mcu_periph_obj_t *clock;
const mcu_periph_obj_t *mosi;
const mcu_periph_obj_t *miso;
} busio_spi_obj_t;
void spi_reset(void);
#endif // MICROPY_INCLUDED_MIMXRT10XX_COMMON_HAL_BUSIO_SPI_H

View File

@ -41,6 +41,7 @@
#include "common-hal/pulseio/PulseOut.h"
#include "common-hal/pulseio/PWMOut.h"
#include "common-hal/rtc/RTC.h"
#include "common-hal/busio/SPI.h"
#include "reset.h"
@ -267,7 +268,7 @@ safe_mode_t port_init(void) {
}
void reset_port(void) {
//reset_sercoms();
spi_reset();
#if CIRCUITPY_AUDIOIO
audio_dma_reset();

View File

@ -134,3 +134,15 @@ GPIO_TypeDef * pin_port(uint8_t pin_port) {
uint16_t pin_mask(uint8_t pin_number) {
return 1<<pin_number;
}
uint8_t common_hal_mcu_pin_number(const mcu_pin_obj_t* pin) {
return pin->port * 16 + pin->number;
}
void common_hal_mcu_pin_claim(const mcu_pin_obj_t* pin) {
claim_pin(pin);
}
void common_hal_mcu_pin_reset_number(uint8_t pin_no) {
reset_pin_number(pin_no / 16, pin_no % 16);
}

View File

@ -0,0 +1,54 @@
/*
* This file is part of the Micro Python project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2020 Jeff Epler for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <stddef.h>
#include "common-hal/rgbmatrix/RGBMatrix.h"
#include STM32_HAL_H
extern void _PM_IRQ_HANDLER(void);
void *common_hal_rgbmatrix_timer_allocate() {
// TODO(jepler) properly handle resource allocation including never-reset
return TIM6;
}
void common_hal_rgbmatrix_timer_enable(void* ptr) {
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
void common_hal_rgbmatrix_timer_disable(void* ptr) {
TIM_TypeDef *tim = (TIM_TypeDef*)ptr;
tim->DIER &= ~TIM_DIER_UIE;
HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
}
void common_hal_rgbmatrix_timer_free(void* ptr) {
common_hal_rgbmatrix_timer_disable(ptr);
// TODO(jepler) properly handle resource allocation including never-reset
}

View File

@ -0,0 +1,35 @@
/*
* This file is part of the Micro Python project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2020 Jeff Epler for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
void *common_hal_rgbmatrix_timer_allocate(void);
void common_hal_rgbmatrix_timer_enable(void*);
void common_hal_rgbmatrix_timer_disable(void*);
void common_hal_rgbmatrix_timer_free(void*);
#endif

View File

@ -3,6 +3,11 @@ LONGINT_IMPL = MPZ
INTERNAL_LIBM = 1
USB_SERIAL_NUMBER_LENGTH = 24
ifeq ($(MCU_VARIANT),STM32F405xx)
CIRCUITPY_FRAMEBUFFERIO = 1
CIRCUITPY_RGBMATRIX = 1
endif
ifeq ($(MCU_SERIES),F4)
# Not yet implemented common-hal modules:
CIRCUITPY_AUDIOBUSIO = 0

View File

@ -99,6 +99,9 @@ endif
###
# Select which builtin modules to compile and include.
ifeq ($(CIRCUITPY_AESIO),1)
SRC_PATTERNS += aesio/%
endif
ifeq ($(CIRCUITPY_ANALOGIO),1)
SRC_PATTERNS += analogio/%
endif
@ -341,6 +344,8 @@ SRC_SHARED_MODULE_ALL = \
bitbangio/__init__.c \
board/__init__.c \
busio/OneWire.c \
aesio/__init__.c \
aesio/aes.c \
displayio/Bitmap.c \
displayio/ColorConverter.c \
displayio/Display.c \

View File

@ -223,6 +223,13 @@ typedef long mp_off_t;
// These CIRCUITPY_xxx values should all be defined in the *.mk files as being on or off.
// So if any are not defined in *.mk, they'll throw an error here.
#if CIRCUITPY_AESIO
extern const struct _mp_obj_module_t aesio_module;
#define AESIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_aesio), (mp_obj_t)&aesio_module },
#else
#define AESIO_MODULE
#endif
#if CIRCUITPY_ANALOGIO
#define ANALOGIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module },
extern const struct _mp_obj_module_t analogio_module;
@ -619,6 +626,7 @@ extern const struct _mp_obj_module_t ustack_module;
// Some of these definitions will be blank depending on what is turned on and off.
// Some are omitted because they're in MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS above.
#define MICROPY_PORT_BUILTIN_MODULES_STRONG_LINKS \
AESIO_MODULE \
ANALOGIO_MODULE \
AUDIOBUSIO_MODULE \
AUDIOCORE_MODULE \

View File

@ -33,6 +33,9 @@ CIRCUITPY_FULL_BUILD ?= 1
CFLAGS += -DCIRCUITPY_FULL_BUILD=$(CIRCUITPY_FULL_BUILD)
CIRCUITPY_AESIO ?= 0
CFLAGS += -DCIRCUITPY_AESIO=$(CIRCUITPY_AESIO)
CIRCUITPY_ANALOGIO ?= 1
CFLAGS += -DCIRCUITPY_ANALOGIO=$(CIRCUITPY_ANALOGIO)

View File

@ -0,0 +1,79 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <stdint.h>
#include "py/obj.h"
#include "py/runtime.h"
#include "__init__.h"
//| :mod:`aesio` --- AES encryption routines
//| ========================================
//|
//| .. module:: aesio
//| :synopsis: Embedded implementation of AES
//|
//| The `AES` module contains classes used to implement encryption
//| and decryption. It aims to be low overhead in terms of memory.
//|
//|
//| Libraries
//|
//| .. toctree::
//| :maxdepth: 3
//|
//| aes
STATIC const mp_obj_tuple_t mp_aes_key_size_obj = {
{&mp_type_tuple},
3,
{
MP_OBJ_NEW_SMALL_INT(16),
MP_OBJ_NEW_SMALL_INT(24),
MP_OBJ_NEW_SMALL_INT(32),
}
};
STATIC const mp_rom_map_elem_t aesio_module_globals_table[] = {
{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_aesio)},
{MP_ROM_QSTR(MP_QSTR_AES), MP_ROM_PTR(&aesio_aes_type) },
{MP_ROM_QSTR(MP_QSTR_MODE_ECB), MP_ROM_INT(AES_MODE_ECB)},
{MP_ROM_QSTR(MP_QSTR_MODE_CBC), MP_ROM_INT(AES_MODE_CBC)},
{MP_ROM_QSTR(MP_QSTR_MODE_CTR), MP_ROM_INT(AES_MODE_CTR)},
{MP_ROM_QSTR(MP_QSTR_block_size), MP_ROM_INT(AES_BLOCKLEN)},
{MP_ROM_QSTR(MP_QSTR_key_size), (mp_obj_t)&mp_aes_key_size_obj},
};
STATIC MP_DEFINE_CONST_DICT(aesio_module_globals, aesio_module_globals_table);
const mp_obj_module_t aesio_module = {
.base = {&mp_type_module},
.globals = (mp_obj_dict_t *)&aesio_module_globals,
};

View File

@ -0,0 +1,53 @@
/*
* This file is part of the Micro Python project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_AESIO_H
#define MICROPY_INCLUDED_SHARED_BINDINGS_AESIO_H
#include "shared-module/aesio/__init__.h"
extern const mp_obj_type_t aesio_aes_type;
void common_hal_aesio_aes_construct(aesio_aes_obj_t* self,
const uint8_t* key,
uint32_t key_length,
const uint8_t* iv,
int mode,
int counter);
void common_hal_aesio_aes_rekey(aesio_aes_obj_t* self,
const uint8_t* key,
uint32_t key_length,
const uint8_t* iv);
void common_hal_aesio_aes_set_mode(aesio_aes_obj_t* self,
int mode);
void common_hal_aesio_aes_encrypt(aesio_aes_obj_t* self,
uint8_t* buffer,
size_t len);
void common_hal_aesio_aes_decrypt(aesio_aes_obj_t* self,
uint8_t* buffer,
size_t len);
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_AESIO_H

271
shared-bindings/aesio/aes.c Normal file
View File

@ -0,0 +1,271 @@
#include <stdint.h>
#include <string.h>
#include "py/obj.h"
#include "py/objproperty.h"
#include "py/runtime.h"
#include "shared-bindings/aesio/__init__.h"
// Defined at the end of this file
//| .. currentmodule:: aesio
//|
//| :class:`aesio` -- Encrypt and decrypt AES streams
//| =====================================================
//|
//| An object that represents an AES stream, including the current state.
//|
//| .. class:: AES(key, mode=0, iv=None, segment_size=8)
//|
//| Create a new AES state with the given key.
//|
//| :param bytearray key: A 16-, 24-, or 32-byte key
//| :param int mode: AES mode to use. One of: AES.MODE_ECB, AES.MODE_CBC, or
//| AES.MODE_CTR
//| :param bytearray iv: Initialization vector to use for CBC or CTR mode
//|
//| Additional arguments are supported for legacy reasons.
//|
//| Encrypting a string::
//|
//| import aesio
//| from binascii import hexlify
//|
//| key = b'Sixteen byte key'
//| inp = b'Circuit Python!!' # Note: 16-bytes long
//| outp = bytearray(len(inp))
//| cipher = aesio.AES(key, aesio.mode.MODE_ECB)
//| cipher.encrypt_into(inp, outp)
//| hexlify(outp)
//|
STATIC mp_obj_t aesio_aes_make_new(const mp_obj_type_t *type, size_t n_args,
const mp_obj_t *pos_args,
mp_map_t *kw_args) {
(void)type;
enum { ARG_key, ARG_mode, ARG_IV, ARG_counter, ARG_segment_size };
static const mp_arg_t allowed_args[] = {
{MP_QSTR_key, MP_ARG_OBJ | MP_ARG_REQUIRED},
{MP_QSTR_mode, MP_ARG_INT, {.u_int = AES_MODE_ECB}},
{MP_QSTR_IV, MP_ARG_OBJ},
{MP_QSTR_counter, MP_ARG_OBJ},
{MP_QSTR_segment_size, MP_ARG_INT, {.u_int = 8}},
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args),
allowed_args, args);
aesio_aes_obj_t *self = m_new_obj(aesio_aes_obj_t);
self->base.type = &aesio_aes_type;
mp_buffer_info_t bufinfo;
const uint8_t *key = NULL;
uint32_t key_length = 0;
if (mp_get_buffer(args[ARG_key].u_obj, &bufinfo, MP_BUFFER_READ)) {
if ((bufinfo.len != 16) && (bufinfo.len != 24) && (bufinfo.len != 32)) {
mp_raise_TypeError(translate("Key must be 16, 24, or 32 bytes long"));
}
key = bufinfo.buf;
key_length = bufinfo.len;
} else {
mp_raise_TypeError(translate("No key was specified"));
}
int mode = args[ARG_mode].u_int;
switch (args[ARG_mode].u_int) {
case AES_MODE_CBC:
case AES_MODE_ECB:
case AES_MODE_CTR:
break;
default:
mp_raise_TypeError(translate("Requested AES mode is unsupported"));
}
// IV is required for CBC mode and is ignored for other modes.
const uint8_t *iv = NULL;
if (args[ARG_IV].u_obj != NULL &&
mp_get_buffer(args[ARG_IV].u_obj, &bufinfo, MP_BUFFER_READ)) {
if (bufinfo.len != AES_BLOCKLEN) {
mp_raise_TypeError_varg(translate("IV must be %d bytes long"),
AES_BLOCKLEN);
}
iv = bufinfo.buf;
}
common_hal_aesio_aes_construct(self, key, key_length, iv, mode,
args[ARG_counter].u_int);
return MP_OBJ_FROM_PTR(self);
}
STATIC mp_obj_t aesio_aes_rekey(size_t n_args, const mp_obj_t *pos_args) {
aesio_aes_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
size_t key_length = 0;
const uint8_t *key =
(const uint8_t *)mp_obj_str_get_data(pos_args[1], &key_length);
if (key == NULL) {
mp_raise_ValueError(translate("No key was specified"));
}
if ((key_length != 16) && (key_length != 24) && (key_length != 32)) {
mp_raise_TypeError(translate("Key must be 16, 24, or 32 bytes long"));
}
const uint8_t *iv = NULL;
if (n_args > 2) {
size_t iv_length = 0;
iv = (const uint8_t *)mp_obj_str_get_data(pos_args[2], &iv_length);
if (iv_length != AES_BLOCKLEN) {
mp_raise_TypeError_varg(translate("IV must be %d bytes long"),
AES_BLOCKLEN);
}
}
common_hal_aesio_aes_rekey(self, key, key_length, iv);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_VAR(aesio_aes_rekey_obj, 2, aesio_aes_rekey);
STATIC void validate_length(aesio_aes_obj_t *self, size_t src_length,
size_t dest_length) {
if (src_length != dest_length) {
mp_raise_ValueError(
translate("Source and destination buffers must be the same length"));
}
switch (self->mode) {
case AES_MODE_ECB:
if (src_length != 16) {
mp_raise_msg(&mp_type_ValueError,
translate("ECB only operates on 16 bytes at a time"));
}
break;
case AES_MODE_CBC:
if ((src_length & 15) != 0) {
mp_raise_msg(&mp_type_ValueError,
translate("CBC blocks must be multiples of 16 bytes"));
}
break;
case AES_MODE_CTR:
break;
}
}
//| .. method:: encrypt_into(src, dest)
//|
//| Encrypt the buffer from ``src`` into ``dest``.
//| For ECB mode, the buffers must be 16 bytes long. For CBC mode, the
//| buffers must be a multiple of 16 bytes, and must be equal length. For
//| CTX mode, there are no restrictions.
//|
STATIC mp_obj_t aesio_aes_encrypt_into(mp_obj_t aesio_obj, mp_obj_t src,
mp_obj_t dest) {
if (!MP_OBJ_IS_TYPE(aesio_obj, &aesio_aes_type)) {
mp_raise_TypeError_varg(translate("Expected a %q"), aesio_aes_type.name);
}
// Convert parameters into expected types.
aesio_aes_obj_t *aes = MP_OBJ_TO_PTR(aesio_obj);
mp_buffer_info_t srcbufinfo, destbufinfo;
mp_get_buffer_raise(src, &srcbufinfo, MP_BUFFER_READ);
mp_get_buffer_raise(dest, &destbufinfo, MP_BUFFER_READ);
validate_length(aes, srcbufinfo.len, destbufinfo.len);
memcpy(destbufinfo.buf, srcbufinfo.buf, srcbufinfo.len);
common_hal_aesio_aes_encrypt(aes, (uint8_t *)destbufinfo.buf,
destbufinfo.len);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_3(aesio_aes_encrypt_into_obj,
aesio_aes_encrypt_into);
//| .. method:: decrypt_into(src, dest)
//|
//| Decrypt the buffer from ``src`` into ``dest``.
//| For ECB mode, the buffers must be 16 bytes long. For CBC mode, the
//| buffers must be a multiple of 16 bytes, and must be equal length. For
//| CTX mode, there are no restrictions.
//|
STATIC mp_obj_t aesio_aes_decrypt_into(mp_obj_t aesio_obj, mp_obj_t src,
mp_obj_t dest) {
if (!MP_OBJ_IS_TYPE(aesio_obj, &aesio_aes_type)) {
mp_raise_TypeError_varg(translate("Expected a %q"), aesio_aes_type.name);
}
// Convert parameters into expected types.
aesio_aes_obj_t *aes = MP_OBJ_TO_PTR(aesio_obj);
mp_buffer_info_t srcbufinfo, destbufinfo;
mp_get_buffer_raise(src, &srcbufinfo, MP_BUFFER_READ);
mp_get_buffer_raise(dest, &destbufinfo, MP_BUFFER_READ);
validate_length(aes, srcbufinfo.len, destbufinfo.len);
memcpy(destbufinfo.buf, srcbufinfo.buf, srcbufinfo.len);
common_hal_aesio_aes_decrypt(aes, (uint8_t *)destbufinfo.buf,
destbufinfo.len);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_3(aesio_aes_decrypt_into_obj,
aesio_aes_decrypt_into);
STATIC mp_obj_t aesio_aes_get_mode(mp_obj_t aesio_obj) {
if (!MP_OBJ_IS_TYPE(aesio_obj, &aesio_aes_type)) {
mp_raise_TypeError_varg(translate("Expected a %q"), aesio_aes_type.name);
}
aesio_aes_obj_t *self = MP_OBJ_TO_PTR(aesio_obj);
return MP_OBJ_NEW_SMALL_INT(self->mode);
}
MP_DEFINE_CONST_FUN_OBJ_1(aesio_aes_get_mode_obj, aesio_aes_get_mode);
STATIC mp_obj_t aesio_aes_set_mode(mp_obj_t aesio_obj, mp_obj_t mode_obj) {
if (!MP_OBJ_IS_TYPE(aesio_obj, &aesio_aes_type)) {
mp_raise_TypeError_varg(translate("Expected a %q"), aesio_aes_type.name);
}
aesio_aes_obj_t *self = MP_OBJ_TO_PTR(aesio_obj);
int mode = mp_obj_get_int(mode_obj);
switch (mode) {
case AES_MODE_CBC:
case AES_MODE_ECB:
case AES_MODE_CTR:
break;
default:
mp_raise_TypeError(translate("Requested AES mode is unsupported"));
}
common_hal_aesio_aes_set_mode(self, mode);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(aesio_aes_set_mode_obj, aesio_aes_set_mode);
const mp_obj_property_t aesio_aes_mode_obj = {
.base.type = &mp_type_property,
.proxy = {
(mp_obj_t)&aesio_aes_get_mode_obj,
(mp_obj_t)&aesio_aes_set_mode_obj,
(mp_obj_t)&mp_const_none_obj
},
};
STATIC const mp_rom_map_elem_t aesio_locals_dict_table[] = {
// Methods
{MP_ROM_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_AES)},
{MP_ROM_QSTR(MP_QSTR_encrypt_into), (mp_obj_t)&aesio_aes_encrypt_into_obj},
{MP_ROM_QSTR(MP_QSTR_decrypt_into), (mp_obj_t)&aesio_aes_decrypt_into_obj},
{MP_ROM_QSTR(MP_QSTR_rekey), (mp_obj_t)&aesio_aes_rekey_obj},
{MP_ROM_QSTR(MP_QSTR_mode), (mp_obj_t)&aesio_aes_mode_obj},
};
STATIC MP_DEFINE_CONST_DICT(aesio_locals_dict, aesio_locals_dict_table);
const mp_obj_type_t aesio_aes_type = {
{&mp_type_type},
.name = MP_QSTR_AES,
.make_new = aesio_aes_make_new,
.locals_dict = (mp_obj_dict_t *)&aesio_locals_dict,
};

View File

@ -65,7 +65,7 @@ STATIC mp_obj_t rtc_rtc_make_new(const mp_obj_type_t *type, size_t n_args, const
//| import time
//|
//| r = rtc.RTC()
//| r.datetime = rtctime.struct_time((2019, 5, 29, 15, 14, 15, 0, -1, -1))
//| r.datetime = time.struct_time((2019, 5, 29, 15, 14, 15, 0, -1, -1))
//|
//|
//| Once set, the RTC will automatically update this value as time passes. You can read this

View File

@ -0,0 +1,58 @@
#include <string.h>
#include "py/runtime.h"
#include "shared-bindings/aesio/__init__.h"
#include "shared-module/aesio/__init__.h"
void common_hal_aesio_aes_construct(aesio_aes_obj_t *self, const uint8_t *key,
uint32_t key_length, const uint8_t *iv,
int mode, int counter) {
self->mode = mode;
self->counter = counter;
common_hal_aesio_aes_rekey(self, key, key_length, iv);
}
void common_hal_aesio_aes_rekey(aesio_aes_obj_t *self, const uint8_t *key,
uint32_t key_length, const uint8_t *iv) {
memset(&self->ctx, 0, sizeof(self->ctx));
if (iv != NULL) {
AES_init_ctx_iv(&self->ctx, key, key_length, iv);
} else {
AES_init_ctx(&self->ctx, key, key_length);
}
}
void common_hal_aesio_aes_set_mode(aesio_aes_obj_t *self, int mode) {
self->mode = mode;
}
void common_hal_aesio_aes_encrypt(aesio_aes_obj_t *self, uint8_t *buffer,
size_t length) {
switch (self->mode) {
case AES_MODE_ECB:
AES_ECB_encrypt(&self->ctx, buffer);
break;
case AES_MODE_CBC:
AES_CBC_encrypt_buffer(&self->ctx, buffer, length);
break;
case AES_MODE_CTR:
AES_CTR_xcrypt_buffer(&self->ctx, buffer, length);
break;
}
}
void common_hal_aesio_aes_decrypt(aesio_aes_obj_t *self, uint8_t *buffer,
size_t length) {
switch (self->mode) {
case AES_MODE_ECB:
AES_ECB_decrypt(&self->ctx, buffer);
break;
case AES_MODE_CBC:
AES_CBC_decrypt_buffer(&self->ctx, buffer, length);
break;
case AES_MODE_CTR:
AES_CTR_xcrypt_buffer(&self->ctx, buffer, length);
break;
}
}

View File

@ -0,0 +1,59 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef MICROPY_INCLUDED_SHARED_MODULE_AESIO__INIT__H
#define MICROPY_INCLUDED_SHARED_MODULE_AESIO__INIT__H
#include <stdbool.h>
#include <stdint.h>
#include "py/obj.h"
#include "py/proto.h"
#include "shared-module/aesio/aes.h"
// These values were chosen to correspond with the values
// present in pycrypto.
enum AES_MODE {
AES_MODE_ECB = 1,
AES_MODE_CBC = 2,
AES_MODE_CTR = 6,
};
typedef struct {
mp_obj_base_t base;
// The tinyaes context
struct AES_ctx ctx;
// Which AES mode this instance of the object is configured to use
enum AES_MODE mode;
// Counter for running in CTR mode
uint32_t counter;
} aesio_aes_obj_t;
#endif // MICROPY_INCLUDED_SHARED_MODULE_AESIO__INIT__H

608
shared-module/aesio/aes.c Normal file
View File

@ -0,0 +1,608 @@
/*
This is an implementation of the AES algorithm, specifically ECB, CTR and CBC mode.
Block size can be chosen in aes.h - available choices are AES128, AES192, AES256.
The implementation is verified against the test vectors in:
National Institute of Standards and Technology Special Publication 800-38A 2001 ED
ECB-AES128
----------
plain-text:
6bc1bee22e409f96e93d7e117393172a
ae2d8a571e03ac9c9eb76fac45af8e51
30c81c46a35ce411e5fbc1191a0a52ef
f69f2445df4f9b17ad2b417be66c3710
key:
2b7e151628aed2a6abf7158809cf4f3c
resulting cipher
3ad77bb40d7a3660a89ecaf32466ef97
f5d3d58503b9699de785895a96fdbaaf
43b1cd7f598ece23881b00e3ed030688
7b0c785e27e8ad3f8223207104725dd4
NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0)
You should pad the end of the string with zeros if this is not the case.
For AES192/256 the key size is proportionally larger.
*/
/*****************************************************************************/
/* Includes: */
/*****************************************************************************/
#include <string.h> // CBC mode, for memset
#include "aes.h"
/*****************************************************************************/
/* Defines: */
/*****************************************************************************/
// The number of columns comprising a state in AES. This is a constant in AES.
// Value=4
#define Nb 4UL
#if defined(AES256) && (AES256 == 1)
#define Nk256 8UL
#define Nr256 14UL
#endif
#if defined(AES192) && (AES192 == 1)
#define Nk192 6UL
#define Nr192 12UL
#endif
#if defined(AES128) && (AES128 == 1)
#define Nk128 4UL // The number of 32 bit words in a key.
#define Nr128 10UL // The number of rounds in AES Cipher.
#endif
// jcallan@github points out that declaring Multiply as a function reduces code
// size considerably with the Keil ARM compiler. See this link for more
// information: https://github.com/kokke/tiny-AES-C/pull/3
#ifndef MULTIPLY_AS_A_FUNCTION
#define MULTIPLY_AS_A_FUNCTION 0
#endif
/*****************************************************************************/
/* Private variables: */
/*****************************************************************************/
// state - array holding the intermediate results during decryption.
typedef uint8_t state_t[4][4];
// The lookup-tables are marked const so they can be placed in read-only storage
// instead of RAM The numbers below can be computed dynamically trading ROM for
// RAM - This can be useful in (embedded) bootloader applications, where ROM is
// often limited.
static const uint8_t sbox[256] = {
//0 1 2 3 4 5 6 7 8 9 A B C D E F
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
static const uint8_t rsbox[256] = {
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
// The round constant word array, Rcon[i], contains the values given by x to the
// power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8)
static const uint8_t Rcon[11] = {
0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };
/*
* Jordan Goulder points out in PR #12
* (https://github.com/kokke/tiny-AES-C/pull/12), that you can remove most of
* the elements in the Rcon array, because they are unused.
*
* From Wikipedia's article on the Rijndael key schedule @
* https://en.wikipedia.org/wiki/Rijndael_key_schedule#Rcon
*
* "Only the first some of these constants are actually used up to rcon[10]
* for AES-128 (as 11 round keys are needed), up to rcon[8] for AES-192, up to
* rcon[7] for AES-256. rcon[0] is not used in AES algorithm."
*/
/*****************************************************************************/
/* Private functions: */
/*****************************************************************************/
static const uint8_t *GetRoundKey(const struct AES_ctx *ctx) {
switch (ctx->KeyLength) {
#if defined(AES128) && (AES128 == 1)
case 16: return ctx->RoundKey128;
#endif
#if defined(AES192) && (AES192 == 1)
case 24: return ctx->RoundKey192;
#endif
#if defined(AES256) && (AES256 == 1)
case 32: return ctx->RoundKey256;
#endif
}
return NULL;
}
/*
static uint8_t getSBoxValue(uint8_t num)
{
return sbox[num];
}
*/
#define getSBoxValue(num) (sbox[(num)])
/*
static uint8_t getSBoxInvert(uint8_t num)
{
return rsbox[num];
}
*/
#define getSBoxInvert(num) (rsbox[(num)])
// This function produces Nb(Nr+1) round keys. The round keys are used in each
// round to decrypt the states.
static void KeyExpansion(struct AES_ctx* ctx, const uint8_t* Key)
{
uint8_t* RoundKey = (uint8_t *)GetRoundKey(ctx);
unsigned i, j, k;
uint8_t tempa[4]; // Used for the column/row operations
// The first round key is the key itself.
for (i = 0; i < ctx->Nk; ++i)
{
RoundKey[(i * 4) + 0] = Key[(i * 4) + 0];
RoundKey[(i * 4) + 1] = Key[(i * 4) + 1];
RoundKey[(i * 4) + 2] = Key[(i * 4) + 2];
RoundKey[(i * 4) + 3] = Key[(i * 4) + 3];
}
// All other round keys are found from the previous round keys.
for (i = ctx->Nk; i < Nb * (ctx->Nr + 1); ++i)
{
{
k = (i - 1) * 4;
tempa[0]=RoundKey[k + 0];
tempa[1]=RoundKey[k + 1];
tempa[2]=RoundKey[k + 2];
tempa[3]=RoundKey[k + 3];
}
if (i % ctx->Nk == 0)
{
// This function shifts the 4 bytes in a word to the left once.
// [a0,a1,a2,a3] becomes [a1,a2,a3,a0]
// Function RotWord()
{
const uint8_t u8tmp = tempa[0];
tempa[0] = tempa[1];
tempa[1] = tempa[2];
tempa[2] = tempa[3];
tempa[3] = u8tmp;
}
// SubWord() is a function that takes a four-byte input word and applies
// the S-box to each of the four bytes to produce an output word.
// Function Subword()
{
tempa[0] = getSBoxValue(tempa[0]);
tempa[1] = getSBoxValue(tempa[1]);
tempa[2] = getSBoxValue(tempa[2]);
tempa[3] = getSBoxValue(tempa[3]);
}
tempa[0] = tempa[0] ^ Rcon[i/ctx->Nk];
}
#if defined(AES256) && (AES256 == 1)
if (ctx->KeyLength == 32) {
if (i % ctx->Nk == 4)
{
// Function Subword()
{
tempa[0] = getSBoxValue(tempa[0]);
tempa[1] = getSBoxValue(tempa[1]);
tempa[2] = getSBoxValue(tempa[2]);
tempa[3] = getSBoxValue(tempa[3]);
}
}
}
#endif
j = i * 4; k=(i - ctx->Nk) * 4;
RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0];
RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1];
RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2];
RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3];
}
}
void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key, uint32_t keylen)
{
ctx->KeyLength = keylen;
switch (ctx->KeyLength) {
#if defined(AES128) && (AES128 == 1)
case 16: ctx->Nr = Nr128; ctx->Nk = Nk128; break;
#endif
#if defined(AES192) && (AES192 == 1)
case 24: ctx->Nr = Nr192; ctx->Nk = Nk192; break;
#endif
#if defined(AES256) && (AES256 == 1)
case 32: ctx->Nr = Nr256; ctx->Nk = Nk256; break;
#endif
default: ctx->Nr = 0; ctx->Nk = 0; break;
}
KeyExpansion(ctx, key);
}
#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1))
void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, uint32_t keylen, const uint8_t* iv)
{
AES_init_ctx(ctx, key, keylen);
memcpy (ctx->Iv, iv, AES_BLOCKLEN);
}
void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv)
{
memcpy (ctx->Iv, iv, AES_BLOCKLEN);
}
#endif
// This function adds the round key to state. The round key is added to the
// state by an XOR function.
static void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey)
{
uint8_t i,j;
for (i = 0; i < 4; ++i)
{
for (j = 0; j < 4; ++j)
{
(*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j];
}
}
}
// The SubBytes Function Substitutes the values in the state matrix with values
// in an S-box.
static void SubBytes(state_t* state)
{
uint8_t i, j;
for (i = 0; i < 4; ++i)
{
for (j = 0; j < 4; ++j)
{
(*state)[j][i] = getSBoxValue((*state)[j][i]);
}
}
}
// The ShiftRows() function shifts the rows in the state to the left. Each row
// is shifted with different offset. Offset = Row number. So the first row is
// not shifted.
static void ShiftRows(state_t* state)
{
uint8_t temp;
// Rotate first row 1 columns to left
temp = (*state)[0][1];
(*state)[0][1] = (*state)[1][1];
(*state)[1][1] = (*state)[2][1];
(*state)[2][1] = (*state)[3][1];
(*state)[3][1] = temp;
// Rotate second row 2 columns to left
temp = (*state)[0][2];
(*state)[0][2] = (*state)[2][2];
(*state)[2][2] = temp;
temp = (*state)[1][2];
(*state)[1][2] = (*state)[3][2];
(*state)[3][2] = temp;
// Rotate third row 3 columns to left
temp = (*state)[0][3];
(*state)[0][3] = (*state)[3][3];
(*state)[3][3] = (*state)[2][3];
(*state)[2][3] = (*state)[1][3];
(*state)[1][3] = temp;
}
static uint8_t xtime(uint8_t x)
{
return ((x<<1) ^ (((x>>7) & 1) * 0x1b));
}
// MixColumns function mixes the columns of the state matrix
static void MixColumns(state_t* state)
{
uint8_t i;
uint8_t Tmp, Tm, t;
for (i = 0; i < 4; ++i)
{
t = (*state)[i][0];
Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3] ;
Tm = (*state)[i][0] ^ (*state)[i][1] ; Tm = xtime(Tm); (*state)[i][0] ^= Tm ^ Tmp ;
Tm = (*state)[i][1] ^ (*state)[i][2] ; Tm = xtime(Tm); (*state)[i][1] ^= Tm ^ Tmp ;
Tm = (*state)[i][2] ^ (*state)[i][3] ; Tm = xtime(Tm); (*state)[i][2] ^= Tm ^ Tmp ;
Tm = (*state)[i][3] ^ t ; Tm = xtime(Tm); (*state)[i][3] ^= Tm ^ Tmp ;
}
}
// Multiply is used to multiply numbers in the field GF(2^8)
// Note: The last call to xtime() is unneeded, but often ends up generating a smaller binary
// The compiler seems to be able to vectorize the operation better this way.
// See https://github.com/kokke/tiny-AES-c/pull/34
#if MULTIPLY_AS_A_FUNCTION
static uint8_t Multiply(uint8_t x, uint8_t y)
{
return (((y & 1) * x) ^
((y>>1 & 1) * xtime(x)) ^
((y>>2 & 1) * xtime(xtime(x))) ^
((y>>3 & 1) * xtime(xtime(xtime(x)))) ^
((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))); /* this last call to xtime() can be omitted */
}
#else
#define Multiply(x, y) \
( ((y & 1) * x) ^ \
((y>>1 & 1) * xtime(x)) ^ \
((y>>2 & 1) * xtime(xtime(x))) ^ \
((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ \
((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) \
#endif
#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
// MixColumns function mixes the columns of the state matrix. The method used to
// multiply may be difficult to understand for the inexperienced. Please use the
// references to gain more information.
static void InvMixColumns(state_t* state)
{
int i;
uint8_t a, b, c, d;
for (i = 0; i < 4; ++i)
{
a = (*state)[i][0];
b = (*state)[i][1];
c = (*state)[i][2];
d = (*state)[i][3];
(*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09);
(*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d);
(*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b);
(*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e);
}
}
// The SubBytes Function Substitutes the values in the state matrix with values
// in an S-box.
static void InvSubBytes(state_t* state)
{
uint8_t i, j;
for (i = 0; i < 4; ++i)
{
for (j = 0; j < 4; ++j)
{
(*state)[j][i] = getSBoxInvert((*state)[j][i]);
}
}
}
static void InvShiftRows(state_t* state)
{
uint8_t temp;
// Rotate first row 1 columns to right
temp = (*state)[3][1];
(*state)[3][1] = (*state)[2][1];
(*state)[2][1] = (*state)[1][1];
(*state)[1][1] = (*state)[0][1];
(*state)[0][1] = temp;
// Rotate second row 2 columns to right
temp = (*state)[0][2];
(*state)[0][2] = (*state)[2][2];
(*state)[2][2] = temp;
temp = (*state)[1][2];
(*state)[1][2] = (*state)[3][2];
(*state)[3][2] = temp;
// Rotate third row 3 columns to right
temp = (*state)[0][3];
(*state)[0][3] = (*state)[1][3];
(*state)[1][3] = (*state)[2][3];
(*state)[2][3] = (*state)[3][3];
(*state)[3][3] = temp;
}
#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
// Cipher is the main function that encrypts the PlainText.
static void Cipher(state_t* state, const struct AES_ctx* ctx)
{
const uint8_t* RoundKey = GetRoundKey(ctx);
uint8_t round = 0;
// Add the First round key to the state before starting the rounds.
AddRoundKey(0, state, RoundKey);
// There will be Nr rounds. The first Nr-1 rounds are identical. These Nr
// rounds are executed in the loop below. Last one without MixColumns()
for (round = 1; ; ++round)
{
SubBytes(state);
ShiftRows(state);
if (round == ctx->Nr) {
break;
}
MixColumns(state);
AddRoundKey(round, state, RoundKey);
}
// Add round key to last round
AddRoundKey(ctx->Nr, state, RoundKey);
}
#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
static void InvCipher(state_t* state, const struct AES_ctx* ctx)
{
const uint8_t* RoundKey = GetRoundKey(ctx);
uint8_t round = 0;
// Add the First round key to the state before starting the rounds.
AddRoundKey(ctx->Nr, state, RoundKey);
// There will be Nr rounds. The first Nr-1 rounds are identical. These Nr
// rounds are executed in the loop below. Last one without InvMixColumn()
for (round = (ctx->Nr - 1); ; --round)
{
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(round, state, RoundKey);
if (round == 0) {
break;
}
InvMixColumns(state);
}
}
#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
/*****************************************************************************/
/* Public functions: */
/*****************************************************************************/
#if defined(ECB) && (ECB == 1)
void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf)
{
// The next function call encrypts the PlainText with the Key using AES
// algorithm.
Cipher((state_t*)buf, ctx);
}
void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf)
{
// The next function call decrypts the PlainText with the Key using AES
// algorithm.
InvCipher((state_t*)buf, ctx);
}
#endif // #if defined(ECB) && (ECB == 1)
#if defined(CBC) && (CBC == 1)
static void XorWithIv(uint8_t* buf, const uint8_t* Iv)
{
uint8_t i;
for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size
{
buf[i] ^= Iv[i];
}
}
void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t* buf, uint32_t length)
{
uintptr_t i;
uint8_t *Iv = ctx->Iv;
for (i = 0; i < length; i += AES_BLOCKLEN)
{
XorWithIv(buf, Iv);
Cipher((state_t*)buf, ctx);
Iv = buf;
buf += AES_BLOCKLEN;
}
/* store Iv in ctx for next call */
memcpy(ctx->Iv, Iv, AES_BLOCKLEN);
}
void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length)
{
uintptr_t i;
uint8_t storeNextIv[AES_BLOCKLEN];
for (i = 0; i < length; i += AES_BLOCKLEN)
{
memcpy(storeNextIv, buf, AES_BLOCKLEN);
InvCipher((state_t*)buf, ctx);
XorWithIv(buf, ctx->Iv);
memcpy(ctx->Iv, storeNextIv, AES_BLOCKLEN);
buf += AES_BLOCKLEN;
}
}
#endif // #if defined(CBC) && (CBC == 1)
#if defined(CTR) && (CTR == 1)
/* Symmetrical operation: same function for encrypting as for decrypting. Note
any IV/nonce should never be reused with the same key */
void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length)
{
uint8_t buffer[AES_BLOCKLEN];
unsigned i;
int bi;
for (i = 0, bi = AES_BLOCKLEN; i < length; ++i, ++bi)
{
if (bi == AES_BLOCKLEN) /* we need to regen xor compliment in buffer */
{
memcpy(buffer, ctx->Iv, AES_BLOCKLEN);
Cipher((state_t*)buffer, ctx);
/* Increment Iv and handle overflow */
for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi)
{
/* inc will overflow */
if (ctx->Iv[bi] == 255)
{
ctx->Iv[bi] = 0;
continue;
}
ctx->Iv[bi] += 1;
break;
}
bi = 0;
}
buf[i] = (buf[i] ^ buffer[bi]);
}
}
#endif // #if defined(CTR) && (CTR == 1)

105
shared-module/aesio/aes.h Normal file
View File

@ -0,0 +1,105 @@
#ifndef _AES_H_
#define _AES_H_
#include <stdint.h>
// #define the macros below to 1/0 to enable/disable the mode of operation.
//
// CBC enables AES encryption in CBC-mode of operation.
// CTR enables encryption in counter-mode.
// ECB enables the basic ECB 16-byte block algorithm. All can be enabled simultaneously.
// The #ifndef-guard allows it to be configured before #include'ing or at compile time.
#ifndef CBC
#define CBC 1
#endif
#ifndef ECB
#define ECB 1
#endif
#ifndef CTR
#define CTR 1
#endif
#define AES128 1
#define AES192 1
#define AES256 1
#define AES_BLOCKLEN 16 // Block length in bytes - AES is 128b block only
#if defined(AES256) && (AES256 == 1)
#define AES_KEYLEN256 32
#define AES_keyExpSize256 240
#endif
#if defined(AES192) && (AES192 == 1)
#define AES_KEYLEN192 24
#define AES_keyExpSize192 208
#endif
#if defined(AES128) && (AES128 == 1)
#define AES_KEYLEN128 16 // Key length in bytes
#define AES_keyExpSize128 176
#endif
struct AES_ctx
{
union {
#if defined(AES256) && (AES256 == 1)
uint8_t RoundKey256[AES_keyExpSize256];
#endif
#if defined(AES192) && (AES192 == 1)
uint8_t RoundKey192[AES_keyExpSize192];
#endif
#if defined(AES128) && (AES128 == 1)
uint8_t RoundKey128[AES_keyExpSize128];
#endif
};
#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1))
uint8_t Iv[AES_BLOCKLEN];
#endif
uint32_t KeyLength;
uint8_t Nr;
uint8_t Nk;
};
void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key, uint32_t keylen);
#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1))
void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, uint32_t keylen, const uint8_t* iv);
void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv);
#endif
#if defined(ECB) && (ECB == 1)
// buffer size is exactly AES_BLOCKLEN bytes;
// you need only AES_init_ctx as IV is not used in ECB
// NB: ECB is considered insecure for most uses
void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf);
#endif // #if defined(ECB) && (ECB == !)
#if defined(CBC) && (CBC == 1)
// buffer size MUST be mutile of AES_BLOCKLEN;
// Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme
// NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv()
// no IV should ever be reused with the same key
void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length);
void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length);
#endif // #if defined(CBC) && (CBC == 1)
#if defined(CTR) && (CTR == 1)
// Same function for encrypting as for decrypting.
// IV is incremented for every block, and used after encryption as XOR-compliment for output
// Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme
// NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv()
// no IV should ever be reused with the same key
void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, uint32_t length);
#endif // #if defined(CTR) && (CTR == 1)
#endif // _AES_H_