blob: a5c843d48ee7fbe8537668a02ab197b773f5c6ab [file] [log] [blame]
// JavaScript Document
/*
InterestMessageEncoder is used to convert XML Interest Message into Binary Interest Message.
@author: Meki Cherkaoui
*/
var DTAGS = require('./TAG').d;
var TT = require('./TAG').tt;
/*
Constructor for the IME
*/
var InterestMessageEncoder = function InterestMessageEncoder(){
};
/*
TT bits specify the type of nodes
*/
var CCN_TT_BITS=3;
var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
var CCN_TT_HBIT=((1 << 7));
/*
Encode function takes in a content object and returs a buffer containing the whole binary encoding.
*/
InterestMessageEncoder.prototype.encodeContentObject = function(_InterestMessage){
var i = 0;
/*
This function will add a Tag to the buffer
The number is the dtag number and tt is the tag type
http://www.ccnx.org/documentation/protocol/ccnx-protocol-2/ccnx-binary-encoding-ccnb/
*/
var addTagToBuffer = function(buffer,number,tt){
var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
splitNumbers = new Buffer(sizeOfBuffer);
number >>= 7-CCN_TT_BITS;
splitNumbers.write((CCN_TT_HBIT & DTAGS.CCN_CLOSE) |
((number & CCN_MAX_TINY) << CCN_TT_BITS) |
(CCN_TT_MASK & tt));
var index = 1;
while(number>0){
splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
index++;
number>>=7;
}
for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
buffer.write(splitNumbers[j]);
}
};
//NOTE NUMBETR= SIZE
var addToBuffer = function(buffer,data,tt){
var number = sizeof(data);
var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
splitNumbers = new Buffer(sizeOfBuffer);
number >>= 7-CCN_TT_BITS;
splitNumbers.write((CCN_TT_HBIT & ~DTAGS.CCN_CLOSE) |
((number & CCN_MAX_TINY) << CCN_TT_BITS) |
(CCN_TT_MASK & tt));
while(number>0){
splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
index++;
number>>=7;
}
for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
buffer[index+i] = splitNumbers[j];
}
for(i=0;i<data.length;i++){
buffer[index+i] = data[i];
}
};
/*
Add tag to buffer:
*/
var addName = function(buffer,name){
for(i=0;i<name.size;i++){
tt = require('./TAG').tt.CCN_BLOB ;
addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
addCloseTag(buffer);
}
};
var addCloseTag = function(buffer){
var tag = DTAGS.CCN_CLOSE;
buffer.write(tag);
};
var buffer = new Buffer(1000);
var tag = DTAGS.CCN_DTAG_ContentObject;
var tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
tag = DTAGS.CCN_Signature;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
tag = DTAGS.CCN_SignatureBits;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
tt = TT.CCN_BLOB ;
addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
addCloseTag(buffer);
addCloseTag(buffer);
tag = DTAGS.CCN_Name;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
addName(buffer,_ContentObject.moName,tt);
addCloseTag(buffer);
tag = DTAGS.CCN_DTAG_SignedInfo;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
addCloseTag(buffer);
tag = DTAGS.CCN_DTAG_Timestamp;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
addCloseTag(buffer);
tag = DTAGS.CCN_DTAG_KeyLocator;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
tag = DTAGS.CCN_DTAG_key;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
addCloseTag(buffer);
addCloseTag(buffer);
tag = DTAGS.CCN_DTAG_Content;
tt = TT.CCN_DTAG ;
addToBuffer(buffer,tag,tt);
addToBufferData(buffer,_ContentObject.msContent,tt);
addCloseTag(buffer);
addCloseTag(buffer);
return buffer;
}
Encoder.prototype.encodeToFile = function(_filename){
var content = "hello world";
var name = new require('./Name').Name(['hello']);
var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
sig.generateSignature(name,sigInfo,content);
var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
var buffer = this.encodeContentObject(co);
fs.writeFile(_filename);
}
var InterestMessageEncoder = new InterestMessageEncoder();
var file = InterestMessageEncoder.encodeToFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');