[PATCH 2/5] lib/security: add in openssl support
Brett Grandbois
brett.grandbois at opengear.com
Tue May 15 07:18:16 AEST 2018
On 14/05/18 15:35, Samuel Mendoza-Jonas wrote:
> On Fri, 2018-05-04 at 11:40 +1000, Brett Grandbois wrote:
>> Refactor to export a generic API rather than specific gpg_ prefixes by
>> changing gpg.h to security.h and renaming some of the exports.
>>
>> Break out the common and specific functionality into common.c and
>> none.c/gpg.c/openssl.c for no/gpgme/openssl modes respectively.
>>
>> gpgme should work as before
>>
>> OpenSSL support works like this:
>>
>> The pb-lockdown file is a PKCS12 file or X509 certificate or PEM-encoded
>> raw public key. To follow the current conventions the presence of a
>> PKCS12 file as a lockdown signals decrypt mode because of the presence
>> of the private key, anything else signals signature verification mode.
>> The keyring path is currently ignored but in the future could be used to
>> point to an X509 certificate chain for validity checking. Because of
>> this self-signed certificates are currently supported and really just
>> used as a public key container.
>>
>> Signature verification mode supports:
>>
>> * Cryptographic Message Syntax (CMS) as detached S/MIME, this is really
>> more for consistency for the encryption mode (see below). This mode
>> requires the lockdown file to be an X509 certificate.
>>
>> A sample creation command would be:
>> openssl cms -sign -in (infile) -out (outfile) -binary -nocerts \
>> -inkey (private key) -signer (recipient certificate)
>>
>> * Raw signature digest as output from openssl dgst -sign command. This
>> mode can have the lockdown file be an X509 certificate or a PEM raw
>> public key but the digest algorithm must be pre-defined by the
>> VERIFY_DIGEST configure argument. The default is SHA256.
>>
>> A sample creation command would be:
>> openssl dgst -sign (private key) -out (outfile) -(digest mode) \
>> (infile)
>>
>> Decryption mode supports:
>>
>> * CMS signed-envelope as attached S/MIME. This is for consistency with
>> the current expectation of no external file for decryption. Some
>> future enhancement could be to come up with some proprietary external
>> file format containing the cipher used, the encrypted cipher key, and
>> the IV (if necessary).
>>
>> A sample creation command would be:
>> openssl cms -sign -in (infile) -signer (recipient certificate) \
>> -binary -nocerts -nodetach -inkey (private key) | \
>> openssl cms -encrypt -(cipher mode) -out (outfile) \
>> (recipient certificate)
>>
>> The PKCS12 file is expecting the private key to have password of NULL or
>> "" as there is currently no mechanism to supply a custom one.
>>
>> Signed-off-by: Brett Grandbois <brett.grandbois at opengear.com>
>> ---
>> lib/Makefile.am | 42 +++--
>> lib/security/common.c | 230 ++++++++++++++++++++++++
>> lib/security/gpg.c | 202 +--------------------
>> lib/security/gpg.h | 83 ---------
>> lib/security/none.c | 61 +++++++
>> lib/security/openssl.c | 460 ++++++++++++++++++++++++++++++++++++++++++++++++
>> lib/security/security.h | 46 +++++
>> 7 files changed, 833 insertions(+), 291 deletions(-)
>> create mode 100644 lib/security/common.c
>> delete mode 100644 lib/security/gpg.h
>> create mode 100644 lib/security/none.c
>> create mode 100644 lib/security/openssl.c
>> create mode 100644 lib/security/security.h
> <snip>
>
>> +int verify_file_signature(const char *plaintext_filename,
>> + const char *signature_filename,
>> + FILE *authorized_signatures_handle,
>> + const char *keyring_path __attribute__((unused)))
>> +{
>> + BIO *signature_bio = NULL, *plaintext_bio = NULL, *content_bio = NULL;
>> + STACK_OF(X509) *certs = NULL;
>> + CMS_ContentInfo *cms = NULL;
>> + ssize_t bytes_read = -1;
>> + EVP_PKEY *pkey = NULL;
>> + char *sigbuf = NULL;
>> + char rdbuf[8192];
>> + EVP_MD_CTX ctx;
>> + int nok = -1;
>> + int siglen;
> My machine is running OpenSSL 1.1.0h and it complains here with:
>
> ../lib/security/openssl.c: In function ‘verify_file_signature’:
> ../lib/security/openssl.c:319:13: error: storage size of ‘ctx’ isn’t known
> EVP_MD_CTX ctx;
> ^~~
> ../lib/security/openssl.c:425:2: warning: implicit declaration of function ‘EVP_MD_CTX_cleanup’; did you mean ‘EVP_MD_CTX_create’? [-Wimplicit-function-declaration]
> EVP_MD_CTX_cleanup(&ctx);
> ^~~~~~~~~~~~~~~~~~
> EVP_MD_CTX_create
> ../lib/security/openssl.c:319:13: warning: unused variable ‘ctx’ [-Wunused-variable]
> EVP_MD_CTX ctx;
> ^~~
>
> It looks like in 1.1 they made this struct opaque and now we need to use
> ctx = EVP_MD_CTX_create();
> and friends to set this up.
>
> I'm not convinced older OpenSSL recognises the new format though - we might need
> a wrapper to create the context depending on the library version :/
Hmm, I actually hadn't considered that. Yes this was all based on 1.0.2
not 1.1.0 but I'll take a look and see what I can do with the version
macros.
>
> Otherwise everything else looks pretty good, fits in a lot cleaner than I expected!
>
> Cheers,
> Sam
>
More information about the Petitboot
mailing list