Dopo ore di sbattimento e spulciamenti, ho confrontato il codice del win32crypt di py2 con quello di py3.
Ed ho trovato cosa effettivamente cambia:
L'errore "
win32crypt (pywintypes.error: (-2146893813, 'CryptProtectData')" per py2 è già gestito con relativa eccezione, mentre nel mio py3 non è gestito automaticamente nella mia versione di win32crypt, così ho aggiunto semplicemente un try con eccezione [codice]chiave = ""[/codice] nel codice di python 3.
Purtroppo ancora non funzionava (però l'errore
ovviamente era scomparso), sono andato a spulciare quindi nella cartella:
"..AppData/Roaming/Microsoft/Crypto", qui ho cambiato nome alla cartella, e per farlo si deve prima spostare sul cestino, e ripristinarla da un altro percorso per poi cambiare il nome in "CryptoOld".
Il programma per grazia divina ha iniziato a funzionare su python3

.
Morale?
Vogliono gli stessi dati, e il parametro non è un buffer o memoryview, è di tipo bytes, mi ha fregato quell'errore da una parte gestito, e dall'altra no.
Comunque buffer e memoryview non sono compatibili al 100%, qui ho chiarito un po' di cose, se può essere utile:
http://python3porting.com/differences.htmlSpulciando però negli esempi di win32crypt (utilizzo python 3.4):
[codice]import unittest
import win32crypt
from pywin32_testutil import str2bytes # py3k-friendly helper
class Crypt(unittest.TestCase):
def testSimple(self):
data = str2bytes("My test data")
entropy = None
desc = "My description"
flags = 0
ps = None
blob = win32crypt.CryptProtectData(data, desc, entropy, None, ps, flags)
got_desc, got_data = win32crypt.CryptUnprotectData(blob, entropy, None, ps, flags)
self.failUnlessEqual(data, got_data)
self.failUnlessEqual(desc, got_desc)
def testEntropy(self):
data = str2bytes("My test data")
entropy = str2bytes("My test entropy")
desc = "My description"
flags = 0
ps = None
blob = win32crypt.CryptProtectData(data, desc, entropy, None, ps, flags)
got_desc, got_data = win32crypt.CryptUnprotectData(blob, entropy, None, ps, flags)
self.failUnlessEqual(data, got_data)
self.failUnlessEqual(desc, got_desc)
if __name__ == '__main__':
unittest.main()[/codice]
Salta nell'occhio la scritta "from pywin32_testutil import str2bytes # py3k-friendly helper"
il cast a str2bytes() restituisce un buffer binario, potrebbe essere uno strumento utile ogni qual volta non si capisca il problema (come nel mio caso, anche se ho risolto diversamente) fra le versione 2.x e 3.x, da qui quelle "biforcazioni" potrebbe essere colmate.
Esiste anche un str2memory()
Spero questo topic possa tornare utile a chi ha un problema di questo tipo.
@RicPol, quando faremo la pace ti offrirò un caffè
