У нас следующая ситуация: мы хотим взять данные из файлового потока (/dev/ttyACM0
, то есть последовательный интерфейс) и зашифровать их с помощью gpg. На данный момент мы используем
cat /dev/ttyACM0 | gpg -e -r [keyid] --trust-model always > output_file
Наша проблема в том, что ttyACM0 будет доставлять данные в течение определенного времени, а затем останавливаться, но сам ttyACM0 останется на месте, поэтому чтение продолжается, а gpg не завершается. Если мы запустим все это с таймаутом (timeout [time] cat /dev/ttyACM0 | gpg ... &
) и позволим тайм-ауту уничтожить процесс, некоторые данные будут потеряны, и при расшифровке мы получим сообщение об ошибке:
gpg: block_filter 0x00005589367a73c0: read error (size=16358,a->size=16358)
gpg: block_filter 0x00005589367aab80: read error (size=13254,a->size=13254)
gpg: WARNING: encrypted message has been manipulated!
gpg: block_filter: pending bytes!
gpg: block_filter: pending bytes!
Расшифровка работает, но в конце отсутствуют некоторые данные. Вероятно, это связано с тем, что GPG заканчивается непустым буфером.
Как мы можем заставить это работать без потери некоторых данных из-за буфера gpg? Я не знаю ни одного SIGXXX, который заставляет gpg завершать операции, записывать результаты и затем завершаться. Процесс должен работать на Raspberry Pi Zero, поэтому в идеале он не должен приводить к значительным накладным расходам по сравнению с обычным шифрованием, и по соображениям соответствия мы не можем сначала передать все в файл и зашифровать его впоследствии, нам нужно зашифровать его непосредственно после его получения. из последовательного интерфейса.