Monday, July 06, 2009

Echoes of Myself

One of my favorite elements of the internet is how it keeps a readily accessible record of our past online interactions. Forty years from now, the very words I'm writing at this moment will still be searchable and accessible to my kids and grandkids. That's pretty cool, but can also be dangerous if you don't take care with what you chisel into the internet stone.

While searching for something completely unrelated, I stumbled upon a conversation between myself and another gentleman on March 8, 2003. It was fascinating to read as it gave a beautiful snapshot of my thinking and temperament at the moment. Although many of my views have since changed, I'm so glad that this still exists. I can't help but wonder what I'll think in six years when I look back at what I am posting today.

Here is the conversation in its entirety. I think the last comment I make is the most interesting when cast in the light of my current beliefs.


jinxidoru: I noticed a discussion on religion and couldn't help but input my two cents.

I am a devote Christian. I cannot accept the idea that God does not have a true church on the Earth today. Many people say that it really doesn't matter what church you belong to just so long as you do good things. I agree to an extent. The most important is to be a good person. You could be a member of the best church ever, but if you're not being a good person, it's pretty pointless. But there is a lot of confusion among the churches on the earth and what constitutes good. For this reason, God has his true church, so that the doctrines are taught properly and with the correct authority. Without this, there is confusion, and people bicker and argue over rediculous things. What is the proper way to baptize? How do we receive salvation? Are there prophets on the earth today? There have to be answers to these questions.

For example, in the times of Jesus Christ, he was very forthright about issues when they were brought to his attention. He didn't give non-committal answers. He gave cut-and-dry answers with little room for interpretation. Why should we believe that whereas Jesus Christ was very direct before, that for some reason he's decided to confuse us by spreading the truth like leaves in the wind.

I cannot accept this. It is for this reason that I have asked the only person who knows what church is the true church of Jesus Christ. I asked Heavenly Father, and I believe that he has made it known unto me personally what church is his and what church has prophets who truly speak with God in our day.

By saying this, I do not mean to be exclusionary nor demeaning in any way. I simply express my feelings and the reason I belong to the church to which I belong. I encourage everyone to pray and ask God where the truth is, and to follow not what I have said but rather what God says to you. We can be tolerant and accepting because ultimately, it's our decisions, not the decisions of others which determine the outcome of our existence.

I apologize if this sounds super-preachy. I'm sure it does, and I'm sure I'll be totally flamed for everything I've just said, but that's ok. I felt that I should share my feelings, so I did.

Creoena: My opinion is that people should live their own lives and not follow some belief imposed on them. People can believe what they want, but have religious folk really thought about their religion and the truth behind it? For example, Creation is all but proven false, and Noah's Ark seems like a story out of a children's book than something actually true.

jinxidoru: I find it funny that you say that people should live their own lives and not follow some belief imposed on them, and then you try to impose on everyone your beliefs. I could easily say that your lack of belief has been imposed on you by society.

Secondly, just because you don't believe in Creation does not mean that it's all but proven false. I have never heard a legitimate scientist say that creation has been proven false. They are not that stupid. Einstein, Newton, Galileo, Copernicus all believed in God (though some in differing ways). Even Steven Hawking, one of the greatest minds of our day, does not deny the existence of God. I don't know whether or not he believes in God, but I have read many instances where he affirms the possibility of the existence of God and of creationism. Please do not say ridiculous lies (in regards to Creation being proved wrong) that have no base in reality just because they back up what you believe.

Prove that you believe what you just said in your post by allowing other people to make the choice that they want to believe in God without people like you slandering them and calling them childish for their beliefs.

Creoena: LOL

I impose a belief that people should have their own beliefs and morals. And you're right, I do impose it on people. But there's a difference. This is that I believe people should follow THEIR hearts, and not become a collective mind. My imposition (if thats a word) does not have any strings attached, while religion does. And I do realize people's own beliefs may be to believe in god and religion and whatever else, but I guess if that's what people want to believe than it will have to be, but I honestly don't really understand why someone would not want to be a true individual.

