From b506528c1e4ce70dc24da87c0f7cd16ddac60701 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 13 Jun 2017 12:12:11 +0100 Subject: [PATCH] [crypto] Provide asn1_built() to construct a cursor from a builder Our ASN.1 parsing code uses a struct asn1_cursor, while the object construction code uses a struct asn1_builder. These structures are identical apart from the const modifier applied to the data pointer in struct asn1_cursor. Provide asn1_built() to safely typecast a struct asn1_builder to a struct asn1_cursor, allowing constructed objects to be passed to functions expecting a struct asn1_cursor. Signed-off-by: Michael Brown --- src/include/ipxe/asn1.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/include/ipxe/asn1.h b/src/include/ipxe/asn1.h index 5a6c0d9c..847d845b 100644 --- a/src/include/ipxe/asn1.h +++ b/src/include/ipxe/asn1.h @@ -9,7 +9,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); +#include #include +#include #include #include @@ -337,6 +339,28 @@ asn1_type ( const struct asn1_cursor *cursor ) { return ( ( cursor->len >= sizeof ( *type ) ) ? *type : ASN1_END ); } +/** + * Get cursor for built object + * + * @v builder ASN.1 object builder + * @ret cursor ASN.1 object cursor + */ +static inline __attribute__ (( always_inline )) struct asn1_cursor * +asn1_built ( struct asn1_builder *builder ) { + union { + struct asn1_builder builder; + struct asn1_cursor cursor; + } *u = container_of ( builder, typeof ( *u ), builder ); + + /* Sanity check */ + linker_assert ( ( ( const void * ) &u->builder.data ) == + &u->cursor.data, asn1_builder_cursor_data_mismatch ); + linker_assert ( &u->builder.len == &u->cursor.len, + asn1_builder_cursor_len_mismatch ); + + return &u->cursor; +} + extern int asn1_start ( struct asn1_cursor *cursor, unsigned int type, size_t extra ); extern int asn1_enter ( struct asn1_cursor *cursor, unsigned int type );