Added digest_len and raw_digest_len fields and replaced strlen() calls
authorMichael Rash <mbr@cipherdyne.org>
Thu, 26 Jul 2012 19:00:32 +0000 (15:00 -0400)
committerMichael Rash <mbr@cipherdyne.org>
Thu, 26 Jul 2012 19:00:32 +0000 (15:00 -0400)
lib/fko_context.h
lib/fko_digest.c
lib/fko_encryption.c

index 2646625..5d3e52a 100644 (file)
@@ -70,12 +70,14 @@ struct fko_context {
     /* Computed or predefined data */
     char           *version;
     char           *digest;
+    int             digest_len;
 
     /* Digest of raw encrypted/base64 data - this is used
      * for replay attack detection
     */
     char           *raw_digest;
     short           raw_digest_type;
+    int             raw_digest_len;
 
     /* Computed processed data (encodings, etc.) */
     char           *encoded_msg;
index 6d6015c..0654c39 100644 (file)
@@ -98,7 +98,7 @@ fko_get_raw_spa_digest_type(fko_ctx_t ctx, short *raw_digest_type)
 }
 
 static int
-set_digest(char *data, char **digest, short digest_type)
+set_digest(char *data, char **digest, short digest_type, int *digest_len)
 {
     char    *md = NULL;
     int     data_len;
@@ -117,6 +117,7 @@ set_digest(char *data, char **digest, short digest_type)
 
             md5_base64(md,
                 (unsigned char*)data, data_len);
+            *digest_len = MD5_B64_LENGTH;
             break;
 
         case FKO_DIGEST_SHA1:
@@ -126,6 +127,7 @@ set_digest(char *data, char **digest, short digest_type)
 
             sha1_base64(md,
                 (unsigned char*)data, data_len);
+            *digest_len = SHA1_B64_LENGTH;
             break;
 
         case FKO_DIGEST_SHA256:
@@ -135,6 +137,7 @@ set_digest(char *data, char **digest, short digest_type)
 
             sha256_base64(md,
                 (unsigned char*)data, data_len);
+            *digest_len = SHA256_B64_LENGTH;
             break;
 
         case FKO_DIGEST_SHA384:
@@ -144,6 +147,7 @@ set_digest(char *data, char **digest, short digest_type)
 
             sha384_base64(md,
                 (unsigned char*)data, data_len);
+            *digest_len = SHA384_B64_LENGTH;
             break;
 
         case FKO_DIGEST_SHA512:
@@ -153,6 +157,7 @@ set_digest(char *data, char **digest, short digest_type)
 
             sha512_base64(md,
                 (unsigned char*)data, data_len);
+            *digest_len = SHA512_B64_LENGTH;
             break;
 
         default:
@@ -183,8 +188,8 @@ fko_set_spa_digest(fko_ctx_t ctx)
     if(ctx->encoded_msg == NULL)
         return(FKO_ERROR_MISSING_ENCODED_DATA);
 
-    return set_digest(ctx->encoded_msg,
-        &ctx->digest, ctx->digest_type);
+    return set_digest(ctx->encoded_msg, &ctx->digest,
+        ctx->digest_type, &ctx->digest_len);
 }
 
 int
@@ -200,8 +205,8 @@ fko_set_raw_spa_digest(fko_ctx_t ctx)
     if(ctx->encrypted_msg == NULL)
         return(FKO_ERROR_MISSING_ENCODED_DATA);
 
-    return set_digest(ctx->encrypted_msg,
-        &ctx->raw_digest, ctx->raw_digest_type);
+    return set_digest(ctx->encrypted_msg, &ctx->raw_digest,
+        ctx->raw_digest_type, &ctx->raw_digest_len);
 }
 
 int
index 8c34cf6..754822b 100644 (file)
@@ -54,7 +54,7 @@ _rijndael_encrypt(fko_ctx_t ctx, const char *enc_key, const int enc_key_len)
      * and populate it appropriately.
     */
     plaintext = calloc(1, ctx->encoded_msg_len
-                    + strlen(ctx->digest) + RIJNDAEL_BLOCKSIZE + 2);
+                    + ctx->digest_len + RIJNDAEL_BLOCKSIZE + 2);
 
     if(plaintext == NULL)
         return(FKO_ERROR_MEMORY_ALLOCATION);
@@ -219,7 +219,7 @@ gpg_encrypt(fko_ctx_t ctx, const char *enc_key)
     /* Make a bucket big enough to hold the enc msg + digest (plaintext)
      * and populate it appropriately.
     */
-    plain = malloc(ctx->encoded_msg_len + strlen(ctx->digest) + 2);
+    plain = malloc(ctx->encoded_msg_len + ctx->digest_len + 2);
     if(plain == NULL)
         return(FKO_ERROR_MEMORY_ALLOCATION);