Path: blob/main/contrib/libder/tests/test_pubkey.c
39478 views
/*-1* Copyright (c) 2024 Kyle Evans <[email protected]>2*3* SPDX-License-Identifier: BSD-2-Clause4*/56#include <sys/stat.h>78#include <assert.h>9#include <fcntl.h>10#include <inttypes.h>11#include <stdio.h>12#include <stdlib.h>13#include <string.h>14#include <unistd.h>1516#include <libder.h>1718#include "test_common.h"1920static const uint8_t oid_ecpubkey[] =21{ 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01 };22static const uint8_t oid_secp256k1[] =23{ 0x2b, 0x81, 0x04, 0x00, 0x0a };2425static const uint8_t pubdata[] = { 0x00, 0x04, 0xd1, 0x76, 0x20, 0x39, 0xe5, 0x3e,260x67, 0x7d, 0x8d, 0xfd, 0xc4, 0x21, 0x20, 0xcd, 0xb0, 0xbf, 0x47, 0x87, 0x6a,270xf8, 0x07, 0x73, 0xbe, 0xbe, 0xd5, 0xbb, 0x3c, 0xbc, 0x32, 0x93, 0xd9, 0xdf,280x96, 0x25, 0xb7, 0x0e, 0x3c, 0x55, 0x12, 0xee, 0x7a, 0x02, 0x39, 0x0f, 0xee,290x7b, 0xfe, 0x1a, 0x93, 0x76, 0xf7, 0xc2, 0xac, 0x05, 0xba, 0x9a, 0x83, 0x37,300xf5, 0xcd, 0x55, 0x57, 0x39, 0x6f };3132static void33test_interface(struct libder_object *root)34{35const uint8_t *data;36size_t datasz;37struct libder_object *keystring;3839keystring = libder_obj_child(root, 1);40assert(keystring != NULL);41assert(libder_obj_type_simple(keystring) == BT_BITSTRING);4243data = libder_obj_data(keystring, &datasz);44assert(datasz == sizeof(pubdata));45assert(memcmp(pubdata, data, datasz) == 0);46}4748/* buf and bufszs are just our reference */49static void50test_construction(struct libder_ctx*ctx, const uint8_t *buf, size_t bufsz)51{52uint8_t *out;53struct libder_object *obj, *params, *root;54struct libder_object *keystring;55size_t outsz;5657root = libder_obj_alloc_simple(ctx, BT_SEQUENCE, NULL, 0);58assert(root != NULL);5960params = libder_obj_alloc_simple(ctx, BT_SEQUENCE, NULL, 0);61assert(params != NULL);62assert(libder_obj_append(root, params));6364keystring = libder_obj_alloc_simple(ctx, BT_BITSTRING, pubdata, sizeof(pubdata));65assert(keystring != NULL);66assert(libder_obj_append(root, keystring));6768/* Now go back and build the two params, id and curve */69obj = libder_obj_alloc_simple(ctx, BT_OID, oid_ecpubkey, sizeof(oid_ecpubkey));70assert(obj != NULL);71assert(libder_obj_append(params, obj));7273obj = libder_obj_alloc_simple(ctx, BT_OID, oid_secp256k1, sizeof(oid_secp256k1));74assert(obj != NULL);75assert(libder_obj_append(params, obj));7677out = NULL;78outsz = 0;79out = libder_write(ctx, root, out, &outsz);80assert(out != NULL);81assert(outsz == bufsz);82assert(memcmp(out, buf, bufsz) == 0);8384libder_obj_free(root);85free(out);86}8788int89main(int argc, char *argv[])90{91struct stat sb;92struct libder_ctx *ctx;93struct libder_object *root;94uint8_t *buf, *out;95size_t bufsz, outsz, rootsz;96ssize_t readsz;97int dfd, error, fd;9899dfd = open_progdir(argv[0]);100101fd = openat(dfd, "repo.pub", O_RDONLY);102assert(fd >= 0);103104close(dfd);105dfd = -1;106107error = fstat(fd, &sb);108assert(error == 0);109110bufsz = sb.st_size;111buf = malloc(bufsz);112assert(buf != NULL);113114readsz = read(fd, buf, bufsz);115close(fd);116117assert(readsz == bufsz);118119ctx = libder_open();120rootsz = bufsz;121libder_set_verbose(ctx, 2);122root = libder_read(ctx, buf, &rootsz);123124assert(root != NULL);125assert(rootsz == bufsz);126127test_interface(root);128test_construction(ctx, buf, bufsz);129130outsz = 0;131out = NULL;132out = libder_write(ctx, root, out, &outsz);133assert(out != NULL);134assert(outsz == bufsz);135136assert(memcmp(buf, out, outsz) == 0);137138free(out);139free(buf);140libder_obj_free(root);141libder_close(ctx);142}143144145