Path: blob/master/crypto/asymmetric_keys/mscode_parser.c
26278 views
// SPDX-License-Identifier: GPL-2.0-or-later1/* Parse a Microsoft Individual Code Signing blob2*3* Copyright (C) 2014 Red Hat, Inc. All Rights Reserved.4* Written by David Howells ([email protected])5*/67#define pr_fmt(fmt) "MSCODE: "fmt8#include <linux/kernel.h>9#include <linux/slab.h>10#include <linux/err.h>11#include <linux/oid_registry.h>12#include <crypto/pkcs7.h>13#include "verify_pefile.h"14#include "mscode.asn1.h"1516/*17* Parse a Microsoft Individual Code Signing blob18*/19int mscode_parse(void *_ctx, const void *content_data, size_t data_len,20size_t asn1hdrlen)21{22struct pefile_context *ctx = _ctx;2324content_data -= asn1hdrlen;25data_len += asn1hdrlen;26pr_devel("Data: %zu [%*ph]\n", data_len, (unsigned)(data_len),27content_data);2829return asn1_ber_decoder(&mscode_decoder, ctx, content_data, data_len);30}3132/*33* Check the content type OID34*/35int mscode_note_content_type(void *context, size_t hdrlen,36unsigned char tag,37const void *value, size_t vlen)38{39enum OID oid;4041oid = look_up_OID(value, vlen);42if (oid == OID__NR) {43char buffer[50];4445sprint_oid(value, vlen, buffer, sizeof(buffer));46pr_err("Unknown OID: %s\n", buffer);47return -EBADMSG;48}4950/*51* pesign utility had a bug where it was putting52* OID_msIndividualSPKeyPurpose instead of OID_msPeImageDataObjId53* So allow both OIDs.54*/55if (oid != OID_msPeImageDataObjId &&56oid != OID_msIndividualSPKeyPurpose) {57pr_err("Unexpected content type OID %u\n", oid);58return -EBADMSG;59}6061return 0;62}6364/*65* Note the digest algorithm OID66*/67int mscode_note_digest_algo(void *context, size_t hdrlen,68unsigned char tag,69const void *value, size_t vlen)70{71struct pefile_context *ctx = context;72char buffer[50];73enum OID oid;7475oid = look_up_OID(value, vlen);76switch (oid) {77case OID_sha1:78ctx->digest_algo = "sha1";79break;80case OID_sha256:81ctx->digest_algo = "sha256";82break;83case OID_sha384:84ctx->digest_algo = "sha384";85break;86case OID_sha512:87ctx->digest_algo = "sha512";88break;89case OID_sha3_256:90ctx->digest_algo = "sha3-256";91break;92case OID_sha3_384:93ctx->digest_algo = "sha3-384";94break;95case OID_sha3_512:96ctx->digest_algo = "sha3-512";97break;9899case OID__NR:100sprint_oid(value, vlen, buffer, sizeof(buffer));101pr_err("Unknown OID: %s\n", buffer);102return -EBADMSG;103104default:105pr_err("Unsupported content type: %u\n", oid);106return -ENOPKG;107}108109return 0;110}111112/*113* Note the digest we're guaranteeing with this certificate114*/115int mscode_note_digest(void *context, size_t hdrlen,116unsigned char tag,117const void *value, size_t vlen)118{119struct pefile_context *ctx = context;120121ctx->digest = kmemdup(value, vlen, GFP_KERNEL);122if (!ctx->digest)123return -ENOMEM;124125ctx->digest_len = vlen;126127return 0;128}129130131