aboutsummaryrefslogtreecommitdiff
path: root/src/gen/seed.c
blob: ad56b18eb46c6fad2cd31d0b00bab15b3b102385 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 * ecgen, tool for generating Elliptic curve domain parameters
 * Copyright (C) 2017 J08nY
 */

#include "seed.h"
#include <misc/types.h>
#include "util/bits.h"
#include "util/memory.h"

seed_t *seed_new(void) { return try_calloc(sizeof(seed_t)); }

seed_t *seed_copy(const seed_t *src, seed_t *dest) {
	if (src->seed) {
		dest->seed = bits_copy(src->seed);
	}
	if (src->hash20) {
		dest->hash20 = try_memdup(src->hash20, 20);
	}
	return dest;
}

seed_t *seed_new_copy(const seed_t *src) {
	seed_t *result = seed_new();
	return seed_copy(src, result);
}

seed_t *seed_clone(const seed_t *src, seed_t *dest) {
	return seed_copy(src, dest);
}

seed_t *seed_new_clone(const seed_t *src) {
	seed_t *result = seed_new();
	return seed_clone(src, result);
}

void seed_free(seed_t **seed) {
	if (*seed) {
		bits_free(&(*seed)->seed);
		if ((*seed)->hash20) {
			try_free((*seed)->hash20);
		}
		switch ((*seed)->type) {
			case SEED_ANSI:
				break;
			case SEED_BRAINPOOL:
			case SEED_BRAINPOOL_RFC:
				bits_free(&(*seed)->brainpool.seed_a);
				bits_free(&(*seed)->brainpool.seed_b);
				break;
			case SEED_FIPS:
				break;
			case SEED_NONE:
				break;
		}
		try_free(*seed);
		*seed = NULL;
	}
}

UNROLL(seed_unroll) {
	seed_free(&curve->seed);
	return -1;
}