/*
+--------------------------------------------------------------------+
- | libmemcached - C/C++ Client Library for memcached |
+ | libmemcached-awesome - C/C++ Client Library for memcached |
+--------------------------------------------------------------------+
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted under the terms of the BSD license. |
#include "libhashkit/common.h"
+#ifdef HAVE_OPENSSL_CRYPTO
+# include <openssl/evp.h>
+#endif
+
static inline void _hashkit_init(hashkit_st *self) {
self->base_hash.function = hashkit_one_at_a_time;
self->base_hash.context = NULL;
self->distribution_hash.context = NULL;
self->flags.is_base_same_distributed = true;
- self->_key = NULL;
+ self->_cryptographic_context = NULL;
}
static inline hashkit_st *_hashkit_create(hashkit_st *self) {
return self;
}
+#ifdef HAVE_OPENSSL_CRYPTO
+static void cryptographic_context_free(encryption_context_t *context) {
+ EVP_CIPHER_CTX_free(context->encryption_context);
+ EVP_CIPHER_CTX_free(context->decryption_context);
+ free(context);
+}
+#endif
+
void hashkit_free(hashkit_st *self) {
- if (self and self->_key) {
- free(self->_key);
- self->_key = NULL;
+#ifdef HAVE_OPENSSL_CRYPTO
+ if (self and self->_cryptographic_context) {
+ cryptographic_context_free((encryption_context_t *)self->_cryptographic_context);
+ self->_cryptographic_context = NULL;
+ }
+#else
+ if (self and self->_cryptographic_context) {
+ free(self->_cryptographic_context);
+ self->_cryptographic_context = NULL;
}
+#endif
if (hashkit_is_allocated(self)) {
free(self);
destination->base_hash = source->base_hash;
destination->distribution_hash = source->distribution_hash;
destination->flags = source->flags;
- destination->_key = aes_clone_key(static_cast<aes_key_t *>(source->_key));
+#ifdef HAVE_OPENSSL_CRYPTO
+ if (destination->_cryptographic_context) {
+ cryptographic_context_free((encryption_context_t *)destination->_cryptographic_context);
+ destination->_cryptographic_context = NULL;
+ }
+ if (source->_cryptographic_context) {
+ destination->_cryptographic_context =
+ aes_clone_cryptographic_context(((encryption_context_t *) source->_cryptographic_context));
+ if (destination->_cryptographic_context) {
+
+ }
+ }
+#else
+ destination->_cryptographic_context = aes_clone_key(static_cast<aes_key_t *>(source->_cryptographic_context));
+#endif
return destination;
}