Skip to content

Commit 47405e7

Browse files
authored
MONGOCRYPT-905 Reduce allocations when parsing FLE2TagAndEncryptedMetadataBlocks (#1161)
1 parent 5759e8d commit 47405e7

4 files changed

Lines changed: 24 additions & 20 deletions

src/mc-fle2-find-range-payload-private-v2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ BSON_STATIC_ASSERT2(alignof_mc_FLE2FindRangePayloadV2_t,
8585

8686
/**
8787
* EdgeFindTokenSetV2 is the following BSON document:
88-
* d: <binary> // EDCDerivedFromDataTokenAndContentionFactor
89-
* s: <binary> // ESCDerivedFromDataTokenAndContentionFactor
88+
* d: <binary> // EDCDerivedFromDataToken
89+
* s: <binary> // ESCDerivedFromDataToken
9090
* l: <binary> // ServerDerivedFromDataToken
9191
*
9292
* Instances of mc_EdgeFindTokenSetV2_t are expected to be owned by

src/mc-fle2-payload-iev-v2.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -622,11 +622,12 @@ bool mc_FLE2IndexedEncryptedValueV2_parse(mc_FLE2IndexedEncryptedValueV2_t *iev,
622622
// Read each metadata element in buff
623623
for (uint32_t i = 0; i < iev->edge_count; i++) {
624624
_mongocrypt_buffer_t tmp_buf;
625+
const uint8_t *mbuf = NULL;
625626

626-
CHECK_AND_RETURN(mc_reader_read_buffer(&reader, &tmp_buf, kMetadataLen, status));
627-
CHECK_AND_RETURN(mc_FLE2TagAndEncryptedMetadataBlock_parse(&iev->metadata[i], &tmp_buf, status));
627+
CHECK_AND_RETURN(mc_reader_read_bytes(&reader, &mbuf, kMetadataLen, status));
628+
_mongocrypt_buffer_from_data(&tmp_buf, mbuf, kMetadataLen);
628629

629-
_mongocrypt_buffer_cleanup(&tmp_buf);
630+
CHECK_AND_RETURN(mc_FLE2TagAndEncryptedMetadataBlock_parse(&iev->metadata[i], &tmp_buf, status));
630631
}
631632

632633
return true;

src/mc-fle2-tag-and-encrypted-metadata-block-private.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,21 @@
1717
#ifndef MC_FLE2_TAG_AND_ENCRYPTED_METADATA_BLOCK_H
1818
#define MC_FLE2_TAG_AND_ENCRYPTED_METADATA_BLOCK_H
1919

20-
#include "mc-reader-private.h"
21-
#include "mc-writer-private.h"
22-
#include "mongocrypt-private.h"
20+
#include "mongocrypt-buffer-private.h"
2321

24-
#define kMetadataLen 96U // encCount(32) + tag(32) + encZeros(32)
22+
#define kFieldLen 32U
23+
#define kMetadataLen 96U // encryptedCount(32) + tag(32) + encryptedZeros(32)
2524

2625
typedef struct _mc_FLE2TagAndEncryptedMetadataBlock_t {
26+
// The contiguous metadata block buffer.
27+
_mongocrypt_buffer_t rawBlock;
28+
29+
// The following are unowned buffers that each points to a field in rawBlock.
2730
_mongocrypt_buffer_t encryptedCount;
2831
_mongocrypt_buffer_t tag;
2932
_mongocrypt_buffer_t encryptedZeros;
3033
} mc_FLE2TagAndEncryptedMetadataBlock_t;
3134

32-
#define kFieldLen 32U
33-
3435
void mc_FLE2TagAndEncryptedMetadataBlock_init(mc_FLE2TagAndEncryptedMetadataBlock_t *metadata);
3536

3637
void mc_FLE2TagAndEncryptedMetadataBlock_cleanup(mc_FLE2TagAndEncryptedMetadataBlock_t *metadata);

src/mc-fle2-tag-and-encrypted-metadata-block.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ void mc_FLE2TagAndEncryptedMetadataBlock_init(mc_FLE2TagAndEncryptedMetadataBloc
3333
void mc_FLE2TagAndEncryptedMetadataBlock_cleanup(mc_FLE2TagAndEncryptedMetadataBlock_t *metadata) {
3434
BSON_ASSERT_PARAM(metadata);
3535

36+
_mongocrypt_buffer_cleanup(&metadata->rawBlock);
3637
_mongocrypt_buffer_cleanup(&metadata->encryptedCount);
3738
_mongocrypt_buffer_cleanup(&metadata->tag);
3839
_mongocrypt_buffer_cleanup(&metadata->encryptedZeros);
@@ -54,11 +55,16 @@ bool mc_FLE2TagAndEncryptedMetadataBlock_parse(mc_FLE2TagAndEncryptedMetadataBlo
5455

5556
mc_FLE2TagAndEncryptedMetadataBlock_init(metadata);
5657

57-
CHECK_AND_RETURN(mc_reader_read_buffer(&reader, &metadata->encryptedCount, kFieldLen, status));
58+
CHECK_AND_RETURN(mc_reader_read_buffer(&reader, &metadata->rawBlock, kMetadataLen, status));
5859

59-
CHECK_AND_RETURN(mc_reader_read_buffer(&reader, &metadata->tag, kFieldLen, status));
60+
uint64_t offset = 0;
61+
_mongocrypt_buffer_from_data(&metadata->encryptedCount, metadata->rawBlock.data + offset, kFieldLen);
6062

61-
CHECK_AND_RETURN(mc_reader_read_buffer(&reader, &metadata->encryptedZeros, kFieldLen, status));
63+
offset += kFieldLen;
64+
_mongocrypt_buffer_from_data(&metadata->tag, metadata->rawBlock.data + offset, kFieldLen);
65+
66+
offset += kFieldLen;
67+
_mongocrypt_buffer_from_data(&metadata->encryptedZeros, metadata->rawBlock.data + offset, kFieldLen);
6268

6369
return true;
6470
}
@@ -72,12 +78,7 @@ bool mc_FLE2TagAndEncryptedMetadataBlock_serialize(const mc_FLE2TagAndEncryptedM
7278
_mongocrypt_buffer_resize(buf, kMetadataLen);
7379
mc_writer_t writer;
7480
mc_writer_init_from_buffer(&writer, buf, __func__);
75-
76-
CHECK_AND_RETURN(mc_writer_write_buffer(&writer, &metadata->encryptedCount, kFieldLen, status));
77-
78-
CHECK_AND_RETURN(mc_writer_write_buffer(&writer, &metadata->tag, kFieldLen, status));
79-
80-
CHECK_AND_RETURN(mc_writer_write_buffer(&writer, &metadata->encryptedZeros, kFieldLen, status));
81+
CHECK_AND_RETURN(mc_writer_write_buffer(&writer, &metadata->rawBlock, kMetadataLen, status));
8182

8283
return true;
8384
}
@@ -92,6 +93,7 @@ bool mc_FLE2TagAndEncryptedMetadataBlock_serialize(const mc_FLE2TagAndEncryptedM
9293

9394
bool mc_FLE2TagAndEncryptedMetadataBlock_validate(const mc_FLE2TagAndEncryptedMetadataBlock_t *metadata,
9495
mongocrypt_status_t *status) {
96+
CHECK(metadata->rawBlock.len == kMetadataLen, "Length of metadata block was unexpected");
9597
CHECK(metadata->encryptedCount.len == kFieldLen, "Length of encrypted count was unexpected");
9698
CHECK(metadata->tag.len == kFieldLen, "Length of tag was unexpected");
9799
CHECK(metadata->encryptedZeros.len == kFieldLen, "Length of encrypted zeros was unexpected");

0 commit comments

Comments
 (0)