Your SlideShare is downloading. ×
Community Open Day 沖縄
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Community Open Day 沖縄

2,457
views

Published on

TouchDevelopでまじめにプログラミングしてみます。 …

TouchDevelopでまじめにプログラミングしてみます。

すべてライブラリとして公開されています。TouchDevelopでepoch util, binary operators, hmac, oauth, sha1 などで見つかります。


1 Comment
1 Like
Statistics
Notes
  • I'm not positive what all this means, but you may be interested in 'bits' service in TouchDevelop beta version - it lets you do operations on 32 bit integers. There is also new Buffer type, which you can create using bits->create_buffer(string, encoding).

    You would still need to implement the SHA rounds yourself ;)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
2,457
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
1
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 車輪の国、TouchDevelopの少女 tmytCOD沖縄13/5/11
  • 2. about me •  tmyt•  東京らへんで組み込みシステム開発してます•  最近はXamarin 2.0とか触ったりしてます•  好き: C++, C#, Delphi, ZSH•  Twitter: @tmyt•  Github: tmyt
  • 3. 今日はなすこと —  TouchDevelopとはなんぞや—  TouchDevelopで学習する—  bit演算—  ハッシュ関数—  認可プロトコル
  • 4. Touch develop is … 何 —  Microsoft Reserchの研究成果—  プログラミングを学習するためのツール—  主なターゲットはタッチデバイス—  キーボードがなくてもボタン押してるだけでOK
  • 5. こんなの DEMO
  • 6. TouchDevelopの特徴 —  『やりたいこと』が主体—  各種命令は高度に抽象化されている—  ひとつの命令で画像を表示したりできる—  あえて言うならCISCアセンブリ言語—  成果物はStore AppsなどにExportできます
  • 7. TouchDevelopで —  出来ること—  文字や画像を表示する—  四則演算する—  三角関数を使う—  出来ないこと—  ビット演算をする—  IntやCharなどを使い分ける—  53bitを超える整数を扱う
  • 8. 今日の目標 TouchDevelopでOAuth認証をしてみる
  • 9. あるひ —  *「TouchDevelopでOAuth認証ってできる?」—  僕「できるんじゃない?」
  • 10. OAuth認証に必要なもの —  HMAC-SHA1ダイジェスト—  Authorization: OAuth ヘッダ—  文字列をUTF-8バイト列として処理—  現在時刻をEpoch Timeで扱う
  • 11. TouchDevelopでできる? —  HMAC-SHA1ダイジェスト—  SHA1ハッシュ—  生成できない—  HMAC—  生成できない—  Authorization: OAuth ヘッダ—  できる—  文字列をUTF-8バイト列として処理—  できない—  現在時刻をEpoch Timeで扱う—  できない
  • 12. TouchDevelopでできる? —  SHA1ハッシュ—  生成できない—  ビット演算ができない—  ライブラリとしての実装もない—  HMAC—  ハッシュアルゴリズムが無いため実装がない—  文字列をUTF-8バイト列として処理—  UTF-16文字列を変換する関数は実装がある—  現在時刻をEpoch Timeで扱う—  現在時刻をDateTime型で取得出来るので変換する
  • 13. OAuthするために 1.  Epoch Timeを実装する2.  ビット演算を実装する3.  SHA1ハッシュを実装する4.  HMACダイジェストを実装する5.  UTF-16 → UTF-8変換を実装する6.  OAuthを実装する
  • 14. Chapter.I Epoch Timeの取得
  • 15. Epoch Timeって? —  いわゆるUNIX時間—  1970年1月1日からの経過秒数として表現—  タイムゾーンのオフセットは存在せず常にUTC
  • 16. TouchDevelopの時刻表現 —  TouchDevelopでは時刻を表現できる—  イメージとしてはJavaScriptのDate型—  もちろんEpoch Timeへの変換は不可
  • 17. Epoch Timeへの変換 1.  UTCで現在時刻を取得する2.  1970年からの経過日数を単純に計算する3.  日付×36400+0時からの経過秒数を計算する—  あれ、TouchDevelopって閏年の判定ができない—  それぐらいは軽く作りましょう—  ここまでで約1時間
  • 18. Chapter.II ビット演算
  • 19. ビット演算とは —  ある値をビット列で表現しそのビットごとに論理演算を適用する—  例えば—  15(10) AND 20(10) = 4(10)—  15(10) OR 20(10) = 31(10)—  15(10) XOR 20(10) = 27(10)—  C言語などではビット演算演算子が存在する
  • 20. ビットの配列へ変換 —  ビット演算には2進数への変換が必要—  手計算で2進数へ変換する場合と同様に実装するList<int>  ToBinary(int  n)  {  var  b  =  new  List<int>();  while  (n  !=  0)  {  b.Add(n  %  2);  n  /=  2;  }  return  b.Reverse().Take(32).ToList();  }  
  • 21. ビット演算を実装する —  任意の数値をビット配列に変換できればあとはビットごとにAND, OR, XOR, NOTを実装するだけ—  SHA1ハッシュの計算にはビットシフトも必要—  同様にして実装します—  だいたいここまでで30分
  • 22. Chapter.III SHA1ハッシュ
  • 23. SHA1ハッシュ —  Secure Hash Algorithm 縮めてSHA—  ハッシュ関数のひとつ—  入力に対し一意な160bitの値を出力する—  余談—  SHA1はNISTが2010年よりDeprecatedとしています—  今後はSHA256を使うのをおすすめします
  • 24. SHA1の生成 —  こんな雰囲気です—  バッファを64の倍数に拡張—  バッファを8bitごとに区切り—  StepA, B, C, Dの4パターンで演算—  格段の値を合計—  32bitの値5個を連結して160bitに
  • 25. TouchDevelopで実装する —  先ほど作ったビット演算が活躍します—  AND, OR, XOR, SHR, SHL—  右回転シフトも必要なので作ります—  定数に16進数は使えないのですべて10進にします—  コピペも出来ないので間違えないように入力します—  加算結果は最大で33bitになります—  TouchDevelopの数値型は53bit精度の浮動小数—  4294967295(0xFFFFFFFF)とANDを取って切り捨てる
  • 26. Chapter.IV HMACダイジェストを計算する
  • 27. HMACダイジェスト —  メッセージとキーから固定長のデータを生成する—  サーバから提供されたデータに対してパスワードを使って演算し、それをサーバに送信とかして使う—  パスワードはユーザ/サーバ両者に既知の値—  サーバはデータ/パスワード共に既知であるためパスワードを直接ネットワーク上に流さずとも検証可能—  結局内部でSHA1とか使ってます
  • 28. HMAC-SHA1 —  HMACの内部アルゴリズムとしてSHA1を使う—  アルゴリズムの流れ—  鍵と0x5cをXORで演算 … ①—  鍵と0x36をXORで演算しメッセージと結合 … ②—  ②へハッシュ関数を適用 … ③—  ①と③を結合 … ④—  ④へハッシュ関数を適用しMACとする
  • 29. TouchDevelopで実装する —  SHA1はすでに実装しました—  文字列からバイナリ生成はすでに実装しました—  ビット演算はすでに実装しました—  これらよりアルゴリズムを忠実に実装します—  飽和演算なども不要なため素直に実装できます
  • 30. Chapter.V UTF-8文字列を作る
  • 31. UTF-8文字列 —  インターネットの世界ではUTF-8が流行—  TouchDevelopの内部はUTF-16です—  OAuthでアクセスする先は大抵UTF-8—  UTF-8文字列が必要になります
  • 32. 文字列の扱い —  TouchDevelopでは文字列はUTF-16—  UTF-8のINT配列にするには?—  web→url encodeを使って変換する—  UTF-16のINT配列を作って変換する—  最終的には後者で実装しています—  後者の方が断然速いです
  • 33. UTF-16からUTF-8への変換 —  UTF-8 ⇔ UTF-16は相互に変換可能  void  to_u8(int  c)  {          if(c  <  128)  chars.Add(c);          else  {                  if(c  <  2048)  chars.Add(((c  >>  6)  &  31)  |  192);                  else  {                          chars.Add((c  >>  12)  |  224);                          chars.Add(((c  >>  6)  &  63)  |  128);                  }                  chars.Add((c  &  63)  |  128);          }  }  
  • 34. Chapter.VI OAuthを実装する
  • 35. OAuthとは — 認可プロトコル—  認証プロトコルではない—  第三者にリソースへのアクセスを許可する—  第三者がユーザのCredentialを知ることはできない
  • 36. OAuthの仕組み —  ConsumerはProviderに仮トークンを要求—  Consumerは仮トークンを使って認証URLを要求—  Userは認証URLで自分のアカウント使いログイン—  得られたVerifierをConsumerへ通知—  ConsumerはVerifierを用いProviderへ実トークンを要求—  Providerはトークンを発行しConsumerのアクセスを認可する
  • 37. 結構めんどくさい
  • 38. 大抵ライブラリがあります —  有名な言語には大抵OAuthの実装はあります—  C++, Java, C#, Objective-C, PHP, Perl, Ruby, …—  OAuthの手実装は面倒なのでライブラリ使うのがおすすめです—  TouchDevelopにはそんなものありません
  • 39. TouchDevelopでの実装 —  OAuthで必要なものはこれまでに用意しました—  HMAC-SHA1—  Epoch Time—  UTF-8—  仕様書通りに実装するだけです—  できあがったものはTouchDevelopライブラリとして公開済みです
  • 40. DEMO できたものがこちら
  • 41. まとめ —  TouchDevelopでプログラミングを学習しました—  TouchDevelopらしい使い方ではありません—  あえて実装することで理解が深まります—  C言語の本でビット演算実装しないでしょ?—  制限された環境だと楽しくなってくる—  学習するための車輪は惜しまない