]> git.ipfire.org Git - thirdparty/strongswan.git/blobdiff - src/charon-tkm/src/tkm/tkm_nonceg.c
Fixed some typos, courtesy of codespell
[thirdparty/strongswan.git] / src / charon-tkm / src / tkm / tkm_nonceg.c
index 90b033f9f6aad063ba3452cfd433465e775b561c..2b3e66d2deb422a1a67e267a42b56cd604733c61 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyrigth (C) 2012 Reto Buerki
+ * Copyright (C) 2012 Reto Buerki
  * Copyright (C) 2012 Adrian-Ken Rueegsegger
  * Hochschule fuer Technik Rapperswil
  *
@@ -33,22 +33,32 @@ struct private_tkm_nonceg_t {
        tkm_nonceg_t public;
 
        /**
-        * Context id.
+        * Nonce chunk.
         */
-       nc_id_type context_id;
-
+       chunk_t nonce;
 };
 
 METHOD(nonce_gen_t, get_nonce, bool,
-       private_tkm_nonceg_t *this, size_t size, u_int8_t *buffer)
+       private_tkm_nonceg_t *this, size_t size, uint8_t *buffer)
 {
        nonce_type nonce;
-       if (ike_nc_create(this->context_id, size, &nonce) != TKM_OK)
+       uint64_t nc_id;
+
+       nc_id = tkm->idmgr->acquire_id(tkm->idmgr, TKM_CTX_NONCE);
+       if (!nc_id)
        {
                return FALSE;
        }
 
+       if (ike_nc_create(nc_id, size, &nonce) != TKM_OK)
+       {
+               tkm->idmgr->release_id(tkm->idmgr, TKM_CTX_NONCE, nc_id);
+               return FALSE;
+       }
+
        memcpy(buffer, &nonce.data, size);
+       this->nonce = chunk_clone(chunk_create(buffer, size));
+       tkm->chunk_map->insert(tkm->chunk_map, &this->nonce, nc_id);
        return TRUE;
 }
 
@@ -62,6 +72,21 @@ METHOD(nonce_gen_t, allocate_nonce, bool,
 METHOD(nonce_gen_t, destroy, void,
        private_tkm_nonceg_t *this)
 {
+       uint64_t nc_id;
+
+       nc_id = tkm->chunk_map->get_id(tkm->chunk_map, &this->nonce);
+       if (nc_id)
+       {
+               DBG1(DBG_IKE, "resetting stale nonce context %llu", nc_id);
+
+               if (ike_nc_reset(nc_id) != TKM_OK)
+               {
+                       DBG1(DBG_IKE, "failed to reset nonce context %llu", nc_id);
+               }
+               tkm->idmgr->release_id(tkm->idmgr, TKM_CTX_NONCE, nc_id);
+               tkm->chunk_map->remove(tkm->chunk_map, &this->nonce);
+       }
+       chunk_free(&this->nonce);
        free(this);
 }
 
@@ -80,14 +105,7 @@ tkm_nonceg_t *tkm_nonceg_create()
                                .destroy = _destroy,
                        },
                },
-               .context_id = tkm->idmgr->acquire_id(tkm->idmgr, TKM_CTX_NONCE),
        );
 
-       if (!this->context_id)
-       {
-               free(this);
-               return NULL;
-       }
-
        return &this->public;
 }