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