]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[crypto] Add abstraction for a public-key algorithm
authorMichael Brown <mcb30@ipxe.org>
Sun, 18 Mar 2012 13:25:10 +0000 (13:25 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sun, 18 Mar 2012 13:35:32 +0000 (13:35 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/crypto/crypto_null.c
src/include/ipxe/crypto.h

index c9c32ae99b1e9c03f06ebcb2e541c86711d85966..590ac560553d5e6fc3bf72dad94ddc4811e8b215 100644 (file)
@@ -81,7 +81,56 @@ struct cipher_algorithm cipher_null = {
        .decrypt = cipher_null_decrypt,
 };
 
+static int pubkey_null_init ( void *ctx __unused, const void *key __unused,
+                             size_t key_len __unused ) {
+       return 0;
+}
+
+static size_t pubkey_null_max_len ( void *ctx __unused ) {
+       return 0;
+}
+
+static int pubkey_null_encrypt ( void *ctx __unused,
+                                const void *plaintext __unused,
+                                size_t plaintext_len __unused,
+                                void *ciphertext __unused ) {
+       return 0;
+}
+
+static int pubkey_null_decrypt ( void *ctx __unused,
+                                const void *ciphertext __unused,
+                                size_t ciphertext_len __unused,
+                                void *plaintext __unused ) {
+       return 0;
+}
+
+static int pubkey_null_sign ( void *ctx __unused,
+                             struct digest_algorithm *digest __unused,
+                             const void *value __unused,
+                             void *signature __unused ) {
+       return 0;
+}
+
+static int pubkey_null_verify ( void *ctx __unused,
+                               struct digest_algorithm *digest __unused,
+                               const void *value __unused,
+                               const void *signature __unused ,
+                               size_t signature_len __unused ) {
+       return 0;
+}
+
+static void pubkey_null_final ( void *ctx __unused ) {
+       /* Do nothing */
+}
+
 struct pubkey_algorithm pubkey_null = {
        .name = "null",
        .ctxsize = 0,
+       .init = pubkey_null_init,
+       .max_len = pubkey_null_max_len,
+       .encrypt = pubkey_null_encrypt,
+       .decrypt = pubkey_null_decrypt,
+       .sign = pubkey_null_sign,
+       .verify = pubkey_null_verify,
+       .final = pubkey_null_final,
 };
index 7c21e96e99a63874944c8fcc7dbe6995ade9a228..d7d42b66c3278cae0e0528290754672796151e99 100644 (file)
@@ -96,6 +96,67 @@ struct pubkey_algorithm {
        const char *name;
        /** Context size */
        size_t ctxsize;
+       /** Initialise algorithm
+        *
+        * @v ctx               Context
+        * @v key               Key
+        * @v key_len           Length of key
+        * @ret rc              Return status code
+        */
+       int ( * init ) ( void *ctx, const void *key, size_t key_len );
+       /** Calculate maximum output length
+        *
+        * @v ctx               Context
+        * @ret max_len         Maximum output length
+        */
+       size_t ( * max_len ) ( void *ctx );
+       /** Encrypt
+        *
+        * @v ctx               Context
+        * @v plaintext         Plaintext
+        * @v plaintext_len     Length of plaintext
+        * @v ciphertext        Ciphertext
+        * @ret ciphertext_len  Length of ciphertext, or negative error
+        */
+       int ( * encrypt ) ( void *ctx, const void *data, size_t len,
+                           void *out );
+       /** Decrypt
+        *
+        * @v ctx               Context
+        * @v ciphertext        Ciphertext
+        * @v ciphertext_len    Ciphertext length
+        * @v plaintext         Plaintext
+        * @ret plaintext_len   Plaintext length, or negative error
+        */
+       int ( * decrypt ) ( void *ctx, const void *data, size_t len,
+                           void *out );
+       /** Sign digest value
+        *
+        * @v ctx               Context
+        * @v digest            Digest algorithm
+        * @v value             Digest value
+        * @v signature         Signature
+        * @ret signature_len   Signature length, or negative error
+        */
+       int ( * sign ) ( void *ctx, struct digest_algorithm *digest,
+                        const void *value, void *signature );
+       /** Verify signed digest value
+        *
+        * @v ctx               Context
+        * @v digest            Digest algorithm
+        * @v value             Digest value
+        * @v signature         Signature
+        * @v signature_len     Signature length
+        * @ret rc              Return status code
+        */
+       int ( * verify ) ( void *ctx, struct digest_algorithm *digest,
+                          const void *value, const void *signature,
+                          size_t signature_len );
+       /** Finalise algorithm
+        *
+        * @v ctx               Context
+        */
+       void ( * final ) ( void *ctx );
 };
 
 static inline void digest_init ( struct digest_algorithm *digest,
@@ -147,6 +208,43 @@ static inline int is_stream_cipher ( struct cipher_algorithm *cipher ) {
        return ( cipher->blocksize == 1 );
 }
 
+static inline int pubkey_init ( struct pubkey_algorithm *pubkey, void *ctx,
+                               const void *key, size_t key_len ) {
+       return pubkey->init ( ctx, key, key_len );
+}
+
+static inline size_t pubkey_max_len ( struct pubkey_algorithm *pubkey,
+                                     void *ctx ) {
+       return pubkey->max_len ( ctx );
+}
+
+static inline int pubkey_encrypt ( struct pubkey_algorithm *pubkey, void *ctx,
+                                  const void *data, size_t len, void *out ) {
+       return pubkey->encrypt ( ctx, data, len, out );
+}
+
+static inline int pubkey_decrypt ( struct pubkey_algorithm *pubkey, void *ctx,
+                                  const void *data, size_t len, void *out ) {
+       return pubkey->decrypt ( ctx, data, len, out );
+}
+
+static inline int pubkey_sign ( struct pubkey_algorithm *pubkey, void *ctx,
+                               struct digest_algorithm *digest,
+                               const void *value, void *signature ) {
+       return pubkey->sign ( ctx, digest, value, signature );
+}
+
+static inline int pubkey_verify ( struct pubkey_algorithm *pubkey, void *ctx,
+                                 struct digest_algorithm *digest,
+                                 const void *value, const void *signature,
+                                 size_t signature_len ) {
+       return pubkey->verify ( ctx, digest, value, signature, signature_len );
+}
+
+static inline void pubkey_final ( struct pubkey_algorithm *pubkey, void *ctx ) {
+       pubkey->final ( ctx );
+}
+
 extern struct digest_algorithm digest_null;
 extern struct cipher_algorithm cipher_null;
 extern struct pubkey_algorithm pubkey_null;