[PATCH 2/3] lib/security: New lib for security functions.
Samuel Mendoza-Jonas
sam at mendozajonas.com
Fri Jun 3 15:52:41 AEST 2016
On Thu, Jun 02, 2016 at 05:56:57AM -0400, Nayna Jain wrote:
> Adds new lib to support security specific functions.
> Functions are separated into different files based on
> functionality they provide. Details as below:
>
> lib/security/crypto: Set of files to support crypto functions
> like hash, encryption etc. Currently, it provides support
> only for hash function and can be extended as needed. Hash
> function is implemented using kernel crypto API.
>
> lib/security/tpmOperations: Set of files to support tpm
> specific operations. Currently, it provides function to extend TPM.
> The implmentation of this function is currently experimental and
> is bound to change.
>
> Signed-off-by: Nayna Jain <nayna at linux.vnet.ibm.com>
Format sounds good - although please don't use camelcase in filenames
(eg. tpm_operations instead of tmpOperations)
> ---
> lib/Makefile.am | 6 +++-
> lib/security/crypto.c | 73 ++++++++++++++++++++++++++++++++++++++++++++
> lib/security/crypto.h | 22 +++++++++++++
> lib/security/tpmOperations.c | 72 +++++++++++++++++++++++++++++++++++++++++++
> lib/security/tpmOperations.h | 18 +++++++++++
> 5 files changed, 190 insertions(+), 1 deletion(-)
> create mode 100644 lib/security/crypto.c
> create mode 100644 lib/security/crypto.h
> create mode 100644 lib/security/tpmOperations.c
> create mode 100644 lib/security/tpmOperations.h
>
> diff --git a/lib/Makefile.am b/lib/Makefile.am
> index 09bc1aa..d5559f0 100644
> --- a/lib/Makefile.am
> +++ b/lib/Makefile.am
> @@ -50,7 +50,11 @@ lib_libpbcore_la_SOURCES = \
> lib/util/util.c \
> lib/util/util.h \
> lib/flash/config.h \
> - lib/flash/flash.h
> + lib/flash/flash.h \
> + lib/security/tpmOperations.c \
> + lib/security/tpmOperations.h \
> + lib/security/crypto.c \
> + lib/security/crypto.h
>
> if ENABLE_MTD
> lib_libpbcore_la_SOURCES += \
> diff --git a/lib/security/crypto.c b/lib/security/crypto.c
> new file mode 100644
> index 0000000..e5344a8
> --- /dev/null
> +++ b/lib/security/crypto.c
> @@ -0,0 +1,73 @@
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +#include <sys/socket.h>
> +#include <linux/if_alg.h>
> +#include <linux/socket.h>
> +
> +#include <log/log.h>
> +
> +#include "crypto.h"
> +
> +#define DIGEST_SIZE(digestname) !strcmp(digestname, "sha1")? \
> + SHA1_DIGEST_SIZE : !strcmp(digestname, "sha256")? \
> + SHA256_DIGEST_SIZE : !strcmp(digestname, "sha512")? \
> + SHA512_DIGEST_SIZE : 0
Please use strncmp() instead of strcmp(). Also this would probably be
better off as a small (inline?) function instead of a macro.
> +
> +
> +int calc_digest(const char *digestname, const unsigned char *ibuf,
> + uint8_t *obuf)
> +{
> + struct sockaddr_alg sa = {
> + .salg_family = AF_ALG,
> + .salg_type = "hash",
> + };
> +
> + int fd = -1;
> + int sockfd = -1;
> + int rc = 0;
> + unsigned char digest[DIGEST_SIZE(digestname)];
> + char *input = NULL;
> + input = ibuf ;
I've noticed this in a few places, please be consistent with
indentation.
> + memset(sa.salg_name, 0, sizeof(sa.salg_name));
> + memcpy(sa.salg_name, digestname, sizeof(sa.salg_name));
> +
> + sockfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
> + if (sockfd == -1)
> + {
> + rc = -1;
> + goto out;
> + }
> +
> + rc = bind(sockfd, (struct sockaddr *)&sa, sizeof(sa));
> + if (rc == -1)
> + goto out;
> +
> + fd = accept(sockfd, NULL, 0);
> + if (fd == -1)
> + {
> + rc = -1;
> + goto out;
> + }
> +
> + rc = write(fd, input, sizeof(input));
> + if (rc == -1)
> + goto out;
> +
> + read(fd, digest, sizeof(digest));
> +
> + memset(obuf, 0, sizeof(digest));
> + memcpy(obuf, digest, sizeof(digest));
> +
> +
> +out:
> + if (fd > 0)
> + close(fd);
> + if (sockfd > 0)
> + close(sockfd);
> +
> + return 0;
> +
> +}
> diff --git a/lib/security/crypto.h b/lib/security/crypto.h
> new file mode 100644
> index 0000000..111c1ea
> --- /dev/null
> +++ b/lib/security/crypto.h
> @@ -0,0 +1,22 @@
> +#ifndef CRYPTO_H
> +#define CRYPTO_H
> +
> +#include <stdint.h>
> +
> +#define SHA1_DIGEST_SIZE 20
> +#define SHA256_DIGEST_SIZE 32
> +#define SHA512_DIGEST_SIZE 64
> +
> +/**
> + * Calculates and returns the digest of the input buffer.
> + * @digestname: Type of digest to be calculated.
> + * @ibuf: Input buffer whose digest is to be calculated.
> + * @obuf: Output buffer in which calculated digest is returned.
> + *
> + * On success, 0 is returned. On error, -1 is returned.
> + **/
> +int calc_digest(const char *digestname, const unsigned char *ibuf,
> + uint8_t *obuf);
> +
> +#endif /* CRYPTO_H */
> +
> diff --git a/lib/security/tpmOperations.c b/lib/security/tpmOperations.c
> new file mode 100644
> index 0000000..bfb2c21
> --- /dev/null
> +++ b/lib/security/tpmOperations.c
> @@ -0,0 +1,72 @@
> +#include <stdio.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <sys/socket.h>
> +#include <linux/if_alg.h>
> +#include <linux/socket.h>
> +
> +#include <log/log.h>
> +
> +#include "crypto.h"
> +#include "tpmOperations.h"
> +
> +/**
> +Note: The implementation of this function is experimental.
> +It only servers the purpose of showing tpm_extend API and its interface.
> +Final implementation will be changed.
> +**/
Right - I'd like to see a lot more detail about what is expected to
happen here so I can fully understand the purpose.
> +
> +int tpm_extend(unsigned int pcr, const char* pcr_bank_hash_alg, uint8_t * buf,
> + uint8_t buflen)
> +{
> +
> + struct sockaddr_alg sa = {
> + .salg_family = AF_ALG,
> + .salg_type = "tpm-extend",
> + };
> + int i=0;
> + int sockfd = -1;
> + int fd = -1;
> + int rc = 0;
> + char res[256]; //This is temporary size and will be defined correctly once
> + //response status code is finalized for extend operation.
> + memset(sa.salg_name, 0, sizeof(sa.salg_name));
> + memcpy(sa.salg_name, pcr_bank_hash_alg, sizeof(pcr_bank_hash_alg));
> +
> + sockfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
> + if (sockfd == -1)
> + {
> + rc = -1;
> + goto out;
> + }
> +
> + rc = bind(sockfd, (struct sockaddr *)&sa, sizeof(sa));
> + if (rc == -1)
> + goto out;
> +
> + fd = accept(sockfd, NULL, 0);
> + if (fd == -1)
> + {
> + rc = -1;
> + goto out;
> + }
> +
> + rc = write(fd, buf, buflen);
> + if (rc == -1)
> + {
> + rc = -1;
> + goto out;
> + }
> +
> + //response will contain status code for extend operation.
> + //handling of error status code is yet to be finalized.
> + read(fd, res, sizeof(res));
> +
> +out:
> + if (fd > 0)
> + close(fd);
> + if (sockfd > 0)
> + close(sockfd);
> + return rc;
> +}
> diff --git a/lib/security/tpmOperations.h b/lib/security/tpmOperations.h
> new file mode 100644
> index 0000000..2231152
> --- /dev/null
> +++ b/lib/security/tpmOperations.h
> @@ -0,0 +1,18 @@
> +#ifndef _TPM_OPERATIONS_H
> +#define _TPM_OPERATIONS_H
> +
> +/**
> + * Prepares the request and send to TPM for extend.
> + * @pcr : PCR Index to which to be extended.
> + * @pcr_bank : PCR Bank to which to be extended.
> + * @buf : Input data to be extended.
> + * @buflen : Length of the input data.
> + *
> + * On success, 0 is returned. On error, -1 is returned.
> +**/
> +
> +int tpm_extend(unsigned int pcr, const char* pcr_bank, uint8_t * buf,
> + uint8_t buflen);
> +
> +#endif /* _TPM_OPERATIONS_H */
> +
> --
> 2.5.0
>
> _______________________________________________
> Petitboot mailing list
> Petitboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/petitboot
More information about the Petitboot
mailing list