Instantly share code, notes, and snippets.
Created
November 24, 2013 18:02
-
Star
1
(1)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save Tasssadar/7630188 to your computer and use it in GitHub Desktop.
A little C program to dump contents of /proc/atags - count, size and md5 checksums
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #ifndef _DMADORE_MD5_H | |
| #define _DMADORE_MD5_H | |
| struct md5_ctx { | |
| /* The four chaining variables */ | |
| unsigned long buf[4]; | |
| /* Count number of message bits */ | |
| unsigned long bits[2]; | |
| /* Data being fed in */ | |
| unsigned long in[16]; | |
| /* Our position within the 512 bits (always between 0 and 63) */ | |
| int b; | |
| }; | |
| void MD5_transform (unsigned long buf[4], const unsigned long in[16]); | |
| void MD5_start (struct md5_ctx *context); | |
| void MD5_feed (struct md5_ctx *context, unsigned char inb); | |
| void MD5_stop (struct md5_ctx *context, unsigned char digest[16]); | |
| #endif /* not defined _DMADORE_MD5_H */ | |
| /* === The implementation === */ | |
| #define F1(x, y, z) (z ^ (x & (y ^ z))) | |
| #define F2(x, y, z) F1(z, x, y) | |
| #define F3(x, y, z) (x ^ y ^ z) | |
| #define F4(x, y, z) (y ^ (x | ~z)) | |
| #define MD5STEP(f, w, x, y, z, data, s) \ | |
| { w += f (x, y, z) + data; w = w<<s | (w&0xffffffffUL)>>(32-s); \ | |
| w += x; } | |
| void | |
| MD5_transform (unsigned long buf[4], const unsigned long in[16]) | |
| { | |
| register unsigned long a, b, c, d; | |
| a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; | |
| MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478UL, 7); | |
| MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756UL, 12); | |
| MD5STEP(F1, c, d, a, b, in[2] + 0x242070dbUL, 17); | |
| MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceeeUL, 22); | |
| MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafUL, 7); | |
| MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aUL, 12); | |
| MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613UL, 17); | |
| MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501UL, 22); | |
| MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8UL, 7); | |
| MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7afUL, 12); | |
| MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1UL, 17); | |
| MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7beUL, 22); | |
| MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122UL, 7); | |
| MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193UL, 12); | |
| MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eUL, 17); | |
| MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821UL, 22); | |
| MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562UL, 5); | |
| MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340UL, 9); | |
| MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51UL, 14); | |
| MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aaUL, 20); | |
| MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105dUL, 5); | |
| MD5STEP(F2, d, a, b, c, in[10] + 0x02441453UL, 9); | |
| MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681UL, 14); | |
| MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8UL, 20); | |
| MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6UL, 5); | |
| MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6UL, 9); | |
| MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87UL, 14); | |
| MD5STEP(F2, b, c, d, a, in[8] + 0x455a14edUL, 20); | |
| MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905UL, 5); | |
| MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8UL, 9); | |
| MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9UL, 14); | |
| MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aUL, 20); | |
| MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942UL, 4); | |
| MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681UL, 11); | |
| MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122UL, 16); | |
| MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380cUL, 23); | |
| MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44UL, 4); | |
| MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9UL, 11); | |
| MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60UL, 16); | |
| MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70UL, 23); | |
| MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6UL, 4); | |
| MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faUL, 11); | |
| MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085UL, 16); | |
| MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05UL, 23); | |
| MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039UL, 4); | |
| MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5UL, 11); | |
| MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8UL, 16); | |
| MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665UL, 23); | |
| MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244UL, 6); | |
| MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97UL, 10); | |
| MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7UL, 15); | |
| MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039UL, 21); | |
| MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3UL, 6); | |
| MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92UL, 10); | |
| MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47dUL, 15); | |
| MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1UL, 21); | |
| MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fUL, 6); | |
| MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0UL, 10); | |
| MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314UL, 15); | |
| MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1UL, 21); | |
| MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82UL, 6); | |
| MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235UL, 10); | |
| MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bbUL, 15); | |
| MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391UL, 21); | |
| buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; | |
| } | |
| #undef F1 | |
| #undef F2 | |
| #undef F3 | |
| #undef F4 | |
| #undef MD5STEP | |
| void | |
| MD5_start (struct md5_ctx *ctx) | |
| { | |
| int i; | |
| ctx->buf[0] = 0x67452301UL; | |
| ctx->buf[1] = 0xefcdab89UL; | |
| ctx->buf[2] = 0x98badcfeUL; | |
| ctx->buf[3] = 0x10325476UL; | |
| ctx->bits[0] = 0; | |
| ctx->bits[1] = 0; | |
| for ( i=0 ; i<16 ; i++ ) | |
| ctx->in[i] = 0; | |
| ctx->b = 0; | |
| } | |
| void | |
| MD5_feed (struct md5_ctx *ctx, unsigned char inb) | |
| { | |
| int i; | |
| unsigned long temp; | |
| ctx->in[ctx->b/4] |= ((unsigned long)inb) << ((ctx->b%4)*8); | |
| if ( ++ctx->b >= 64 ) | |
| { | |
| MD5_transform (ctx->buf, ctx->in); | |
| ctx->b = 0; | |
| for ( i=0 ; i<16 ; i++ ) | |
| ctx->in[i] = 0; | |
| } | |
| temp = ctx->bits[0]; | |
| ctx->bits[0] += 8; | |
| if ( (temp&0xffffffffUL) > (ctx->bits[0]&0xffffffffUL) ) | |
| ctx->bits[1]++; | |
| } | |
| void | |
| MD5_stop (struct md5_ctx *ctx, unsigned char digest[32]) | |
| { | |
| int i; | |
| unsigned long bits[2]; | |
| for ( i=0 ; i<2 ; i++ ) | |
| bits[i] = ctx->bits[i]; | |
| MD5_feed (ctx, 0x80); | |
| for ( ; ctx->b!=56 ; ) | |
| MD5_feed (ctx, 0); | |
| for ( i=0 ; i<2 ; i++ ) | |
| { | |
| MD5_feed (ctx, bits[i]&0xff); | |
| MD5_feed (ctx, (bits[i]>>8)&0xff); | |
| MD5_feed (ctx, (bits[i]>>16)&0xff); | |
| MD5_feed (ctx, (bits[i]>>24)&0xff); | |
| } | |
| /*for ( i=0 ; i<4 ; i++ ) | |
| { | |
| digest[4*i] = ctx->buf[i]&0xff; | |
| digest[4*i+1] = (ctx->buf[i]>>8)&0xff; | |
| digest[4*i+2] = (ctx->buf[i]>>16)&0xff; | |
| digest[4*i+3] = (ctx->buf[i]>>24)&0xff; | |
| }*/ | |
| static const char *hex = "0123456789abcdef"; | |
| for ( i=0 ; i<4 ; i++ ) | |
| { | |
| digest[4*i] = hex[(ctx->buf[i]&0xff) >> 4]; | |
| digest[4*i+1] = hex[(ctx->buf[i]&0xff) & 0x0F]; | |
| digest[4*i+2] = hex[((ctx->buf[i]>>8)&0xff) >> 4]; | |
| digest[4*i+3] = hex[((ctx->buf[i]>>8)&0xff) & 0x0F]; | |
| digest[4*i+4] = hex[((ctx->buf[i]>>16)&0xff) >> 4]; | |
| digest[4*i+5] = hex[((ctx->buf[i]>>16)&0xff) & 0x0F]; | |
| digest[4*i+6] = hex[((ctx->buf[i]>>24)&0xff) >> 4]; | |
| digest[4*i+7] = hex[((ctx->buf[i]>>24)&0xff) & 0x0F]; | |
| } | |
| } | |
| // ============================================================================ | |
| #include <stdio.h> | |
| #include <stdint.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| static const char *DEFAULT_PATH = "/proc/atags"; | |
| struct tag_header { | |
| uint32_t size; | |
| uint32_t tag; | |
| }; | |
| struct tag { | |
| struct tag_header hdr; | |
| union { | |
| /* data structs */ | |
| } u; | |
| }; | |
| #define ATAG_NONE 0x00000000 | |
| #define tag_next(t) ((struct tag *)((uint32_t *)(t) + (t)->hdr.size)) | |
| int main(int argc, const char **argv) { | |
| const char *path = DEFAULT_PATH; | |
| if(argc >= 2) | |
| path = argv[1]; | |
| FILE *f = fopen(path, "r"); | |
| if(!f) | |
| { | |
| fprintf(stderr, "Failed to open \"%s\"!\n", path); | |
| return -1; | |
| } | |
| char *data = NULL; | |
| char buff[128]; | |
| size_t read = 0; | |
| size_t size = 0; | |
| while((read = fread(buff, 1, sizeof(buff), f)) > 0) | |
| { | |
| data = realloc(data, size+read); | |
| memcpy(data+size, buff, read); | |
| size += read; | |
| } | |
| struct tag *t = (struct tag*)data; | |
| size = 0; | |
| size_t count = 0; | |
| int i; | |
| struct md5_ctx context; | |
| unsigned char md5[33] = { 0 }; | |
| for (; t->hdr.size; t = tag_next(t)) | |
| { | |
| ++count; | |
| size += t->hdr.size*4; | |
| MD5_start (&context); | |
| for(i = sizeof(struct tag_header); i < (t->hdr.size*4); ++i) | |
| MD5_feed(&context, ((char*)t)[i]); | |
| MD5_stop (&context, md5); | |
| printf("Tag %02u: 0x%08X, size %06u, md5 %s\n", count, t->hdr.tag, t->hdr.size*4, md5); | |
| } | |
| printf("Total count: %u size: %u\n", count, size); | |
| free(data); | |
| fclose(f); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment