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