aboutsummaryrefslogtreecommitdiffstats
path: root/libsecauth_format_spec.c
blob: 09fa600c4b6aa9ab422b4d6bc120f1b7fddfd585 (plain) (blame)
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
/* See LICENSE file for copyright and license details. */
#include "libsecauth.h"

#include <inttypes.h>
#include <stdio.h>
#include <string.h>


size_t
libsecauth_format_spec(struct libsecauth_spec *spec, char *buffer, size_t buffer_size)
{
	char client_rounds[sizeof("4294967295")];
	char server_rounds[sizeof("4294967295")];
	int i, expected_with_dollars;
	client_rounds[0] = '\0';
	server_rounds[0] = '\0';
	if (spec->client_rounds)
		sprintf(client_rounds, "%"PRIu32, spec->client_rounds);
	if (spec->server_rounds)
		sprintf(server_rounds, "%"PRIu32, spec->server_rounds);
	expected_with_dollars = spec->expected && strchr(spec->expected, '$');
	i = snprintf(buffer, buffer_size, "$secauth$%s%s%s$%s%s%s$%s$%s$%s%s%s$%s%s%s",
	             spec->prehash  ? "{$" : "", spec->prehash  ? spec->prehash  : "", spec->prehash  ? "$}" : "",
	             spec->xferhash ? "{$" : "", spec->xferhash ? spec->xferhash : "", spec->xferhash ? "$}" : "",
	             client_rounds, server_rounds,
	             spec->posthash ? "{$" : "", spec->posthash ? spec->posthash : "", spec->posthash ? "$}" : "",
	             expected_with_dollars ? "{$" : "", spec->expected ? spec->expected : "" , expected_with_dollars ? "$}" : "");
	return i > 0 ? (size_t)(i + 1) : 0;
}