]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[image] Add image_asn1() to extract ASN.1 objects from image
authorMichael Brown <mcb30@ipxe.org>
Thu, 28 Jul 2016 15:16:55 +0000 (16:16 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 28 Jul 2016 23:41:36 +0000 (00:41 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/image.c
src/include/ipxe/image.h

index a185b82f4ffbe54e227d3e46cc4d5306065598b0..b4785269b4ebbeaa5c4ff0d6865850ca869663de 100644 (file)
@@ -505,3 +505,38 @@ int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf ) {
 
        return 0;
 }
+
+/**
+ * Extract ASN.1 object from image
+ *
+ * @v image            Image
+ * @v offset           Offset within image
+ * @v cursor           ASN.1 cursor to fill in
+ * @ret next           Offset to next image, or negative error
+ *
+ * The caller is responsible for eventually calling free() on the
+ * allocated ASN.1 cursor.
+ */
+int image_asn1 ( struct image *image, size_t offset,
+                struct asn1_cursor **cursor ) {
+       int next;
+       int rc;
+
+       /* Sanity check */
+       assert ( offset <= image->len );
+
+       /* Check that this image can be used to extract an ASN.1 object */
+       if ( ! ( image->type && image->type->asn1 ) )
+               return -ENOTSUP;
+
+       /* Try creating ASN.1 cursor */
+       next = image->type->asn1 ( image, offset, cursor );
+       if ( next < 0 ) {
+               rc = next;
+               DBGC ( image, "IMAGE %s could not extract ASN.1 object: %s\n",
+                      image->name, strerror ( rc ) );
+               return rc;
+       }
+
+       return next;
+}
index f33feddad9e07411694eaefe768d4815e14304e9..2e7eb4cee39698b1af44ef1773bf26948e9b6d33 100644 (file)
@@ -17,6 +17,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 struct uri;
 struct pixel_buffer;
+struct asn1_cursor;
 struct image_type;
 
 /** An executable image */
@@ -99,6 +100,19 @@ struct image_type {
         * @ret rc              Return status code
         */
        int ( * pixbuf ) ( struct image *image, struct pixel_buffer **pixbuf );
+       /**
+        * Extract ASN.1 object from image
+        *
+        * @v image             Image
+        * @v offset            Offset within image
+        * @v cursor            ASN.1 cursor to fill in
+        * @ret next            Offset to next image, or negative error
+        *
+        * The caller is responsible for eventually calling free() on
+        * the allocated ASN.1 cursor.
+        */
+       int ( * asn1 ) ( struct image *image, size_t offset,
+                        struct asn1_cursor **cursor );
 };
 
 /**
@@ -170,6 +184,8 @@ extern int image_select ( struct image *image );
 extern struct image * image_find_selected ( void );
 extern int image_set_trust ( int require_trusted, int permanent );
 extern int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf );
+extern int image_asn1 ( struct image *image, size_t offset,
+                       struct asn1_cursor **cursor );
 
 /**
  * Increment reference count on an image