<?xml version = "1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">

<head>
	<title>NDN Decode Interest + Face Instance</title>
	
	<script type="text/javascript" src="../Helper.js"></script>

	<script type="text/javascript">
	

		
		function decode(){

			var input = document.getElementById('result').innerHTML;

			
			var interest = decodeHexInterest(input);
			
			if(LOG>3)console.log('INTEREST DECODED');
			if(LOG>3)console.log(interest);

			///////////////////////////////////////
			
			var output ="";
			
			
			if(interest.name!=null && interest.name.components!=null){
				output+= "NAME: ";
				
				for(var i=0;i<interest.name.components.length;i++){
					output+= "/"+ DataUtils.toString(interest.name.components[i]);
				}
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.faceInstance!=null ){
				output+= "FaceInstance: ";
				
					output+=  interest.faceInstance;
				
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.exclude!=null ){
				output+= "Exclude: ";
				
					output+=  interest.exclude;
				
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.childSelector!=null ){
				output+= "ChildSelector: ";
				
					output+=  interest.childSelector;
				
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.answerOriginKind!=null ){
				output+= "AnswerOriginKind: ";
				
					output+=  interest.answerOriginKind;
				
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.interestLifetime!=null ){
				output+= "InterestLifetime: ";
				
					output+=  interest.interestLifetime;
				
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.nonce!=null ){
				output+= "Nonce: ";
				
					output+=  interest.nonce;
				
				output+= "<br />";
				output+= "<br />";
			}
			
			
			if(interest.scope!=null ){
				output+= "SCOPE: ";
				
					output+=  interest.scope;
				
				output+= "<br />";
				output+= "<br />";
			}
	
			if(interest.publisherPublicKeyDigest!=null ){
				output+= "PUBLISHER PUBLIC KEY DIGEST: ";
				
				output+=  interest.publisherPublicKeyDigest.publisherPublicKeyDigest;
                                        
				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.maxSuffixComponents!=null ){
				output+= "MaxSuffixComponents : ";
				
				output+=  interest.maxSuffixComponents;

				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.minSuffixComponents!=null ){
				output+= "MinSuffixComponents : ";
				
				output+=  interest.minSuffixComponents;

				output+= "<br />";
				output+= "<br />";
			}
			
			if(interest.name.components[3] !=null){
				
				
				var input = DataUtils.toHex(interest.name.components[3]) ;

				var contentObject = decodeHexContentObject(input);
				
				if(contentObject.content!=null ){
					output+= "Content of content Object: ";
					
						output+=  DataUtils.toHex(contentObject.content);
						
					output+= "<br />";
					output+= "<br />";
				}
				
				
				var content = DataUtils.toHex(contentObject.content);
				
				var co = contentObject;
				
				
				////////////////////////////////////////
				

				if(co.name!=null && co.name.components!=null){
					output+= "NAME: ";
					
					for(var i=0;i<co.name.components.length;i++){
						output+= "/"+ DataUtils.toString(co.name.components[i]);
					}
					output+= "<br />";
					output+= "<br />";
				}
	
				if(co.content !=null){
					output += "CONTENT(ASCII): "+ DataUtils.toString(co.content);
					
					output+= "<br />";
					output+= "<br />";
				}
				if(co.content !=null){
					output += "CONTENT(hex): "+ DataUtils.toHex(co.content);
					
					output+= "<br />";
					output+= "<br />";
				}
				if(co.signature !=null && co.signature.signature!=null){
					
					output += "SIGNATURE(hex): "+ DataUtils.toHex(co.signature.signature);
					
					output+= "<br />";
					output+= "<br />";
				}
				if(co.signedInfo !=null && co.signedInfo.publisher!=null && co.signedInfo.publisher.publisherPublicKeyDigest!=null){
					
					output += "Publisher Public Key Digest(hex): "+ DataUtils.toHex(co.signedInfo.publisher.publisherPublicKeyDigest);
					
					output+= "<br />";
					output+= "<br />";
				}
				if(co.signedInfo !=null && co.signedInfo.timestamp!=null){
					var d = new Date();
					d.setTime( co.signedInfo.timestamp.msec );
					
					var bytes = [217, 185, 12, 225, 217, 185, 12, 225];
					
					output += "TimeStamp: "+d;
					output+= "<br />";
					output += "TimeStamp(number): "+ co.signedInfo.timestamp.msec;
					
					
					output+= "<br />";
				}
			    if(co.signedInfo !=null && co.signedInfo.type!=null){

					output += "Type: "+co.signedInfo.type;
					output+= "<br />";
					output+= "<br />";
				}
			    if(co.signedInfo !=null && co.signedInfo.locator!=null){

					output += "Locator: "+co.signedInfo.locator.type;
					output+= "<br />";
					output+= "<br />";
				}
			    if(co.signedInfo !=null && co.signedInfo.freshnessSeconds!=null){

					output += "FreshnessSeconds: "+co.signedInfo.freshnessSeconds;
					output+= "<br />";
					output+= "<br />";
				}
			    if(co.signedInfo !=null && co.signedInfo.finalBlockID!=null){

					output += "FinalBlockID: "+co.signedInfo.finalBlockID;
					output+= "<br />";
					output+= "<br />";
				}
				
				if(co.signedInfo!=null && co.signedInfo.locator!=null && co.signedInfo.locator.publicKey!=null){
					
					var publickey = rstr2b64(DataUtils.toString(co.signedInfo.locator.publicKey));
					var publickeyHex = DataUtils.toHex(co.signedInfo.locator.publicKey).toLowerCase();
					var publickeyString = DataUtils.toString(co.signedInfo.locator.publicKey);
					
					var signature = DataUtils.toHex(co.signature.signature).toLowerCase();
					
					
					var input = DataUtils.toString(co.rawSignatureData);
					 
					
					output += "DER Certificate: "+publickey ;
					
					output+= "<br />";
					output+= "<br />";
					
					

					if(LOG>2) console.log(" ContentName + SignedInfo + Content = "+input);
					if(LOG>2) console.log(" PublicKey = "+publickey );
					if(LOG>2) console.log(" PublicKeyHex = "+publickeyHex );
					if(LOG>2) console.log(" PublicKeyString = "+publickeyString );
					
					if(LOG>2) console.log(" Signature "+signature );
					
					if(LOG>2) console.log(" Signature NOW IS" );
					
					if(LOG>2) console.log(co.signature.signature);
					
					
					/*var x509 = new X509();
					
					x509.readCertPEM(publickey);
					
					
					//x509.readCertPEMWithoutRSAInit(publickey);

					var result = x509.subjectPublicKeyRSA.verifyString(input, signature);*/
					//console.log('result is '+result);
					
					
					var kp = publickeyHex.slice(56,314);
					
					output += "PUBLISHER KEY(hex): "+kp ;
					
					output+= "<br />";
					output+= "<br />";
					
					console.log('PUBLIC KEY IN HEX is ');
					console.log(kp);

					var exp = publickeyHex.slice(318,324);
					
					console.log('kp size is '+kp.length );
					output += "exponent: "+exp ;
					
					output+= "<br />";
					output+= "<br />";
					
					console.log('EXPONENT is ');
					console.log(exp);

					
					
					/*var c1 = hex_sha256(input);
					var c2 = signature;
					
					if(LOG>4)console.log('input is ');
					if(LOG>4)console.log(input);
					if(LOG>4)console.log('C1 is ');
					if(LOG>4)console.log(c1);
					if(LOG>4)console.log('C2 is ');
					if(LOG>4)console.log(c2);
					var result = c1 == c2;*/
					
					var rsakey = new RSAKey();
					
					rsakey.setPublic(kp,exp);
					
				    var result = rsakey.verifyString(input, signature);
					
				    
				    
				    console.log('PUBLIC KEY n after is ');
					console.log(rsakey.n);

					console.log('EXPONENT e after is ');
					console.log(rsakey.e);
					
					
					if(result)
						output += 'SIGNATURE VALID';
					else
						output += 'SIGNATURE INVALID';

					//output += "VALID: "+ toHex(co.signedInfo.locator.publicKey);
					
					output+= "<br />";
					output+= "<br />";
					
					
				    //if(LOG>4) console.log('str'[1]);
				}
				
				////////////////////////////////////////
				
				
				var forwardingEntry = decodeHexForwardingEntry(content);
				
				if(LOG>3)console.log('FORWARDING ENTRY IS PRESENT');
				if(LOG>3)console.log(forwardingEntry);

				///////////////////////////////////////
				
				//var output ="";
				
				if(forwardingEntry.action!=null ){
					output+= "Action: ";
					
					output+=  DataUtils.toHex(forwardingEntry.action);
						
					output+= "<br />";
					output+= "<br />";
				}
				
				if(forwardingEntry.prefixName!=null){
					output+= "PrefixName: ";
					
					output+= forwardingEntry.prefixName.getName();
					output+= "<br />";
				}
				
				if(forwardingEntry.ccndID!=null){
					output+= "ccndID: ";
					
					output+= forwardingEntry.ccndID;
					output+= "<br />";
				}
				
				if(forwardingEntry.flags!=null){
					output+= "Flags: ";
					
					output+= forwardingEntry.flags;
					output+= "<br />";
				}
				
				if(forwardingEntry.lifetime!=null){
					output+= "Lifetime: ";
					
					output+= forwardingEntry.lifetime;
					output+= "<br />";
				}

				
			}
			
			
			
			document.getElementById('result').innerHTML = output;
			
		}

	</script>

