1231927Sadrian/*
2231927Sadrian *  Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
3231927Sadrian *
4231927Sadrian *  This program is free software; you can redistribute it and/or modify it
5231927Sadrian *  under the terms of the GNU General Public License version 2 as published
6231927Sadrian *  by the Free Software Foundation.
7231927Sadrian *
8231927Sadrian */
9231927Sadrian
10231927Sadrian#ifndef _BUFFALO_LIB_H
11231927Sadrian#define _BUFFALO_LIB_H
12231927Sadrian
13231927Sadrian#include <stdint.h>
14231927Sadrian
15231927Sadrian#define ARRAY_SIZE(_a)	(sizeof((_a)) / sizeof((_a)[0]))
16231927Sadrian#define BIT(_x)		(1UL << (_x))
17231927Sadrian
18231927Sadrian#define TAG_BRAND_LEN		32
19231927Sadrian#define TAG_PRODUCT_LEN		32
20231927Sadrian#define TAG_VERSION_LEN		8
21231927Sadrian#define TAG_REGION_LEN		2
22231927Sadrian#define TAG_LANGUAGE_LEN	8
23231927Sadrian#define TAG_PLATFORM_LEN	8
24231927Sadrian#define TAG_HWVER_LEN		4
25231927Sadrian#define TAG_HWVER_VAL_LEN	4
26231927Sadrian
27231927Sadrianstruct buffalo_tag {
28231927Sadrian	unsigned char	product[TAG_PRODUCT_LEN];
29231927Sadrian	unsigned char	brand[TAG_BRAND_LEN];
30231927Sadrian	unsigned char	ver_major[TAG_VERSION_LEN];
31231927Sadrian	unsigned char	ver_minor[TAG_VERSION_LEN];
32231927Sadrian	unsigned char	region_code[2];
33231927Sadrian	uint32_t	region_mask;
34231927Sadrian	unsigned char	unknown0[2];
35231927Sadrian	unsigned char	language[TAG_LANGUAGE_LEN];
36231927Sadrian	unsigned char	platform[TAG_PLATFORM_LEN];
37231927Sadrian	unsigned char	hwv[TAG_HWVER_LEN];
38231927Sadrian	unsigned char	hwv_val[TAG_HWVER_VAL_LEN];
39231927Sadrian	uint8_t		unknown1[24];
40231927Sadrian
41231927Sadrian	uint32_t	len;
42231927Sadrian	uint32_t	crc;
43231927Sadrian	uint32_t	base1;
44231927Sadrian	uint32_t	base2;
45231927Sadrian	uint32_t	data_len;
46231927Sadrian	uint8_t		flag;
47231927Sadrian	uint8_t		unknown2[3];
48231927Sadrian} __attribute ((packed));
49231927Sadrian
50231927Sadrianstruct buffalo_tag2 {
51231927Sadrian	unsigned char	product[TAG_PRODUCT_LEN];
52231927Sadrian	unsigned char	brand[TAG_BRAND_LEN];
53231927Sadrian	unsigned char	ver_major[TAG_VERSION_LEN];
54231927Sadrian	unsigned char	ver_minor[TAG_VERSION_LEN];
55231927Sadrian	unsigned char	region_code[2];
56231927Sadrian	uint32_t	region_mask;
57231927Sadrian	unsigned char	unknown0[2];
58231927Sadrian	unsigned char	language[TAG_LANGUAGE_LEN];
59231927Sadrian	unsigned char	platform[TAG_PLATFORM_LEN];
60231927Sadrian	unsigned char	hwv[TAG_HWVER_LEN];
61231927Sadrian	unsigned char	hwv_val[TAG_HWVER_VAL_LEN];
62231927Sadrian	uint8_t		unknown1[24];
63231927Sadrian
64231927Sadrian	uint32_t	total_len;
65231927Sadrian	uint32_t	crc;
66231927Sadrian	uint32_t	len1;
67231927Sadrian	uint32_t	len2;
68231927Sadrian	uint8_t		flag;
69231927Sadrian	uint8_t		unknown2[3];
70231927Sadrian} __attribute ((packed));
71231927Sadrian
72231927Sadrian#define ENC_PRODUCT_LEN		32
73231927Sadrian#define ENC_VERSION_LEN		8
74231927Sadrian#define ENC_MAGIC_LEN		6
75231927Sadrian
76231927Sadrianunsigned long enc_compute_header_len(char *product, char *version);
77231927Sadrianunsigned long enc_compute_buf_len(char *product, char *version,
78231927Sadrian				  unsigned long datalen);
79231927Sadrian
80231927Sadrianstruct enc_param {
81231927Sadrian	unsigned char *key;
82231927Sadrian	unsigned char magic[ENC_MAGIC_LEN];
83231927Sadrian	unsigned char product[ENC_PRODUCT_LEN];
84231927Sadrian	unsigned char version[ENC_VERSION_LEN];
85231927Sadrian	unsigned char seed;
86231927Sadrian	int longstate;
87231927Sadrian	unsigned datalen;
88231927Sadrian	uint32_t csum;
89231927Sadrian};
90231927Sadrian
91231927Sadrianint encrypt_buf(struct enc_param *ep, unsigned char *hdr,
92231927Sadrian	        unsigned char *data);
93231927Sadrianint decrypt_buf(struct enc_param *ep, unsigned char *data,
94231927Sadrian		unsigned long datalen);
95231927Sadrian
96231927Sadrian#define BCRYPT_DEFAULT_STATE_LEN	256
97231927Sadrian#define BCRYPT_MAX_KEYLEN		254
98231927Sadrian
99231927Sadrianstruct bcrypt_ctx {
100231927Sadrian	unsigned long i;
101231927Sadrian	unsigned long j;
102231927Sadrian	unsigned char *state;
103231927Sadrian	unsigned long state_len;
104231927Sadrian};
105231927Sadrian
106231927Sadrianint bcrypt_init(struct bcrypt_ctx *ctx, void *key, int keylen,
107231927Sadrian		unsigned long state_len);
108231927Sadrianint bcrypt_process(struct bcrypt_ctx *ctx, unsigned char *src,
109231927Sadrian		   unsigned char *dst, unsigned long len);
110231927Sadrianvoid bcrypt_finish(struct bcrypt_ctx *ctx);
111231927Sadrianint bcrypt_buf(unsigned char seed, unsigned char *key, unsigned char *src,
112231927Sadrian	       unsigned char *dst, unsigned long len, int longstate);
113231927Sadrian
114231927Sadrianuint32_t buffalo_csum(uint32_t csum, void *buf, unsigned long len);
115231927Sadrianuint32_t buffalo_crc(void *buf, unsigned long len);
116231927Sadrian
117231927Sadrianssize_t get_file_size(char *name);
118231927Sadrianint read_file_to_buf(char *name, void *buf, ssize_t buflen);
119231927Sadrianint write_buf_to_file(char *name, void *buf, ssize_t buflen);
120231927Sadrian
121231927Sadrian#endif /* _BUFFALO_LIB_H */
122231927Sadrian