Fix crypt_load usage in Python binding.
authorMilan Broz <gmazyland@gmail.com>
Mon, 7 Nov 2011 13:05:16 +0000 (13:05 +0000)
committerMilan Broz <gmazyland@gmail.com>
Mon, 7 Nov 2011 13:05:16 +0000 (13:05 +0000)
git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@678 36d66b0a-2a48-0410-832c-cd162a569da5

python/pycryptsetup-test.py
python/pycryptsetup.c

index 091d157..1dc78cd 100755 (executable)
@@ -70,4 +70,30 @@ print "deact.  :", c.deactivate()
 
 del c
 
+c = pycryptsetup.CryptSetup(
+        device = IMG,
+        name = DEVICE,
+        yesDialog = askyes,
+        logFunc = log,
+        passwordDialog = askpassword)
+
+print "activate:", c.activate(name = DEVICE, passphrase = PASSWORD)
+
+c2 = pycryptsetup.CryptSetup(
+        name = DEVICE,
+        yesDialog = askyes,
+        logFunc = log,
+        passwordDialog = askpassword)
+
+info = c2.info()
+print "cipher  :", info["cipher"]
+print "cmode   :", info["cipher_mode"]
+print "keysize :", info["keysize"]
+
+print "deact.  :", c.deactivate()
+r = c2.deactivate()
+print "deact.  :", r
+del c
+del c2
+
 os.remove(IMG)
index fe361a7..087ae57 100644 (file)
@@ -69,6 +69,7 @@ static int passwordDialog(const char *msg, char *buf, size_t length, void *this)
 {
        CryptSetupObject *self = this;
        PyObject *result, *arglist;
+       size_t len;
        char *res = NULL;
 
        if(self->passwordDialogCB){
@@ -88,10 +89,12 @@ static int passwordDialog(const char *msg, char *buf, size_t length, void *this)
                }
 
                strncpy(buf, res, length - 1);
+               len = strlen(res);
 
-               // FIXME: wipe res
+               memset(res, 0, len);
                Py_DECREF(result);
-               return strlen(buf);
+
+               return (int)len;
        }
 
        return -EINVAL;
@@ -168,6 +171,7 @@ static int CryptSetup_init(CryptSetupObject* self, PyObject *args, PyObject *kwd
                 *cmdLineLogCB = NULL,
                 *tmp = NULL;
        char *device = NULL, *deviceName = NULL;
+       int r;
 
        if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zzOOO", kwlist, &device, &deviceName,
                                         &yesDialogCB, &passwordDialogCB, &cmdLineLogCB))
@@ -178,19 +182,23 @@ static int CryptSetup_init(CryptSetupObject* self, PyObject *args, PyObject *kwd
                        PyErr_SetString(PyExc_IOError, "Device cannot be opened");
                        return -1;
                }
-
+               /* Try to load header form device */
+               r = crypt_load(self->device, NULL, NULL);
+               if (r && r != -EINVAL) {
+                       PyErr_SetString(PyExc_RuntimeError, "Cannot initialize device context");
+                       return -1;
+               }
        } else if (deviceName) {
                if (crypt_init_by_name(&(self->device), deviceName)) {
                        PyErr_SetString(PyExc_IOError, "Device cannot be opened");
                        return -1;
                }
+               /* Context is initialized automatically from active device */
        } else {
                PyErr_SetString(PyExc_RuntimeError, "Either device file or luks name has to be specified");
                return -1;
        }
 
-       // FIXME: check return code
-       crypt_load(self->device, NULL, NULL);
        if(deviceName)
                self->activated_as = strdup(deviceName);