diff --git a/arduino/security/signature_test.go b/arduino/security/signature_test.go index dc97e86c363..82d5572f219 100644 --- a/arduino/security/signature_test.go +++ b/arduino/security/signature_test.go @@ -22,14 +22,36 @@ import ( "github.com/stretchr/testify/require" ) -func TestSignatureVerification(t *testing.T) { - res, signer, err := VerifyArduinoDetachedSignature(paths.New("testdata/package_index.json"), paths.New("testdata/package_index.json.sig")) +var ( + PackageIndexPath = paths.New("testdata/package_index.json") + PackageSignaturePath = paths.New("testdata/package_index.json.sig") + BoardIndexPath = paths.New("testdata/module_firmware_index.json") + BoardSignaturePath = paths.New("testdata/module_firmware_index.json.sig") + BoardKey = paths.New("testdata/module_firmware_index_public.gpg.key") + InvalidIndexPath = paths.New("testdata/invalid_file.json") +) + +func TestVerifyArduinoDetachedSignature(t *testing.T) { + res, signer, err := VerifyArduinoDetachedSignature(PackageIndexPath, PackageSignaturePath) require.NoError(t, err) require.NotNil(t, signer) require.True(t, res) require.Equal(t, uint64(0x7baf404c2dfab4ae), signer.PrimaryKey.KeyId) - res, signer, err = VerifyArduinoDetachedSignature(paths.New("testdata/invalid_file.json"), paths.New("testdata/package_index.json.sig")) + res, signer, err = VerifyArduinoDetachedSignature(InvalidIndexPath, PackageSignaturePath) + require.False(t, res) + require.Nil(t, signer) + require.Error(t, err) +} + +func TestVerifyDetachedSignature(t *testing.T) { + res, signer, err := VerifyDetachedSignature(BoardIndexPath, BoardSignaturePath, BoardKey) + require.NoError(t, err) + require.NotNil(t, signer) + require.True(t, res) + require.Equal(t, uint64(0x82f2d7c7c5a22a73), signer.PrimaryKey.KeyId) + + res, signer, err = VerifyDetachedSignature(InvalidIndexPath, PackageSignaturePath, BoardKey) require.False(t, res) require.Nil(t, signer) require.Error(t, err) diff --git a/arduino/security/signatures.go b/arduino/security/signatures.go index fad37435027..2bc7a9fec88 100644 --- a/arduino/security/signatures.go +++ b/arduino/security/signatures.go @@ -17,6 +17,8 @@ package security import ( "fmt" + "io" + "os" "github.com/arduino/go-paths-helper" rice "github.com/cmaglie/go.rice" @@ -37,11 +39,33 @@ func VerifyArduinoDetachedSignature(targetPath *paths.Path, signaturePath *paths if err != nil { panic("could not find bundled signature keys") } + return verifySignature(targetPath, signaturePath, arduinoKeyringFile) +} + +// VerifyDetachedSignature checks that the detached GPG signature (in the +// signaturePath file) matches the given targetPath file and is an authentic +// signature from the bundled trusted keychain. The keyPath is the path of the public key used. +// This function allows to specify the path of the key to use. +// If any of the above conditions fails this function returns false. +// The PGP entity in the trusted keychain that produced the signature is returned too. +func VerifyDetachedSignature(targetPath *paths.Path, signaturePath *paths.Path, keyPath *paths.Path) (bool, *openpgp.Entity, error) { + arduinoKeyringFile, err := os.Open(keyPath.String()) + if err != nil { + panic("could not open signature keys") + } + defer arduinoKeyringFile.Close() + return verifySignature(targetPath, signaturePath, arduinoKeyringFile) +} + +//verifySignature is an helper function that checks that the detached GPG signature (in the +// signaturePath file) matches the given targetPath file and is an authentic +// signature. If any of the above conditions fails this function returns false. +// The PGP entity in the trusted keychain that produced the signature is returned too. +func verifySignature(targetPath *paths.Path, signaturePath *paths.Path, arduinoKeyringFile io.Reader) (bool, *openpgp.Entity, error) { keyRing, err := openpgp.ReadKeyRing(arduinoKeyringFile) if err != nil { return false, nil, fmt.Errorf("retrieving Arduino public keys: %s", err) } - target, err := targetPath.Open() if err != nil { return false, nil, fmt.Errorf("opening target file: %s", err) diff --git a/arduino/security/testdata/module_firmware_index.json b/arduino/security/testdata/module_firmware_index.json new file mode 100644 index 00000000000..3850373429d --- /dev/null +++ b/arduino/security/testdata/module_firmware_index.json @@ -0,0 +1,455 @@ +[ + { + "fqbn": "arduino:samd:mkr1000", + "firmware": [ + { + "version": "19.4.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/WINC1500/19.4.4/m2m_aio_3a0.bin", + "checksum": "SHA-256:f8be2a5ef10e109f685b7550d211ed11c07487de430b0e5994ca557160116c27", + "size": "412308" + }, + { + "version": "19.5.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/WINC1500/19.5.2/m2m_aio_3a0.bin", + "checksum": "SHA-256:e2e5aa2cf185745582002e2fed27c079d4228bc8d756281f43638c72061c9110", + "size": "413604" + }, + { + "version": "19.5.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/WINC1500/19.5.4/m2m_aio_3a0.bin", + "checksum": "SHA-256:146d3d5fccf65ff6d732e34077e56f1f0b2f69584fd8499db914ea11ed463042", + "size": "413604" + }, + { + "version": "19.6.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/WINC1500/19.6.1/m2m_aio_3a0.bin", + "checksum": "SHA-256:629a2553cb738be1424eaa707c00403ebce179fdb94008acec1f185a19a60c81", + "size": "359356" + } + ], + "loader_sketch": { + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.samd.mkr1000/loader.bin", + "checksum": "SHA-256:1d904bf745c8df448358d70837a36ee8dec4c2a01e0e3b2ef8ef51c6a6c9d385", + "size": "16328" + }, + "module": "WINC1500", + "name": "Arduino MKR1000", + "uploader": "arduino:bossac@1.7.0-arduino3", + "upload.use_1200bps_touch": "true", + "upload.wait_for_upload_port": "true", + "uploader.command": "\"{uploader}\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R" + }, + { + "fqbn": "arduino:samd:mkrwifi1010", + "firmware": [ + { + "version": "1.0.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.0.0/NINA_W102.bin", + "checksum": "SHA-256:3fe2cd90a0774e271624d42ab1b238d92c7495648e9918ad49dea3b20379905e", + "size": "736256" + }, + { + "version": "1.1.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.1.0/NINA_W102.bin", + "checksum": "SHA-256:3b38f44a2e2e2d28995973f432bc2795f7c58a14e8638f55e3f024ffa499bcf8", + "size": "814080" + }, + { + "version": "1.2.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.1/NINA_W102.bin", + "checksum": "SHA-256:3121bf4074fce0248946810c4d03f5d3fb1296cd4667aeb801b5d066e1b07ff3", + "size": "880640" + }, + { + "version": "1.2.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.2/NINA_W102.bin", + "checksum": "SHA-256:71d0a49a4d79aa46dff6f434383133b4365581407846d709fbd961e2b770eb3c", + "size": "893952" + }, + { + "version": "1.2.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.3/NINA_W102.bin", + "checksum": "SHA-256:9c908f33cc05831972833a274f65baf84da35c61fc081856959211ae3504c899", + "size": "893952" + }, + { + "version": "1.2.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.4/NINA_W102.bin", + "checksum": "SHA-256:8b9c07abdaa5647c47466aa3c575e743495a295fd8db2fe91b7e28fe4135ffad", + "size": "917504" + }, + { + "version": "1.3.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.3.0/NINA_W102.bin", + "checksum": "SHA-256:aa37c920df18aabc6544df93c64bea6b3b97841b68ff4a6a53d2b800b265d2b5", + "size": "986112" + }, + { + "version": "1.4.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.0/NINA_W102.bin", + "checksum": "SHA-256:ca5ed0b5efd727dd3c507f39a744e171ce690ef17b116c0571f18d1fea17aa85", + "size": "1035264" + }, + { + "version": "1.4.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.1/NINA_W102.bin", + "checksum": "SHA-256:b20f213bc886a95556fc5cec5003c7ebc617da83581ba20fb9f96db003063bbd", + "size": "1208320" + }, + { + "version": "1.4.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.2/NINA_W102.bin", + "checksum": "SHA-256:61d0acbd3d2eeb45b6971448d9537f7c4fa27f264e20970ad5dfdd4cbfdd8ee0", + "size": "1125376" + }, + { + "version": "1.4.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.3/NINA_W102.bin", + "checksum": "SHA-256:8c10c3ee3b8fb2ade3a650b41a3081566fc160e89b32e5d0ee040e63647692b8", + "size": "1125376" + }, + { + "version": "1.4.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.4/NINA_W102.bin", + "checksum": "SHA-256:c8678e00ab9b2dc99cdc45ef577b77498dac802c3f5b99961da190374fddcef8", + "size": "1125376" + }, + { + "version": "1.4.5", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.5/NINA_W102.bin", + "checksum": "SHA-256:7c2814c8f879e62d234d7ac3a9c28f9a2d1e1dbc3569bd740761ca796247a4c9", + "size": "1127424" + } + ], + "loader_sketch": { + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.samd.mkrwifi1010/loader.bin", + "checksum": "SHA-256:a4f9b0586bf78b8e1c5a6660df6b749d1ad4e3ee79ee4928371a465899a4a1c4", + "size": "13688" + }, + "module": "NINA", + "name": "Arduino MKR WiFi 1010", + "uploader": "arduino:bossac@1.7.0-arduino3", + "upload.use_1200bps_touch": "true", + "upload.wait_for_upload_port": "true", + "uploader.command": "\"{uploader}\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R" + }, + { + "fqbn": "arduino:samd:nano_33_iot", + "firmware": [ + { + "version": "1.0.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.0.0/NINA_W102.bin", + "checksum": "SHA-256:3fe2cd90a0774e271624d42ab1b238d92c7495648e9918ad49dea3b20379905e", + "size": "736256" + }, + { + "version": "1.1.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.1.0/NINA_W102.bin", + "checksum": "SHA-256:3b38f44a2e2e2d28995973f432bc2795f7c58a14e8638f55e3f024ffa499bcf8", + "size": "814080" + }, + { + "version": "1.2.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.1/NINA_W102.bin", + "checksum": "SHA-256:3121bf4074fce0248946810c4d03f5d3fb1296cd4667aeb801b5d066e1b07ff3", + "size": "880640" + }, + { + "version": "1.2.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.2/NINA_W102.bin", + "checksum": "SHA-256:71d0a49a4d79aa46dff6f434383133b4365581407846d709fbd961e2b770eb3c", + "size": "893952" + }, + { + "version": "1.2.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.3/NINA_W102.bin", + "checksum": "SHA-256:9c908f33cc05831972833a274f65baf84da35c61fc081856959211ae3504c899", + "size": "893952" + }, + { + "version": "1.2.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.4/NINA_W102.bin", + "checksum": "SHA-256:8b9c07abdaa5647c47466aa3c575e743495a295fd8db2fe91b7e28fe4135ffad", + "size": "917504" + }, + { + "version": "1.3.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.3.0/NINA_W102.bin", + "checksum": "SHA-256:aa37c920df18aabc6544df93c64bea6b3b97841b68ff4a6a53d2b800b265d2b5", + "size": "986112" + }, + { + "version": "1.4.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.0/NINA_W102.bin", + "checksum": "SHA-256:ca5ed0b5efd727dd3c507f39a744e171ce690ef17b116c0571f18d1fea17aa85", + "size": "1035264" + }, + { + "version": "1.4.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.1/NINA_W102.bin", + "checksum": "SHA-256:b20f213bc886a95556fc5cec5003c7ebc617da83581ba20fb9f96db003063bbd", + "size": "1208320" + }, + { + "version": "1.4.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.2/NINA_W102.bin", + "checksum": "SHA-256:61d0acbd3d2eeb45b6971448d9537f7c4fa27f264e20970ad5dfdd4cbfdd8ee0", + "size": "1125376" + }, + { + "version": "1.4.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.3/NINA_W102.bin", + "checksum": "SHA-256:8c10c3ee3b8fb2ade3a650b41a3081566fc160e89b32e5d0ee040e63647692b8", + "size": "1125376" + }, + { + "version": "1.4.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.4/NINA_W102.bin", + "checksum": "SHA-256:c8678e00ab9b2dc99cdc45ef577b77498dac802c3f5b99961da190374fddcef8", + "size": "1125376" + }, + { + "version": "1.4.5", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.5/NINA_W102.bin", + "checksum": "SHA-256:7c2814c8f879e62d234d7ac3a9c28f9a2d1e1dbc3569bd740761ca796247a4c9", + "size": "1127424" + } + ], + "loader_sketch": { + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.samd.nano_33_iot/loader.bin", + "checksum": "SHA-256:f643fd763ba6aec835bb708669a6a5f5709357990d9eab6f4e6d5223ea3ca2a3", + "size": "14348" + }, + "module": "NINA", + "name": "Arduino NANO 33 IoT", + "uploader": "arduino:bossac@1.7.0-arduino3", + "upload.use_1200bps_touch": "true", + "upload.wait_for_upload_port": "true", + "uploader.command": "\"{uploader}\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R" + }, + { + "fqbn": "arduino:samd:mkrvidor4000", + "firmware": [ + { + "version": "1.0.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.0.0/NINA_W102.bin", + "checksum": "SHA-256:3fe2cd90a0774e271624d42ab1b238d92c7495648e9918ad49dea3b20379905e", + "size": "736256" + }, + { + "version": "1.1.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.1.0/NINA_W102.bin", + "checksum": "SHA-256:3b38f44a2e2e2d28995973f432bc2795f7c58a14e8638f55e3f024ffa499bcf8", + "size": "814080" + }, + { + "version": "1.2.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.1/NINA_W102.bin", + "checksum": "SHA-256:3121bf4074fce0248946810c4d03f5d3fb1296cd4667aeb801b5d066e1b07ff3", + "size": "880640" + }, + { + "version": "1.2.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.2/NINA_W102.bin", + "checksum": "SHA-256:71d0a49a4d79aa46dff6f434383133b4365581407846d709fbd961e2b770eb3c", + "size": "893952" + }, + { + "version": "1.2.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.3/NINA_W102.bin", + "checksum": "SHA-256:9c908f33cc05831972833a274f65baf84da35c61fc081856959211ae3504c899", + "size": "893952" + }, + { + "version": "1.2.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.4/NINA_W102.bin", + "checksum": "SHA-256:8b9c07abdaa5647c47466aa3c575e743495a295fd8db2fe91b7e28fe4135ffad", + "size": "917504" + }, + { + "version": "1.3.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.3.0/NINA_W102.bin", + "checksum": "SHA-256:aa37c920df18aabc6544df93c64bea6b3b97841b68ff4a6a53d2b800b265d2b5", + "size": "986112" + }, + { + "version": "1.4.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.0/NINA_W102.bin", + "checksum": "SHA-256:ca5ed0b5efd727dd3c507f39a744e171ce690ef17b116c0571f18d1fea17aa85", + "size": "1035264" + }, + { + "version": "1.4.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.1/NINA_W102.bin", + "checksum": "SHA-256:b20f213bc886a95556fc5cec5003c7ebc617da83581ba20fb9f96db003063bbd", + "size": "1208320" + }, + { + "version": "1.4.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.2/NINA_W102.bin", + "checksum": "SHA-256:61d0acbd3d2eeb45b6971448d9537f7c4fa27f264e20970ad5dfdd4cbfdd8ee0", + "size": "1125376" + }, + { + "version": "1.4.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.3/NINA_W102.bin", + "checksum": "SHA-256:8c10c3ee3b8fb2ade3a650b41a3081566fc160e89b32e5d0ee040e63647692b8", + "size": "1125376" + }, + { + "version": "1.4.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.4/NINA_W102.bin", + "checksum": "SHA-256:c8678e00ab9b2dc99cdc45ef577b77498dac802c3f5b99961da190374fddcef8", + "size": "1125376" + }, + { + "version": "1.4.5", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.5/NINA_W102.bin", + "checksum": "SHA-256:7c2814c8f879e62d234d7ac3a9c28f9a2d1e1dbc3569bd740761ca796247a4c9", + "size": "1127424" + } + ], + "module": "NINA", + "name": "Arduino MKR Vidor 4000", + "uploader": "arduino:bossac@1.7.0-arduino3", + "upload.use_1200bps_touch": "true", + "upload.wait_for_upload_port": "true", + "uploader.command": "\"{uploader}\" -i -d --port={serial.port.file} -I -U true -i -e -w \"{loader.sketch}.bin\" -R" + }, + { + "fqbn": "arduino:megaavr:uno2018", + "firmware": [ + { + "version": "1.2.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.1/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:bac23326dd4c3b6358ee88ff322da8c16e24e9917b8b0bbd18f663aacfb758cf", + "size": "880640" + }, + { + "version": "1.2.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.2/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:d1f496b185eff6b2ab2f839f6673afc80e1b3e3b2056fc8d9290a74895baf0e5", + "size": "893952" + }, + { + "version": "1.2.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.3/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:53668eb76be80fffdd67ced7cbb8ab231638b9ee428ae83568dfe48359008bb4", + "size": "893952" + }, + { + "version": "1.2.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.2.4/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:37b042cf759b52a96304c35af6a066038184533cc6256f795e92ed1b4fbda3d5", + "size": "917504" + }, + { + "version": "1.3.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.3.0/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:c538028f428b3fc219d2f7c0d9debacd07bababf43dbc28680ed452225ff4629", + "size": "986112" + }, + { + "version": "1.4.0", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.0/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:fe852e28eb0547a324069194dcce524b5a9f18adce2983bbe11a818a7ae8200a", + "size": "1041408" + }, + { + "version": "1.4.1", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.1/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:f11deb8ce5abe908353eebca7253c18359eb8ea2a601908d5cdb56bf035b4158", + "size": "1044480" + }, + { + "version": "1.4.2", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.2/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:7adff887267297dccc6c3ce77f41a986a23a1f7dfce9e8f3b70b3aa038371d47", + "size": "1132544" + }, + { + "version": "1.4.3", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.3/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:c026f967bd3add27716a1afaf729d669a5e093771098329bab2477980d6879b5", + "size": "1132544" + }, + { + "version": "1.4.4", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.4/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:6b7809357a57946638b271dd1b0b43a84cbcbea9b854d3ff093752fa0fe7b818", + "size": "1132544" + }, + { + "version": "1.4.5", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.5/NINA_W102-Uno_WiFi_Rev2.bin", + "checksum": "SHA-256:b641c4f6f76ab4c7a529848da54f15b9b9857a9627920129a0a6f65edc465c67", + "size": "1133568" + } + ], + "loader_sketch": { + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.megaavr.uno2018/loader.hex", + "checksum": "SHA-256:0d4c2bf93da575245e92595b1d0f55db1fa79583f1c3361646da051dab020afe", + "size": "18954" + }, + "module": "NINA", + "name": "Arduino Uno WiFi Rev2", + "uploader": "arduino:avrdude@6.3.0-arduino17", + "uploader.command": "\"{uploader}\" \"-C{config.path}\" -v -patmega4809 -cxplainedmini_updi -Pusb -b115200 -e -D \"-Uflash:w:{loader.sketch}.hex:i\" \"-Ufuse2:w:0x01:m\" \"-Ufuse5:w:0xC9:m\" \"-Ufuse8:w:0x02:m\" " + }, + { + "fqbn": "arduino:samd:mkrnb1500", + "firmware": [ + { + "version": "5.6A2.00-to-5.6A2.01", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/5.6A2.00-to-5.6A2.01/5.6A2.00-to-5.6A2.01.pkg", + "checksum": "SHA-256:8f04bd7fa1833cf2d3762e086d79191e76bf66c6e108e852b5fe89ca4f2b72c9", + "size": "529880" + }, + { + "version": "5.6A2_01_to_99", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/5.6A2_01_to_99/5.6A2_01_to_99.pkg", + "checksum": "SHA-256:abb947accdeb980d7aeafed45ac7ce797eb90445eeb8d0bd57ca5b3ad204dbf6", + "size": "1738" + }, + { + "version": "99_to_5.6A2_01", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/SARA/99_to_5.6A2_01/99_to_5.6A2_01.pkg", + "checksum": "SHA-256:81618148c677d8c36df5089c931b46476f4a78fd9d9fd231fee0a9dbb38aa970", + "size": "1724" + } + ], + "loader_sketch": { + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.samd.mkrnb1500/loader.bin", + "checksum": "SHA-256:a627ff76588626eacaaec2a2f5719e3fcf069fda2b32f8ace4f2703f1768f142", + "size": "11312" + }, + "module": "SARA", + "name": "Arduino MKR NB 1500", + "uploader": "arduino:bossac@1.7.0-arduino3", + "upload.use_1200bps_touch": "true", + "upload.wait_for_upload_port": "true", + "uploader.command": "\"{uploader}\" -i -d --port={serial.port.file} -U true -i -e -w -v \"{loader.sketch}.bin\" -R" + }, + { + "fqbn": "arduino:mbed_nano:nanorp2040connect", + "firmware": [ + { + "version": "1.4.5", + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/NINA/1.4.5/NINA_W102-Nano_RP2040_Connect.bin", + "checksum": "SHA-256:5cc391414abd2233001923221a0103dd5ca37222cf885dace065962c962ccd2b", + "size": "1127424" + } + ], + "loader_sketch": { + "url": "https://downloads.arduino.cc/arduino-fwuploader/firmwares/loader/arduino.mbed_nano.nanorp2040connect/loader.elf", + "checksum": "SHA-256:263fe2389f9a4ee3ba5938f2115faad3bbb9c775821a598a66f0f1708e64fc01", + "size": "1649504" + }, + "module": "NINA", + "name": "Arduino Nano RP2040 Connect", + "uploader": "arduino:rp2040tools@1.0.2", + "upload.use_1200bps_touch": "true", + "upload.wait_for_upload_port": "false", + "uploader.command": "\"{uploader}\" -v -D \"{loader.sketch}.elf\"" + } +] \ No newline at end of file diff --git a/arduino/security/testdata/module_firmware_index.json.sig b/arduino/security/testdata/module_firmware_index.json.sig new file mode 100644 index 00000000000..c2bce9ecbdc Binary files /dev/null and b/arduino/security/testdata/module_firmware_index.json.sig differ diff --git a/arduino/security/testdata/module_firmware_index_public.gpg.key b/arduino/security/testdata/module_firmware_index_public.gpg.key new file mode 100644 index 00000000000..22fb62e0c35 Binary files /dev/null and b/arduino/security/testdata/module_firmware_index_public.gpg.key differ