iPXE
Functions
pubkey_test.c File Reference

Public key self-tests. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ipxe/crypto.h>
#include <ipxe/test.h>
#include "pubkey_test.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void pubkey_okx (struct pubkey_test *test, const char *file, unsigned int line)
 Report public key encryption and decryption test result. More...
 
void pubkey_sign_okx (struct pubkey_sign_test *test, const char *file, unsigned int line)
 Report public key signature test result. More...
 

Detailed Description

Public key self-tests.

Definition in file pubkey_test.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ pubkey_okx()

void pubkey_okx ( struct pubkey_test test,
const char *  file,
unsigned int  line 
)

Report public key encryption and decryption test result.

Parameters
testPublic key encryption and decryption test
fileTest code file
lineTest code line

Definition at line 50 of file pubkey_test.c.

51  {
52  struct pubkey_algorithm *pubkey = test->pubkey;
53  struct asn1_builder plaintext;
54  struct asn1_builder ciphertext;
55 
56  /* Test key matching */
57  okx ( pubkey_match ( pubkey, &test->private, &test->public ) == 0,
58  file, line );
59 
60  /* Test decrypting with private key to obtain known plaintext */
61  plaintext.data = NULL;
62  plaintext.len = 0;
63  okx ( pubkey_decrypt ( pubkey, &test->private, &test->ciphertext,
64  &plaintext ) == 0, file, line );
65  okx ( asn1_compare ( asn1_built ( &plaintext ),
66  &test->plaintext ) == 0, file, line );
67  free ( plaintext.data );
68 
69  /* Test encrypting with private key and decrypting with public key */
70  ciphertext.data = NULL;
71  ciphertext.len = 0;
72  plaintext.data = NULL;
73  plaintext.len = 0;
74  okx ( pubkey_encrypt ( pubkey, &test->private, &test->plaintext,
75  &ciphertext ) == 0, file, line );
76  okx ( pubkey_decrypt ( pubkey, &test->public,
77  asn1_built ( &ciphertext ),
78  &plaintext ) == 0, file, line );
79  okx ( asn1_compare ( asn1_built ( &plaintext ),
80  &test->plaintext ) == 0, file, line );
81  free ( ciphertext.data );
82  free ( plaintext.data );
83 
84  /* Test encrypting with public key and decrypting with private key */
85  ciphertext.data = NULL;
86  ciphertext.len = 0;
87  plaintext.data = NULL;
88  plaintext.len = 0;
89  okx ( pubkey_encrypt ( pubkey, &test->public, &test->plaintext,
90  &ciphertext ) == 0, file, line );
91  okx ( pubkey_decrypt ( pubkey, &test->private,
92  asn1_built ( &ciphertext ),
93  &plaintext ) == 0, file, line );
94  okx ( asn1_compare ( asn1_built ( &plaintext ),
95  &test->plaintext ) == 0, file, line );
96  free ( ciphertext.data );
97  free ( plaintext.data );
98 }
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:447
static int pubkey_match(struct pubkey_algorithm *pubkey, const struct asn1_cursor *private_key, const struct asn1_cursor *public_key)
Definition: crypto.h:292
#define okx(success, file, line)
Report test result.
Definition: test.h:44
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
An ASN.1 object builder.
Definition: asn1.h:28
static int pubkey_encrypt(struct pubkey_algorithm *pubkey, const struct asn1_cursor *key, const struct asn1_cursor *plaintext, struct asn1_builder *ciphertext)
Definition: crypto.h:264
static struct asn1_cursor * asn1_built(struct asn1_builder *builder)
Get cursor for built object.
Definition: asn1.h:467
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A public key algorithm.
Definition: crypto.h:121
static int test
Definition: epic100.c:73
static int pubkey_decrypt(struct pubkey_algorithm *pubkey, const struct asn1_cursor *key, const struct asn1_cursor *ciphertext, struct asn1_builder *plaintext)
Definition: crypto.h:271

References asn1_built(), asn1_compare(), asn1_builder::data, free, asn1_builder::len, NULL, okx, pubkey_decrypt(), pubkey_encrypt(), pubkey_match(), and test.

◆ pubkey_sign_okx()

void pubkey_sign_okx ( struct pubkey_sign_test test,
const char *  file,
unsigned int  line 
)

Report public key signature test result.

Parameters
testPublic key signature test
fileTest code file
lineTest code line

Definition at line 107 of file pubkey_test.c.

108  {
109  struct pubkey_algorithm *pubkey = test->pubkey;
110  struct digest_algorithm *digest = test->digest;
111  uint8_t digestctx[digest->ctxsize ];
112  uint8_t digestout[digest->digestsize];
113  struct asn1_builder signature = { NULL, 0 };
114  uint8_t *bad;
115 
116  /* Test key matching */
117  okx ( pubkey_match ( pubkey, &test->private, &test->public ) == 0,
118  file, line );
119 
120  /* Construct digest over plaintext */
121  digest_init ( digest, digestctx );
122  digest_update ( digest, digestctx, test->plaintext,
123  test->plaintext_len );
124  digest_final ( digest, digestctx, digestout );
125 
126  /* Test signing using private key */
127  okx ( pubkey_sign ( pubkey, &test->private, digest, digestout,
128  &signature ) == 0, file, line );
129  okx ( signature.len != 0, file, line );
131  &test->signature ) == 0, file, line );
132 
133  /* Test verification using public key */
134  okx ( pubkey_verify ( pubkey, &test->public, digest, digestout,
135  &test->signature ) == 0, file, line );
136 
137  /* Test verification failure of modified signature */
138  bad = ( signature.data + ( test->signature.len / 2 ) );
139  okx ( pubkey_verify ( pubkey, &test->public, digest, digestout,
140  asn1_built ( &signature ) ) == 0, file, line );
141  *bad ^= 0x40;
142  okx ( pubkey_verify ( pubkey, &test->public, digest, digestout,
143  asn1_built ( &signature ) ) != 0, file, line );
144 
145  /* Free signature */
146  free ( signature.data );
147 }
static void digest_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Definition: crypto.h:201
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:447
static void digest_final(struct digest_algorithm *digest, void *ctx, void *out)
Definition: crypto.h:207
static int pubkey_match(struct pubkey_algorithm *pubkey, const struct asn1_cursor *private_key, const struct asn1_cursor *public_key)
Definition: crypto.h:292
static int pubkey_sign(struct pubkey_algorithm *pubkey, const struct asn1_cursor *key, struct digest_algorithm *digest, const void *value, struct asn1_builder *signature)
Definition: crypto.h:278
#define okx(success, file, line)
Report test result.
Definition: test.h:44
static void digest_init(struct digest_algorithm *digest, void *ctx)
Definition: crypto.h:196
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
An ASN.1 object builder.
Definition: asn1.h:28
unsigned char uint8_t
Definition: stdint.h:10
static int pubkey_verify(struct pubkey_algorithm *pubkey, const struct asn1_cursor *key, struct digest_algorithm *digest, const void *value, const struct asn1_cursor *signature)
Definition: crypto.h:285
size_t ctxsize
Context size.
Definition: crypto.h:22
size_t digestsize
Digest size.
Definition: crypto.h:26
A message digest algorithm.
Definition: crypto.h:18
static struct asn1_cursor * asn1_built(struct asn1_builder *builder)
Get cursor for built object.
Definition: asn1.h:467
u8 signature
CPU signature.
Definition: CIB_PRM.h:35
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A public key algorithm.
Definition: crypto.h:121
static int test
Definition: epic100.c:73

References asn1_built(), asn1_compare(), digest_algorithm::ctxsize, digest_final(), digest_init(), digest_update(), digest_algorithm::digestsize, free, NULL, okx, pubkey_match(), pubkey_sign(), pubkey_verify(), signature, and test.