Create binary versions of signature functions
[asterisk/asterisk.git] / res / res_crypto.c
index 8df8d2b..87339f2 100755 (executable)
@@ -213,9 +213,9 @@ static struct ast_key *try_load_key (char *dir, char *fname, int ifd, int ofd, i
        if (found)
                ast_mutex_lock(&keylock);
        /* First the filename */
        if (found)
                ast_mutex_lock(&keylock);
        /* First the filename */
-       strncpy(key->fn, ffname, sizeof(key->fn));
+       strncpy(key->fn, ffname, sizeof(key->fn) - 1);
        /* Then the name */
        /* Then the name */
-       strncpy(key->name, fname, sizeof(key->name));
+       strncpy(key->name, fname, sizeof(key->name) - 1);
        key->ktype = ktype;
        /* Yes, assume we're going to be deleted */
        key->delme = 1;
        key->ktype = ktype;
        /* Yes, assume we're going to be deleted */
        key->delme = 1;
@@ -296,10 +296,9 @@ static char *binary(int y, int len)
 
 #endif
 
 
 #endif
 
-int ast_sign(struct ast_key *key, char *msg, char *sig)
+int ast_sign_bin(struct ast_key *key, char *msg, unsigned char *dsig)
 {
        unsigned char digest[20];
 {
        unsigned char digest[20];
-       unsigned char dsig[128];
        int siglen = sizeof(dsig);
        int res;
 
        int siglen = sizeof(dsig);
        int res;
 
@@ -324,16 +323,26 @@ int ast_sign(struct ast_key *key, char *msg, char *sig)
                return -1;
        }
 
                return -1;
        }
 
-       /* Success -- encode (256 bytes max as documented) */
-       ast_base64encode(sig, dsig, siglen, 256);
        return 0;
        
 }
 
        return 0;
        
 }
 
-int ast_check_signature(struct ast_key *key, char *msg, char *sig)
+int ast_sign(struct ast_key *key, char *msg, char *sig)
 {
 {
-       unsigned char digest[20];
        unsigned char dsig[128];
        unsigned char dsig[128];
+       int siglen = sizeof(dsig);
+       int res;
+       res = ast_sign_bin(key, msg, dsig);
+       if (!res)
+               /* Success -- encode (256 bytes max as documented) */
+               ast_base64encode(sig, dsig, siglen, 256);
+       return res;
+       
+}
+
+int ast_check_signature_bin(struct ast_key *key, char *msg, unsigned char *dsig)
+{
+       unsigned char digest[20];
        int res;
 
        if (key->ktype != AST_KEY_PUBLIC) {
        int res;
 
        if (key->ktype != AST_KEY_PUBLIC) {
@@ -343,13 +352,6 @@ int ast_check_signature(struct ast_key *key, char *msg, char *sig)
                return -1;
        }
 
                return -1;
        }
 
-       /* Decode signature */
-       res = ast_base64decode(dsig, sig, sizeof(dsig));
-       if (res != sizeof(dsig)) {
-               ast_log(LOG_WARNING, "Signature improper length (expect %d, got %d)\n", (int)sizeof(dsig), (int)res);
-               return -1;
-       }
-
        /* Calculate digest of message */
        SHA1((unsigned char *)msg, strlen(msg), digest);
 
        /* Calculate digest of message */
        SHA1((unsigned char *)msg, strlen(msg), digest);
 
@@ -364,6 +366,21 @@ int ast_check_signature(struct ast_key *key, char *msg, char *sig)
        return 0;
 }
 
        return 0;
 }
 
+int ast_check_signature(struct ast_key *key, char *msg, char *sig)
+{
+       unsigned char dsig[128];
+       int res;
+
+       /* Decode signature */
+       res = ast_base64decode(dsig, sig, sizeof(dsig));
+       if (res != sizeof(dsig)) {
+               ast_log(LOG_WARNING, "Signature improper length (expect %d, got %d)\n", (int)sizeof(dsig), (int)res);
+               return -1;
+       }
+       res = ast_check_signature_bin(key, msg, dsig);
+       return res;
+}
+
 static void crypto_load(int ifd, int ofd)
 {
        struct ast_key *key, *nkey, *last;
 static void crypto_load(int ifd, int ofd)
 {
        struct ast_key *key, *nkey, *last;
@@ -444,14 +461,14 @@ static int init_keys(int fd, int argc, char *argv[])
        struct ast_key *key;
        int ign;
        char *kn;
        struct ast_key *key;
        int ign;
        char *kn;
-       char tmp[256];
+       char tmp[256] = "";
 
        key = keys;
        while(key) {
                /* Reload keys that need pass codes now */
                if (key->ktype & KEY_NEEDS_PASSCODE) {
                        kn = key->fn + strlen(ast_config_AST_KEY_DIR) + 1;
 
        key = keys;
        while(key) {
                /* Reload keys that need pass codes now */
                if (key->ktype & KEY_NEEDS_PASSCODE) {
                        kn = key->fn + strlen(ast_config_AST_KEY_DIR) + 1;
-                       strncpy(tmp, kn, sizeof(tmp));
+                       strncpy(tmp, kn, sizeof(tmp) - 1);
                        try_load_key((char *)ast_config_AST_KEY_DIR, tmp, fd, fd, &ign);
                }
                key = key->next;
                        try_load_key((char *)ast_config_AST_KEY_DIR, tmp, fd, fd, &ign);
                }
                key = key->next;