</head>
<body >
	<form>
		
		Please Press Decode:<br />
		

	</form>
	<button onclick="decode()">Decode</button>

		<!-- p id="result-old-from-ccnx">01d2f2faa563636e7800fa0285e0a01e093968f9740ce7f4361babf5bb05a4e55aaca5e58f73eddeb8e013aa8f00fabd73656c6672656700fa1bf5048202aa03b208854a18988c72aee624da28e2e1acbccb209b8e89429041985521ed68f95a1c546872fba3d854b1377dc249b6d8ec5935e5069256c97a7f6d8a62e86222ccd2cfe5097aed3fe5ede6732ce191a8680d78e39d0c5058a2b7bb0f0687994e9f045de346b66c46498547a08da1f2f0cdfafba3afdfe7107931935ede79040137ba94a90000f20001a203e202851a4860caa4991e829bcdc9429fb711d52440968d23560726606050bf147acffc0002bab504fcb3f03aa40001e201da0a9530819f300d06092a864886f70d010101050003818d00308189028181008ed27580e3d1c4c67672208665133a1ba12d8ebf5cad8e054571926b3ff0782a04c71703384021a6cefb6616b66cbd8a679b761d69d6373a851546e26f7105510b4c23be9a3c7f2e652e100ecc1471855730659f1477ce4e8504ad1fd8f44116baaeae2ff67eec33abba790157a79bf5039e5a528a471d9d67c94e70117ed7490203010001000000019a0585058a04cabe73656c6672656700f2faad726f63636f000003e20285e0a01e093968f9740ce7f4361babf5bb05a4e55aaca5e58f73eddeb8e013aa8f0004fa8e330003d2d63231343734383336343700000000000002d28e310000</p-->
		
		<p id="result">01d2f2faa563636e7800fa0285e0a01e093968f9740ce7f4361babf5bb05a4e55aaca5e58f73eddeb8e013aa8f00facd70726566697872656700fa29ad048202aa03b208854ddbf69779cdf4ef74be99474478c8bc3ca0873e0ffa1fa60120aa276db122b83404e595a8a3caeaf09630276658ba4e7beaadb4b91a8cc58e19ac4a42289507ed8d609aa9bef61a5a507f349c83d2944b8c16fecfd90d4a40ddb8687592c0a57517564235b2e359db54f51a37e1ac39e518a2196e3ffda7eb2fb301f3c404dd0000f20001a203e20285ef7c4f5d4743a8b8586ea2e741b7fc39d1dc0dbe1b1930e787cfd1d833ea7a610002bab504fce9e253d70001e2018219fd3082019b30820104020900b7d85c906bad52ee300d06092a864886f70d010105050030123110300e060355040313076178656c636476301e170d3132303432383233343433375a170d3132303532383233343433375a30123110300e060355040313076178656c63647630819f300d06092a864886f70d010101050003818d0030818902818100e17d30a7d828ab1b840b17542dcaf6207afd221e086b2a60d16cb7f54448ba9f3f08bcd099db21dd162a779e61aa89eee554d3a47de230bc7ac590d524067c3898bba6f5dc4360b845eda48cbd9cf126a723445f0e1952d7325a75faf556144f9a98af7186b0278685b8e2c08bea87171b4dee585c1828295b5395eb4a17779f0203010001300d06092a864886f70d010105050003818100cb3ab0357d7cd2ae97ed501e51a3a0e2817d418e47fb17906477af61495a7e8d8789141065b082d001f4b15193d0b43fb661cde20a6498372c6abbd3dcb9f0d12659ef07b3c6dbdf8bdf2f65477eed7adcd457d793b1c27badda7c5ade80ce95b7d8827fe78c8a35f3fb4ba648a081be2cfe84231abab3c2b531746df2e0492b000000019a02d5058a04cabe73656c6672656700f2faa56d656b69000004fa8e330003d2d63231343734383336343700000000000002d28e310000</p>

</body>
</html>