Reduce GPGME memory usage
Justus Winter
justus at g10code.com
Wed Aug 3 14:54:30 CEST 2016
Hello :)
Marcel Behlau <marcel.behlau at elfin.de> writes:
> The old version worked fine, now i have to port the stuff to a new
> system with fewer RAM and bigger update files. This generates some
> problems , if the maximum RAM is used, caused by to big update files. In
> my workflow, i'm compare the signer keys of the updatefiles and the
> expected keys, but the "gpgme_get_key" functions fails with a "Invalid
> crypto engine" error. Is the error message correct at this position? The
> gpgme_op_decrypt_verify, gpgme_op_decrypt_result and
> gpgme_op_verify_result work before properly.
Did gpgme_get_key work before for you? Looking at the source of
gpgme_get_key I see that it clones the context, so maybe you are setting
up the context in a special way that makes it fail? Does the
gpgme_op_keylist_start interface work for you?
If you are able to construct a minimal test case, feel free to open a
bug report.
> The size of the update files will be reduced before the release, so i'm
> hoping, the system will finaly work. But this is very critical, if
> someday, the applications, which are running on the system, using to
> much RAM. So 'm now trying to reduce the memory usage for the complete
> update process.
>
> My gpgme encrypted updatefile contains a single tar file, the tar file
> contains all necessary files for the update. I'm using libtar to extract
> the files to the installation path, libtar is working directly on the
> gpgme memory buffer. The complete update is stored during the process in
> the memory. This leads to the problems with to few RAM. Is there a way,
> to reduce the size of the gpgme memory buffer, maybe by reloading (and
> redecrypting ) data chunks from the orignal crypted update file? The
> original update file is loaded via stream. I found the " Callback Based
> Data Buffers" in the documation. It is possible, to use this buffers, to
> realize the reloading behavior?
I just tried, and the callbacks can indeed be used to implement a
streaming interface, e.g.:
~~~ snip ~~~
import sys
import pyme
def do_write(data):
sys.stdout.write(chr(data[0]))
return 1
data = pyme.Data(cbs=(None, do_write, None, lambda: None, None))
with pyme.Context() as c:
c.decrypt(sys.stdin, sink=data)
~~~ snap ~~~
Likewise you can feed the source in smaller chunks to the engine.
If that is not enough, you might want to look at TinyGPG, a library
implementing a subset of the OpenPGP protocol, that is written with
embedded systems in mind:
https://git.gnupg.org/cgi-bin/gitweb.cgi?p=tgpg.git;a=summary
Cheers,
Justus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 472 bytes
Desc: not available
URL: </pipermail/attachments/20160803/6d05d9e6/attachment.sig>
More information about the Gnupg-users
mailing list