Secondly, I do have to apologize.....creation has not officially been disproven, but every day the truth is coming more and more from science.

Third, I did not call religion childish, I just feel the story of Noah's ark is a bit childish. Religion is actually quite complex, or there wouldn't have been all the religious wars that there has been. And the day religious people stop trying to convert us to religion, and we all know that will never happen, I will stop promoting Atheism, so I guess you're just going to have to deal with it.

jinxidoru: I agree with a lot of what you said except one thing. I don't think you should ever stop promoting Atheism unless you stop believing in it, just I will not stop promoting Christianity unless I were to stop believing in it. If we feel that something is correct and right, we should do all we can to help others understand it and accept it if they can. For this I respect your desire to promote your beliefs and encourage you to continue even if I don't necesarily agree with said beliefs.

Creoena: Wow, well said. This would be a rather dull world if everyone agreed with everything.



And here's one more extra post I found on the same forum, but a different thread. Here's a comment with which I still agree 100%.

jinxidoru: One more thing. If you're Christian, please don't post unless you have something intelligent to say. It really sheds a negative light on the rest of us. Reading some of the posts by so called "Christians" I can fully understand why we are often times labeled has hypocrites. Please quit using profanity and show a little love, kindness, and open-mindedness. As we always say, "What would Jesus do?" Well, I'm pretty sure we wouldn't go around dropping the F-bomb at people he didn't agree with.

Saturday, June 20, 2009

iTunes Remote pairing code

If you have an iPhone or iPod Touch, you are probably familiar with the iTunes Remote app. It allows you to control iTunes from a really well designed application. I have recently been working on reverse engineering the communication so that I can use the same remote to control other media applications like Boxee and XBMC. There are a number of other projects doing similar things (stereo).

The communication has not been difficult to decode. It is a variation of the previously reverse-engineered DAAP communication used by iTunes sharing. It's referred to as DACP. If you are looking for information about this protocol, Jeffrey Sharkey has done an excellent job of documenting his efforts in creating a Google Android implementation of the iTunes Remote (Android DACP Remote Control).

Before you can use the iPhone as a remote, there is a pairing process which occurs between the server and the remote. There is a good discussion of the pairing process by mycroes (Pairing the Itunes Remote app with your own server). The one part that is missing is how iTunes generates the pairing code which it sends back to the iPhone. I have finally, with a fair bit of effort, been able to decode the value.

