Twitter with OAuth Example.\\ see also http://www.soramimi.jp/twicpp/index.html
Dependencies: mbed HTTPClient NTPClient_NetServices EthernetNetIf
hash.cpp@0:7ddb56bfde0c, 2011-03-23 (annotated)
- Committer:
- soramimi
- Date:
- Wed Mar 23 19:53:42 2011 +0000
- Revision:
- 0:7ddb56bfde0c
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
soramimi | 0:7ddb56bfde0c | 1 | |
soramimi | 0:7ddb56bfde0c | 2 | #include "oauth.h" // base64 encode fn's. |
soramimi | 0:7ddb56bfde0c | 3 | #include "sha1.h" |
soramimi | 0:7ddb56bfde0c | 4 | |
soramimi | 0:7ddb56bfde0c | 5 | #include <string.h> |
soramimi | 0:7ddb56bfde0c | 6 | |
soramimi | 0:7ddb56bfde0c | 7 | void hmac_sha1(unsigned char const *key, size_t keylen, unsigned char const *in, size_t inlen, unsigned char *resbuf) |
soramimi | 0:7ddb56bfde0c | 8 | { |
soramimi | 0:7ddb56bfde0c | 9 | struct SHA1Context inner; |
soramimi | 0:7ddb56bfde0c | 10 | struct SHA1Context outer; |
soramimi | 0:7ddb56bfde0c | 11 | unsigned char tmpkey[20]; |
soramimi | 0:7ddb56bfde0c | 12 | unsigned char digest[20]; |
soramimi | 0:7ddb56bfde0c | 13 | unsigned char block[64]; |
soramimi | 0:7ddb56bfde0c | 14 | |
soramimi | 0:7ddb56bfde0c | 15 | const int IPAD = 0x36; |
soramimi | 0:7ddb56bfde0c | 16 | const int OPAD = 0x5c; |
soramimi | 0:7ddb56bfde0c | 17 | |
soramimi | 0:7ddb56bfde0c | 18 | if (keylen > 64) { |
soramimi | 0:7ddb56bfde0c | 19 | struct SHA1Context keyhash; |
soramimi | 0:7ddb56bfde0c | 20 | SHA1Reset(&keyhash); |
soramimi | 0:7ddb56bfde0c | 21 | SHA1Input(&keyhash, key, keylen); |
soramimi | 0:7ddb56bfde0c | 22 | SHA1Result(&keyhash, tmpkey); |
soramimi | 0:7ddb56bfde0c | 23 | key = tmpkey; |
soramimi | 0:7ddb56bfde0c | 24 | keylen = 20; |
soramimi | 0:7ddb56bfde0c | 25 | } |
soramimi | 0:7ddb56bfde0c | 26 | |
soramimi | 0:7ddb56bfde0c | 27 | for (size_t i = 0; i < sizeof(block); i++) { |
soramimi | 0:7ddb56bfde0c | 28 | block[i] = IPAD ^ (i < keylen ? key[i] : 0); |
soramimi | 0:7ddb56bfde0c | 29 | } |
soramimi | 0:7ddb56bfde0c | 30 | SHA1Reset(&inner); |
soramimi | 0:7ddb56bfde0c | 31 | SHA1Input(&inner, block, 64); |
soramimi | 0:7ddb56bfde0c | 32 | SHA1Input(&inner, in, inlen); |
soramimi | 0:7ddb56bfde0c | 33 | SHA1Result(&inner, digest); |
soramimi | 0:7ddb56bfde0c | 34 | |
soramimi | 0:7ddb56bfde0c | 35 | for (size_t i = 0; i < sizeof(block); i++) { |
soramimi | 0:7ddb56bfde0c | 36 | block[i] = OPAD ^ (i < keylen ? key[i] : 0); |
soramimi | 0:7ddb56bfde0c | 37 | } |
soramimi | 0:7ddb56bfde0c | 38 | SHA1Reset(&outer); |
soramimi | 0:7ddb56bfde0c | 39 | SHA1Input(&outer, block, 64); |
soramimi | 0:7ddb56bfde0c | 40 | SHA1Input(&outer, digest, 20); |
soramimi | 0:7ddb56bfde0c | 41 | SHA1Result(&outer, resbuf); |
soramimi | 0:7ddb56bfde0c | 42 | } |
soramimi | 0:7ddb56bfde0c | 43 | |
soramimi | 0:7ddb56bfde0c | 44 | |
soramimi | 0:7ddb56bfde0c | 45 | std::string oauth_sign_hmac_sha1(const char *m, const char *k) |
soramimi | 0:7ddb56bfde0c | 46 | { |
soramimi | 0:7ddb56bfde0c | 47 | return oauth_sign_hmac_sha1_raw(m, strlen(m), k, strlen(k)); |
soramimi | 0:7ddb56bfde0c | 48 | } |
soramimi | 0:7ddb56bfde0c | 49 | |
soramimi | 0:7ddb56bfde0c | 50 | std::string oauth_sign_hmac_sha1_raw(const char *m, const size_t ml, const char *k, const size_t kl) |
soramimi | 0:7ddb56bfde0c | 51 | { |
soramimi | 0:7ddb56bfde0c | 52 | unsigned char result[20]; |
soramimi | 0:7ddb56bfde0c | 53 | hmac_sha1((unsigned char const *)k, kl, (unsigned char const *)m, ml, result); |
soramimi | 0:7ddb56bfde0c | 54 | return oauth_encode_base64(result, 20); |
soramimi | 0:7ddb56bfde0c | 55 | } |
soramimi | 0:7ddb56bfde0c | 56 |