Skip to content

Commit 1ae37ee

Browse files
author
sunqian
committed
1.添加工程文件
1 parent 7a6c9d8 commit 1ae37ee

File tree

5 files changed

+432
-0
lines changed

5 files changed

+432
-0
lines changed

Makefile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CC = gcc
2+
CFLAGS = -Wall -g -O0
3+
LIB = -lmactoll_lltomac -L.
4+
extractbpi:extractbpi.c
5+
$(CC) $(CFLAGS) $^ -o $@ $(LIB)
6+
7+
clean:
8+
$(RM) extractbpi .*.sw?

extractbpi

23.2 KB
Binary file not shown.

extractbpi.c

+327
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,327 @@
1+
2+
3+
#include "extractbpi.h"
4+
5+
#define NDEBUG
6+
7+
#undef pr_debug
8+
9+
#ifdef NDEBUG
10+
11+
#define pr_debug(fmt, args...)
12+
13+
#else
14+
15+
#define pr_debug(fmt, args...) fprintf(stderr, fmt, ## args)
16+
17+
#endif
18+
19+
20+
int main(void)
21+
{
22+
__uint64_t num,sum = 0;
23+
__uint64_t num_start, num_stop;
24+
char mac_start[userinputlen] = "\0";
25+
char mac_stop[userinputlen] = "\0";
26+
char mac_cur[userinputlen] = "\0";
27+
char inputcer[filenamelen] = "\0";
28+
char inputprv[filenamelen] = "\0";
29+
char outputbat[filenamelen] = "\0";
30+
//输入MAC范围
31+
getmac(mac_start, mac_stop);
32+
33+
//校验MAC范围和源文件数量
34+
num_start = mactoll(mac_start);
35+
num_stop = mactoll(mac_stop);
36+
if(-1 == verify_input(indir_private, num_stop - num_start))
37+
{
38+
exit(EXIT_FAILURE);
39+
}
40+
41+
42+
if(2 != calc_file_num(indir_public))
43+
{
44+
printf("Error: Files in %s is more/less than 2 !", indir_public);
45+
exit(EXIT_FAILURE);
46+
}
47+
48+
if(-1 == verify_output(outdir))
49+
{
50+
exit(EXIT_FAILURE);
51+
}
52+
53+
system("clear");
54+
for(num = num_start; num <= num_stop; ++num)
55+
{
56+
bzero(mac_cur, sizeof(mac_cur));
57+
lltomac(num, mac_cur);
58+
59+
sprintf(inputcer, "%s/%s%s",indir_private, mac_cur, suffix_cer);
60+
sprintf(inputprv, "%s/%s%s",indir_private, mac_cur, suffix_prv);
61+
sprintf(outputbat, "%s/%s%s",outdir, mac_cur, suffix_bat);
62+
63+
extract(inputcer, inputprv,
64+
inputpubcer, inputpubbin,
65+
outputbat, num);
66+
fprintf(stderr, "Complete: %s.bat\n",mac_cur);
67+
++sum;
68+
}
69+
printf("====== %lld files Complete Down! ======\n",sum);
70+
71+
return 0;
72+
}
73+
74+
75+
//检查输出文件夹是否为空
76+
int verify_output(char *dir)
77+
{
78+
79+
char isgo[userinputlen];
80+
if (0 != calc_file_num(dir))
81+
{
82+
printf("Warning: Out directory is not empty,\
83+
If there is a file have the same name, all of them will be covered!\n\
84+
Are you sure go on?[y/n]");
85+
86+
while(getchar() != '\n');
87+
scanf("%s",isgo);
88+
if (0 == strcmp(isgo, "y"))
89+
{
90+
return 1;
91+
}
92+
else
93+
{
94+
printf("Your choice is [%s],Program exits now!\n",isgo);
95+
return -1;
96+
}
97+
}
98+
else
99+
{
100+
return 1;
101+
}
102+
103+
}
104+
int verify_input(char *dir, __uint64_t num)
105+
{
106+
__uint64_t file_num = calc_file_num(dir);
107+
char isgo[userinputlen];
108+
109+
110+
if(num+1 > file_num/2)
111+
{
112+
printf("Error:The scope of your input MAC is %lld ,but only %lld files already searched,\
113+
Please check your input MAC or files in directory \"files\"!\n",
114+
num+1, file_num);
115+
return -1;
116+
}
117+
else if(num+1 < file_num/2)
118+
{
119+
120+
printf("Warning: The scope of your input MAC is %lld ,but %lld files already searched,\
121+
Make sure to extract only your input MAC ?[y/n]",
122+
num+1, file_num);
123+
while(getchar() != '\n');
124+
scanf("%s",isgo);
125+
if (0 == strcmp(isgo, "y"))
126+
{
127+
return 1;
128+
}
129+
else
130+
{
131+
printf("Your choice is [%s],Program exits now!\n",isgo);
132+
return -1;
133+
}
134+
}
135+
else
136+
{
137+
return 1;
138+
}
139+
}
140+
141+
//统计文件夹内的文件数量
142+
__uint64_t calc_file_num(char * dir)
143+
{
144+
145+
DIR * dir_pointer;
146+
147+
struct dirent * p_dir;
148+
dir_pointer = opendir(dir);
149+
__uint64_t file_num = 0;
150+
151+
if(NULL == dir_pointer)
152+
{
153+
printf("open %s failed,No such file or directory\n", dir);
154+
exit(EXIT_FAILURE);
155+
}
156+
157+
while(NULL != (p_dir = readdir(dir_pointer)))
158+
{
159+
//过滤 .. 和 . (p_dir->d_type是4)
160+
if(8 == p_dir->d_type)
161+
{
162+
//printf("%s\n",p_dir->d_name);
163+
++file_num;
164+
}
165+
}
166+
167+
closedir(dir_pointer);
168+
return file_num;
169+
170+
}
171+
172+
//让用户输入起止MAC
173+
void getmac(char * mac_start, char * mac_stop)
174+
{
175+
176+
int isloop = 0;
177+
__uint64_t num;
178+
system("clear");
179+
do
180+
{
181+
printf("Please Input Start MAC[00-00-00-00-00-00]:");
182+
scanf("%s", mac_start);
183+
num = mactoll(mac_start);
184+
if(num <= 0 || num >= 0XFFFFFFFFFFFF)
185+
{
186+
printf("Input MacAddress Error!\n");
187+
isloop = 1;
188+
}
189+
else
190+
{
191+
isloop = 0;
192+
}
193+
}
194+
while(isloop);
195+
196+
do
197+
{
198+
printf("Please Input Stop MAC[00-00-00-00-00-00]:");
199+
scanf("%s", mac_stop);
200+
num = mactoll(mac_stop);
201+
if(num <= 0 || num >= 0XFFFFFFFFFFFF)
202+
{
203+
printf("Input MacAddress Error!\n");
204+
isloop = 1;
205+
}
206+
else
207+
{
208+
isloop = 0;
209+
}
210+
}
211+
while(isloop);
212+
213+
}
214+
215+
//提取文件
216+
void extract(char * file_cer, char * file_prv,
217+
char * file_pubcer, char * file_pubbin,
218+
char * file_bat, __uint64_t macnum)
219+
{
220+
FILE * read_cer, *read_prv, *read_pubcer, *read_pubbin, *write_bat;
221+
char a;
222+
223+
224+
read_cer = fopen(file_cer, "r");
225+
if(read_cer == NULL)
226+
{
227+
printf("open %s failed,No such file or directory\n", file_cer);
228+
exit(EXIT_FAILURE);
229+
}
230+
231+
read_prv = fopen(file_prv, "r");
232+
if(read_prv == NULL)
233+
{
234+
printf("open %s failed,No such file or directory\n", file_prv);
235+
exit(EXIT_FAILURE);
236+
}
237+
238+
read_pubcer = fopen(file_pubcer, "r");
239+
if(read_prv == NULL)
240+
{
241+
printf("open %s failed,No such file or directory\n", file_pubcer);
242+
exit(EXIT_FAILURE);
243+
}
244+
245+
read_pubbin = fopen(file_pubbin, "r");
246+
if(read_prv == NULL)
247+
{
248+
printf("open %s failed,No such file or directory\n", file_pubbin);
249+
exit(EXIT_FAILURE);
250+
}
251+
252+
write_bat = fopen(file_bat, "w");
253+
if(write_bat == NULL)
254+
{
255+
printf("open %s failed,No such file or directory\n", file_bat);
256+
exit(EXIT_FAILURE);
257+
}
258+
259+
/********** enable factory mode **********/
260+
fprintf(write_bat, "%s\n", echo_enable);
261+
fprintf(write_bat, "%s\n", cdPvtMibEnableKeyValue);
262+
fprintf(write_bat, "%s\n", cmFactOperMode);
263+
fprintf(write_bat, "%s\n", cdPrivateMibEnable);
264+
265+
/********** Set DOCSIS Private Key **********/
266+
fprintf(write_bat, "\n%s\n", echo_set);
267+
fprintf(write_bat, "%s ", cmBpiPlusCmCertificate);
268+
while(fscanf(read_cer, "%c", &a) != EOF)
269+
{ //cmBpiPlusCmCertificate
270+
pr_debug("%02X\n",a);
271+
fprintf(write_bat, "%02X", a & 0xFF); //清除高位,保留最低位的一个字节
272+
273+
}
274+
275+
fprintf(write_bat, "\n%s ", cmBpiPrivateKey);
276+
while(fscanf(read_prv, "%c", &a) != EOF)
277+
{ //cmBpiPrivateKey
278+
fprintf(write_bat, "%02X", a & 0xFF);
279+
280+
}
281+
282+
fprintf(write_bat, "\n%s ", cmBpiPublicKey);
283+
fseek(read_cer, start_bytes - 1, SEEK_SET);
284+
pr_debug("[sun]==========%ld\n", ftell(read_cer));
285+
while(fscanf(read_cer, "%c", &a) != EOF)
286+
{ //cmBpiPublicKey
287+
if(ftell(read_cer) > stop_bytes)
288+
{
289+
break;
290+
}
291+
292+
fprintf(write_bat, "%02X", a & 0xFF);
293+
294+
}
295+
296+
fprintf(write_bat, "\n%s ", cmBpiPlusCaCertificate);
297+
while(fscanf(read_pubcer, "%c", &a) != EOF)
298+
{ //cmBpiPlusCaCertificate
299+
fprintf(write_bat, "%02X", a & 0xFF);
300+
301+
}
302+
303+
fprintf(write_bat, "\n%s ", cmBpiPlusRootPublicKey);
304+
while(fscanf(read_pubbin, "%c", &a) != EOF)
305+
{ //cmBpiPlusRootPublicKey
306+
fprintf(write_bat, "%02X", a & 0xFF);
307+
308+
}
309+
310+
fprintf(write_bat, "\n%s %llX", cdMacAddress, macnum);
311+
fprintf(write_bat, "\n");
312+
313+
/********** Commit **********/
314+
fprintf(write_bat, "\n%s\n", echo_Commit);
315+
fprintf(write_bat, "%s\n", Commit_cmFactOperMode);
316+
fprintf(write_bat, "%s\n", Commit_cdPrivateMibEnable);
317+
fprintf(write_bat, "%s", Commit_cdFactCommitSettings);
318+
319+
320+
fclose(read_cer);
321+
fclose(read_prv);
322+
fclose(read_pubcer);
323+
fclose(read_pubbin);
324+
fclose(write_bat);
325+
}
326+
327+

0 commit comments

Comments
 (0)