blob: ba909342b51b390b0975998d10d4f43c9b450d75 [file] [log] [blame]
Meki Cherkaouib0365a72012-02-18 00:59:57 -08001// JavaScript Document
2/*
3 InterestMessageEncoder is used to convert XML Interest Message into Binary Interest Message.
4 @author: Meki Cherkaoui
5
6*/
7var DTAGS = require('./TAG').d;
8var TT = require('./TAG').tt;
9
10
11/*
12 Constructor for the IME
13*/
14var InterestMessageEncoder = function InterestMessageEncoder(){
15
16
17};
18
19/*
20 TT bits specify the type of nodes
21
22*/
23var CCN_TT_BITS=3;
24var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
25var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
26var CCN_TT_HBIT=((1 << 7));
27
28
29/*
30 Encode function takes in a content object and returs a buffer containing the whole binary encoding.
31
32*/
33Encoder.prototype.encodeContentObject = function(_ContentObject){
34
35
36 var i = 0;
37
38
39
40 /*
41 This function will add a Tag to the buffer
42 The number is the dtag number and tt is the tag type
43 http://www.ccnx.org/documentation/protocol/ccnx-protocol-2/ccnx-binary-encoding-ccnb/
44
45 */
46 var addTagToBuffer = function(buffer,number,tt){
47
48 var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
49
50 splitNumbers = new Buffer(sizeOfBuffer);
51
52 number >>= 7-CCN_TT_BITS;
53
54 splitNumbers.write((CCN_TT_HBIT & DTAGS.CCN_CLOSE) |
55 ((number & CCN_MAX_TINY) << CCN_TT_BITS) |
56 (CCN_TT_MASK & tt));
57
58 var index = 1;
59 while(number>0){
60 splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
61 index++;
62 number>>=7;
63 }
64
65 for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
66
67 buffer.write(splitNumbers[j]);
68 }
69
70 };
71
72 //NOTE NUMBETR= SIZE
73 var addToBuffer = function(buffer,data,tt){
74
75 var number = sizeof(data);
76 var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
77
78 splitNumbers = new Buffer(sizeOfBuffer);
79
80 number >>= 7-CCN_TT_BITS;
81
82 splitNumbers.write((CCN_TT_HBIT & ~DTAGS.CCN_CLOSE) |
83 ((number & CCN_MAX_TINY) << CCN_TT_BITS) |
84 (CCN_TT_MASK & tt));
85
86
87 while(number>0){
88 splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
89 index++;
90 number>>=7;
91 }
92
93 for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
94
95 buffer[index+i] = splitNumbers[j];
96 }
97
98 for(i=0;i<data.length;i++){
99 buffer[index+i] = data[i];
100 }
101
102 };
103
104
105 /*
106 Add tag to buffer:
107
108
109 */
110 var addName = function(buffer,name){
111
112 for(i=0;i<name.size;i++){
113 tt = require('./TAG').tt.CCN_BLOB ;
114 addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
115 addCloseTag(buffer);
116 }
117
118 };
119
120
121 var addCloseTag = function(buffer){
122 var tag = DTAGS.CCN_CLOSE;
123 buffer.write(tag);
124 };
125
126 var buffer = new Buffer(1000);
127
128 var tag = DTAGS.CCN_DTAG_ContentObject;
129 var tt = TT.CCN_DTAG ;
130 addToBuffer(buffer,tag,tt);
131
132
133 tag = DTAGS.CCN_Signature;
134 tt = TT.CCN_DTAG ;
135 addToBuffer(buffer,tag,tt);
136
137
138 tag = DTAGS.CCN_SignatureBits;
139 tt = TT.CCN_DTAG ;
140 addToBuffer(buffer,tag,tt);
141
142 tt = TT.CCN_BLOB ;
143 addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
144
145 addCloseTag(buffer);
146
147 addCloseTag(buffer);
148
149 tag = DTAGS.CCN_Name;
150 tt = TT.CCN_DTAG ;
151 addToBuffer(buffer,tag,tt);
152
153
154 addName(buffer,_ContentObject.moName,tt);
155
156 addCloseTag(buffer);
157
158 tag = DTAGS.CCN_DTAG_SignedInfo;
159 tt = TT.CCN_DTAG ;
160 addToBuffer(buffer,tag,tt);
161
162 tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
163 tt = TT.CCN_DTAG ;
164 addToBuffer(buffer,tag,tt);
165
166 addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
167
168 addCloseTag(buffer);
169
170 tag = DTAGS.CCN_DTAG_Timestamp;
171 tt = TT.CCN_DTAG ;
172 addToBuffer(buffer,tag,tt);
173
174 addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
175
176 addCloseTag(buffer);
177
178 tag = DTAGS.CCN_DTAG_KeyLocator;
179 tt = TT.CCN_DTAG ;
180 addToBuffer(buffer,tag,tt);
181
182 tag = DTAGS.CCN_DTAG_key;
183 tt = TT.CCN_DTAG ;
184 addToBuffer(buffer,tag,tt);
185
186 addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
187
188 addCloseTag(buffer);
189
190 addCloseTag(buffer);
191
192 tag = DTAGS.CCN_DTAG_Content;
193 tt = TT.CCN_DTAG ;
194 addToBuffer(buffer,tag,tt);
195
196 addToBufferData(buffer,_ContentObject.msContent,tt);
197
198 addCloseTag(buffer);
199
200 addCloseTag(buffer);
201
202
203 return buffer;
204}
205
206
207Encoder.prototype.encodeToFile = function(_filename){
208
209
210 var content = "hello world";
211
212 var name = new require('./Name').Name(['hello']);
213
214 var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
215
216 var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
217
218 sig.generateSignature(name,sigInfo,content);
219
220 var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
221
222 var buffer = this.encodeContentObject(co);
223
224 fs.writeFile(_filename);
225
226
227}
228
229
230var InterestMessageEncoder = new InterestMessageEncoder();
231
232var file = InterestMessageEncoder.encodeToFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
233
234