]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[crypto] Provide asn1_built() to construct a cursor from a builder
authorMichael Brown <mcb30@ipxe.org>
Tue, 13 Jun 2017 11:12:11 +0000 (12:12 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 20 Jun 2017 08:49:00 +0000 (09:49 +0100)
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 <mcb30@ipxe.org>
src/include/ipxe/asn1.h

index 5a6c0d9c3bcb7958e4a29081fadde57df7087458..847d845bb80529dfdb53495cc2d0aec8f942519c 100644 (file)
@@ -9,7 +9,9 @@
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
+#include <stddef.h>
 #include <stdint.h>
+#include <assert.h>
 #include <time.h>
 #include <ipxe/tables.h>
 
@@ -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 );