36 #include "scheduler/schedule.h"
37 #include "scheduler/task.h"
45 #include <ldns/ldns.h>
46 #include <ldns/util.h>
61 static pthread_once_t __hsm_key_factory_once = PTHREAD_ONCE_INIT;
62 static pthread_mutex_t* __hsm_key_factory_lock = NULL;
64 static void hsm_key_factory_init(
void) {
65 pthread_mutexattr_t attr;
67 if (!__hsm_key_factory_lock) {
68 if (!(__hsm_key_factory_lock = calloc(1,
sizeof(pthread_mutex_t)))
69 || pthread_mutexattr_init(&attr)
70 || pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)
71 || pthread_mutex_init(__hsm_key_factory_lock, &attr))
74 ods_log_error(
"[hsm_key_factory_init] mutex error");
75 if (__hsm_key_factory_lock) {
76 pthread_mutex_destroy(__hsm_key_factory_lock);
77 free(__hsm_key_factory_lock);
78 __hsm_key_factory_lock = NULL;
86 if (__hsm_key_factory_lock) {
87 (void)pthread_mutex_destroy(__hsm_key_factory_lock);
88 free(__hsm_key_factory_lock);
89 __hsm_key_factory_lock = NULL;
102 ssize_t generate_keys;
103 libhsm_key_t *key = NULL;
106 hsm_repository_t* hsm;
116 if (!__hsm_key_factory_lock) {
117 pthread_once(&__hsm_key_factory_once, hsm_key_factory_init);
118 if (!__hsm_key_factory_lock) {
119 ods_log_error(
"[hsm_key_factory_generate] mutex init error");
123 if (pthread_mutex_lock(__hsm_key_factory_lock)) {
124 ods_log_error(
"[hsm_key_factory_generate] mutex lock error");
146 ods_log_error(
"[hsm_key_factory_generate] unable to count unused keys, database or memory allocation error");
149 pthread_mutex_unlock(__hsm_key_factory_lock);
163 ods_log_error(
"[hsm_key_factory_generate] unable to count zones for policy, database or memory allocation error");
166 pthread_mutex_unlock(__hsm_key_factory_lock);
177 pthread_mutex_unlock(__hsm_key_factory_lock);
189 if (num_zones == 0 || (ssize_t)num_keys >= generate_keys) {
190 pthread_mutex_unlock(__hsm_key_factory_lock);
195 ods_log_info(
"%lu zone(s) found on policy \"%s\"", num_zones,
policy_name(
policy));
197 ods_log_info(
"%lu zone(s) found on policy <unknown>", num_zones);
199 ods_log_info(
"[hsm_key_factory_generate] %lu keys needed for %lu "
200 "zones covering %lld seconds, generating %lu keys for policy %s",
201 generate_keys, num_zones, (
long long)duration,
202 (
unsigned long)(generate_keys-num_keys),
204 generate_keys -= num_keys;
210 if (!(hsm_ctx = hsm_create_context())) {
211 pthread_mutex_unlock(__hsm_key_factory_lock);
215 if ((hsm_err = hsm_get_error(hsm_ctx))) {
222 hsm_destroy_context(hsm_ctx);
223 pthread_mutex_unlock(__hsm_key_factory_lock);
230 while (generate_keys--) {
243 hsm_destroy_context(hsm_ctx);
244 pthread_mutex_unlock(__hsm_key_factory_lock);
253 case LDNS_RSASHA1_NSEC3:
261 case LDNS_ECDSAP256SHA256:
264 case LDNS_ECDSAP384SHA384:
267 #if (LDNS_REVISION >= ((1<<16)|(7<<8)|(0)))
283 if (!(key_id = hsm_get_key_id(hsm_ctx, key))) {
284 if ((hsm_err = hsm_get_error(hsm_ctx))) {
285 ods_log_error(
"[hsm_key_factory_generate] unable to get the ID of the key generated, HSM error: %s", hsm_err);
289 ods_log_error(
"[hsm_key_factory_generate] unable to get the ID of the key generated");
291 libhsm_key_free(key);
292 hsm_destroy_context(hsm_ctx);
293 pthread_mutex_unlock(__hsm_key_factory_lock);
313 ods_log_error(
"[hsm_key_factory_generate] hsm key creation failed, database or memory error");
317 hsm_destroy_context(hsm_ctx);
318 pthread_mutex_unlock(__hsm_key_factory_lock);
322 ods_log_debug(
"[hsm_key_factory_generate] generated key %s successfully", key_id);
326 libhsm_key_free(key);
329 if ((hsm_err = hsm_get_error(hsm_ctx))) {
330 ods_log_error(
"[hsm_key_factory_generate] key generation failed, HSM error: %s", hsm_err);
334 ods_log_error(
"[hsm_key_factory_generate] key generation failed");
336 hsm_destroy_context(hsm_ctx);
337 pthread_mutex_unlock(__hsm_key_factory_lock);
341 hsm_destroy_context(hsm_ctx);
342 pthread_mutex_unlock(__hsm_key_factory_lock);
351 if (!engine || !
policy || !connection) {
355 if (!__hsm_key_factory_lock) {
356 pthread_once(&__hsm_key_factory_once, hsm_key_factory_init);
357 if (!__hsm_key_factory_lock) {
358 ods_log_error(
"[hsm_key_factory_generate_policy] mutex init error");
362 if (pthread_mutex_lock(__hsm_key_factory_lock)) {
363 ods_log_error(
"[hsm_key_factory_generate_policy] mutex lock error");
367 ods_log_debug(
"[hsm_key_factory_generate_policy] policy %s",
policy_name(
policy));
374 pthread_mutex_unlock(__hsm_key_factory_lock);
382 pthread_mutex_unlock(__hsm_key_factory_lock);
393 if (!engine || !connection) {
397 if (!__hsm_key_factory_lock) {
398 pthread_once(&__hsm_key_factory_once, hsm_key_factory_init);
399 if (!__hsm_key_factory_lock) {
400 ods_log_error(
"[hsm_key_factory_generate_all] mutex init error");
404 if (pthread_mutex_lock(__hsm_key_factory_lock)) {
405 ods_log_error(
"[hsm_key_factory_generate_all] mutex lock error");
409 ods_log_debug(
"[hsm_key_factory_generate_all] generating keys");
416 pthread_mutex_unlock(__hsm_key_factory_lock);
431 pthread_mutex_unlock(__hsm_key_factory_lock);
436 hsm_key_factory_generate_cb(task_type* task,
char const *owner,
void* userdata,
void* context)
445 return schedule_SUCCESS;
456 ods_log_debug(
"[hsm_key_factory_generate_cb] generate for policy key [duration: %lu]", (
unsigned long)task2->
duration);
458 ods_log_debug(
"[hsm_key_factory_generate_cb] generate for policy key done");
464 return schedule_SUCCESS;
468 hsm_key_factory_generate_policy_cb(task_type* task,
char const *owner,
void *userdata,
477 return schedule_SUCCESS;
481 ods_log_debug(
"[hsm_key_factory_generate_policy_cb] generate for policy [duration: %lu]", (
unsigned long) task2->
duration);
483 ods_log_debug(
"[hsm_key_factory_generate_policy_cb] generate for policy done");
486 return schedule_SUCCESS;
490 hsm_key_factory_generate_all_cb(task_type* task,
char const *owner,
void *userdata,
499 return schedule_SUCCESS;
503 ods_log_debug(
"[hsm_key_factory_generate_all_cb] generate for all policies [duration: %lu]", (
unsigned long)task2->
duration);
505 ods_log_debug(
"[hsm_key_factory_generate_all_cb] generate for all policies done");
508 return schedule_SUCCESS;
543 task = task_create(strdup(
"hsm_key_factory_schedule_generation"),
544 TASK_CLASS_ENFORCER, TASK_TYPE_HSMKEYGEN,
545 hsm_key_factory_generate_cb, task2,
548 if (schedule_task(
engine->
taskq, task, 1, 0) != ODS_STATUS_OK) {
581 task = task_create(strdup(
"hsm_key_factory_schedule_generation_policy"),
582 TASK_CLASS_ENFORCER, TASK_TYPE_HSMKEYGEN,
583 hsm_key_factory_generate_policy_cb, task2,
586 if (schedule_task(
engine->
taskq, task, 1, 0) != ODS_STATUS_OK) {
613 task = task_create(strdup(
"hsm_key_factory_schedule_generation"),
614 TASK_CLASS_ENFORCER, TASK_TYPE_HSMKEYGEN,
615 hsm_key_factory_generate_all_cb, task2,
618 if (schedule_task(
engine->
taskq, task, 1, 0) != ODS_STATUS_OK) {
665 ods_log_error(
"[hsm_key_factory_get_key] unable to list keys, database or memory allocation error");
676 ods_log_warning(
"[hsm_key_factory_get_key] no keys available");
690 ods_log_debug(
"[hsm_key_factory_get_key] unable to update fetched key");
698 ods_log_debug(
"[hsm_key_factory_get_key] key allocated");
723 ods_log_debug(
"[hsm_key_factory_release_key_id] unable to check usage of hsm_key, database or memory allocation error");
733 ods_log_debug(
"[hsm_key_factory_release_key_id] unable to release hsm_key, in use");
739 ods_log_debug(
"[hsm_key_factory_release_key_id] unable to fetch hsm_key");
745 ods_log_debug(
"[hsm_key_factory_release_key_id] hsm_key already DELETE (?)");
753 ods_log_debug(
"[hsm_key_factory_release_key_id] unable to change hsm_key state to DELETE");
780 ods_log_debug(
"[hsm_key_factory_release_key] unable to check usage of hsm_key, database or memory allocation error");
789 ods_log_debug(
"[hsm_key_factory_release_key] unable to release hsm_key, in use");
794 ods_log_debug(
"[hsm_key_factory_release_key] hsm_key already DELETE (?)");
801 ods_log_debug(
"[hsm_key_factory_release_key] unable to change hsm_key state to DELETE");