damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit c3b06d281ecefa5b8da81d37e373c31c9024b6b1
parent 1b09e9458c6107a1afccdd4b68afc2ed79baee34
Author: William Casarin <jb55@jb55.com>
Date:   Wed, 27 Dec 2023 14:54:43 -0800

nostrdb/bech32: add some initial tests

since we modified this recently, let's add some tests to make sure
we didn't break anything

Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mnostrdb/src/nostr_bech32.c | 54+++++++++++++++++++++++++++++++++++-------------------
Mnostrdb/src/nostr_bech32.h | 8++++++--
2 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/nostrdb/src/nostr_bech32.c b/nostrdb/src/nostr_bech32.c @@ -216,31 +216,31 @@ int parse_nostr_bech32_buffer(struct cursor *cur, switch (obj->type) { case NOSTR_BECH32_NOTE: - if (!parse_nostr_bech32_note(cur, &obj->data.note)) + if (!parse_nostr_bech32_note(cur, &obj->note)) return 0; break; case NOSTR_BECH32_NPUB: - if (!parse_nostr_bech32_npub(cur, &obj->data.npub)) + if (!parse_nostr_bech32_npub(cur, &obj->npub)) return 0; break; case NOSTR_BECH32_NSEC: - if (!parse_nostr_bech32_nsec(cur, &obj->data.nsec)) + if (!parse_nostr_bech32_nsec(cur, &obj->nsec)) return 0; break; case NOSTR_BECH32_NEVENT: - if (!parse_nostr_bech32_nevent(cur, &obj->data.nevent)) + if (!parse_nostr_bech32_nevent(cur, &obj->nevent)) return 0; break; case NOSTR_BECH32_NADDR: - if (!parse_nostr_bech32_naddr(cur, &obj->data.naddr)) + if (!parse_nostr_bech32_naddr(cur, &obj->naddr)) return 0; break; case NOSTR_BECH32_NPROFILE: - if (!parse_nostr_bech32_nprofile(cur, &obj->data.nprofile)) + if (!parse_nostr_bech32_nprofile(cur, &obj->nprofile)) return 0; break; case NOSTR_BECH32_NRELAY: - if (!parse_nostr_bech32_nrelay(cur, &obj->data.nrelay)) + if (!parse_nostr_bech32_nrelay(cur, &obj->nrelay)) return 0; break; } @@ -248,36 +248,52 @@ int parse_nostr_bech32_buffer(struct cursor *cur, return 1; } -int parse_nostr_bech32_str(struct cursor *bech32) { - enum nostr_bech32_type type; - - if (!parse_nostr_bech32_type((const char *)bech32->p, &type)) + +int parse_nostr_bech32_str(struct cursor *bech32, enum nostr_bech32_type *type) { + if (!parse_nostr_bech32_type((const char *)bech32->p, type)) return 0; if (!consume_until_non_alphanumeric(bech32, 1)) return 0; return 1; +} + - /* - *parsed_len = bech32->p - start; +int parse_nostr_bech32(unsigned char *buf, int buflen, + const char *bech32_str, size_t bech32_len, + struct nostr_bech32 *obj) { + unsigned char *start; + size_t parsed_len, u5_out_len, u8_out_len; + enum nostr_bech32_type type; + static const int MAX_PREFIX = 8; + struct cursor cur, bech32; + + make_cursor(buf, buf + buflen, &cur); + make_cursor((unsigned char*)bech32_str, (unsigned char*)bech32_str + bech32_len, &bech32); + + start = bech32.p; + if (!parse_nostr_bech32_str(&bech32, &type)) + return 0; + + parsed_len = bech32.p - start; // some random sanity checking - if (*parsed_len < 10 || *parsed_len > 10000) + if (parsed_len < 10 || parsed_len > 10000) return 0; - const char u5[*parsed_len]; + unsigned char u5[parsed_len]; + char prefix[MAX_PREFIX]; if (bech32_decode_len(prefix, u5, &u5_out_len, (const char*)start, - *parsed_len, MAX_PREFIX) == BECH32_ENCODING_NONE) + parsed_len, MAX_PREFIX) == BECH32_ENCODING_NONE) { return 0; } - if (!parse_nostr_bech32_type(prefix, type)) + if (!bech32_convert_bits(cur.p, &u8_out_len, 8, u5, u5_out_len, 5, 0)) return 0; - */ - return 1; + return parse_nostr_bech32_buffer(&cur, type, obj); } diff --git a/nostrdb/src/nostr_bech32.h b/nostrdb/src/nostr_bech32.h @@ -73,16 +73,20 @@ struct nostr_bech32 { struct bech32_nprofile nprofile; struct bech32_naddr naddr; struct bech32_nrelay nrelay; - } data; + }; }; -int parse_nostr_bech32_str(struct cursor *bech32); +int parse_nostr_bech32_str(struct cursor *bech32, enum nostr_bech32_type *type); int parse_nostr_bech32_type(const char *prefix, enum nostr_bech32_type *type); int parse_nostr_bech32_buffer(struct cursor *cur, enum nostr_bech32_type type, struct nostr_bech32 *obj); +int parse_nostr_bech32(unsigned char *buf, int buflen, + const char *bech32_str, size_t bech32_len, + struct nostr_bech32 *obj); + /* int parse_nostr_bech32(const char *bech32, size_t input_len, unsigned char *outbuf, size_t outlen,