]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[crypto] Use linker tables for RSA digestInfo prefixes
authorMichael Brown <mcb30@ipxe.org>
Tue, 20 Mar 2012 04:20:06 +0000 (04:20 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 20 Mar 2012 17:10:39 +0000 (17:10 +0000)
Allow external code to specify RSA digestInfo prefixes for additional
digest algorithms.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/crypto/rsa.c
src/include/ipxe/rsa.h

index 6aa6e8971d7069b556472e6e5a05a9d41affa809..9b98b179046dd536f5cc58e146546ccb882e805a 100644 (file)
@@ -39,45 +39,37 @@ FILE_LICENCE ( GPL2_OR_LATER );
  * RSA is documented in RFC 3447.
  */
 
-/** An RSA digestInfo prefix */
-struct rsa_digestinfo_prefix {
-       /** Digest algorithm */
-       struct digest_algorithm *digest;
-       /** Prefix */
-       const void *data;
-       /** Length of prefix */
-       size_t len;
-};
-
-/** "id-md5" object identifier */
-static const uint8_t rsa_md5_prefix[] =
+/** MD5 digestInfo prefix */
+static const uint8_t rsa_md5_prefix_data[] =
        { RSA_DIGESTINFO_PREFIX ( MD5_DIGEST_SIZE, ASN1_OID_MD5 ) };
 
-/** "id-sha1" object identifier */
-static const uint8_t rsa_sha1_prefix[] =
+/** SHA-1 digestInfo prefix */
+static const uint8_t rsa_sha1_prefix_data[] =
        { RSA_DIGESTINFO_PREFIX ( SHA1_DIGEST_SIZE, ASN1_OID_SHA1 ) };
 
-/** "id-sha256" object identifier */
-static const uint8_t rsa_sha256_prefix[] =
+/** SHA-256 digestInfo prefix */
+static const uint8_t rsa_sha256_prefix_data[] =
        { RSA_DIGESTINFO_PREFIX ( SHA256_DIGEST_SIZE, ASN1_OID_SHA256 ) };
 
-/** RSA digestInfo prefixes */
-static struct rsa_digestinfo_prefix rsa_digestinfo_prefixes[] = {
-       {
-               .digest = &md5_algorithm,
-               .data = rsa_md5_prefix,
-               .len = sizeof ( rsa_md5_prefix ),
-       },
-       {
-               .digest = &sha1_algorithm,
-               .data = rsa_sha1_prefix,
-               .len = sizeof ( rsa_sha1_prefix ),
-       },
-       {
-               .digest = &sha256_algorithm,
-               .data = rsa_sha256_prefix,
-               .len = sizeof ( rsa_sha256_prefix ),
-       },
+/** MD5 digestInfo prefix */
+struct rsa_digestinfo_prefix rsa_md5_prefix __rsa_digestinfo_prefix = {
+       .digest = &md5_algorithm,
+       .data = rsa_md5_prefix_data,
+       .len = sizeof ( rsa_md5_prefix_data ),
+};
+
+/** SHA-1 digestInfo prefix */
+struct rsa_digestinfo_prefix rsa_sha1_prefix __rsa_digestinfo_prefix = {
+       .digest = &sha1_algorithm,
+       .data = rsa_sha1_prefix_data,
+       .len = sizeof ( rsa_sha1_prefix_data ),
+};
+
+/** SHA-256 digestInfo prefix */
+struct rsa_digestinfo_prefix rsa_sha256_prefix __rsa_digestinfo_prefix = {
+       .digest = &sha256_algorithm,
+       .data = rsa_sha256_prefix_data,
+       .len = sizeof ( rsa_sha256_prefix_data ),
 };
 
 /**
@@ -89,11 +81,8 @@ static struct rsa_digestinfo_prefix rsa_digestinfo_prefixes[] = {
 static struct rsa_digestinfo_prefix *
 rsa_find_prefix ( struct digest_algorithm *digest ) {
        struct rsa_digestinfo_prefix *prefix;
-       unsigned int i;
 
-       for ( i = 0 ; i < ( sizeof ( rsa_digestinfo_prefixes ) /
-                           sizeof ( rsa_digestinfo_prefixes[0] ) ) ; i++ ) {
-               prefix = &rsa_digestinfo_prefixes[i];
+       for_each_table_entry ( prefix, RSA_DIGESTINFO_PREFIXES ) {
                if ( prefix->digest == digest )
                        return prefix;
        }
index 87e75a82fb685a7c803da5466d8e020849c908d0..d43d336ab27f7ab937d79fa3c3ed4e97cef3dbce 100644 (file)
@@ -11,6 +11,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <ipxe/crypto.h>
 #include <ipxe/bigint.h>
 #include <ipxe/asn1.h>
+#include <ipxe/tables.h>
 
 /** ASN.1 OID for iso(1) member-body(2) us(840) */
 #define ASN1_OID_ISO_US ASN1_OID_ISO_MEMBERBODY, ASN1_OID_DOUBLE ( 840 )
@@ -111,6 +112,23 @@ FILE_LICENCE ( GPL2_OR_LATER );
        RSA_DIGESTALGORITHM ( __VA_ARGS__ ),                            \
        RSA_DIGEST_PREFIX ( digest_size )
 
+/** An RSA digestInfo prefix */
+struct rsa_digestinfo_prefix {
+       /** Digest algorithm */
+       struct digest_algorithm *digest;
+       /** Prefix */
+       const void *data;
+       /** Length of prefix */
+       size_t len;
+};
+
+/** RSA digestInfo prefix table */
+#define RSA_DIGESTINFO_PREFIXES \
+       __table ( struct rsa_digestinfo_prefix, "rsa_digestinfo_prefixes" )
+
+/** Declare an RSA digestInfo prefix */
+#define __rsa_digestinfo_prefix __table_entry ( RSA_DIGESTINFO_PREFIXES, 01 )
+
 /** An RSA context */
 struct rsa_context {
        /** Allocated memory */