blob: ae10a5f7dd5af4cca1b784f6acecf5f5867eb542 [file] [log] [blame]
Meki Cherkaouib0365a72012-02-18 00:59:57 -08001// JavaScript Document
2/*
3 @author: Meki Cherkaoui
4*/
5var DTAGS = require('./TAG').d;
6var TT = require('./TAG').tt;
7
8
9var ContentObjectEncoder = function ContentObjectEncoder(){
10
11
12};
13
14
15/*
16 TT bits specify the type of nodes
17
18*/
19var CCN_TT_BITS=3;
20var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
21var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
22var CCN_TT_HBIT=((1 << 7));
23
24Encoder.prototype.encodeContentObject = function(_ContentObject){
25
26 //var slit = function splitNumber(number){
27 //};
28
29 /*
30 * returns an integer
31 */
32 var encodeTypeAndVal = function(itype, lvalue, bstream) {
33 /*
34 We exploit the fact that encoding is done from the right, so this actually means
35 there is a deterministic encoding from a long to a Type/Value pair:
36
37 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
38 |ABCD.EFGH|IJKL.MNOP|QRST.UVWX|YZ01.2345|6789.abcd|efgh.ijkl|mnop.qrst|uvwx.yz@#
39
40 60> 53> 46> 39> 32> 25> 18> 11> 4>
41 |_000.ABCD|_EFG.HIJK|_LMN.OPQR|_STU.VWXY|_Z01.2345|_678.9abc|_defg.hij|_klm.nopq|_rst.uvwx|_yz@#___
42
43 What we want to do is compute the result in MSB order and write it directly
44 to the channel without any intermediate form.
45 */
46
47 var bits;
48 var count = 0;
49
50 // once we start writing bits, we keep writing bits even if they are "0"
51 var writing = false;
52
53 // a few heuristic to catch the small-bit length patterns
54 if( value < 0 || value > 15 ) {
55 int start = 60;
56 if( 0 <= value ) {
57 if( value < bits_11 )
58 start = 4;
59 else if( value < bits_18 )
60 start = 11;
61 else if( value < bits_32 )
62 start = 25;
63 }
64
65 for( var i = start; i >= 4; i -= 7) {
66 bits = (int) (value >>> i) & BinaryXMLCodec.XML_REG_VAL_MASK;
67 if( bits != 0 || writing ) {
68 ostream.write(bits);
69 count++;
70 writing = true;
71 }
72 }
73 }
74 };
75
76 var addToBuffer = function addToBuffer(buffer,number,tt){
77
78
79 var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
80
81
82
83 splitNumbers = new Buffer(sizeOfBuffer);
84
85 number >>= 7-CCN_TT_BITS;
86
87 splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
88 ((number & CCN_MAX_TINY) << CCN_TT_BITS) |
89 (CCN_TT_MASK & tt));
90
91 var index = 1;
92 while(number>0){
93 splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
94 index++;
95 number>>=7;
96 }
97
98 for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
99
100 buffer[index+i] = splitNumbers[j];
101 }
102
103 };
104 //NOTE NUMBETR= SIZE
105 var addToBufferData = function addToBuffer(buffer,data,tt){
106
107 var number = sizeof(data);
108 var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
109
110 splitNumbers = new Buffer(sizeOfBuffer);
111
112 number >>= 7-CCN_TT_BITS;
113
114 splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
115 ((number & CCN_MAX_TINY) << CCN_TT_BITS) |
116 (CCN_TT_MASK & tt));
117
118
119 while(number>0){
120 splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
121 index++;
122 number>>=7;
123 }
124
125 for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
126
127 buffer[index+i] = splitNumbers[j];
128 }
129
130 for(i=0;i<10;i++){
131 buffer[index+i] = data[i];
132 }
133
134 };
135
136 //NOTE NUMBETR= SIZE
137 var addName = function addToBuffer(buffer,name){
138
139 for(i=0;i<name.size;i++){
140 tt = require('./TAG').tt.CCN_BLOB ;
141 addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
142 addCloseTag(buffer);
143 }
144
145 };
146
147
148 var addCloseTag = function addCloseTag(buffer){
149 var tag = DTAGS.CCN_CLOSE;
150 buffer.write(tag);
151 };
152
153 var buffer = new Buffer(1000);
154
155 var tag = DTAGS.CCN_DTAG_ContentObject;
156 var tt = TT.CCN_DTAG ;
157 addToBuffer(buffer,tag,tt);
158
159
160 tag = DTAGS.CCN_Signature;
161 tt = TT.CCN_DTAG ;
162 addToBuffer(buffer,tag,tt);
163
164
165 tag = DTAGS.CCN_SignatureBits;
166 tt = TT.CCN_DTAG ;
167 addToBuffer(buffer,tag,tt);
168
169 tt = TT.CCN_BLOB ;
170 addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
171
172 addCloseTag(buffer);
173
174 addCloseTag(buffer);
175
176 tag = DTAGS.CCN_Name;
177 tt = TT.CCN_DTAG ;
178 addToBuffer(buffer,tag,tt);
179
180
181 addName(buffer,_ContentObject.moName,tt);
182
183 addCloseTag(buffer);
184
185 tag = DTAGS.CCN_DTAG_SignedInfo;
186 tt = TT.CCN_DTAG ;
187 addToBuffer(buffer,tag,tt);
188
189 tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
190 tt = TT.CCN_DTAG ;
191 addToBuffer(buffer,tag,tt);
192
193 addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
194
195 addCloseTag(buffer);
196
197 tag = DTAGS.CCN_DTAG_Timestamp;
198 tt = TT.CCN_DTAG ;
199 addToBuffer(buffer,tag,tt);
200
201 addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
202
203 addCloseTag(buffer);
204
205 tag = DTAGS.CCN_DTAG_KeyLocator;
206 tt = TT.CCN_DTAG ;
207 addToBuffer(buffer,tag,tt);
208
209 tag = DTAGS.CCN_DTAG_key;
210 tt = TT.CCN_DTAG ;
211 addToBuffer(buffer,tag,tt);
212
213 addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
214
215 addCloseTag(buffer);
216
217 addCloseTag(buffer);
218
219 tag = DTAGS.CCN_DTAG_Content;
220 tt = TT.CCN_DTAG ;
221 addToBuffer(buffer,tag,tt);
222
223 addToBufferData(buffer,_ContentObject.msContent,tt);
224
225 addCloseTag(buffer);
226
227 addCloseTag(buffer);
228
229}
230
231
232Encoder.prototype.encodeContentObjectToFile = function(_filename){
233
234
235 var content = "hello world";
236
237 var name = new require('./Name').Name(['hello']);
238
239 var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
240
241 var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
242
243 sig.generateSignature(name,sigInfo,content);
244
245 var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
246
247 var buffer = this.encodeContentObject(co);
248
249 fs.writeFile(_filename);
250
251
252}
253
254
255var co = new ContentObjectEncoder();
256
257
258var file = ContentObjectEncoder.decodeFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
259
260