lkml.org 
[lkml]   [2012]   [Sep]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [GIT PULL] Asymmetric keys and module signing
    From
    Hello David,

    As I can see API has changed towards our discussion on KS.
    Now digest can be supplied to the verify_signature in a
    public_key_signature argument.
    It looks that in such away we can use this API for IMA/EVM as well.

    Just one question about key description...
    request_asymmetric_key uses format for key description: "<signer>: <key-id>".
    Preparsing code creates description from those values.
    I see that key id is not 8 bytes anymore but full hash size of 20 bytes.

    For practical reasons for IMA it might be nice to save some space in
    xattrs and use shorter key id/description.
    As I understand from implementation, if key name is provided with
    "keyctl add", it will not be replaced with
    preparsed value.

    Right?
    And we can actually use any keyid we want?

    - Dmitry


    On Tue, Sep 25, 2012 at 3:07 AM, David Howells <dhowells@redhat.com> wrote:
    >
    > Hi Herbert, Rusty,
    >
    > Here are my latest module signing patches on top of the asymmetric key crypto
    > patches, which I hope Herbert will consider taking, at least from the
    > crypto-keys-post-KS branch:
    >
    > http://git.kernel.org/?p=linux/kernel/git/dhowells/linux-modsign.git;a=shortlog;h=refs/heads/crypto-keys-post-KS
    >
    > The module signing patches go on top of those, and the set can be found here:
    >
    > http://git.kernel.org/?p=linux/kernel/git/dhowells/linux-modsign.git;a=shortlog;h=refs/heads/modsign-post-KS
    >
    > Do you want the patches posting to the lists? I've tried posting the series
    > as one, but there seems to be a problem posting the merge commit in the middle
    > because it has two parents:-/
    >
    > Anyway...
    >
    >
    > The module signing patches provide:
    >
    > - Some fixes to Rusty's patch. Also an additional patch to extend the policy
    > handling for modules signed with an unknown key and to handle FIPS mode.
    >
    > - Module signature generation and checking. The signature format is:
    >
    > <signer-id-string>
    > <binary-key-id>
    > <binary-signature>
    > <sig-information-block>
    >
    > The fixed-length sig-information-block indicates the crypto algorithm (RSA
    > only for the moment), the hash type (SHA512 for example) and the identifier
    > scope (X.509 in this case), plus the lengths of the other three parts.
    >
    > The binary-key-id could be rendered as hex and pasted onto the end of the
    > signer-id-string so that the kernel doesn't have to do the conversion.
    >
    > A script is provided in one of the patches to generate the signer name and
    > key ID parts from the X.509 cert for later inclusion in module signatures
    > during the build.
    >
    > - A transient X.509 cert will be automatically generated if one is not given
    > and will be used to automatically sign the modules after they've been
    > thoroughly stripped.
    >
    > Note that this may prove not to be the best way for distributions to do
    > things. We're currently looking at the best way being to do the stripping
    > and signing manually from the RPM spec file after the make modules_install
    > step and after the debuginfo has been extracted, so automatic signing may
    > need to go away, or at least become optional.
    >
    > To make this easier, a script is provided to sign a module and this can be
    > called either from the Makefile or the spec file.
    >
    > - An 'extra_certificates' file can be placed in the root of the kernel build
    > containing a number of supplementary X.509 certs just cat'd together. These
    > will get added to the internal keyring and can then be used to check module
    > signatures also.
    >
    >
    > I have also fixed a number of things in the crypto patches:
    >
    > - GeneralizedTime and GeneralString were transposed in the ASN.1 compiler
    > directive table and enum token_type ('S' comes before 'i' to strcmp()),
    > resulting in it not being possible to use either.
    >
    > - I had made it a requirement that the X.509 certificate subjectKeyIdentifier
    > and authorityKeyIdentifier extensions exist so that we can validate the
    > X.509 signature if possible, but I hadn't put in any checks that they'd been
    > found before using the values extracted, leading to a crash.
    >
    > - I fixed header length computation in ASN.1 decoder resulting making it
    > possible to discard one of the x509.asn1 callback actions (we can locate the
    > start of the TBS container directly now by subtraction).
    >
    > - I got rid of the fingerprint bit at the end of the public_key struct as it's
    > superfluous (the asymmetric key type stores the fingerprint attached to
    > key->type_data.p[1]).
    >
    > - I made the X.509 parser render the key description in a more compact manner:
    >
    > The description is split into two parts: "<signer>: <key-id>".
    >
    > The <key-id> is a hex rendering of the key identifier - in the case of X.509
    > that would be the contents of the subjectKeyIdentifier extension field with
    > the ASN.1 OctetString wrapper removed.
    >
    > The <signer> is (in order) one of:
    >
    > - The O and CN attributes as "<O-attr>: <CN-attr>" if the CN attribute
    > isn't prefixed with the O attribute, and, if longer, doesn't share
    > the same first seven chars (say a company name such as Red Hat Inc.).
    > I admit this is entirely arbitrary and biased towards companies with
    > 7 chars or more in there name, but it does remove duplication of the
    > organisation's name if it's in both the O and the CN. Can anyone
    > suggest a better heuristic?
    >
    > - The CN attribute.
    >
    > - The O attribute.
    >
    > - The email address.
    >
    > - Omitted (with ": " omitted too).
    >
    > As an example:
    >
    > Magrathea: Glacier signing key: 5dd0839552bd6af498253f8af1e65da3472941c6
    >
    > which is "<O-attr>: <CN-attr>: <key-id>" in form, or:
    >
    > Red Hat Test Certificate: 3580cf35d76b3b667a40df66691cbcf87353b23c
    >
    > which is just "<CN-attr>: <key-id>" in form.
    >
    > - I no longer extract the bits of the X.509 certificate I don't currently use
    > (such as the version number).
    >
    > Note, this implementation of the X.509 certificate parser uses a couple of
    > patterns to drive a reusable ASN.1 decoder. I do, however, have a direct
    > in-line decoder implementation also that can only decode X.509 certs. The
    > stack space usage is greater, but the code size is simpler and slightly smaller
    > and the code is less capable (it can't handle indefinite-length elements for
    > example), and it can't be reused for anything else (such as CIFS, netfilter,
    > PKCS#7, Kerberos tickets), whereas the pattern-based decoder can. I'll post
    > this separately to see what people think.
    >
    > As far as testing goes, I have posted a number of testing scripts that I have
    > used to punish the crypto keys side of things. The "keyctl padd" command makes
    > this straightforward.
    >
    > Hopefully, later this week the patches will appear in the Fedora 18 kernel.
    >
    > David
    > ---
    > The following changes since commit eeea3ac912207dcf759b95b2b4c36f96bce583bf:
    >
    > Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc (2012-09-06 10:23:58 -0700)
    >
    > are available in the git repository at:
    >
    >
    > git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-modsign.git modsign-post-KS
    >
    > for you to fetch changes up to 8d4f62638e9aae069d1145dfeb7300c58077be49:
    >
    > MODSIGN: Extend the policy on signature check failure (2012-09-24 20:51:59 +0100)
    >
    > ----------------------------------------------------------------
    > (from the branch description for modsign-post-KS local branch)
    >
    > post Kernel-Summit module signing
    > ----------------------------------------------------------------
    > David Howells (26):
    > KEYS: Add payload preparsing opportunity prior to key instantiate or update
    > MPILIB: Provide count_leading/trailing_zeros() based on arch functions
    > KEYS: Document asymmetric key type
    > KEYS: Implement asymmetric key type
    > KEYS: Asymmetric key pluggable data parsers
    > KEYS: Asymmetric public-key algorithm crypto key subtype
    > KEYS: Provide signature verification with an asymmetric key
    > MPILIB: Reinstate mpi_cmp[_ui]() and export for RSA signature verification
    > RSA: Implement signature verification algorithm [PKCS#1 / RFC3447]
    > RSA: Fix signature verification for shorter signatures
    > X.509: Implement simple static OID registry
    > X.509: Add utility functions to render OIDs as strings
    > X.509: Add simple ASN.1 grammar compiler
    > X.509: Add an ASN.1 decoder
    > MPILIB: Provide a function to read raw data into an MPI
    > X.509: Add a crypto key parser for binary (DER) X.509 certificates
    > Merge Rusty's module signature checking hook into modsign-post-KS
    > MOD: Fix Rusty's module_sig_check()
    > MODSIGN: Provide gitignore and make clean rules for extra files
    > MODSIGN: Provide Kconfig options
    > MODSIGN: Automatically generate module signing keys if missing
    > MODSIGN: Provide module signing public keys to the kernel
    > MODSIGN: Implement module signature checking
    > MODSIGN: Provide a script for generating a key ID from an X.509 cert
    > MODSIGN: Sign modules during the build process
    > MODSIGN: Extend the policy on signature check failure
    >
    > Rusty Russell (1):
    > module: signature checking hook
    >
    > .gitignore | 13 +
    > Documentation/crypto/asymmetric-keys.txt | 312 ++++++
    > Documentation/kernel-parameters.txt | 6 +
    > Documentation/security/keys.txt | 50 +-
    > Makefile | 1 +
    > crypto/Kconfig | 1 +
    > crypto/Makefile | 1 +
    > crypto/asymmetric_keys/.gitignore | 1 +
    > crypto/asymmetric_keys/Kconfig | 38 +
    > crypto/asymmetric_keys/Makefile | 27 +
    > crypto/asymmetric_keys/asymmetric_keys.h | 15 +
    > crypto/asymmetric_keys/asymmetric_type.c | 274 +++++
    > crypto/asymmetric_keys/public_key.c | 108 ++
    > crypto/asymmetric_keys/public_key.h | 30 +
    > crypto/asymmetric_keys/rsa.c | 277 ++++++
    > crypto/asymmetric_keys/signature.c | 49 +
    > crypto/asymmetric_keys/x509.asn1 | 60 ++
    > crypto/asymmetric_keys/x509_cert_parser.c | 497 ++++++++++
    > crypto/asymmetric_keys/x509_parser.h | 36 +
    > crypto/asymmetric_keys/x509_public_key.c | 207 ++++
    > crypto/asymmetric_keys/x509_rsakey.asn1 | 4 +
    > fs/cifs/cifs_spnego.c | 6 +-
    > fs/cifs/cifsacl.c | 8 +-
    > include/asm-generic/bitops/count_zeros.h | 57 ++
    > include/crypto/public_key.h | 108 ++
    > include/keys/asymmetric-parser.h | 37 +
    > include/keys/asymmetric-subtype.h | 55 +
    > include/keys/asymmetric-type.h | 25 +
    > include/keys/user-type.h | 6 +-
    > include/linux/asn1.h | 67 ++
    > include/linux/asn1_ber_bytecode.h | 87 ++
    > include/linux/asn1_decoder.h | 24 +
    > include/linux/key-type.h | 35 +-
    > include/linux/module.h | 8 +
    > include/linux/mpi.h | 1 +
    > include/linux/oid_registry.h | 92 ++
    > init/Kconfig | 68 ++
    > kernel/Makefile | 57 ++
    > kernel/modsign_pubkey.c | 112 +++
    > kernel/module-internal.h | 16 +
    > kernel/module.c | 100 +-
    > kernel/module_signing.c | 247 +++++
    > lib/.gitignore | 2 +-
    > lib/Kconfig | 5 +
    > lib/Makefile | 18 +
    > lib/asn1_decoder.c | 477 +++++++++
    > lib/build_OID_registry | 209 ++++
    > lib/mpi/Makefile | 1 +
    > lib/mpi/longlong.h | 138 +--
    > lib/mpi/mpi-bit.c | 2 +-
    > lib/mpi/mpi-cmp.c | 70 ++
    > lib/mpi/mpi-pow.c | 4 +-
    > lib/mpi/mpicoder.c | 55 +
    > lib/oid_registry.c | 170 ++++
    > net/ceph/crypto.c | 9 +-
    > net/dns_resolver/dns_key.c | 6 +-
    > net/rxrpc/ar-key.c | 40 +-
    > scripts/.gitignore | 1 +
    > scripts/Makefile | 2 +
    > scripts/Makefile.build | 11 +
    > scripts/Makefile.modpost | 75 +-
    > scripts/asn1_compiler.c | 1545 +++++++++++++++++++++++++++++
    > scripts/sign-file | 115 +++
    > scripts/x509keyid | 268 +++++
    > security/keys/encrypted-keys/encrypted.c | 16 +-
    > security/keys/key.c | 114 ++-
    > security/keys/keyctl.c | 18 +-
    > security/keys/keyring.c | 6 +-
    > security/keys/request_key_auth.c | 8 +-
    > security/keys/trusted.c | 16 +-
    > security/keys/user_defined.c | 14 +-
    > 71 files changed, 6394 insertions(+), 244 deletions(-)
    > create mode 100644 Documentation/crypto/asymmetric-keys.txt
    > create mode 100644 crypto/asymmetric_keys/.gitignore
    > create mode 100644 crypto/asymmetric_keys/Kconfig
    > create mode 100644 crypto/asymmetric_keys/Makefile
    > create mode 100644 crypto/asymmetric_keys/asymmetric_keys.h
    > create mode 100644 crypto/asymmetric_keys/asymmetric_type.c
    > create mode 100644 crypto/asymmetric_keys/public_key.c
    > create mode 100644 crypto/asymmetric_keys/public_key.h
    > create mode 100644 crypto/asymmetric_keys/rsa.c
    > create mode 100644 crypto/asymmetric_keys/signature.c
    > create mode 100644 crypto/asymmetric_keys/x509.asn1
    > create mode 100644 crypto/asymmetric_keys/x509_cert_parser.c
    > create mode 100644 crypto/asymmetric_keys/x509_parser.h
    > create mode 100644 crypto/asymmetric_keys/x509_public_key.c
    > create mode 100644 crypto/asymmetric_keys/x509_rsakey.asn1
    > create mode 100644 include/asm-generic/bitops/count_zeros.h
    > create mode 100644 include/crypto/public_key.h
    > create mode 100644 include/keys/asymmetric-parser.h
    > create mode 100644 include/keys/asymmetric-subtype.h
    > create mode 100644 include/keys/asymmetric-type.h
    > create mode 100644 include/linux/asn1.h
    > create mode 100644 include/linux/asn1_ber_bytecode.h
    > create mode 100644 include/linux/asn1_decoder.h
    > create mode 100644 include/linux/oid_registry.h
    > create mode 100644 kernel/modsign_pubkey.c
    > create mode 100644 kernel/module-internal.h
    > create mode 100644 kernel/module_signing.c
    > create mode 100644 lib/asn1_decoder.c
    > create mode 100755 lib/build_OID_registry
    > create mode 100644 lib/mpi/mpi-cmp.c
    > create mode 100644 lib/oid_registry.c
    > create mode 100644 scripts/asn1_compiler.c
    > create mode 100644 scripts/sign-file
    > create mode 100755 scripts/x509keyid
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at http://vger.kernel.org/majordomo-info.html


    \
     
     \ /
      Last update: 2012-09-25 18:21    [W:0.092 / U:2.152 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site