Commit 23beccc9 authored by danh-arm's avatar danh-arm Committed by GitHub
Browse files

Merge pull request #812 from antonio-nino-diaz-arm/an/clear-static-vars

Clear static variables in X509 parser on error
parents f38d93fd 51c5e1a2
/* /*
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
* extensions field, such as an image hash or a public key. * extensions field, such as an image hash or a public key.
*/ */
#include <arch_helpers.h>
#include <assert.h> #include <assert.h>
#include <img_parser_mod.h> #include <img_parser_mod.h>
#include <mbedtls_common.h> #include <mbedtls_common.h>
...@@ -63,6 +64,26 @@ static mbedtls_asn1_buf pk; ...@@ -63,6 +64,26 @@ static mbedtls_asn1_buf pk;
static mbedtls_asn1_buf sig_alg; static mbedtls_asn1_buf sig_alg;
static mbedtls_asn1_buf signature; static mbedtls_asn1_buf signature;
/*
* Clear all static temporary variables.
*/
static void clear_temp_vars(void)
{
#define ZERO_AND_CLEAN(x) \
do { \
memset(&x, 0, sizeof(x)); \
clean_dcache_range((uintptr_t)&x, sizeof(x)); \
} while (0);
ZERO_AND_CLEAN(tbs)
ZERO_AND_CLEAN(v3_ext);
ZERO_AND_CLEAN(pk);
ZERO_AND_CLEAN(sig_alg);
ZERO_AND_CLEAN(signature);
#undef ZERO_AND_CLEAN
}
/* /*
* Get X509v3 extension * Get X509v3 extension
* *
...@@ -134,7 +155,12 @@ static int get_ext(const char *oid, void **ext, unsigned int *ext_len) ...@@ -134,7 +155,12 @@ static int get_ext(const char *oid, void **ext, unsigned int *ext_len)
/* /*
* Check the integrity of the certificate ASN.1 structure. * Check the integrity of the certificate ASN.1 structure.
*
* Extract the relevant data that will be used later during authentication. * Extract the relevant data that will be used later during authentication.
*
* This function doesn't clear the static variables located on the top of this
* file in case of an error. It is only called from check_integrity(), which
* performs the cleanup if necessary.
*/ */
static int cert_parse(void *img, unsigned int img_len) static int cert_parse(void *img, unsigned int img_len)
{ {
...@@ -398,9 +424,18 @@ static void init(void) ...@@ -398,9 +424,18 @@ static void init(void)
mbedtls_init(); mbedtls_init();
} }
/*
* Wrapper for cert_parse() that clears the static variables used by it in case
* of an error.
*/
static int check_integrity(void *img, unsigned int img_len) static int check_integrity(void *img, unsigned int img_len)
{ {
return cert_parse(img, img_len); int rc = cert_parse(img, img_len);
if (rc != IMG_PARSER_OK)
clear_temp_vars();
return rc;
} }
/* /*
......
/* /*
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <arch.h> /* for additional register definitions */ #include <arch.h> /* for additional register definitions */
#include <stdint.h> #include <stdint.h>
#include <types.h> #include <sys/types.h>
/********************************************************************** /**********************************************************************
* Macros which create inline functions to read or write CPU system * Macros which create inline functions to read or write CPU system
...@@ -187,6 +187,9 @@ void flush_dcache_range(uintptr_t addr, size_t size); ...@@ -187,6 +187,9 @@ void flush_dcache_range(uintptr_t addr, size_t size);
void clean_dcache_range(uintptr_t addr, size_t size); void clean_dcache_range(uintptr_t addr, size_t size);
void inv_dcache_range(uintptr_t addr, size_t size); void inv_dcache_range(uintptr_t addr, size_t size);
void dcsw_op_louis(u_register_t op_type);
void dcsw_op_all(u_register_t op_type);
void disable_mmu_secure(void); void disable_mmu_secure(void);
void disable_mmu_icache_secure(void); void disable_mmu_icache_secure(void);
......
/* /*
* Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <arch.h> /* for additional register definitions */ #include <arch.h> /* for additional register definitions */
#include <cdefs.h> /* For __dead2 */ #include <cdefs.h> /* For __dead2 */
#include <stdint.h> #include <stdint.h>
#include <sys/types.h>
/********************************************************************** /**********************************************************************
* Macros which create inline functions to read or write CPU system * Macros which create inline functions to read or write CPU system
...@@ -143,11 +144,12 @@ DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1w) ...@@ -143,11 +144,12 @@ DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1w)
DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0r) DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0r)
DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0w) DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0w)
void flush_dcache_range(uint64_t, uint64_t); void flush_dcache_range(uintptr_t addr, size_t size);
void clean_dcache_range(uint64_t, uint64_t); void clean_dcache_range(uintptr_t addr, size_t size);
void inv_dcache_range(uint64_t, uint64_t); void inv_dcache_range(uintptr_t addr, size_t size);
void dcsw_op_louis(uint32_t);
void dcsw_op_all(uint32_t); void dcsw_op_louis(u_register_t op_type);
void dcsw_op_all(u_register_t op_type);
void disable_mmu_el3(void); void disable_mmu_el3(void);
void disable_mmu_icache_el3(void); void disable_mmu_icache_el3(void);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment