• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GPXE_CRYPTO_H
2 #define _GPXE_CRYPTO_H
3 
4 /** @file
5  *
6  * Cryptographic API
7  *
8  */
9 
10 FILE_LICENCE ( GPL2_OR_LATER );
11 
12 #include <stdint.h>
13 #include <stddef.h>
14 
15 /** A message digest algorithm */
16 struct digest_algorithm {
17 	/** Algorithm name */
18 	const char *name;
19 	/** Context size */
20 	size_t ctxsize;
21 	/** Block size */
22 	size_t blocksize;
23 	/** Digest size */
24 	size_t digestsize;
25 	/** Initialise digest
26 	 *
27 	 * @v ctx		Context
28 	 */
29 	void ( * init ) ( void *ctx );
30 	/** Update digest with new data
31 	 *
32 	 * @v ctx		Context
33 	 * @v src		Data to digest
34 	 * @v len		Length of data
35 	 *
36 	 * @v len is not necessarily a multiple of @c blocksize.
37 	 */
38 	void ( * update ) ( void *ctx, const void *src, size_t len );
39 	/** Finalise digest
40 	 *
41 	 * @v ctx		Context
42 	 * @v out		Buffer for digest output
43 	 */
44 	void ( * final ) ( void *ctx, void *out );
45 };
46 
47 /** A cipher algorithm */
48 struct cipher_algorithm {
49 	/** Algorithm name */
50 	const char *name;
51 	/** Context size */
52 	size_t ctxsize;
53 	/** Block size */
54 	size_t blocksize;
55 	/** Set key
56 	 *
57 	 * @v ctx		Context
58 	 * @v key		Key
59 	 * @v keylen		Key length
60 	 * @ret rc		Return status code
61 	 */
62 	int ( * setkey ) ( void *ctx, const void *key, size_t keylen );
63 	/** Set initialisation vector
64 	 *
65 	 * @v ctx		Context
66 	 * @v iv		Initialisation vector
67 	 */
68 	void ( * setiv ) ( void *ctx, const void *iv );
69 	/** Encrypt data
70 	 *
71 	 * @v ctx		Context
72 	 * @v src		Data to encrypt
73 	 * @v dst		Buffer for encrypted data
74 	 * @v len		Length of data
75 	 *
76 	 * @v len is guaranteed to be a multiple of @c blocksize.
77 	 */
78 	void ( * encrypt ) ( void *ctx, const void *src, void *dst,
79 			     size_t len );
80 	/** Decrypt data
81 	 *
82 	 * @v ctx		Context
83 	 * @v src		Data to decrypt
84 	 * @v dst		Buffer for decrypted data
85 	 * @v len		Length of data
86 	 *
87 	 * @v len is guaranteed to be a multiple of @c blocksize.
88 	 */
89 	void ( * decrypt ) ( void *ctx, const void *src, void *dst,
90 			     size_t len );
91 };
92 
93 /** A public key algorithm */
94 struct pubkey_algorithm {
95 	/** Algorithm name */
96 	const char *name;
97 	/** Context size */
98 	size_t ctxsize;
99 };
100 
digest_init(struct digest_algorithm * digest,void * ctx)101 static inline void digest_init ( struct digest_algorithm *digest,
102 				 void *ctx ) {
103 	digest->init ( ctx );
104 }
105 
digest_update(struct digest_algorithm * digest,void * ctx,const void * data,size_t len)106 static inline void digest_update ( struct digest_algorithm *digest,
107 				   void *ctx, const void *data, size_t len ) {
108 	digest->update ( ctx, data, len );
109 }
110 
digest_final(struct digest_algorithm * digest,void * ctx,void * out)111 static inline void digest_final ( struct digest_algorithm *digest,
112 				  void *ctx, void *out ) {
113 	digest->final ( ctx, out );
114 }
115 
cipher_setkey(struct cipher_algorithm * cipher,void * ctx,const void * key,size_t keylen)116 static inline int cipher_setkey ( struct cipher_algorithm *cipher,
117 				  void *ctx, const void *key, size_t keylen ) {
118 	return cipher->setkey ( ctx, key, keylen );
119 }
120 
cipher_setiv(struct cipher_algorithm * cipher,void * ctx,const void * iv)121 static inline void cipher_setiv ( struct cipher_algorithm *cipher,
122 				  void *ctx, const void *iv ) {
123 	cipher->setiv ( ctx, iv );
124 }
125 
cipher_encrypt(struct cipher_algorithm * cipher,void * ctx,const void * src,void * dst,size_t len)126 static inline void cipher_encrypt ( struct cipher_algorithm *cipher,
127 				    void *ctx, const void *src, void *dst,
128 				    size_t len ) {
129 	cipher->encrypt ( ctx, src, dst, len );
130 }
131 #define cipher_encrypt( cipher, ctx, src, dst, len ) do {		\
132 	assert ( ( (len) & ( (cipher)->blocksize - 1 ) ) == 0 );	\
133 	cipher_encrypt ( (cipher), (ctx), (src), (dst), (len) );	\
134 	} while ( 0 )
135 
cipher_decrypt(struct cipher_algorithm * cipher,void * ctx,const void * src,void * dst,size_t len)136 static inline void cipher_decrypt ( struct cipher_algorithm *cipher,
137 				    void *ctx, const void *src, void *dst,
138 				    size_t len ) {
139 	cipher->decrypt ( ctx, src, dst, len );
140 }
141 #define cipher_decrypt( cipher, ctx, src, dst, len ) do {		\
142 	assert ( ( (len) & ( (cipher)->blocksize - 1 ) ) == 0 );	\
143 	cipher_decrypt ( (cipher), (ctx), (src), (dst), (len) );	\
144 	} while ( 0 )
145 
is_stream_cipher(struct cipher_algorithm * cipher)146 static inline int is_stream_cipher ( struct cipher_algorithm *cipher ) {
147 	return ( cipher->blocksize == 1 );
148 }
149 
150 extern struct digest_algorithm digest_null;
151 extern struct cipher_algorithm cipher_null;
152 extern struct pubkey_algorithm pubkey_null;
153 
154 void get_random_bytes ( void *buf, size_t len );
155 
156 #endif /* _GPXE_CRYPTO_H */
157