Fix integer overrun and print progress.
[shamirs] / shamirssecret.c
index b69004884bb889f5f0dc9530d39edd42b76092a8..617f959cd1f846ecd2b42934b2b7b9bb9fd8b1d2 100644 (file)
@@ -264,7 +264,6 @@ int main(int argc, char* argv[]) {
                        ERROREXIT("Could not open %s for reading.\n", in_file)
 
                uint8_t secret[MAX_LENGTH];
-               memset(secret, 0, MAX_LENGTH*sizeof(uint8_t));
 
                size_t secret_length = fread(secret, 1, MAX_LENGTH*sizeof(uint8_t), secret_file);
                if (secret_length == 0)
@@ -274,15 +273,18 @@ int main(int argc, char* argv[]) {
                fclose(secret_file);
                printf("Using secret of length %lu\n", secret_length);
 
-               uint8_t a[secret_length][k], D[n][secret_length];
+               uint8_t a[k], D[n][secret_length];
 
-               for (uint8_t i = 0; i < secret_length; i++) {
-                       a[i][0] = secret[i];
+               for (uint32_t i = 0; i < secret_length; i++) {
+                       a[0] = secret[i];
 
                        for (uint8_t j = 1; j < k; j++)
-                               assert(fread(&a[i][j], sizeof(uint8_t), 1, random) == 1);
+                               assert(fread(&a[j], sizeof(uint8_t), 1, random) == 1);
                        for (uint8_t j = 0; j < n; j++)
-                               D[j][i] = calculateQ(a[i], k, j+1);
+                               D[j][i] = calculateQ(a, k, j+1);
+
+                       if (i % 32 == 0 && i != 0)
+                               printf("Finished processing %u bytes.\n", i);
                }
 
                char out_file_name_buf[strlen(out_file_param) + 4];
@@ -312,6 +314,11 @@ int main(int argc, char* argv[]) {
                        printf("%02x", secret[i]);
                printf("\n");*/
 
+               // Clear sensitive data (No, GCC 4.7.2 is currently not optimizing this out)
+               memset(secret, 0, sizeof(uint8_t)*secret_length);
+               memset(a, 0, sizeof(uint8_t)*k);
+               memset(in_file, 0, strlen(in_file));
+
                fclose(random);
        } else {
                if (!k)
@@ -333,7 +340,7 @@ int main(int argc, char* argv[]) {
 
                uint8_t secret[MAX_LENGTH];
 
-               uint8_t i = 0;
+               uint32_t i = 0;
                while (fread(&q[0], sizeof(uint8_t), 1, files_fps[0]) == 1) {
                        for (uint8_t j = 1; j < k; j++) {
                                if (fread(&q[j], sizeof(uint8_t), 1, files_fps[j]) != 1)
@@ -349,6 +356,14 @@ int main(int argc, char* argv[]) {
 
                for (uint8_t i = 0; i < k; i++)
                        fclose(files_fps[i]);
+
+               // Clear sensitive data (No, GCC 4.7.2 is currently not optimizing this out)
+               memset(secret, 0, sizeof(uint8_t)*i);
+               memset(q, 0, sizeof(uint8_t)*k);
+               memset(out_file_param, 0, strlen(out_file_param));
+               for (uint8_t i = 0; i < k; i++)
+                       memset(files[i], 0, strlen(files[i]));
+               memset(x, 0, sizeof(uint8_t)*k);
        }
 
        return 0;