class EncryptedPasswordsEntry(TestCase):

    def setUp(self):
        self.engine = CryptoEngine(master_key='mykeyisawesome!')
        self.texts = CryptoEngineTest._generate_texts(100)

    def test_save_entry_with_encrypted_key(self):

        c = Category(title='Internet')
        c.save()

        for i, password in enumerate(self.texts):

            password_after_encryption = self.engine.encrypt(password)
            title = 'My Twitter Account: ' + str(i)
            e = Entry(title=title, username='******',
                      url='twitter.com', password=password_after_encryption,
                      comment='no comment')
            e.category = c
            e.save()

            # Fetches the saved entry
            f = Entry.objects.filter(title=title)[0]
            password_decrypted = self.engine.decrypt(f.password)

            self.assertEquals(password_after_encryption, f.password)
            self.assertEquals(password_decrypted, password)
            f.delete()
示例#2
0
class EncryptedPasswordsEntry(TestCase):
    def setUp(self):
        self.engine = CryptoEngine(master_key='mykeyisawesome!')
        self.texts = CryptoEngineTest._generate_texts(100)

    def test_save_entry_with_encrypted_key(self):

        c = Category(title='Internet')
        c.save()

        for i, password in enumerate(self.texts):

            password_after_encryption = self.engine.encrypt(password)
            title = 'My Twitter Account: ' + str(i)
            e = Entry(title=title,
                      username='******',
                      url='twitter.com',
                      password=password_after_encryption,
                      comment='no comment')
            e.category = c
            e.save()

            # Fetches the saved entry
            f = Entry.objects.filter(title=title)[0]
            password_decrypted = self.engine.decrypt(f.password)

            self.assertEquals(password_after_encryption, f.password)
            self.assertEquals(password_decrypted, password)
            f.delete()
示例#3
0
    def post(self, request, *args, **kwargs):

        if request.user.is_superuser:
            engine = CryptoEngine(master_key=request.user.password)

            form = EntryForm(request.POST)
            if form.is_valid():
                entry = form.save(commit=False)
                entry.password = engine.encrypt(form.cleaned_data['password'])
                entry.save()
                messages.add_message(request, messages.INFO, u'New entry added: {}'.format(entry.title))
                return redirect('home')
            else:
                form = EntryForm()
        return render(request, self.template_name, locals())
def post_entry_add(request):

    engine = CryptoEngine(master_key=request.user.password)

    e = None
    attributes = set(['title', 'password', 'category'])
    if attributes <= set(request.POST.keys()):

        e = Entry(title=request.POST['title'],
                  password=request.POST['password'])

        for k, v in request.POST.items():
            if k == 'username':
                e.username = v
            elif k == 'url':
                e.url = v
            elif k == 'comment':
                e.comment = v
            elif k == 'expires':
                # date formated: m/d/Y
                e.expires = datetime.datetime.strptime(v, "%m/%d/%Y").date()
            elif k == 'category':
                c = Category.objects.filter(id=int(v))
                if len(c) == 0:
                    return HttpResponse(0)
                else:
                    e.category_id = int(v)
        try:
            e.save()
            return HttpResponse(1)
        except:
            return HttpResponse(0)
    else:
        return HttpResponse(0)
    def post(self, request, *args, **kwargs):

        if request.user.is_superuser:
            engine = CryptoEngine(master_key=request.user.password)

            form = EntryForm(request.POST)
            if form.is_valid():
                entry = form.save(commit=False)
                entry.password = engine.encrypt(form.cleaned_data['password'])
                entry.save()
                messages.add_message(
                    request, messages.INFO,
                    u'New entry added: {}'.format(entry.title))
                return redirect('home')
            else:
                form = EntryForm()
        return render(request, self.template_name, locals())
