|
|
|
@ -1044,3 +1044,84 @@ int DatasetAddSerialized(Dataset *set, const char *string)
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \retval 1 data was removed from the hash
|
|
|
|
|
* \retval 0 data not removed (busy)
|
|
|
|
|
* \retval -1 data not found
|
|
|
|
|
*/
|
|
|
|
|
static int DatasetRemoveString(Dataset *set, const uint8_t *data, const uint32_t data_len)
|
|
|
|
|
{
|
|
|
|
|
if (set == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
StringType lookup = { .ptr = (uint8_t *)data, .len = data_len,
|
|
|
|
|
.rep.value = 0 };
|
|
|
|
|
return THashRemoveFromHash(set->hash, &lookup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int DatasetRemoveMd5(Dataset *set, const uint8_t *data, const uint32_t data_len)
|
|
|
|
|
{
|
|
|
|
|
if (set == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
if (data_len != 16)
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
Md5Type lookup = { .rep.value = 0 };
|
|
|
|
|
memcpy(lookup.md5, data, 16);
|
|
|
|
|
return THashRemoveFromHash(set->hash, &lookup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int DatasetRemoveSha256(Dataset *set, const uint8_t *data, const uint32_t data_len)
|
|
|
|
|
{
|
|
|
|
|
if (set == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
if (data_len != 32)
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
Sha256Type lookup = { .rep.value = 0 };
|
|
|
|
|
memcpy(lookup.sha256, data, 32);
|
|
|
|
|
return THashRemoveFromHash(set->hash, &lookup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** \brief remove serialized data from set
|
|
|
|
|
* \retval int 1 removed
|
|
|
|
|
* \retval int 0 found but busy (not removed)
|
|
|
|
|
* \retval int -1 API error (not removed)
|
|
|
|
|
* \retval int -2 DATA error */
|
|
|
|
|
int DatasetRemoveSerialized(Dataset *set, const char *string)
|
|
|
|
|
{
|
|
|
|
|
if (set == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
switch (set->type) {
|
|
|
|
|
case DATASET_TYPE_STRING: {
|
|
|
|
|
uint8_t decoded[strlen(string)];
|
|
|
|
|
uint32_t len = DecodeBase64(decoded, (const uint8_t *)string, strlen(string), 1);
|
|
|
|
|
if (len == 0) {
|
|
|
|
|
return -2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return DatasetRemoveString(set, decoded, len);
|
|
|
|
|
}
|
|
|
|
|
case DATASET_TYPE_MD5: {
|
|
|
|
|
if (strlen(string) != 32)
|
|
|
|
|
return -2;
|
|
|
|
|
uint8_t hash[16];
|
|
|
|
|
if (HexToRaw((const uint8_t *)string, 32, hash, sizeof(hash)) < 0)
|
|
|
|
|
return -2;
|
|
|
|
|
return DatasetRemoveMd5(set, hash, 16);
|
|
|
|
|
}
|
|
|
|
|
case DATASET_TYPE_SHA256: {
|
|
|
|
|
if (strlen(string) != 64)
|
|
|
|
|
return -2;
|
|
|
|
|
uint8_t hash[32];
|
|
|
|
|
if (HexToRaw((const uint8_t *)string, 64, hash, sizeof(hash)) < 0)
|
|
|
|
|
return -2;
|
|
|
|
|
return DatasetRemoveSha256(set, hash, 32);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|