2 * Copyright (C) 2010 Martin Willi
4 * Copyright (C) secunet Security Networks AG
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "af_alg_signer.h"
18 #include "af_alg_ops.h"
20 typedef struct private_af_alg_signer_t private_af_alg_signer_t
;
23 * Private data structure with signing context.
25 struct private_af_alg_signer_t
{
28 * Public interface of af_alg_signer_t.
30 af_alg_signer_t
public;
38 * Size of the truncated signature
52 integrity_algorithm_t id
;
56 } algs
[AF_ALG_SIGNER
] = {
57 {AUTH_HMAC_SHA1_96
, "hmac(sha1)", 12, 20, },
58 {AUTH_HMAC_SHA1_128
, "hmac(sha1)", 16, 20, },
59 {AUTH_HMAC_SHA1_160
, "hmac(sha1)", 20, 20, },
60 {AUTH_HMAC_SHA2_256_96
, "hmac(sha256)", 12, 32, },
61 {AUTH_HMAC_SHA2_256_128
, "hmac(sha256)", 16, 32, },
62 {AUTH_HMAC_MD5_96
, "hmac(md5)", 12, 16, },
63 {AUTH_HMAC_MD5_128
, "hmac(md5)", 16, 16, },
64 {AUTH_HMAC_SHA2_256_256
, "hmac(sha256)", 32, 32, },
65 {AUTH_HMAC_SHA2_384_192
, "hmac(sha384)", 24, 48, },
66 {AUTH_HMAC_SHA2_384_384
, "hmac(sha384)", 48, 48, },
67 {AUTH_HMAC_SHA2_512_256
, "hmac(sha512)", 32, 64, },
68 {AUTH_HMAC_SHA2_512_512
, "hmac(sha512)", 64, 64, },
69 {AUTH_AES_XCBC_96
, "xcbc(aes)", 12, 16, },
70 {AUTH_CAMELLIA_XCBC_96
, "xcbc(camellia)", 12, 16, },
76 void af_alg_signer_probe(plugin_feature_t
*features
, int *pos
)
81 for (i
= 0; i
< countof(algs
); i
++)
83 ops
= af_alg_ops_create("hash", algs
[i
].name
);
87 features
[(*pos
)++] = PLUGIN_PROVIDE(SIGNER
, algs
[i
].id
);
93 * Get the kernel algorithm string and block/key size for our identifier
95 static size_t lookup_alg(integrity_algorithm_t algo
, char **name
,
100 for (i
= 0; i
< countof(algs
); i
++)
102 if (algs
[i
].id
== algo
)
104 *name
= algs
[i
].name
;
105 *key_size
= algs
[i
].key_size
;
106 return algs
[i
].block_size
;
112 METHOD(signer_t
, get_signature
, bool,
113 private_af_alg_signer_t
*this, chunk_t data
, uint8_t *buffer
)
115 return this->ops
->hash(this->ops
, data
, buffer
, this->block_size
);
118 METHOD(signer_t
, allocate_signature
, bool,
119 private_af_alg_signer_t
*this, chunk_t data
, chunk_t
*chunk
)
123 *chunk
= chunk_alloc(this->block_size
);
124 return get_signature(this, data
, chunk
->ptr
);
126 return get_signature(this, data
, NULL
);
129 METHOD(signer_t
, verify_signature
, bool,
130 private_af_alg_signer_t
*this, chunk_t data
, chunk_t signature
)
132 char sig
[this->block_size
];
134 if (signature
.len
!= this->block_size
)
138 if (!get_signature(this, data
, sig
))
142 return memeq_const(signature
.ptr
, sig
, signature
.len
);
145 METHOD(signer_t
, get_key_size
, size_t,
146 private_af_alg_signer_t
*this)
148 return this->key_size
;
151 METHOD(signer_t
, get_block_size
, size_t,
152 private_af_alg_signer_t
*this)
154 return this->block_size
;
157 METHOD(signer_t
, set_key
, bool,
158 private_af_alg_signer_t
*this, chunk_t key
)
160 this->ops
->reset(this->ops
);
161 return this->ops
->set_key(this->ops
, key
);
164 METHOD(signer_t
, destroy
, void,
165 private_af_alg_signer_t
*this)
167 this->ops
->destroy(this->ops
);
172 * Described in header
174 af_alg_signer_t
*af_alg_signer_create(integrity_algorithm_t algo
)
176 private_af_alg_signer_t
*this;
177 size_t block_size
, key_size
;
180 block_size
= lookup_alg(algo
, &name
, &key_size
);
182 { /* not supported by kernel */
189 .get_signature
= _get_signature
,
190 .allocate_signature
= _allocate_signature
,
191 .verify_signature
= _verify_signature
,
192 .get_key_size
= _get_key_size
,
193 .get_block_size
= _get_block_size
,
198 .ops
= af_alg_ops_create("hash", name
),
199 .block_size
= block_size
,
200 .key_size
= key_size
,
207 return &this->public;