示例#6
0
class CryptoEngineTest(TestCase):
    def setUp(self):

        self.engine = CryptoEngine(master_key='mykeyisawesome!')
        self.block_length = 32
        self.texts = CryptoEngineTest._generate_texts(100)

    def test_padding(self):
        for t in self.texts:
            padded_text = self.engine._pad(t)
            self.assertEquals(len(padded_text) % self.block_length, 0)

    def test_depadding(self):
        for p, t in zip([
                t + ''.join([
                    self.engine.PADDING for i in xrange(random.randint(1, 10))
                ]) for t in self.texts
        ], self.texts):
            self.assertEquals(t, self.engine._depad(p))

    def test_decryption(self):
        for t in self.texts:
            cipher_text = self.engine.encrypt(t)
            self.assertEquals(self.engine.decrypt(cipher_text), t)

    @classmethod
    def _generate_texts(cls, limit):

        allowed_char = map(chr, range(97, 123))
        allowed_char += map(chr, range(65, 91))
        allowed_char += [str(i) for i in xrange(0, 10)]
        allowed_char += map(chr, range(33, 47))

        min_length = 1
        max_length = len(allowed_char) - 1

        texts = []

        for i in xrange(limit):
            length = random.randint(min_length, max_length)
            random.shuffle(allowed_char)
            texts += [''.join(allowed_char[:length])]

        return texts
class CryptoEngineTest(TestCase):

    def setUp(self):

        self.engine = CryptoEngine(master_key='mykeyisawesome!')
        self.block_length = 32
        self.texts = CryptoEngineTest._generate_texts(100)

    def test_padding(self):
        for t in self.texts:
            padded_text = self.engine._pad(t)
            self.assertEquals(len(padded_text) % self.block_length, 0)

    def test_depadding(self):
        for p, t in zip([t + ''.join([self.engine.PADDING
                                      for i in xrange(random.randint(1, 10))])
                         for t in self.texts], self.texts):
            self.assertEquals(t, self.engine._depad(p))

    def test_decryption(self):
        for t in self.texts:
            cipher_text = self.engine.encrypt(t)
            self.assertEquals(self.engine.decrypt(cipher_text), t)

    @classmethod
    def _generate_texts(cls, limit):

            allowed_char = map(chr, range(97, 123))
            allowed_char += map(chr, range(65, 91))
            allowed_char += [str(i) for i in xrange(0, 10)]
            allowed_char += map(chr, range(33, 47))

            min_length = 1
            max_length = len(allowed_char) - 1

            texts = []

            for i in xrange(limit):
                length = random.randint(min_length, max_length)
                random.shuffle(allowed_char)
                texts += [''.join(allowed_char[:length])]

            return texts
示例#8
0
def get_search(request):

    engine = CryptoEngine(master_key=request.user.password)
    entries = None

    if 'title' in request.GET:
        search = str(request.GET['title'])
        entries = Entry.objects.filter(title__contains=search)

    elif 'category' in request.GET:
        search = str(request.GET['category'])
        categories = Category.objects.filter(title__contains=search)
        entries = [e for c in categories for e in c.entry_set.all()]

    else:
        entries = Entry.objects.all()

    # Decrypts the passwords
    for e in entries:
        e.password = engine.decrypt(e.password)

    response_data = [e.dict() for e in entries]
    return HttpResponse(json.dumps(response_data), content_type="application/json")
def get_search(request):

    engine = CryptoEngine(master_key=request.user.password)
    entries = None

    if 'title' in request.GET:
        search = str(request.GET['title'])
        entries = Entry.objects.filter(title__contains=search)

    elif 'category' in request.GET:
        search = str(request.GET['category'])
        categories = Category.objects.filter(title__contains=search)
        entries = [e for c in categories for e in c.entry_set.all()]

    else:
        entries = Entry.objects.all()

    # Decrypts the passwords
    for e in entries:
        e.password = engine.decrypt(e.password)

    response_data = [e.dict() for e in entries]
    return HttpResponse(json.dumps(response_data),
                        content_type="application/json")
    def setUp(self):

        self.engine = CryptoEngine(master_key='mykeyisawesome!')
        self.block_length = 32
        self.texts = CryptoEngineTest._generate_texts(100)
def decrypt(text, master_key):
    engine = CryptoEngine(master_key=master_key)
    return engine.decrypt(text)
示例#12
0
    def setUp(self):

        self.engine = CryptoEngine(master_key='mykeyisawesome!')
        self.block_length = 32
        self.texts = CryptoEngineTest._generate_texts(100)