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>
This commit is contained in:
William Casarin
2023-12-27 14:54:43 -08:00
committed by Daniel D’Aquino
parent 1b09e9458c
commit c3b06d281e
2 changed files with 42 additions and 22 deletions

View File

@@ -216,31 +216,31 @@ int parse_nostr_bech32_buffer(struct cursor *cur,
switch (obj->type) { switch (obj->type) {
case NOSTR_BECH32_NOTE: case NOSTR_BECH32_NOTE:
if (!parse_nostr_bech32_note(cur, &obj->data.note)) if (!parse_nostr_bech32_note(cur, &obj->note))
return 0; return 0;
break; break;
case NOSTR_BECH32_NPUB: case NOSTR_BECH32_NPUB:
if (!parse_nostr_bech32_npub(cur, &obj->data.npub)) if (!parse_nostr_bech32_npub(cur, &obj->npub))
return 0; return 0;
break; break;
case NOSTR_BECH32_NSEC: case NOSTR_BECH32_NSEC:
if (!parse_nostr_bech32_nsec(cur, &obj->data.nsec)) if (!parse_nostr_bech32_nsec(cur, &obj->nsec))
return 0; return 0;
break; break;
case NOSTR_BECH32_NEVENT: case NOSTR_BECH32_NEVENT:
if (!parse_nostr_bech32_nevent(cur, &obj->data.nevent)) if (!parse_nostr_bech32_nevent(cur, &obj->nevent))
return 0; return 0;
break; break;
case NOSTR_BECH32_NADDR: case NOSTR_BECH32_NADDR:
if (!parse_nostr_bech32_naddr(cur, &obj->data.naddr)) if (!parse_nostr_bech32_naddr(cur, &obj->naddr))
return 0; return 0;
break; break;
case NOSTR_BECH32_NPROFILE: case NOSTR_BECH32_NPROFILE:
if (!parse_nostr_bech32_nprofile(cur, &obj->data.nprofile)) if (!parse_nostr_bech32_nprofile(cur, &obj->nprofile))
return 0; return 0;
break; break;
case NOSTR_BECH32_NRELAY: case NOSTR_BECH32_NRELAY:
if (!parse_nostr_bech32_nrelay(cur, &obj->data.nrelay)) if (!parse_nostr_bech32_nrelay(cur, &obj->nrelay))
return 0; return 0;
break; break;
} }
@@ -248,36 +248,52 @@ int parse_nostr_bech32_buffer(struct cursor *cur,
return 1; 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; return 0;
if (!consume_until_non_alphanumeric(bech32, 1)) if (!consume_until_non_alphanumeric(bech32, 1))
return 0; return 0;
return 1; return 1;
}
/*
*parsed_len = bech32->p - start;
// some random sanity checking int parse_nostr_bech32(unsigned char *buf, int buflen,
if (*parsed_len < 10 || *parsed_len > 10000) 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; return 0;
const char u5[*parsed_len]; parsed_len = bech32.p - start;
// some random sanity checking
if (parsed_len < 10 || parsed_len > 10000)
return 0;
unsigned char u5[parsed_len];
char prefix[MAX_PREFIX];
if (bech32_decode_len(prefix, u5, &u5_out_len, (const char*)start, 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; 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 0;
*/
return 1; return parse_nostr_bech32_buffer(&cur, type, obj);
} }

View File

@@ -73,16 +73,20 @@ struct nostr_bech32 {
struct bech32_nprofile nprofile; struct bech32_nprofile nprofile;
struct bech32_naddr naddr; struct bech32_naddr naddr;
struct bech32_nrelay nrelay; 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_type(const char *prefix, enum nostr_bech32_type *type);
int parse_nostr_bech32_buffer(struct cursor *cur, enum nostr_bech32_type type, int parse_nostr_bech32_buffer(struct cursor *cur, enum nostr_bech32_type type,
struct nostr_bech32 *obj); 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, int parse_nostr_bech32(const char *bech32, size_t input_len,
unsigned char *outbuf, size_t outlen, unsigned char *outbuf, size_t outlen,