Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Thu, 04 Jul 2013 16:58:04 +0200
From: marcus.desto <>
Subject: Re: OpenCL PBKDFv2 Kernel With Python

Hi volks,

ok, I fixed some stuff.

I still do not know how to handle the following:
> How to deal with that using python?
>  * Pass this kernel -DKEYLEN=x -DOUTLEN=y -DSALTLEN=z for generic use.
>  *
>  * KEYLEN  should be PLAINTEXT_LENGTH for passwords or 20 for hash
>  * OUTLEN  should be sizeof(outbuffer->v)
>  * SALTLEN should be sizeof(currentsalt.salt)

I have made a workaround by defining all 3 in the .cl file

Another problem appeared:

Traceback (most recent call last):
  File "", line 124, in <module>
    cl.enqueue_copy(queue, OUT_host_buffer, OUT_dev_buffer).wait()
  File "/usr/lib/python2.7/dist-packages/pyopencl/", line 790, in enqueue_copy
    return _cl._enqueue_read_buffer(queue, src, dest, **kwargs)
TypeError: Cannot use string as modifiable buffer

Here is some code:

plaintexts = []

import struct
mf = cl.mem_flags
password_host_buffer = "".join([ struct.pack("=I65s", len(plaintext),plaintext) for plaintext in plaintexts ])
password_dev_buffer = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=password_host_buffer)

plainsalts = []

salt_host_buffer = "".join([ struct.pack("=I52s", len(plainsalt),plainsalt) for plainsalt in plainsalts ])
salt_dev_buffer = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=salt_host_buffer)

pyKEYLEN=20 # for hash

OUT_host_buffer = "".join([ struct.pack("=I",100+i) for i in range(pyKEYLEN) ]) # for testing 100+i, should be 0
OUT_dev_buffer = cl.Buffer(ctx, mf.READ_WRITE, sys.getsizeof(OUT_host_buffer))

f = open("", 'r')
fstr = "".join(f.readlines())

prg = cl.Program(ctx, fstr).build()

cl.enqueue_copy(queue, password_dev_buffer, password_host_buffer, is_blocking=True)
cl.enqueue_copy(queue, salt_dev_buffer, salt_host_buffer, is_blocking=True)

from time import clock
clbegin = clock()

# __kernel void derive_key(__global const pbkdf2_password *inbuffer, __global pbkdf2_hash *outbuffer, __global const pbkdf2_salt *salt)
prg.derive_key(queue, (1,), None, password_dev_buffer, OUT_dev_buffer ,salt_dev_buffer).wait()

cl.enqueue_copy(queue, OUT_host_buffer, OUT_dev_buffer).wait() # <== ERROR here

What kind of type do I have to use?


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.