The pairing code is generated by a hash algorithm I was able to lift and modify from the xine source code. The algorithm takes two arguments. The first is the Pair parameter in the _touch-remote._tcp zeroconf record (refer to mycroes's article). The Pair parameter is a 16 character hexadecimal string. The second is the four digit passcode provided by the remote which must be sent back by iTunes (or the custom server).

These two parameters can be passed to the function provided below. The result is a 32 character hexadecimal string which is returned back to the remote application in the form of a GET request.

Since this code was modified from GPL source code (xine), it is also protected by the GPL. Feel free to use this code for whatever you want. All I ask is that you give me proper attribution. Also, I would love to hear what you have done with it, so please let me know if you use it for a cool project.

With no further ado, here's the source.


std::string itunes_pairingcode( std::string passcode, std::string pair )
{
// initialize the param array
char param[64];
::memset( param, 0, 64 );
param[56] = '\xc0';
param[24] = '\x80';

// set the pair value
::strncpy( param, pair.c_str(), 16 );

// copy the pair code
::strncpy( param+16, passcode.c_str(), 4 );
param[22] = param[19];
param[20] = param[18];
param[18] = param[17];
param[19] = param[17] = 0;

// initialize a, b, c, d
uint32_t a = 0x67452301;
uint32_t b = 0xefcdab89;
uint32_t c = 0x98badcfe;
uint32_t d = 0x10325476;

a = ((b & c) | (~b & d)) + (*(uint32_t*)(param+0x00)) + a - 0x28955B88;
a = ((a << 0x07) | (a >> 0x19)) + b;
d = ((a & b) | (~a & c)) + (*(uint32_t*)(param+0x04)) + d - 0x173848AA;
d = ((d << 0x0c) | (d >> 0x14)) + a;
c = ((d & a) | (~d & b)) + (*(uint32_t*)(param+0x08)) + c + 0x242070DB;
c = ((c << 0x11) | (c >> 0x0f)) + d;
b = ((c & d) | (~c & a)) + (*(uint32_t*)(param+0x0c)) + b - 0x3E423112;
b = ((b << 0x16) | (b >> 0x0a)) + c;
a = ((b & c) | (~b & d)) + (*(uint32_t*)(param+0x10)) + a - 0x0A83F051;
a = ((a << 0x07) | (a >> 0x19)) + b;
d = ((a & b) | (~a & c)) + (*(uint32_t*)(param+0x14)) + d + 0x4787C62A;
d = ((d << 0x0c) | (d >> 0x14)) + a;
c = ((d & a) | (~d & b)) + (*(uint32_t*)(param+0x18)) + c - 0x57CFB9ED;
c = ((c << 0x11) | (c >> 0x0f)) + d;
b = ((c & d) | (~c & a)) + (*(uint32_t*)(param+0x1c)) + b - 0x02B96AFF;
b = ((b << 0x16) | (b >> 0x0a)) + c;
a = ((b & c) | (~b & d)) + (*(uint32_t*)(param+0x20)) + a + 0x698098D8;
a = ((a << 0x07) | (a >> 0x19)) + b;
d = ((a & b) | (~a & c)) + (*(uint32_t*)(param+0x24)) + d - 0x74BB0851;
d = ((d << 0x0c) | (d >> 0x14)) + a;
c = ((d & a) | (~d & b)) + (*(uint32_t*)(param+0x28)) + c - 0x0000A44F;
c = ((c << 0x11) | (c >> 0x0f)) + d;
b = ((c & d) | (~c & a)) + (*(uint32_t*)(param+0x2C)) + b - 0x76A32842;
b = ((b << 0x16) | (b >> 0x0a)) + c;
a = ((b & c) | (~b & d)) + (*(uint32_t*)(param+0x30)) + a + 0x6B901122;
a = ((a << 0x07) | (a >> 0x19)) + b;
d = ((a & b) | (~a & c)) + (*(uint32_t*)(param+0x34)) + d - 0x02678E6D;
d = ((d << 0x0c) | (d >> 0x14)) + a;
c = ((d & a) | (~d & b)) + (*(uint32_t*)(param+0x38)) + c - 0x5986BC72;
c = ((c << 0x11) | (c >> 0x0f)) + d;
b = ((c & d) | (~c & a)) + (*(uint32_t*)(param+0x3c)) + b + 0x49B40821;
b = ((b << 0x16) | (b >> 0x0a)) + c;

a = ((b & d) | (~d & c)) + (*(uint32_t*)(param+0x04)) + a - 0x09E1DA9E;
a = ((a << 0x05) | (a >> 0x1b)) + b;
d = ((a & c) | (~c & b)) + (*(uint32_t*)(param+0x18)) + d - 0x3FBF4CC0;
d = ((d << 0x09) | (d >> 0x17)) + a;
c = ((d & b) | (~b & a)) + (*(uint32_t*)(param+0x2c)) + c + 0x265E5A51;
c = ((c << 0x0e) | (c >> 0x12)) + d;
b = ((c & a) | (~a & d)) + (*(uint32_t*)(param+0x00)) + b - 0x16493856;
b = ((b << 0x14) | (b >> 0x0c)) + c;
a = ((b & d) | (~d & c)) + (*(uint32_t*)(param+0x14)) + a - 0x29D0EFA3;
a = ((a << 0x05) | (a >> 0x1b)) + b;
d = ((a & c) | (~c & b)) + (*(uint32_t*)(param+0x28)) + d + 0x02441453;
d = ((d << 0x09) | (d >> 0x17)) + a;
c = ((d & b) | (~b & a)) + (*(uint32_t*)(param+0x3c)) + c - 0x275E197F;
c = ((c << 0x0e) | (c >> 0x12)) + d;
b = ((c & a) | (~a & d)) + (*(uint32_t*)(param+0x10)) + b - 0x182C0438;
b = ((b << 0x14) | (b >> 0x0c)) + c;
a = ((b & d) | (~d & c)) + (*(uint32_t*)(param+0x24)) + a + 0x21E1CDE6;
a = ((a << 0x05) | (a >> 0x1b)) + b;
d = ((a & c) | (~c & b)) + (*(uint32_t*)(param+0x38)) + d - 0x3CC8F82A;
d = ((d << 0x09) | (d >> 0x17)) + a;
c = ((d & b) | (~b & a)) + (*(uint32_t*)(param+0x0c)) + c - 0x0B2AF279;
c = ((c << 0x0e) | (c >> 0x12)) + d;
b = ((c & a) | (~a & d)) + (*(uint32_t*)(param+0x20)) + b + 0x455A14ED;
b = ((b << 0x14) | (b >> 0x0c)) + c;
a = ((b & d) | (~d & c)) + (*(uint32_t*)(param+0x34)) + a - 0x561C16FB;
a = ((a << 0x05) | (a >> 0x1b)) + b;
d = ((a & c) | (~c & b)) + (*(uint32_t*)(param+0x08)) + d - 0x03105C08;
d = ((d << 0x09) | (d >> 0x17)) + a;
c = ((d & b) | (~b & a)) + (*(uint32_t*)(param+0x1c)) + c + 0x676F02D9;
c = ((c << 0x0e) | (c >> 0x12)) + d;
b = ((c & a) | (~a & d)) + (*(uint32_t*)(param+0x30)) + b - 0x72D5B376;
b = ((b << 0x14) | (b >> 0x0c)) + c;

a = (b ^ c ^ d) + (*(uint32_t*)(param+0x14)) + a - 0x0005C6BE;
a = ((a << 0x04) | (a >> 0x1c)) + b;
d = (a ^ b ^ c) + (*(uint32_t*)(param+0x20)) + d - 0x788E097F;
d = ((d << 0x0b) | (d >> 0x15)) + a;
c = (d ^ a ^ b) + (*(uint32_t*)(param+0x2c)) + c + 0x6D9D6122;
c = ((c << 0x10) | (c >> 0x10)) + d;
b = (c ^ d ^ a) + (*(uint32_t*)(param+0x38)) + b - 0x021AC7F4;
b = ((b << 0x17) | (b >> 0x09)) + c;
a = (b ^ c ^ d) + (*(uint32_t*)(param+0x04)) + a - 0x5B4115BC;
a = ((a << 0x04) | (a >> 0x1c)) + b;
d = (a ^ b ^ c) + (*(uint32_t*)(param+0x10)) + d + 0x4BDECFA9;
d = ((d << 0x0b) | (d >> 0x15)) + a;
c = (d ^ a ^ b) + (*(uint32_t*)(param+0x1c)) + c - 0x0944B4A0;
c = ((c << 0x10) | (c >> 0x10)) + d;
b = (c ^ d ^ a) + (*(uint32_t*)(param+0x28)) + b - 0x41404390;
b = ((b << 0x17) | (b >> 0x09)) + c;
a = (b ^ c ^ d) + (*(uint32_t*)(param+0x34)) + a + 0x289B7EC6;
a = ((a << 0x04) | (a >> 0x1c)) + b;
d = (a ^ b ^ c) + (*(uint32_t*)(param+0x00)) + d - 0x155ED806;
d = ((d << 0x0b) | (d >> 0x15)) + a;
c = (d ^ a ^ b) + (*(uint32_t*)(param+0x0c)) + c - 0x2B10CF7B;
c = ((c << 0x10) | (c >> 0x10)) + d;
b = (c ^ d ^ a) + (*(uint32_t*)(param+0x18)) + b + 0x04881D05;
b = ((b << 0x17) | (b >> 0x09)) + c;
a = (b ^ c ^ d) + (*(uint32_t*)(param+0x24)) + a - 0x262B2FC7;
a = ((a << 0x04) | (a >> 0x1c)) + b;
d = (a ^ b ^ c) + (*(uint32_t*)(param+0x30)) + d - 0x1924661B;
d = ((d << 0x0b) | (d >> 0x15)) + a;
c = (d ^ a ^ b) + (*(uint32_t*)(param+0x3c)) + c + 0x1fa27cf8;
c = ((c << 0x10) | (c >> 0x10)) + d;
b = (c ^ d ^ a) + (*(uint32_t*)(param+0x08)) + b - 0x3B53A99B;
b = ((b << 0x17) | (b >> 0x09)) + c;

a = ((~d | b) ^ c) + (*(uint32_t*)(param+0x00)) + a - 0x0BD6DDBC;
a = ((a << 0x06) | (a >> 0x1a)) + b;
d = ((~c | a) ^ b) + (*(uint32_t*)(param+0x1c)) + d + 0x432AFF97;
d = ((d << 0x0a) | (d >> 0x16)) + a;
c = ((~b | d) ^ a) + (*(uint32_t*)(param+0x38)) + c - 0x546BDC59;
c = ((c << 0x0f) | (c >> 0x11)) + d;
b = ((~a | c) ^ d) + (*(uint32_t*)(param+0x14)) + b - 0x036C5FC7;
b = ((b << 0x15) | (b >> 0x0b)) + c;
a = ((~d | b) ^ c) + (*(uint32_t*)(param+0x30)) + a + 0x655B59C3;
a = ((a << 0x06) | (a >> 0x1a)) + b;
d = ((~c | a) ^ b) + (*(uint32_t*)(param+0x0C)) + d - 0x70F3336E;
d = ((d << 0x0a) | (d >> 0x16)) + a;
c = ((~b | d) ^ a) + (*(uint32_t*)(param+0x28)) + c - 0x00100B83;
c = ((c << 0x0f) | (c >> 0x11)) + d;
b = ((~a | c) ^ d) + (*(uint32_t*)(param+0x04)) + b - 0x7A7BA22F;
b = ((b << 0x15) | (b >> 0x0b)) + c;
a = ((~d | b) ^ c) + (*(uint32_t*)(param+0x20)) + a + 0x6FA87E4F;
a = ((a << 0x06) | (a >> 0x1a)) + b;
d = ((~c | a) ^ b) + (*(uint32_t*)(param+0x3c)) + d - 0x01D31920;
d = ((d << 0x0a) | (d >> 0x16)) + a;
c = ((~b | d) ^ a) + (*(uint32_t*)(param+0x18)) + c - 0x5CFEBCEC;
c = ((c << 0x0f) | (c >> 0x11)) + d;
b = ((~a | c) ^ d) + (*(uint32_t*)(param+0x34)) + b + 0x4E0811A1;
b = ((b << 0x15) | (b >> 0x0b)) + c;
a = ((~d | b) ^ c) + (*(uint32_t*)(param+0x10)) + a - 0x08AC817E;
a = ((a << 0x06) | (a >> 0x1a)) + b;
d = ((~c | a) ^ b) + (*(uint32_t*)(param+0x2c)) + d - 0x42C50DCB;
d = ((d << 0x0a) | (d >> 0x16)) + a;
c = ((~b | d) ^ a) + (*(uint32_t*)(param+0x08)) + c + 0x2AD7D2BB;
c = ((c << 0x0f) | (c >> 0x11)) + d;
b = ((~a | c) ^ d) + (*(uint32_t*)(param+0x24)) + b - 0x14792C6F;
b = ((b << 0x15) | (b >> 0x0b)) + c;

a += 0x67452301;
b += 0xefcdab89;
c += 0x98badcfe;
d += 0x10325476;

// switch to little endian
a = ((a&0xff000000)>>24) + ((a&0xff0000)>>8) + ((a&0xff00)<<8) + ((a&0xff)<<24);
b = ((b&0xff000000)>>24) + ((b&0xff0000)>>8) + ((b&0xff00)<<8) + ((b&0xff)<<24);
c = ((c&0xff000000)>>24) + ((c&0xff0000)>>8) + ((c&0xff00)<<8) + ((c&0xff)<<24);
d = ((d&0xff000000)>>24) + ((d&0xff0000)>>8) + ((d&0xff00)<<8) + ((d&0xff)<<24);

// write the pairing id and return it
char retval[33];
snprintf( retval, sizeof(retval), "%0X%0X%0X%0X", a, b, c, d );
return retval;
}

Monday, April 20, 2009

Teabagging the White House

By now, I suspect you have all heard of these anti-tax protests staged around the country on April 15th. For the benefit of posterity, I will give a brief synopsis. With the passing of the recent stimulus package of about $800 billion, Republicans are furious. To air their grievances, they have turned to the street and organized a nation-wide protest to decry the massive increase in taxes brought on by the stimulus package. They have chosen to refer to themselves as a tea party, in order to hearken back to Boston Tea Party of the revolution.

For starters, I don't know who it was that came up with the name of tea parties for these recent anti-tax protests, but I want to thank whoever it was. You have given us liberals a gift. Mocking you has never been so easy. These teabagging jokes just write themselves. The last time you gave us such a comedic gift of this quality, a lawyer was pulling BBs out of his face.

I love that they try to connect themselves to the Boston Tea Party. Republicans are trying to connect the current state of the nation with the state of pre-revolution America. Any grade-schooler can tell you the battle cry of the original tea partiers, "No taxation without representation!" But does that refer to the current state of America? Are Republicans being taxed without representation? They would have you think they are, but the answer is obviously no. In fact there are two problems with that claim.

The first problem with the above statement is the claim that we are being taxed. That is the most bizarre element of this whole circus. Taxes have not gone up. In fact, I just got my pay check for the last half of March. Guess what. My taxes went down. The stimulus package contained about $300 billion in tax cuts. Those were put in to appease the Republicans, who still refused to vote for it as a complete block. So, I'm not sure whose taxes you are protesting, not mine apparently.

Last I checked, Republicans still have the right to vote. The fact that more Americans disagree with them today than agree with them does not change the fact that they still have representation. Over the last eight years I watched as the leader made decision after decision that made me sick to my stomach. Did Democrats lack representation? No. We simply lacked control. That is the situation you are currently in. You mucked up government so bad that people decided that they had had enough and voted you guys out of office. Apparently though, your idea of being represented is that my viewpoint (and the views of the majority of America) be relegated to the dustbin. Ahhh... sounds like the Bush years.

It's illuminating to consider how Republicans considered protesters just a few years back. When Republicans were in power, anyone who voiced any sort of dissent were considered anti-American. I can't count the number of times I was personally called anti-American because I had the audacity to voice my disagreement with the current administration. According to Republicans of the past eight years, the First Ammendment provides all Americans the right to freely speak in favor of the Executive branch.

Well, the tables have certainly changed, haven't they? Your man is no longer in power, and the value of dissent has completely changed in your eyes as a result. Whereas you once considered dissent to be anti-American, you now have pundits like O'Reilly and Hannity extolling the great patriotic fervor of those protesting. How is it that when you disagree with the government you are patriotic, but when I do the same thing I am anti-American?!

I would like to state categorically that I believe peaceful public dissent to be a wonderful thing. It is a hallmark of a free nation. Although I think that these tea parties are ridiculous, I wholeheartedly encourage Americans who feel disenfranchised by Obama's presidency to let their voice be heard. Please keep it up. Protesting is not anti-American. Quite the contrary, it's one of the most American activities that exists.

The funniest part of this whole anti-American rhetoric is how there have been a number of tea parties where secession was advocated. This was especially the case in Texas, where even the governor tipped his hat to the seditious talk. So, let me get this right. If I believe that we should stop sending our children to die in Iraq, I am anti-American. But, if you advocate seceding, you are a patriot. In the words of my brother, "The party of Lincoln certainly has come full circle, hasn't it?"