3

У нас следующая ситуация: мы хотим взять данные из файлового потока (/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, поэтому в идеале он не должен приводить к значительным накладным расходам по сравнению с обычным шифрованием, и по соображениям соответствия мы не можем сначала передать все в файл и зашифровать его впоследствии, нам нужно зашифровать его непосредственно после его получения. из последовательного интерфейса.

1 ответ1

2

Если вы установите timeout в середине конвейера, то gpg выйдет чисто:

cat /dev/ttyACM0 | timeout ${TIMEOUT} cat | gpg -e -r ${RECIPIENT} > ${OUT_FILE}

Я не могу полностью объяснить это, но я полагаю, что это связано с тем, как ошибки / сигналы конвейера обрабатываются / распространяются.

Примечание: я задал этот вопрос, чтобы попытаться понять это лучше.


Обратите внимание, что даже при использовании следующего произойдет сбой:

$ timeout 5 cat < /dev/urandom | gpg -e -r ${RECIPIENT} > myfile.gpg

gpg: Terminated caught ... exiting
Terminated

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .