libaacs | branch: master | npzacs <[email protected]> | Wed Nov  3 13:39:09 2010 
+0200| [05ee93d4c566cfd6b6c45028748a3ba9ac8d7319] | committer: npzacs 

Added loaders for simple key files

> http://git.videolan.org/gitweb.cgi/libaacs.git/?a=commit;h=05ee93d4c566cfd6b6c45028748a3ba9ac8d7319
---

 src/file/keydbcfg.c |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/file/keydbcfg.h |    2 +
 2 files changed, 163 insertions(+), 0 deletions(-)

diff --git a/src/file/keydbcfg.c b/src/file/keydbcfg.c
index 8289c74..fea001a 100644
--- a/src/file/keydbcfg.c
+++ b/src/file/keydbcfg.c
@@ -32,7 +32,168 @@
 #define SYSTEM_CFG_DIR "/etc/libaacs/"
 
 #define CFG_FILE_NAME  "KEYDB.cfg"
+#define CERT_FILE_NAME "HostKeyCertificate.txt"
+#define PK_FILE_NAME   "ProcessingDeviceKeysSimple.txt"
 
+#define MIN_FILE_SIZE  20
+#define MAX_FILE_SIZE  65535
+
+
+static char *_load_file(FILE *fp)
+{
+    char *data = NULL;
+    long file_size, read_size;
+
+    fseek(fp, 0, SEEK_END);
+    file_size = ftell(fp);
+    fseek(fp, 0, SEEK_SET);
+
+    if (file_size < MIN_FILE_SIZE || file_size > MAX_FILE_SIZE) {
+        DEBUG(DBG_FILE, "Invalid file size\n");
+        return NULL;
+    }
+
+    data      = malloc(file_size + 1);
+    read_size = fread(data, 1, file_size, fp);
+
+    if (read_size != file_size) {
+        DEBUG(DBG_FILE, "Error reading file\n");
+        X_FREE(data);
+       return NULL;
+    }
+
+    data[file_size] = 0;
+
+    return data;
+}
+
+static FILE *_open_cfg_file(const char *file_name, int user)
+{
+    char *cfg_file = NULL;
+
+    if (user) {
+        const char *userhome = getenv("HOME");
+        cfg_file = str_printf("%s%s%s", userhome, USER_CFG_DIR, file_name);
+
+    } else {
+        cfg_file = str_printf("%s%s", SYSTEM_CFG_DIR, file_name);
+    }
+
+    FILE *fp = fopen(cfg_file, "r");
+
+    DEBUG(DBG_FILE, fp ? "Reading %s\n" : "%s not found\n", cfg_file);
+
+    X_FREE(cfg_file);
+
+    return fp;
+}
+
+static int _parse_pk_file(config_file *cf, FILE *fp)
+{
+    char *data   = _load_file(fp);
+    int   result = 0;
+
+    if (data) {
+        const char *p = data;
+
+        while (*p) {
+            char *str = str_get_hex_string(p, 2*16);
+
+            if (str) {
+                DEBUG(DBG_FILE, "Found processing key %s\n", str);
+
+                pk_list *e = calloc(1, sizeof(pk_list));
+
+                e->key  = str;
+               e->next = cf->pkl;
+
+                cf->pkl = e;
+
+                result++;
+            }
+
+            p = str_next_line(p);
+        }
+
+        X_FREE(data);
+    }
+
+    return result;
+}
+
+static int _parse_cert_file(config_file *cf, FILE *fp)
+{
+    char *data   = _load_file(fp);
+    int   result = 0;
+
+    if (data) {
+        const char *p = data;
+        cert_list  *e = calloc(1, sizeof(cert_list));
+
+        e->host_priv_key = str_get_hex_string(p, 2*20);
+        p = str_next_line(p);
+        e->host_cert = str_get_hex_string(p, 2*92);
+
+        X_FREE(data);
+
+        if (!e->host_priv_key || !e->host_cert) {
+            DEBUG(DBG_FILE, "Invalid file\n");
+            X_FREE(e->host_priv_key);
+            X_FREE(e->host_cert);
+            X_FREE(e);
+
+        } else {
+            DEBUG(DBG_FILE, "Found certificate: %s %s\n", e->host_priv_key, 
e->host_cert);
+            e->next = cf->host_cert_list;
+            cf->host_cert_list = e;
+            result = 1;
+        }
+    }
+
+    return result;
+}
+
+int keydbcfg_load_pk_file(config_file *cf)
+{
+    static const char pk_file_name[] = PK_FILE_NAME;
+    FILE *fp;
+    int result = 0;
+
+    fp = _open_cfg_file(pk_file_name, 0);
+    if (fp) {
+        result += _parse_pk_file(cf, fp);
+        fclose(fp);
+    }
+
+    fp = _open_cfg_file(pk_file_name, 1);
+    if (fp) {
+        result += _parse_pk_file(cf, fp);
+        fclose(fp);
+    }
+
+    return result;
+}
+
+int keydbcfg_load_cert_file(config_file *cf)
+{
+    static const char cert_file_name[] = CERT_FILE_NAME;
+    FILE *fp;
+    int result = 0;
+
+    fp = _open_cfg_file(cert_file_name, 0);
+    if (fp) {
+        result += _parse_cert_file(cf, fp);
+        fclose(fp);
+    }
+
+    fp = _open_cfg_file(cert_file_name, 1);
+    if (fp) {
+        result += _parse_cert_file(cf, fp);
+        fclose(fp);
+    }
+
+    return result;
+}
 
 char *keydbcfg_find_config_file(void)
 {
diff --git a/src/file/keydbcfg.h b/src/file/keydbcfg.h
index 9c273f9..44e47f1 100644
--- a/src/file/keydbcfg.h
+++ b/src/file/keydbcfg.h
@@ -117,6 +117,8 @@ AACS_PRIVATE int keydbcfg_config_file_close(config_file 
*cfgfile);
 /* */
 
 AACS_PRIVATE char *keydbcfg_find_config_file(void);
+AACS_PRIVATE int   keydbcfg_load_cert_file(config_file *cf);
+AACS_PRIVATE int   keydbcfg_load_pk_file(config_file *cf);
 
 
 #endif

_______________________________________________
libaacs-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libaacs-devel

Reply via email to