Home | History | Annotate | Download | only in lib
      1 /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  *
      5  * Host functions for verified boot.
      6  */
      7 
      8 /* TODO: change all 'return 0', 'return 1' into meaningful return codes */
      9 
     10 #include <stdio.h>
     11 #include <stdlib.h>
     12 #include <string.h>
     13 #include <unistd.h>
     14 
     15 #include "cryptolib.h"
     16 #include "host_common.h"
     17 #include "vboot_common.h"
     18 
     19 
     20 char* StrCopy(char* dest, const char* src, int dest_size) {
     21   strncpy(dest, src, dest_size);
     22   dest[dest_size - 1] = '\0';
     23   return dest;
     24 }
     25 
     26 
     27 uint8_t* ReadFile(const char* filename, uint64_t* sizeptr) {
     28   FILE* f;
     29   uint8_t* buf;
     30   uint64_t size;
     31 
     32   f = fopen(filename, "rb");
     33   if (!f) {
     34     VBDEBUG(("Unable to open file %s\n", filename));
     35     return NULL;
     36   }
     37 
     38   fseek(f, 0, SEEK_END);
     39   size = ftell(f);
     40   rewind(f);
     41 
     42   buf = malloc(size);
     43   if (!buf) {
     44     fclose(f);
     45     return NULL;
     46   }
     47 
     48   if(1 != fread(buf, size, 1, f)) {
     49     VBDEBUG(("Unable to read from file %s\n", filename));
     50     fclose(f);
     51     free(buf);
     52     return NULL;
     53   }
     54 
     55   fclose(f);
     56   if (sizeptr)
     57     *sizeptr = size;
     58   return buf;
     59 }
     60 
     61 
     62 char* ReadFileString(char* dest, int size, const char* filename) {
     63   char* got;
     64   FILE* f;
     65 
     66   f = fopen(filename, "rt");
     67   if (!f)
     68     return NULL;
     69 
     70   got = fgets(dest, size, f);
     71   fclose(f);
     72   return got;
     73 }
     74 
     75 
     76 int ReadFileInt(const char* filename, unsigned* value) {
     77   char buf[64];
     78   char* e = NULL;
     79 
     80   if (!ReadFileString(buf, sizeof(buf), filename))
     81     return -1;
     82 
     83   /* Convert to integer.  Allow characters after the int ("123 blah"). */
     84   *value = (unsigned)strtoul(buf, &e, 0);
     85   if (e == buf)
     86     return -1;  /* No characters consumed, so conversion failed */
     87 
     88   return 0;
     89 }
     90 
     91 
     92 int ReadFileBit(const char* filename, int bitmask) {
     93   unsigned value;
     94   if (ReadFileInt(filename, &value) < 0)
     95     return -1;
     96   else return (value & bitmask ? 1 : 0);
     97 }
     98 
     99 
    100 int WriteFile(const char* filename, const void *data, uint64_t size) {
    101   FILE *f = fopen(filename, "wb");
    102   if (!f) {
    103     VBDEBUG(("Unable to open file %s\n", filename));
    104     return 1;
    105   }
    106 
    107   if (1 != fwrite(data, size, 1, f)) {
    108     VBDEBUG(("Unable to write to file %s\n", filename));
    109     fclose(f);
    110     unlink(filename);  /* Delete any partial file */
    111     return 1;
    112   }
    113 
    114   fclose(f);
    115   return 0;
    116 }
    117