char *oauth_body_hash_data(size_t length, const char *data) { PK11SlotInfo *slot = NULL; PK11Context *context = NULL; unsigned char digest[20]; // Is there a way to tell how large the output is? unsigned int len; SECStatus s; char *rv=NULL; oauth_init_nss(); slot = PK11_GetInternalKeySlot(); if (!slot) goto looser; context = PK11_CreateDigestContext(SEC_OID_SHA1); if (!context) goto looser; s = PK11_DigestBegin(context); if (s != SECSuccess) goto looser; s = PK11_DigestOp(context, (unsigned char*) data, length); if (s != SECSuccess) goto looser; s = PK11_DigestFinal(context, digest, &len, sizeof digest); if (s != SECSuccess) goto looser; unsigned char *dgst = xmalloc(len*sizeof(char)); // oauth_body_hash_encode frees the digest.. memcpy(dgst, digest, len); rv=oauth_body_hash_encode(len, dgst); looser: if (context) PK11_DestroyContext(context, PR_TRUE); if (slot) PK11_FreeSlot(slot); return rv; }
char *oauth_body_hash_data(size_t length, const char *data) { sha1nfo s; sha1_init(&s); for (;length--;) sha1_writebyte(&s, *data++); unsigned char *dgst = xmalloc(HASH_LENGTH*sizeof(char)); // oauth_body_hash_encode frees the digest.. memcpy(dgst, sha1_result(&s), HASH_LENGTH); return oauth_body_hash_encode(HASH_LENGTH, dgst); }
char *oauth_body_hash_data(size_t length, const char *data) { EVP_MD_CTX ctx; size_t len=0; unsigned char *md; md=(unsigned char*) xcalloc(EVP_MD_size(EVP_sha1()),sizeof(unsigned char)); EVP_MD_CTX_init(&ctx); EVP_DigestInit(&ctx,EVP_sha1()); EVP_DigestUpdate(&ctx, data, length); EVP_DigestFinal(&ctx, md,(unsigned int*) &len); EVP_MD_CTX_cleanup(&ctx); return oauth_body_hash_encode(len, md); }
char *oauth_body_hash_file(char *filename) { FILE *F= fopen(filename, "r"); if (!F) return NULL; size_t len=0; char fb[BUFSIZ]; sha1nfo s; sha1_init(&s); while (!feof(F) && (len=fread(fb,sizeof(char),BUFSIZ, F))>0) { sha1_write(&s, fb, len); } fclose(F); unsigned char *dgst = xmalloc(HASH_LENGTH*sizeof(char)); // oauth_body_hash_encode frees the digest.. memcpy(dgst, sha1_result(&s), HASH_LENGTH); return oauth_body_hash_encode(HASH_LENGTH, dgst); }
/** * http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html */ char *oauth_body_hash_file(char *filename) { unsigned char fb[BUFSIZ]; EVP_MD_CTX ctx; size_t len=0; unsigned char *md; FILE *F= fopen(filename, "r"); if (!F) return NULL; EVP_MD_CTX_init(&ctx); EVP_DigestInit(&ctx,EVP_sha1()); while (!feof(F) && (len=fread(fb,sizeof(char),BUFSIZ, F))>0) { EVP_DigestUpdate(&ctx, fb, len); } fclose(F); len=0; md=(unsigned char*) xcalloc(EVP_MD_size(EVP_sha1()),sizeof(unsigned char)); EVP_DigestFinal(&ctx, md,(unsigned int*) &len); EVP_MD_CTX_cleanup(&ctx); return oauth_body_hash_encode(len, md); }
char *oauth_body_hash_file(char *filename) { PK11SlotInfo *slot = NULL; PK11Context *context = NULL; unsigned char digest[20]; // Is there a way to tell how large the output is? unsigned int len; SECStatus s; char *rv=NULL; size_t bl; unsigned char fb[BUFSIZ]; FILE *F= fopen(filename, "r"); if (!F) return NULL; oauth_init_nss(); slot = PK11_GetInternalKeySlot(); if (!slot) goto looser; context = PK11_CreateDigestContext(SEC_OID_SHA1); if (!context) goto looser; s = PK11_DigestBegin(context); if (s != SECSuccess) goto looser; while (!feof(F) && (bl=fread(fb,sizeof(char),BUFSIZ, F))>0) { s = PK11_DigestOp(context, (unsigned char*) fb, bl); if (s != SECSuccess) goto looser; } s = PK11_DigestFinal(context, digest, &len, sizeof digest); if (s != SECSuccess) goto looser; unsigned char *dgst = xmalloc(len*sizeof(char)); // oauth_body_hash_encode frees the digest.. memcpy(dgst, digest, len); rv=oauth_body_hash_encode(len, dgst); looser: fclose(F); if (context) PK11_DestroyContext(context, PR_TRUE); if (slot) PK11_FreeSlot(slot); return rv; }