+apr_status_t HMAC_BUFFER(struct seal_key *skey, struct databuf *buffer,
+ struct databuf *result)
+{
+ HMAC_CTX hmac_ctx = { 0 };
+ unsigned int len;
+ int ret;
+
+ /* now MAC the buffer */
+ HMAC_CTX_init(&hmac_ctx);
+
+ ret = HMAC_Init_ex(&hmac_ctx, skey->hkey,
+ skey->cipher->key_len, skey->md, NULL);
+ if (ret == 0) goto done;
+
+ ret = HMAC_Update(&hmac_ctx, buffer->value, buffer->length);
+ if (ret == 0) goto done;
+
+ ret = HMAC_Final(&hmac_ctx, result->value, &len);
+
+done:
+ HMAC_CTX_cleanup(&hmac_ctx);
+ if (ret == 0) return EFAULT;
+
+ result->length = len;
+ return 0;
+}
+