Switch to python3

This commit is contained in:
j 2014-09-30 18:15:32 +02:00
commit 9ba4b6a91a
5286 changed files with 677347 additions and 576888 deletions

View file

@ -1,88 +0,0 @@
#!/usr/bin/python
import os, sys
import ed25519
from hashlib import sha256
def help():
print """\
Usage: (ed25519 version %s)
edsig generate [STEM]
creates keypair, writes to 'STEM.signing.key' and 'STEM.verifying.key'
default is to 'signing.key' and 'verifying.key'
edsig sign (signing.key|keyfile) message.file
prints signature to stdout
If message.file is "-", reads from stdin.
edsig verify (verifying.key|keyfile) message.file (signature|sigfile)
prints 'good signature!' or raises exception
If message.file is "-", reads from stdin.
Key-providing arguments can either be the key itself, or point to a file
containing the key.
""" % ed25519.__version__
def remove_prefix(prefix, s):
if not s.startswith(prefix):
raise ValueError("no prefix found")
return s[len(prefix):]
def data_from_arg(arg, prefix, keylen, readable):
if (readable
and arg.startswith(prefix)
and len(remove_prefix(prefix, arg))==keylen):
return arg
if os.path.isfile(arg):
return open(arg,"r").read()
raise ValueError("unable to get data from '%s'" % arg)
def message_rep(msg_arg):
if msg_arg == "-":
f = sys.stdin
else:
f = open(msg_arg, "rb")
h = sha256()
while True:
data = f.read(16*1024)
if not data:
break
h.update(data)
return h.digest()
if len(sys.argv) < 2:
help()
elif sys.argv[1] == "generate":
sk,vk = ed25519.create_keypair()
if len(sys.argv) > 2:
sk_outfile = sys.argv[2]+".signing.key"
vk_outfile = sys.argv[2]+".verifying.key"
else:
sk_outfile = "signing.key"
vk_outfile = "verifying.key"
sk_s = sk.to_seed(prefix="sign0-")
vk_s = vk.to_ascii("verf0-", "base32")
open(sk_outfile,"w").write(sk_s)
open(vk_outfile,"w").write(vk_s+"\n")
print "wrote private signing key to", sk_outfile
print "write public verifying key to", vk_outfile
elif sys.argv[1] == "sign":
sk_arg = sys.argv[2]
msg_arg = sys.argv[3]
sk = ed25519.SigningKey(data_from_arg(sk_arg, "sign0-", 52, False),
prefix="sign0-")
sig = sk.sign(message_rep(msg_arg), prefix="sig0-", encoding="base32")
print sig
elif sys.argv[1] == "verify":
vk_arg = sys.argv[2]
msg_arg = sys.argv[3]
sig_arg = sys.argv[4]
vk = ed25519.VerifyingKey(data_from_arg(vk_arg, "verf0-", 52, True),
prefix="verf0-", encoding="base32")
sig = data_from_arg(sig_arg, "sig0-", 103, True)
vk.verify(sig, message_rep(msg_arg),
prefix="sig0-", encoding="base32") # could raise BadSignature
print "good signature!"
else:
help()

View file

@ -1,364 +0,0 @@
../sqlalchemy/log.py
../sqlalchemy/inspection.py
../sqlalchemy/interfaces.py
../sqlalchemy/types.py
../sqlalchemy/pool.py
../sqlalchemy/__init__.py
../sqlalchemy/schema.py
../sqlalchemy/exc.py
../sqlalchemy/events.py
../sqlalchemy/processors.py
../sqlalchemy/util/compat.py
../sqlalchemy/util/deprecations.py
../sqlalchemy/util/_collections.py
../sqlalchemy/util/topological.py
../sqlalchemy/util/queue.py
../sqlalchemy/util/__init__.py
../sqlalchemy/util/langhelpers.py
../sqlalchemy/ext/horizontal_shard.py
../sqlalchemy/ext/serializer.py
../sqlalchemy/ext/automap.py
../sqlalchemy/ext/associationproxy.py
../sqlalchemy/ext/__init__.py
../sqlalchemy/ext/hybrid.py
../sqlalchemy/ext/mutable.py
../sqlalchemy/ext/orderinglist.py
../sqlalchemy/ext/compiler.py
../sqlalchemy/ext/instrumentation.py
../sqlalchemy/ext/declarative/api.py
../sqlalchemy/ext/declarative/__init__.py
../sqlalchemy/ext/declarative/base.py
../sqlalchemy/ext/declarative/clsregistry.py
../sqlalchemy/event/api.py
../sqlalchemy/event/registry.py
../sqlalchemy/event/__init__.py
../sqlalchemy/event/legacy.py
../sqlalchemy/event/base.py
../sqlalchemy/event/attr.py
../sqlalchemy/sql/type_api.py
../sqlalchemy/sql/ddl.py
../sqlalchemy/sql/selectable.py
../sqlalchemy/sql/util.py
../sqlalchemy/sql/sqltypes.py
../sqlalchemy/sql/functions.py
../sqlalchemy/sql/operators.py
../sqlalchemy/sql/dml.py
../sqlalchemy/sql/naming.py
../sqlalchemy/sql/expression.py
../sqlalchemy/sql/__init__.py
../sqlalchemy/sql/schema.py
../sqlalchemy/sql/base.py
../sqlalchemy/sql/default_comparator.py
../sqlalchemy/sql/visitors.py
../sqlalchemy/sql/compiler.py
../sqlalchemy/sql/elements.py
../sqlalchemy/sql/annotation.py
../sqlalchemy/engine/default.py
../sqlalchemy/engine/url.py
../sqlalchemy/engine/util.py
../sqlalchemy/engine/interfaces.py
../sqlalchemy/engine/result.py
../sqlalchemy/engine/__init__.py
../sqlalchemy/engine/base.py
../sqlalchemy/engine/threadlocal.py
../sqlalchemy/engine/reflection.py
../sqlalchemy/engine/strategies.py
../sqlalchemy/dialects/postgres.py
../sqlalchemy/dialects/__init__.py
../sqlalchemy/dialects/mysql/mysqlconnector.py
../sqlalchemy/dialects/mysql/pymysql.py
../sqlalchemy/dialects/mysql/cymysql.py
../sqlalchemy/dialects/mysql/oursql.py
../sqlalchemy/dialects/mysql/pyodbc.py
../sqlalchemy/dialects/mysql/__init__.py
../sqlalchemy/dialects/mysql/zxjdbc.py
../sqlalchemy/dialects/mysql/base.py
../sqlalchemy/dialects/mysql/gaerdbms.py
../sqlalchemy/dialects/mysql/mysqldb.py
../sqlalchemy/dialects/postgresql/pg8000.py
../sqlalchemy/dialects/postgresql/hstore.py
../sqlalchemy/dialects/postgresql/pypostgresql.py
../sqlalchemy/dialects/postgresql/psycopg2.py
../sqlalchemy/dialects/postgresql/ranges.py
../sqlalchemy/dialects/postgresql/json.py
../sqlalchemy/dialects/postgresql/__init__.py
../sqlalchemy/dialects/postgresql/zxjdbc.py
../sqlalchemy/dialects/postgresql/base.py
../sqlalchemy/dialects/postgresql/constraints.py
../sqlalchemy/dialects/sybase/pyodbc.py
../sqlalchemy/dialects/sybase/__init__.py
../sqlalchemy/dialects/sybase/base.py
../sqlalchemy/dialects/sybase/mxodbc.py
../sqlalchemy/dialects/sybase/pysybase.py
../sqlalchemy/dialects/firebird/fdb.py
../sqlalchemy/dialects/firebird/__init__.py
../sqlalchemy/dialects/firebird/kinterbasdb.py
../sqlalchemy/dialects/firebird/base.py
../sqlalchemy/dialects/sqlite/pysqlite.py
../sqlalchemy/dialects/sqlite/__init__.py
../sqlalchemy/dialects/sqlite/base.py
../sqlalchemy/dialects/mssql/information_schema.py
../sqlalchemy/dialects/mssql/pymssql.py
../sqlalchemy/dialects/mssql/adodbapi.py
../sqlalchemy/dialects/mssql/pyodbc.py
../sqlalchemy/dialects/mssql/__init__.py
../sqlalchemy/dialects/mssql/zxjdbc.py
../sqlalchemy/dialects/mssql/base.py
../sqlalchemy/dialects/mssql/mxodbc.py
../sqlalchemy/dialects/drizzle/__init__.py
../sqlalchemy/dialects/drizzle/base.py
../sqlalchemy/dialects/drizzle/mysqldb.py
../sqlalchemy/dialects/oracle/cx_oracle.py
../sqlalchemy/dialects/oracle/__init__.py
../sqlalchemy/dialects/oracle/zxjdbc.py
../sqlalchemy/dialects/oracle/base.py
../sqlalchemy/testing/profiling.py
../sqlalchemy/testing/warnings.py
../sqlalchemy/testing/engines.py
../sqlalchemy/testing/util.py
../sqlalchemy/testing/entities.py
../sqlalchemy/testing/mock.py
../sqlalchemy/testing/exclusions.py
../sqlalchemy/testing/assertions.py
../sqlalchemy/testing/fixtures.py
../sqlalchemy/testing/pickleable.py
../sqlalchemy/testing/__init__.py
../sqlalchemy/testing/schema.py
../sqlalchemy/testing/runner.py
../sqlalchemy/testing/config.py
../sqlalchemy/testing/requirements.py
../sqlalchemy/testing/assertsql.py
../sqlalchemy/testing/plugin/pytestplugin.py
../sqlalchemy/testing/plugin/plugin_base.py
../sqlalchemy/testing/plugin/noseplugin.py
../sqlalchemy/testing/plugin/__init__.py
../sqlalchemy/testing/suite/test_types.py
../sqlalchemy/testing/suite/test_select.py
../sqlalchemy/testing/suite/test_ddl.py
../sqlalchemy/testing/suite/test_reflection.py
../sqlalchemy/testing/suite/test_sequence.py
../sqlalchemy/testing/suite/__init__.py
../sqlalchemy/testing/suite/test_results.py
../sqlalchemy/testing/suite/test_insert.py
../sqlalchemy/testing/suite/test_update_delete.py
../sqlalchemy/orm/state.py
../sqlalchemy/orm/session.py
../sqlalchemy/orm/unitofwork.py
../sqlalchemy/orm/properties.py
../sqlalchemy/orm/collections.py
../sqlalchemy/orm/identity.py
../sqlalchemy/orm/util.py
../sqlalchemy/orm/sync.py
../sqlalchemy/orm/interfaces.py
../sqlalchemy/orm/path_registry.py
../sqlalchemy/orm/evaluator.py
../sqlalchemy/orm/deprecated_interfaces.py
../sqlalchemy/orm/mapper.py
../sqlalchemy/orm/persistence.py
../sqlalchemy/orm/dynamic.py
../sqlalchemy/orm/__init__.py
../sqlalchemy/orm/scoping.py
../sqlalchemy/orm/descriptor_props.py
../sqlalchemy/orm/loading.py
../sqlalchemy/orm/base.py
../sqlalchemy/orm/exc.py
../sqlalchemy/orm/events.py
../sqlalchemy/orm/strategies.py
../sqlalchemy/orm/query.py
../sqlalchemy/orm/dependency.py
../sqlalchemy/orm/attributes.py
../sqlalchemy/orm/relationships.py
../sqlalchemy/orm/strategy_options.py
../sqlalchemy/orm/instrumentation.py
../sqlalchemy/connectors/pyodbc.py
../sqlalchemy/connectors/__init__.py
../sqlalchemy/connectors/zxJDBC.py
../sqlalchemy/connectors/mysqldb.py
../sqlalchemy/connectors/mxodbc.py
../sqlalchemy/databases/__init__.py
../sqlalchemy/log.pyc
../sqlalchemy/inspection.pyc
../sqlalchemy/interfaces.pyc
../sqlalchemy/types.pyc
../sqlalchemy/pool.pyc
../sqlalchemy/__init__.pyc
../sqlalchemy/schema.pyc
../sqlalchemy/exc.pyc
../sqlalchemy/events.pyc
../sqlalchemy/processors.pyc
../sqlalchemy/util/compat.pyc
../sqlalchemy/util/deprecations.pyc
../sqlalchemy/util/_collections.pyc
../sqlalchemy/util/topological.pyc
../sqlalchemy/util/queue.pyc
../sqlalchemy/util/__init__.pyc
../sqlalchemy/util/langhelpers.pyc
../sqlalchemy/ext/horizontal_shard.pyc
../sqlalchemy/ext/serializer.pyc
../sqlalchemy/ext/automap.pyc
../sqlalchemy/ext/associationproxy.pyc
../sqlalchemy/ext/__init__.pyc
../sqlalchemy/ext/hybrid.pyc
../sqlalchemy/ext/mutable.pyc
../sqlalchemy/ext/orderinglist.pyc
../sqlalchemy/ext/compiler.pyc
../sqlalchemy/ext/instrumentation.pyc
../sqlalchemy/ext/declarative/api.pyc
../sqlalchemy/ext/declarative/__init__.pyc
../sqlalchemy/ext/declarative/base.pyc
../sqlalchemy/ext/declarative/clsregistry.pyc
../sqlalchemy/event/api.pyc
../sqlalchemy/event/registry.pyc
../sqlalchemy/event/__init__.pyc
../sqlalchemy/event/legacy.pyc
../sqlalchemy/event/base.pyc
../sqlalchemy/event/attr.pyc
../sqlalchemy/sql/type_api.pyc
../sqlalchemy/sql/ddl.pyc
../sqlalchemy/sql/selectable.pyc
../sqlalchemy/sql/util.pyc
../sqlalchemy/sql/sqltypes.pyc
../sqlalchemy/sql/functions.pyc
../sqlalchemy/sql/operators.pyc
../sqlalchemy/sql/dml.pyc
../sqlalchemy/sql/naming.pyc
../sqlalchemy/sql/expression.pyc
../sqlalchemy/sql/__init__.pyc
../sqlalchemy/sql/schema.pyc
../sqlalchemy/sql/base.pyc
../sqlalchemy/sql/default_comparator.pyc
../sqlalchemy/sql/visitors.pyc
../sqlalchemy/sql/compiler.pyc
../sqlalchemy/sql/elements.pyc
../sqlalchemy/sql/annotation.pyc
../sqlalchemy/engine/default.pyc
../sqlalchemy/engine/url.pyc
../sqlalchemy/engine/util.pyc
../sqlalchemy/engine/interfaces.pyc
../sqlalchemy/engine/result.pyc
../sqlalchemy/engine/__init__.pyc
../sqlalchemy/engine/base.pyc
../sqlalchemy/engine/threadlocal.pyc
../sqlalchemy/engine/reflection.pyc
../sqlalchemy/engine/strategies.pyc
../sqlalchemy/dialects/postgres.pyc
../sqlalchemy/dialects/__init__.pyc
../sqlalchemy/dialects/mysql/mysqlconnector.pyc
../sqlalchemy/dialects/mysql/pymysql.pyc
../sqlalchemy/dialects/mysql/cymysql.pyc
../sqlalchemy/dialects/mysql/oursql.pyc
../sqlalchemy/dialects/mysql/pyodbc.pyc
../sqlalchemy/dialects/mysql/__init__.pyc
../sqlalchemy/dialects/mysql/zxjdbc.pyc
../sqlalchemy/dialects/mysql/base.pyc
../sqlalchemy/dialects/mysql/gaerdbms.pyc
../sqlalchemy/dialects/mysql/mysqldb.pyc
../sqlalchemy/dialects/postgresql/pg8000.pyc
../sqlalchemy/dialects/postgresql/hstore.pyc
../sqlalchemy/dialects/postgresql/pypostgresql.pyc
../sqlalchemy/dialects/postgresql/psycopg2.pyc
../sqlalchemy/dialects/postgresql/ranges.pyc
../sqlalchemy/dialects/postgresql/json.pyc
../sqlalchemy/dialects/postgresql/__init__.pyc
../sqlalchemy/dialects/postgresql/zxjdbc.pyc
../sqlalchemy/dialects/postgresql/base.pyc
../sqlalchemy/dialects/postgresql/constraints.pyc
../sqlalchemy/dialects/sybase/pyodbc.pyc
../sqlalchemy/dialects/sybase/__init__.pyc
../sqlalchemy/dialects/sybase/base.pyc
../sqlalchemy/dialects/sybase/mxodbc.pyc
../sqlalchemy/dialects/sybase/pysybase.pyc
../sqlalchemy/dialects/firebird/fdb.pyc
../sqlalchemy/dialects/firebird/__init__.pyc
../sqlalchemy/dialects/firebird/kinterbasdb.pyc
../sqlalchemy/dialects/firebird/base.pyc
../sqlalchemy/dialects/sqlite/pysqlite.pyc
../sqlalchemy/dialects/sqlite/__init__.pyc
../sqlalchemy/dialects/sqlite/base.pyc
../sqlalchemy/dialects/mssql/information_schema.pyc
../sqlalchemy/dialects/mssql/pymssql.pyc
../sqlalchemy/dialects/mssql/adodbapi.pyc
../sqlalchemy/dialects/mssql/pyodbc.pyc
../sqlalchemy/dialects/mssql/__init__.pyc
../sqlalchemy/dialects/mssql/zxjdbc.pyc
../sqlalchemy/dialects/mssql/base.pyc
../sqlalchemy/dialects/mssql/mxodbc.pyc
../sqlalchemy/dialects/drizzle/__init__.pyc
../sqlalchemy/dialects/drizzle/base.pyc
../sqlalchemy/dialects/drizzle/mysqldb.pyc
../sqlalchemy/dialects/oracle/cx_oracle.pyc
../sqlalchemy/dialects/oracle/__init__.pyc
../sqlalchemy/dialects/oracle/zxjdbc.pyc
../sqlalchemy/dialects/oracle/base.pyc
../sqlalchemy/testing/profiling.pyc
../sqlalchemy/testing/warnings.pyc
../sqlalchemy/testing/engines.pyc
../sqlalchemy/testing/util.pyc
../sqlalchemy/testing/entities.pyc
../sqlalchemy/testing/mock.pyc
../sqlalchemy/testing/exclusions.pyc
../sqlalchemy/testing/assertions.pyc
../sqlalchemy/testing/fixtures.pyc
../sqlalchemy/testing/pickleable.pyc
../sqlalchemy/testing/__init__.pyc
../sqlalchemy/testing/schema.pyc
../sqlalchemy/testing/runner.pyc
../sqlalchemy/testing/config.pyc
../sqlalchemy/testing/requirements.pyc
../sqlalchemy/testing/assertsql.pyc
../sqlalchemy/testing/plugin/pytestplugin.pyc
../sqlalchemy/testing/plugin/plugin_base.pyc
../sqlalchemy/testing/plugin/noseplugin.pyc
../sqlalchemy/testing/plugin/__init__.pyc
../sqlalchemy/testing/suite/test_types.pyc
../sqlalchemy/testing/suite/test_select.pyc
../sqlalchemy/testing/suite/test_ddl.pyc
../sqlalchemy/testing/suite/test_reflection.pyc
../sqlalchemy/testing/suite/test_sequence.pyc
../sqlalchemy/testing/suite/__init__.pyc
../sqlalchemy/testing/suite/test_results.pyc
../sqlalchemy/testing/suite/test_insert.pyc
../sqlalchemy/testing/suite/test_update_delete.pyc
../sqlalchemy/orm/state.pyc
../sqlalchemy/orm/session.pyc
../sqlalchemy/orm/unitofwork.pyc
../sqlalchemy/orm/properties.pyc
../sqlalchemy/orm/collections.pyc
../sqlalchemy/orm/identity.pyc
../sqlalchemy/orm/util.pyc
../sqlalchemy/orm/sync.pyc
../sqlalchemy/orm/interfaces.pyc
../sqlalchemy/orm/path_registry.pyc
../sqlalchemy/orm/evaluator.pyc
../sqlalchemy/orm/deprecated_interfaces.pyc
../sqlalchemy/orm/mapper.pyc
../sqlalchemy/orm/persistence.pyc
../sqlalchemy/orm/dynamic.pyc
../sqlalchemy/orm/__init__.pyc
../sqlalchemy/orm/scoping.pyc
../sqlalchemy/orm/descriptor_props.pyc
../sqlalchemy/orm/loading.pyc
../sqlalchemy/orm/base.pyc
../sqlalchemy/orm/exc.pyc
../sqlalchemy/orm/events.pyc
../sqlalchemy/orm/strategies.pyc
../sqlalchemy/orm/query.pyc
../sqlalchemy/orm/dependency.pyc
../sqlalchemy/orm/attributes.pyc
../sqlalchemy/orm/relationships.pyc
../sqlalchemy/orm/strategy_options.pyc
../sqlalchemy/orm/instrumentation.pyc
../sqlalchemy/connectors/pyodbc.pyc
../sqlalchemy/connectors/__init__.pyc
../sqlalchemy/connectors/zxJDBC.pyc
../sqlalchemy/connectors/mysqldb.pyc
../sqlalchemy/connectors/mxodbc.pyc
../sqlalchemy/databases/__init__.pyc
../sqlalchemy/cprocessors.so
../sqlalchemy/cresultproxy.so
../sqlalchemy/cutils.so
./
SOURCES.txt
dependency_links.txt
PKG-INFO
top_level.txt

View file

@ -1,32 +0,0 @@
../cffi/api.py
../cffi/vengine_gen.py
../cffi/verifier.py
../cffi/commontypes.py
../cffi/cparser.py
../cffi/__init__.py
../cffi/backend_ctypes.py
../cffi/gc_weakref.py
../cffi/vengine_cpy.py
../cffi/ffiplatform.py
../cffi/model.py
../cffi/lock.py
../cffi/api.pyc
../cffi/vengine_gen.pyc
../cffi/verifier.pyc
../cffi/commontypes.pyc
../cffi/cparser.pyc
../cffi/__init__.pyc
../cffi/backend_ctypes.pyc
../cffi/gc_weakref.pyc
../cffi/vengine_cpy.pyc
../cffi/ffiplatform.pyc
../cffi/model.pyc
../cffi/lock.pyc
../_cffi_backend.so
./
requires.txt
SOURCES.txt
dependency_links.txt
PKG-INFO
not-zip-safe
top_level.txt

View file

@ -1,196 +0,0 @@
../cryptography/exceptions.py
../cryptography/__init__.py
../cryptography/fernet.py
../cryptography/utils.py
../cryptography/__about__.py
../cryptography/hazmat/__init__.py
../cryptography/hazmat/backends/multibackend.py
../cryptography/hazmat/backends/interfaces.py
../cryptography/hazmat/backends/__init__.py
../cryptography/hazmat/primitives/hmac.py
../cryptography/hazmat/primitives/hashes.py
../cryptography/hazmat/primitives/cmac.py
../cryptography/hazmat/primitives/interfaces.py
../cryptography/hazmat/primitives/serialization.py
../cryptography/hazmat/primitives/constant_time.py
../cryptography/hazmat/primitives/__init__.py
../cryptography/hazmat/primitives/padding.py
../cryptography/hazmat/bindings/__init__.py
../cryptography/hazmat/bindings/utils.py
../cryptography/hazmat/backends/openssl/hmac.py
../cryptography/hazmat/backends/openssl/rsa.py
../cryptography/hazmat/backends/openssl/hashes.py
../cryptography/hazmat/backends/openssl/cmac.py
../cryptography/hazmat/backends/openssl/dsa.py
../cryptography/hazmat/backends/openssl/__init__.py
../cryptography/hazmat/backends/openssl/ciphers.py
../cryptography/hazmat/backends/openssl/backend.py
../cryptography/hazmat/backends/openssl/ec.py
../cryptography/hazmat/backends/commoncrypto/hmac.py
../cryptography/hazmat/backends/commoncrypto/hashes.py
../cryptography/hazmat/backends/commoncrypto/__init__.py
../cryptography/hazmat/backends/commoncrypto/ciphers.py
../cryptography/hazmat/backends/commoncrypto/backend.py
../cryptography/hazmat/primitives/twofactor/totp.py
../cryptography/hazmat/primitives/twofactor/__init__.py
../cryptography/hazmat/primitives/twofactor/hotp.py
../cryptography/hazmat/primitives/kdf/__init__.py
../cryptography/hazmat/primitives/kdf/pbkdf2.py
../cryptography/hazmat/primitives/kdf/hkdf.py
../cryptography/hazmat/primitives/asymmetric/rsa.py
../cryptography/hazmat/primitives/asymmetric/dsa.py
../cryptography/hazmat/primitives/asymmetric/__init__.py
../cryptography/hazmat/primitives/asymmetric/padding.py
../cryptography/hazmat/primitives/asymmetric/ec.py
../cryptography/hazmat/primitives/ciphers/modes.py
../cryptography/hazmat/primitives/ciphers/__init__.py
../cryptography/hazmat/primitives/ciphers/base.py
../cryptography/hazmat/primitives/ciphers/algorithms.py
../cryptography/hazmat/bindings/openssl/conf.py
../cryptography/hazmat/bindings/openssl/ssl.py
../cryptography/hazmat/bindings/openssl/crypto.py
../cryptography/hazmat/bindings/openssl/hmac.py
../cryptography/hazmat/bindings/openssl/rsa.py
../cryptography/hazmat/bindings/openssl/bio.py
../cryptography/hazmat/bindings/openssl/binding.py
../cryptography/hazmat/bindings/openssl/cmac.py
../cryptography/hazmat/bindings/openssl/pem.py
../cryptography/hazmat/bindings/openssl/rand.py
../cryptography/hazmat/bindings/openssl/pkcs7.py
../cryptography/hazmat/bindings/openssl/osrandom_engine.py
../cryptography/hazmat/bindings/openssl/objects.py
../cryptography/hazmat/bindings/openssl/x509.py
../cryptography/hazmat/bindings/openssl/err.py
../cryptography/hazmat/bindings/openssl/dsa.py
../cryptography/hazmat/bindings/openssl/x509_vfy.py
../cryptography/hazmat/bindings/openssl/dh.py
../cryptography/hazmat/bindings/openssl/pkcs12.py
../cryptography/hazmat/bindings/openssl/__init__.py
../cryptography/hazmat/bindings/openssl/aes.py
../cryptography/hazmat/bindings/openssl/bignum.py
../cryptography/hazmat/bindings/openssl/x509name.py
../cryptography/hazmat/bindings/openssl/asn1.py
../cryptography/hazmat/bindings/openssl/cms.py
../cryptography/hazmat/bindings/openssl/nid.py
../cryptography/hazmat/bindings/openssl/ecdh.py
../cryptography/hazmat/bindings/openssl/ecdsa.py
../cryptography/hazmat/bindings/openssl/x509v3.py
../cryptography/hazmat/bindings/openssl/evp.py
../cryptography/hazmat/bindings/openssl/opensslv.py
../cryptography/hazmat/bindings/openssl/engine.py
../cryptography/hazmat/bindings/openssl/ec.py
../cryptography/hazmat/bindings/commoncrypto/common_cryptor.py
../cryptography/hazmat/bindings/commoncrypto/binding.py
../cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py
../cryptography/hazmat/bindings/commoncrypto/seckey.py
../cryptography/hazmat/bindings/commoncrypto/common_hmac.py
../cryptography/hazmat/bindings/commoncrypto/common_digest.py
../cryptography/hazmat/bindings/commoncrypto/__init__.py
../cryptography/hazmat/bindings/commoncrypto/sectransform.py
../cryptography/hazmat/bindings/commoncrypto/secitem.py
../cryptography/hazmat/bindings/commoncrypto/secimport.py
../cryptography/hazmat/bindings/commoncrypto/cf.py
../cryptography/hazmat/bindings/commoncrypto/seckeychain.py
../cryptography/exceptions.pyc
../cryptography/__init__.pyc
../cryptography/fernet.pyc
../cryptography/utils.pyc
../cryptography/__about__.pyc
../cryptography/hazmat/__init__.pyc
../cryptography/hazmat/backends/multibackend.pyc
../cryptography/hazmat/backends/interfaces.pyc
../cryptography/hazmat/backends/__init__.pyc
../cryptography/hazmat/primitives/hmac.pyc
../cryptography/hazmat/primitives/hashes.pyc
../cryptography/hazmat/primitives/cmac.pyc
../cryptography/hazmat/primitives/interfaces.pyc
../cryptography/hazmat/primitives/serialization.pyc
../cryptography/hazmat/primitives/constant_time.pyc
../cryptography/hazmat/primitives/__init__.pyc
../cryptography/hazmat/primitives/padding.pyc
../cryptography/hazmat/bindings/__init__.pyc
../cryptography/hazmat/bindings/utils.pyc
../cryptography/hazmat/backends/openssl/hmac.pyc
../cryptography/hazmat/backends/openssl/rsa.pyc
../cryptography/hazmat/backends/openssl/hashes.pyc
../cryptography/hazmat/backends/openssl/cmac.pyc
../cryptography/hazmat/backends/openssl/dsa.pyc
../cryptography/hazmat/backends/openssl/__init__.pyc
../cryptography/hazmat/backends/openssl/ciphers.pyc
../cryptography/hazmat/backends/openssl/backend.pyc
../cryptography/hazmat/backends/openssl/ec.pyc
../cryptography/hazmat/backends/commoncrypto/hmac.pyc
../cryptography/hazmat/backends/commoncrypto/hashes.pyc
../cryptography/hazmat/backends/commoncrypto/__init__.pyc
../cryptography/hazmat/backends/commoncrypto/ciphers.pyc
../cryptography/hazmat/backends/commoncrypto/backend.pyc
../cryptography/hazmat/primitives/twofactor/totp.pyc
../cryptography/hazmat/primitives/twofactor/__init__.pyc
../cryptography/hazmat/primitives/twofactor/hotp.pyc
../cryptography/hazmat/primitives/kdf/__init__.pyc
../cryptography/hazmat/primitives/kdf/pbkdf2.pyc
../cryptography/hazmat/primitives/kdf/hkdf.pyc
../cryptography/hazmat/primitives/asymmetric/rsa.pyc
../cryptography/hazmat/primitives/asymmetric/dsa.pyc
../cryptography/hazmat/primitives/asymmetric/__init__.pyc
../cryptography/hazmat/primitives/asymmetric/padding.pyc
../cryptography/hazmat/primitives/asymmetric/ec.pyc
../cryptography/hazmat/primitives/ciphers/modes.pyc
../cryptography/hazmat/primitives/ciphers/__init__.pyc
../cryptography/hazmat/primitives/ciphers/base.pyc
../cryptography/hazmat/primitives/ciphers/algorithms.pyc
../cryptography/hazmat/bindings/openssl/conf.pyc
../cryptography/hazmat/bindings/openssl/ssl.pyc
../cryptography/hazmat/bindings/openssl/crypto.pyc
../cryptography/hazmat/bindings/openssl/hmac.pyc
../cryptography/hazmat/bindings/openssl/rsa.pyc
../cryptography/hazmat/bindings/openssl/bio.pyc
../cryptography/hazmat/bindings/openssl/binding.pyc
../cryptography/hazmat/bindings/openssl/cmac.pyc
../cryptography/hazmat/bindings/openssl/pem.pyc
../cryptography/hazmat/bindings/openssl/rand.pyc
../cryptography/hazmat/bindings/openssl/pkcs7.pyc
../cryptography/hazmat/bindings/openssl/osrandom_engine.pyc
../cryptography/hazmat/bindings/openssl/objects.pyc
../cryptography/hazmat/bindings/openssl/x509.pyc
../cryptography/hazmat/bindings/openssl/err.pyc
../cryptography/hazmat/bindings/openssl/dsa.pyc
../cryptography/hazmat/bindings/openssl/x509_vfy.pyc
../cryptography/hazmat/bindings/openssl/dh.pyc
../cryptography/hazmat/bindings/openssl/pkcs12.pyc
../cryptography/hazmat/bindings/openssl/__init__.pyc
../cryptography/hazmat/bindings/openssl/aes.pyc
../cryptography/hazmat/bindings/openssl/bignum.pyc
../cryptography/hazmat/bindings/openssl/x509name.pyc
../cryptography/hazmat/bindings/openssl/asn1.pyc
../cryptography/hazmat/bindings/openssl/cms.pyc
../cryptography/hazmat/bindings/openssl/nid.pyc
../cryptography/hazmat/bindings/openssl/ecdh.pyc
../cryptography/hazmat/bindings/openssl/ecdsa.pyc
../cryptography/hazmat/bindings/openssl/x509v3.pyc
../cryptography/hazmat/bindings/openssl/evp.pyc
../cryptography/hazmat/bindings/openssl/opensslv.pyc
../cryptography/hazmat/bindings/openssl/engine.pyc
../cryptography/hazmat/bindings/openssl/ec.pyc
../cryptography/hazmat/bindings/commoncrypto/common_cryptor.pyc
../cryptography/hazmat/bindings/commoncrypto/binding.pyc
../cryptography/hazmat/bindings/commoncrypto/common_key_derivation.pyc
../cryptography/hazmat/bindings/commoncrypto/seckey.pyc
../cryptography/hazmat/bindings/commoncrypto/common_hmac.pyc
../cryptography/hazmat/bindings/commoncrypto/common_digest.pyc
../cryptography/hazmat/bindings/commoncrypto/__init__.pyc
../cryptography/hazmat/bindings/commoncrypto/sectransform.pyc
../cryptography/hazmat/bindings/commoncrypto/secitem.pyc
../cryptography/hazmat/bindings/commoncrypto/secimport.pyc
../cryptography/hazmat/bindings/commoncrypto/cf.pyc
../cryptography/hazmat/bindings/commoncrypto/seckeychain.pyc
../cryptography/_Cryptography_cffi_4ed9e37dx4000d087.so
../cryptography/_Cryptography_cffi_684bb40axf342507b.so
../cryptography/_Cryptography_cffi_8f86901cxc1767c5a.so
./
requires.txt
SOURCES.txt
dependency_links.txt
PKG-INFO
not-zip-safe
top_level.txt

View file

@ -1,4 +0,0 @@
_Cryptography_cffi_684bb40axf342507b
_Cryptography_cffi_4ed9e37dx4000d087
cryptography
_Cryptography_cffi_8f86901cxc1767c5a

View file

@ -1,15 +0,0 @@
../ed25519/keys.py
../ed25519/_version.py
../ed25519/test_ed25519.py
../ed25519/__init__.py
../ed25519/keys.pyc
../ed25519/_version.pyc
../ed25519/test_ed25519.pyc
../ed25519/__init__.pyc
../ed25519/_ed25519.so
./
SOURCES.txt
dependency_links.txt
PKG-INFO
top_level.txt
../../../../bin/edsig

View file

@ -1,30 +0,0 @@
../OpenSSL/__init__.py
../OpenSSL/tsafe.py
../OpenSSL/rand.py
../OpenSSL/crypto.py
../OpenSSL/SSL.py
../OpenSSL/version.py
../OpenSSL/test/__init__.py
../OpenSSL/test/util.py
../OpenSSL/test/test_crypto.py
../OpenSSL/test/test_rand.py
../OpenSSL/test/test_ssl.py
../OpenSSL/_util.py
../OpenSSL/__init__.pyc
../OpenSSL/tsafe.pyc
../OpenSSL/rand.pyc
../OpenSSL/crypto.pyc
../OpenSSL/SSL.pyc
../OpenSSL/version.pyc
../OpenSSL/test/__init__.pyc
../OpenSSL/test/util.pyc
../OpenSSL/test/test_crypto.pyc
../OpenSSL/test/test_rand.pyc
../OpenSSL/test/test_ssl.pyc
../OpenSSL/_util.pyc
./
requires.txt
SOURCES.txt
dependency_links.txt
PKG-INFO
top_level.txt

View file

@ -1,38 +0,0 @@
../pycparser/c_ast.py
../pycparser/yacctab.py
../pycparser/ast_transforms.py
../pycparser/__init__.py
../pycparser/plyparser.py
../pycparser/c_lexer.py
../pycparser/c_parser.py
../pycparser/c_generator.py
../pycparser/_ast_gen.py
../pycparser/_build_tables.py
../pycparser/lextab.py
../pycparser/ply/ctokens.py
../pycparser/ply/__init__.py
../pycparser/ply/cpp.py
../pycparser/ply/yacc.py
../pycparser/ply/lex.py
../pycparser/_c_ast.cfg
../pycparser/c_ast.pyc
../pycparser/yacctab.pyc
../pycparser/ast_transforms.pyc
../pycparser/__init__.pyc
../pycparser/plyparser.pyc
../pycparser/c_lexer.pyc
../pycparser/c_parser.pyc
../pycparser/c_generator.pyc
../pycparser/_ast_gen.pyc
../pycparser/_build_tables.pyc
../pycparser/lextab.pyc
../pycparser/ply/ctokens.pyc
../pycparser/ply/__init__.pyc
../pycparser/ply/cpp.pyc
../pycparser/ply/yacc.pyc
../pycparser/ply/lex.pyc
./
SOURCES.txt
dependency_links.txt
PKG-INFO
top_level.txt

View file

@ -1,32 +0,0 @@
Metadata-Version: 1.1
Name: six
Version: 1.7.3
Summary: Python 2 and 3 compatibility utilities
Home-page: http://pypi.python.org/pypi/six/
Author: Benjamin Peterson
Author-email: benjamin@python.org
License: MIT
Description: Six is a Python 2 and 3 compatibility library. It provides utility functions
for smoothing over the differences between the Python versions with the goal of
writing Python code that is compatible on both Python versions. See the
documentation for more information on what is provided.
Six supports every Python version since 2.5. It is contained in only one Python
file, so it can be easily copied into your project. (The copyright and license
notice must be retained.)
Online documentation is at http://pythonhosted.org/six/.
Bugs can be reported to http://bitbucket.org/gutworth/six. The code can also be
found there.
For questions about six or porting in general, email the python-porting mailing
list: http://mail.python.org/mailman/listinfo/python-porting
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities

View file

@ -1,15 +0,0 @@
CHANGES
LICENSE
MANIFEST.in
README
setup.cfg
setup.py
six.py
test_six.py
documentation/Makefile
documentation/conf.py
documentation/index.rst
six.egg-info/PKG-INFO
six.egg-info/SOURCES.txt
six.egg-info/dependency_links.txt
six.egg-info/top_level.txt

View file

@ -1,7 +0,0 @@
../six.py
../six.pyc
./
SOURCES.txt
dependency_links.txt
PKG-INFO
top_level.txt

View file

@ -1,114 +0,0 @@
# mssql/information_schema.py
# Copyright (C) 2005-2014 the SQLAlchemy authors and contributors <see AUTHORS file>
#
# This module is part of SQLAlchemy and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
# TODO: should be using the sys. catalog with SQL Server, not information schema
from ... import Table, MetaData, Column
from ...types import String, Unicode, UnicodeText, Integer, TypeDecorator
from ... import cast
from ... import util
from ...sql import expression
from ...ext.compiler import compiles
ischema = MetaData()
class CoerceUnicode(TypeDecorator):
impl = Unicode
def process_bind_param(self, value, dialect):
if util.py2k and isinstance(value, util.binary_type):
value = value.decode(dialect.encoding)
return value
def bind_expression(self, bindvalue):
return _cast_on_2005(bindvalue)
class _cast_on_2005(expression.ColumnElement):
def __init__(self, bindvalue):
self.bindvalue = bindvalue
@compiles(_cast_on_2005)
def _compile(element, compiler, **kw):
from . import base
if compiler.dialect.server_version_info < base.MS_2005_VERSION:
return compiler.process(element.bindvalue, **kw)
else:
return compiler.process(cast(element.bindvalue, Unicode), **kw)
schemata = Table("SCHEMATA", ischema,
Column("CATALOG_NAME", CoerceUnicode, key="catalog_name"),
Column("SCHEMA_NAME", CoerceUnicode, key="schema_name"),
Column("SCHEMA_OWNER", CoerceUnicode, key="schema_owner"),
schema="INFORMATION_SCHEMA")
tables = Table("TABLES", ischema,
Column("TABLE_CATALOG", CoerceUnicode, key="table_catalog"),
Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
Column("TABLE_NAME", CoerceUnicode, key="table_name"),
Column("TABLE_TYPE", String(convert_unicode=True), key="table_type"),
schema="INFORMATION_SCHEMA")
columns = Table("COLUMNS", ischema,
Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
Column("TABLE_NAME", CoerceUnicode, key="table_name"),
Column("COLUMN_NAME", CoerceUnicode, key="column_name"),
Column("IS_NULLABLE", Integer, key="is_nullable"),
Column("DATA_TYPE", String, key="data_type"),
Column("ORDINAL_POSITION", Integer, key="ordinal_position"),
Column("CHARACTER_MAXIMUM_LENGTH", Integer, key="character_maximum_length"),
Column("NUMERIC_PRECISION", Integer, key="numeric_precision"),
Column("NUMERIC_SCALE", Integer, key="numeric_scale"),
Column("COLUMN_DEFAULT", Integer, key="column_default"),
Column("COLLATION_NAME", String, key="collation_name"),
schema="INFORMATION_SCHEMA")
constraints = Table("TABLE_CONSTRAINTS", ischema,
Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
Column("TABLE_NAME", CoerceUnicode, key="table_name"),
Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
Column("CONSTRAINT_TYPE", String(convert_unicode=True), key="constraint_type"),
schema="INFORMATION_SCHEMA")
column_constraints = Table("CONSTRAINT_COLUMN_USAGE", ischema,
Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
Column("TABLE_NAME", CoerceUnicode, key="table_name"),
Column("COLUMN_NAME", CoerceUnicode, key="column_name"),
Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
schema="INFORMATION_SCHEMA")
key_constraints = Table("KEY_COLUMN_USAGE", ischema,
Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
Column("TABLE_NAME", CoerceUnicode, key="table_name"),
Column("COLUMN_NAME", CoerceUnicode, key="column_name"),
Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
Column("ORDINAL_POSITION", Integer, key="ordinal_position"),
schema="INFORMATION_SCHEMA")
ref_constraints = Table("REFERENTIAL_CONSTRAINTS", ischema,
Column("CONSTRAINT_CATALOG", CoerceUnicode, key="constraint_catalog"),
Column("CONSTRAINT_SCHEMA", CoerceUnicode, key="constraint_schema"),
Column("CONSTRAINT_NAME", CoerceUnicode, key="constraint_name"),
# TODO: is CATLOG misspelled ?
Column("UNIQUE_CONSTRAINT_CATLOG", CoerceUnicode,
key="unique_constraint_catalog"),
Column("UNIQUE_CONSTRAINT_SCHEMA", CoerceUnicode,
key="unique_constraint_schema"),
Column("UNIQUE_CONSTRAINT_NAME", CoerceUnicode,
key="unique_constraint_name"),
Column("MATCH_OPTION", String, key="match_option"),
Column("UPDATE_RULE", String, key="update_rule"),
Column("DELETE_RULE", String, key="delete_rule"),
schema="INFORMATION_SCHEMA")
views = Table("VIEWS", ischema,
Column("TABLE_CATALOG", CoerceUnicode, key="table_catalog"),
Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"),
Column("TABLE_NAME", CoerceUnicode, key="table_name"),
Column("VIEW_DEFINITION", CoerceUnicode, key="view_definition"),
Column("CHECK_OPTION", String, key="check_option"),
Column("IS_UPDATABLE", String, key="is_updatable"),
schema="INFORMATION_SCHEMA")

View file

@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: SQLAlchemy
Version: 0.9.4
Version: 0.9.7
Summary: Database Abstraction Library
Home-page: http://www.sqlalchemy.org
Author: Mike Bayer

View file

@ -49,6 +49,7 @@ doc/_modules/examples/inheritance/single.html
doc/_modules/examples/join_conditions/cast.html
doc/_modules/examples/join_conditions/threeway.html
doc/_modules/examples/large_collection/large_collection.html
doc/_modules/examples/materialized_paths/materialized_paths.html
doc/_modules/examples/nested_sets/nested_sets.html
doc/_modules/examples/postgis/postgis.html
doc/_modules/examples/sharding/attribute_shard.html
@ -58,91 +59,13 @@ doc/_modules/examples/versioned_rows/versioned_map.html
doc/_modules/examples/versioned_rows/versioned_rows.html
doc/_modules/examples/vertical/dictlike-polymorphic.html
doc/_modules/examples/vertical/dictlike.html
doc/_sources/contents.txt
doc/_sources/copyright.txt
doc/_sources/faq.txt
doc/_sources/glossary.txt
doc/_sources/index.txt
doc/_sources/intro.txt
doc/_sources/changelog/changelog_01.txt
doc/_sources/changelog/changelog_02.txt
doc/_sources/changelog/changelog_03.txt
doc/_sources/changelog/changelog_04.txt
doc/_sources/changelog/changelog_05.txt
doc/_sources/changelog/changelog_06.txt
doc/_sources/changelog/changelog_07.txt
doc/_sources/changelog/changelog_08.txt
doc/_sources/changelog/changelog_09.txt
doc/_sources/changelog/index.txt
doc/_sources/changelog/migration_04.txt
doc/_sources/changelog/migration_05.txt
doc/_sources/changelog/migration_06.txt
doc/_sources/changelog/migration_07.txt
doc/_sources/changelog/migration_08.txt
doc/_sources/changelog/migration_09.txt
doc/_sources/core/compiler.txt
doc/_sources/core/connections.txt
doc/_sources/core/constraints.txt
doc/_sources/core/ddl.txt
doc/_sources/core/defaults.txt
doc/_sources/core/dml.txt
doc/_sources/core/engines.txt
doc/_sources/core/event.txt
doc/_sources/core/events.txt
doc/_sources/core/exceptions.txt
doc/_sources/core/expression_api.txt
doc/_sources/core/functions.txt
doc/_sources/core/index.txt
doc/_sources/core/inspection.txt
doc/_sources/core/interfaces.txt
doc/_sources/core/internals.txt
doc/_sources/core/metadata.txt
doc/_sources/core/pooling.txt
doc/_sources/core/reflection.txt
doc/_sources/core/schema.txt
doc/_sources/core/selectable.txt
doc/_sources/core/serializer.txt
doc/_sources/core/sqlelement.txt
doc/_sources/core/tutorial.txt
doc/_sources/core/types.txt
doc/_sources/dialects/drizzle.txt
doc/_sources/dialects/firebird.txt
doc/_sources/dialects/index.txt
doc/_sources/dialects/mssql.txt
doc/_sources/dialects/mysql.txt
doc/_sources/dialects/oracle.txt
doc/_sources/dialects/postgresql.txt
doc/_sources/dialects/sqlite.txt
doc/_sources/dialects/sybase.txt
doc/_sources/orm/collections.txt
doc/_sources/orm/deprecated.txt
doc/_sources/orm/events.txt
doc/_sources/orm/examples.txt
doc/_sources/orm/exceptions.txt
doc/_sources/orm/index.txt
doc/_sources/orm/inheritance.txt
doc/_sources/orm/internals.txt
doc/_sources/orm/loading.txt
doc/_sources/orm/mapper_config.txt
doc/_sources/orm/query.txt
doc/_sources/orm/relationships.txt
doc/_sources/orm/session.txt
doc/_sources/orm/tutorial.txt
doc/_sources/orm/extensions/associationproxy.txt
doc/_sources/orm/extensions/automap.txt
doc/_sources/orm/extensions/declarative.txt
doc/_sources/orm/extensions/horizontal_shard.txt
doc/_sources/orm/extensions/hybrid.txt
doc/_sources/orm/extensions/index.txt
doc/_sources/orm/extensions/instrumentation.txt
doc/_sources/orm/extensions/mutable.txt
doc/_sources/orm/extensions/orderinglist.txt
doc/_static/basic.css
doc/_static/changelog.css
doc/_static/comment-bright.png
doc/_static/comment-close.png
doc/_static/comment.png
doc/_static/default.css
doc/_static/detectmobile.js
doc/_static/docs.css
doc/_static/doctools.js
doc/_static/down-pressed.png
@ -252,6 +175,7 @@ doc/build/orm/extensions/index.rst
doc/build/orm/extensions/instrumentation.rst
doc/build/orm/extensions/mutable.rst
doc/build/orm/extensions/orderinglist.rst
doc/build/static/detectmobile.js
doc/build/static/docs.css
doc/build/static/init.js
doc/build/templates/genindex.mako
@ -378,6 +302,8 @@ examples/join_conditions/cast.py
examples/join_conditions/threeway.py
examples/large_collection/__init__.py
examples/large_collection/large_collection.py
examples/materialized_paths/__init__.py
examples/materialized_paths/materialized_paths.py
examples/nested_sets/__init__.py
examples/nested_sets/nested_sets.py
examples/postgis/__init__.py
@ -547,6 +473,7 @@ lib/sqlalchemy/testing/__init__.py
lib/sqlalchemy/testing/assertions.py
lib/sqlalchemy/testing/assertsql.py
lib/sqlalchemy/testing/config.py
lib/sqlalchemy/testing/distutils_run.py
lib/sqlalchemy/testing/engines.py
lib/sqlalchemy/testing/entities.py
lib/sqlalchemy/testing/exclusions.py
@ -725,6 +652,7 @@ test/orm/inheritance/test_relationship.py
test/orm/inheritance/test_selects.py
test/orm/inheritance/test_single.py
test/orm/inheritance/test_with_poly.py
test/perf/invalidate_stresstest.py
test/perf/orm2010.py
test/sql/__init__.py
test/sql/test_case_statement.py

View file

@ -0,0 +1,366 @@
../sqlalchemy/interfaces.py
../sqlalchemy/events.py
../sqlalchemy/types.py
../sqlalchemy/exc.py
../sqlalchemy/schema.py
../sqlalchemy/inspection.py
../sqlalchemy/__init__.py
../sqlalchemy/pool.py
../sqlalchemy/processors.py
../sqlalchemy/log.py
../sqlalchemy/databases/__init__.py
../sqlalchemy/testing/engines.py
../sqlalchemy/testing/schema.py
../sqlalchemy/testing/pickleable.py
../sqlalchemy/testing/fixtures.py
../sqlalchemy/testing/__init__.py
../sqlalchemy/testing/assertsql.py
../sqlalchemy/testing/config.py
../sqlalchemy/testing/warnings.py
../sqlalchemy/testing/distutils_run.py
../sqlalchemy/testing/requirements.py
../sqlalchemy/testing/runner.py
../sqlalchemy/testing/assertions.py
../sqlalchemy/testing/profiling.py
../sqlalchemy/testing/mock.py
../sqlalchemy/testing/exclusions.py
../sqlalchemy/testing/util.py
../sqlalchemy/testing/entities.py
../sqlalchemy/testing/plugin/noseplugin.py
../sqlalchemy/testing/plugin/__init__.py
../sqlalchemy/testing/plugin/pytestplugin.py
../sqlalchemy/testing/plugin/plugin_base.py
../sqlalchemy/testing/suite/test_insert.py
../sqlalchemy/testing/suite/test_results.py
../sqlalchemy/testing/suite/__init__.py
../sqlalchemy/testing/suite/test_select.py
../sqlalchemy/testing/suite/test_sequence.py
../sqlalchemy/testing/suite/test_types.py
../sqlalchemy/testing/suite/test_update_delete.py
../sqlalchemy/testing/suite/test_reflection.py
../sqlalchemy/testing/suite/test_ddl.py
../sqlalchemy/orm/persistence.py
../sqlalchemy/orm/interfaces.py
../sqlalchemy/orm/events.py
../sqlalchemy/orm/path_registry.py
../sqlalchemy/orm/descriptor_props.py
../sqlalchemy/orm/identity.py
../sqlalchemy/orm/evaluator.py
../sqlalchemy/orm/exc.py
../sqlalchemy/orm/base.py
../sqlalchemy/orm/__init__.py
../sqlalchemy/orm/properties.py
../sqlalchemy/orm/relationships.py
../sqlalchemy/orm/collections.py
../sqlalchemy/orm/strategy_options.py
../sqlalchemy/orm/dynamic.py
../sqlalchemy/orm/attributes.py
../sqlalchemy/orm/mapper.py
../sqlalchemy/orm/state.py
../sqlalchemy/orm/sync.py
../sqlalchemy/orm/loading.py
../sqlalchemy/orm/strategies.py
../sqlalchemy/orm/unitofwork.py
../sqlalchemy/orm/query.py
../sqlalchemy/orm/instrumentation.py
../sqlalchemy/orm/session.py
../sqlalchemy/orm/deprecated_interfaces.py
../sqlalchemy/orm/scoping.py
../sqlalchemy/orm/dependency.py
../sqlalchemy/orm/util.py
../sqlalchemy/sql/default_comparator.py
../sqlalchemy/sql/sqltypes.py
../sqlalchemy/sql/functions.py
../sqlalchemy/sql/base.py
../sqlalchemy/sql/schema.py
../sqlalchemy/sql/__init__.py
../sqlalchemy/sql/ddl.py
../sqlalchemy/sql/elements.py
../sqlalchemy/sql/compiler.py
../sqlalchemy/sql/annotation.py
../sqlalchemy/sql/dml.py
../sqlalchemy/sql/expression.py
../sqlalchemy/sql/operators.py
../sqlalchemy/sql/selectable.py
../sqlalchemy/sql/visitors.py
../sqlalchemy/sql/type_api.py
../sqlalchemy/sql/naming.py
../sqlalchemy/sql/util.py
../sqlalchemy/ext/serializer.py
../sqlalchemy/ext/associationproxy.py
../sqlalchemy/ext/automap.py
../sqlalchemy/ext/__init__.py
../sqlalchemy/ext/hybrid.py
../sqlalchemy/ext/compiler.py
../sqlalchemy/ext/horizontal_shard.py
../sqlalchemy/ext/orderinglist.py
../sqlalchemy/ext/instrumentation.py
../sqlalchemy/ext/mutable.py
../sqlalchemy/ext/declarative/base.py
../sqlalchemy/ext/declarative/__init__.py
../sqlalchemy/ext/declarative/clsregistry.py
../sqlalchemy/ext/declarative/api.py
../sqlalchemy/util/langhelpers.py
../sqlalchemy/util/queue.py
../sqlalchemy/util/compat.py
../sqlalchemy/util/__init__.py
../sqlalchemy/util/deprecations.py
../sqlalchemy/util/_collections.py
../sqlalchemy/util/topological.py
../sqlalchemy/connectors/mxodbc.py
../sqlalchemy/connectors/__init__.py
../sqlalchemy/connectors/pyodbc.py
../sqlalchemy/connectors/mysqldb.py
../sqlalchemy/connectors/zxJDBC.py
../sqlalchemy/dialects/postgres.py
../sqlalchemy/dialects/__init__.py
../sqlalchemy/dialects/mssql/adodbapi.py
../sqlalchemy/dialects/mssql/mxodbc.py
../sqlalchemy/dialects/mssql/base.py
../sqlalchemy/dialects/mssql/information_schema.py
../sqlalchemy/dialects/mssql/__init__.py
../sqlalchemy/dialects/mssql/pyodbc.py
../sqlalchemy/dialects/mssql/zxjdbc.py
../sqlalchemy/dialects/mssql/pymssql.py
../sqlalchemy/dialects/postgresql/pg8000.py
../sqlalchemy/dialects/postgresql/ranges.py
../sqlalchemy/dialects/postgresql/base.py
../sqlalchemy/dialects/postgresql/__init__.py
../sqlalchemy/dialects/postgresql/zxjdbc.py
../sqlalchemy/dialects/postgresql/json.py
../sqlalchemy/dialects/postgresql/pypostgresql.py
../sqlalchemy/dialects/postgresql/constraints.py
../sqlalchemy/dialects/postgresql/hstore.py
../sqlalchemy/dialects/postgresql/psycopg2.py
../sqlalchemy/dialects/sybase/mxodbc.py
../sqlalchemy/dialects/sybase/base.py
../sqlalchemy/dialects/sybase/__init__.py
../sqlalchemy/dialects/sybase/pyodbc.py
../sqlalchemy/dialects/sybase/pysybase.py
../sqlalchemy/dialects/drizzle/base.py
../sqlalchemy/dialects/drizzle/__init__.py
../sqlalchemy/dialects/drizzle/mysqldb.py
../sqlalchemy/dialects/mysql/mysqlconnector.py
../sqlalchemy/dialects/mysql/base.py
../sqlalchemy/dialects/mysql/__init__.py
../sqlalchemy/dialects/mysql/pyodbc.py
../sqlalchemy/dialects/mysql/zxjdbc.py
../sqlalchemy/dialects/mysql/oursql.py
../sqlalchemy/dialects/mysql/pymysql.py
../sqlalchemy/dialects/mysql/cymysql.py
../sqlalchemy/dialects/mysql/gaerdbms.py
../sqlalchemy/dialects/mysql/mysqldb.py
../sqlalchemy/dialects/sqlite/base.py
../sqlalchemy/dialects/sqlite/__init__.py
../sqlalchemy/dialects/sqlite/pysqlite.py
../sqlalchemy/dialects/firebird/base.py
../sqlalchemy/dialects/firebird/__init__.py
../sqlalchemy/dialects/firebird/fdb.py
../sqlalchemy/dialects/firebird/kinterbasdb.py
../sqlalchemy/dialects/oracle/base.py
../sqlalchemy/dialects/oracle/__init__.py
../sqlalchemy/dialects/oracle/zxjdbc.py
../sqlalchemy/dialects/oracle/cx_oracle.py
../sqlalchemy/engine/interfaces.py
../sqlalchemy/engine/result.py
../sqlalchemy/engine/base.py
../sqlalchemy/engine/url.py
../sqlalchemy/engine/threadlocal.py
../sqlalchemy/engine/__init__.py
../sqlalchemy/engine/default.py
../sqlalchemy/engine/strategies.py
../sqlalchemy/engine/reflection.py
../sqlalchemy/engine/util.py
../sqlalchemy/event/base.py
../sqlalchemy/event/__init__.py
../sqlalchemy/event/attr.py
../sqlalchemy/event/registry.py
../sqlalchemy/event/legacy.py
../sqlalchemy/event/api.py
../sqlalchemy/__pycache__/interfaces.cpython-34.pyc
../sqlalchemy/__pycache__/events.cpython-34.pyc
../sqlalchemy/__pycache__/types.cpython-34.pyc
../sqlalchemy/__pycache__/exc.cpython-34.pyc
../sqlalchemy/__pycache__/schema.cpython-34.pyc
../sqlalchemy/__pycache__/inspection.cpython-34.pyc
../sqlalchemy/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/__pycache__/pool.cpython-34.pyc
../sqlalchemy/__pycache__/processors.cpython-34.pyc
../sqlalchemy/__pycache__/log.cpython-34.pyc
../sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/testing/__pycache__/engines.cpython-34.pyc
../sqlalchemy/testing/__pycache__/schema.cpython-34.pyc
../sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc
../sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc
../sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc
../sqlalchemy/testing/__pycache__/config.cpython-34.pyc
../sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc
../sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc
../sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc
../sqlalchemy/testing/__pycache__/runner.cpython-34.pyc
../sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc
../sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc
../sqlalchemy/testing/__pycache__/mock.cpython-34.pyc
../sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc
../sqlalchemy/testing/__pycache__/util.cpython-34.pyc
../sqlalchemy/testing/__pycache__/entities.cpython-34.pyc
../sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc
../sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc
../sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc
../sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc
../sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc
../sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc
../sqlalchemy/orm/__pycache__/events.cpython-34.pyc
../sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc
../sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc
../sqlalchemy/orm/__pycache__/identity.cpython-34.pyc
../sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc
../sqlalchemy/orm/__pycache__/exc.cpython-34.pyc
../sqlalchemy/orm/__pycache__/base.cpython-34.pyc
../sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/orm/__pycache__/properties.cpython-34.pyc
../sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc
../sqlalchemy/orm/__pycache__/collections.cpython-34.pyc
../sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc
../sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc
../sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc
../sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc
../sqlalchemy/orm/__pycache__/state.cpython-34.pyc
../sqlalchemy/orm/__pycache__/sync.cpython-34.pyc
../sqlalchemy/orm/__pycache__/loading.cpython-34.pyc
../sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc
../sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc
../sqlalchemy/orm/__pycache__/query.cpython-34.pyc
../sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc
../sqlalchemy/orm/__pycache__/session.cpython-34.pyc
../sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc
../sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc
../sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc
../sqlalchemy/orm/__pycache__/util.cpython-34.pyc
../sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc
../sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc
../sqlalchemy/sql/__pycache__/functions.cpython-34.pyc
../sqlalchemy/sql/__pycache__/base.cpython-34.pyc
../sqlalchemy/sql/__pycache__/schema.cpython-34.pyc
../sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc
../sqlalchemy/sql/__pycache__/elements.cpython-34.pyc
../sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc
../sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc
../sqlalchemy/sql/__pycache__/dml.cpython-34.pyc
../sqlalchemy/sql/__pycache__/expression.cpython-34.pyc
../sqlalchemy/sql/__pycache__/operators.cpython-34.pyc
../sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc
../sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc
../sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc
../sqlalchemy/sql/__pycache__/naming.cpython-34.pyc
../sqlalchemy/sql/__pycache__/util.cpython-34.pyc
../sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc
../sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc
../sqlalchemy/ext/__pycache__/automap.cpython-34.pyc
../sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc
../sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc
../sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc
../sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc
../sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc
../sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc
../sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc
../sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc
../sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc
../sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc
../sqlalchemy/util/__pycache__/queue.cpython-34.pyc
../sqlalchemy/util/__pycache__/compat.cpython-34.pyc
../sqlalchemy/util/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc
../sqlalchemy/util/__pycache__/_collections.cpython-34.pyc
../sqlalchemy/util/__pycache__/topological.cpython-34.pyc
../sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc
../sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc
../sqlalchemy/connectors/__pycache__/mysqldb.cpython-34.pyc
../sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc
../sqlalchemy/dialects/__pycache__/postgres.cpython-34.pyc
../sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc
../sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc
../sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc
../sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc
../sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc
../sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc
../sqlalchemy/dialects/drizzle/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/drizzle/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/drizzle/__pycache__/mysqldb.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc
../sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc
../sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc
../sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc
../sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc
../sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc
../sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc
../sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc
../sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc
../sqlalchemy/engine/__pycache__/result.cpython-34.pyc
../sqlalchemy/engine/__pycache__/base.cpython-34.pyc
../sqlalchemy/engine/__pycache__/url.cpython-34.pyc
../sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc
../sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/engine/__pycache__/default.cpython-34.pyc
../sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc
../sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc
../sqlalchemy/engine/__pycache__/util.cpython-34.pyc
../sqlalchemy/event/__pycache__/base.cpython-34.pyc
../sqlalchemy/event/__pycache__/__init__.cpython-34.pyc
../sqlalchemy/event/__pycache__/attr.cpython-34.pyc
../sqlalchemy/event/__pycache__/registry.cpython-34.pyc
../sqlalchemy/event/__pycache__/legacy.cpython-34.pyc
../sqlalchemy/event/__pycache__/api.cpython-34.pyc
../sqlalchemy/cprocessors.cpython-34m.so
../sqlalchemy/cresultproxy.cpython-34m.so
../sqlalchemy/cutils.cpython-34m.so
./
dependency_links.txt
PKG-INFO
SOURCES.txt
top_level.txt

View file

@ -0,0 +1,16 @@
try:
import ast
from _markerlib.markers import default_environment, compile, interpret
except ImportError:
if 'ast' in globals():
raise
def default_environment():
return {}
def compile(marker):
def marker_fn(environment=None, override=None):
# 'empty markers are True' heuristic won't install extra deps.
return not marker.strip()
marker_fn.__doc__ = marker
return marker_fn
def interpret(marker, environment=None, override=None):
return compile(marker)()

View file

@ -0,0 +1,119 @@
# -*- coding: utf-8 -*-
"""Interpret PEP 345 environment markers.
EXPR [in|==|!=|not in] EXPR [or|and] ...
where EXPR belongs to any of those:
python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
python_full_version = sys.version.split()[0]
os.name = os.name
sys.platform = sys.platform
platform.version = platform.version()
platform.machine = platform.machine()
platform.python_implementation = platform.python_implementation()
a free string, like '2.6', or 'win32'
"""
__all__ = ['default_environment', 'compile', 'interpret']
import ast
import os
import platform
import sys
import weakref
_builtin_compile = compile
try:
from platform import python_implementation
except ImportError:
if os.name == "java":
# Jython 2.5 has ast module, but not platform.python_implementation() function.
def python_implementation():
return "Jython"
else:
raise
# restricted set of variables
_VARS = {'sys.platform': sys.platform,
'python_version': '%s.%s' % sys.version_info[:2],
# FIXME parsing sys.platform is not reliable, but there is no other
# way to get e.g. 2.7.2+, and the PEP is defined with sys.version
'python_full_version': sys.version.split(' ', 1)[0],
'os.name': os.name,
'platform.version': platform.version(),
'platform.machine': platform.machine(),
'platform.python_implementation': python_implementation(),
'extra': None # wheel extension
}
for var in list(_VARS.keys()):
if '.' in var:
_VARS[var.replace('.', '_')] = _VARS[var]
def default_environment():
"""Return copy of default PEP 385 globals dictionary."""
return dict(_VARS)
class ASTWhitelist(ast.NodeTransformer):
def __init__(self, statement):
self.statement = statement # for error messages
ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str)
# Bool operations
ALLOWED += (ast.And, ast.Or)
# Comparison operations
ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn)
def visit(self, node):
"""Ensure statement only contains allowed nodes."""
if not isinstance(node, self.ALLOWED):
raise SyntaxError('Not allowed in environment markers.\n%s\n%s' %
(self.statement,
(' ' * node.col_offset) + '^'))
return ast.NodeTransformer.visit(self, node)
def visit_Attribute(self, node):
"""Flatten one level of attribute access."""
new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx)
return ast.copy_location(new_node, node)
def parse_marker(marker):
tree = ast.parse(marker, mode='eval')
new_tree = ASTWhitelist(marker).generic_visit(tree)
return new_tree
def compile_marker(parsed_marker):
return _builtin_compile(parsed_marker, '<environment marker>', 'eval',
dont_inherit=True)
_cache = weakref.WeakValueDictionary()
def compile(marker):
"""Return compiled marker as a function accepting an environment dict."""
try:
return _cache[marker]
except KeyError:
pass
if not marker.strip():
def marker_fn(environment=None, override=None):
""""""
return True
else:
compiled_marker = compile_marker(parse_marker(marker))
def marker_fn(environment=None, override=None):
"""override updates environment"""
if override is None:
override = {}
if environment is None:
environment = default_environment()
environment.update(override)
return eval(compiled_marker, environment)
marker_fn.__doc__ = marker
_cache[marker] = marker_fn
return _cache[marker]
def interpret(marker, environment=None):
return compile(marker)(environment)

View file

@ -0,0 +1,32 @@
../cffi/lock.py
../cffi/backend_ctypes.py
../cffi/__init__.py
../cffi/ffiplatform.py
../cffi/vengine_gen.py
../cffi/commontypes.py
../cffi/vengine_cpy.py
../cffi/api.py
../cffi/gc_weakref.py
../cffi/verifier.py
../cffi/cparser.py
../cffi/model.py
../cffi/__pycache__/lock.cpython-34.pyc
../cffi/__pycache__/backend_ctypes.cpython-34.pyc
../cffi/__pycache__/__init__.cpython-34.pyc
../cffi/__pycache__/ffiplatform.cpython-34.pyc
../cffi/__pycache__/vengine_gen.cpython-34.pyc
../cffi/__pycache__/commontypes.cpython-34.pyc
../cffi/__pycache__/vengine_cpy.cpython-34.pyc
../cffi/__pycache__/api.cpython-34.pyc
../cffi/__pycache__/gc_weakref.cpython-34.pyc
../cffi/__pycache__/verifier.cpython-34.pyc
../cffi/__pycache__/cparser.cpython-34.pyc
../cffi/__pycache__/model.cpython-34.pyc
../_cffi_backend.cpython-34m.so
./
dependency_links.txt
PKG-INFO
SOURCES.txt
not-zip-safe
top_level.txt
requires.txt

View file

@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: cryptography
Version: 0.5.4
Version: 0.6
Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers.
Home-page: https://github.com/pyca/cryptography
Author: The cryptography developers
@ -13,6 +13,10 @@ Description: Cryptography
:target: https://pypi.python.org/pypi/cryptography/
:alt: Latest Version
.. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest
:target: https://cryptography.io
:alt: Latest Docs
.. image:: https://travis-ci.org/pyca/cryptography.svg?branch=master
:target: https://travis-ci.org/pyca/cryptography

View file

@ -14,6 +14,7 @@ cryptography/utils.py
cryptography.egg-info/PKG-INFO
cryptography.egg-info/SOURCES.txt
cryptography.egg-info/dependency_links.txt
cryptography.egg-info/entry_points.txt
cryptography.egg-info/not-zip-safe
cryptography.egg-info/requires.txt
cryptography.egg-info/top_level.txt
@ -37,8 +38,7 @@ cryptography/hazmat/backends/openssl/hmac.py
cryptography/hazmat/backends/openssl/rsa.py
cryptography/hazmat/bindings/__init__.py
cryptography/hazmat/bindings/utils.py
cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_4ed9e37dx4000d087.c
cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_d62b3d91x972e1c0b.c
cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_3e31f141x4000d087.c
cryptography/hazmat/bindings/commoncrypto/__init__.py
cryptography/hazmat/bindings/commoncrypto/binding.py
cryptography/hazmat/bindings/commoncrypto/cf.py
@ -92,8 +92,8 @@ cryptography/hazmat/primitives/hmac.py
cryptography/hazmat/primitives/interfaces.py
cryptography/hazmat/primitives/padding.py
cryptography/hazmat/primitives/serialization.py
cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_684bb40axf342507b.c
cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_8f86901cxc1767c5a.c
cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_7ab3712bx4f158fee.c
cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_dd416c1exc1767c5a.c
cryptography/hazmat/primitives/asymmetric/__init__.py
cryptography/hazmat/primitives/asymmetric/dsa.py
cryptography/hazmat/primitives/asymmetric/ec.py
@ -106,6 +106,8 @@ cryptography/hazmat/primitives/ciphers/modes.py
cryptography/hazmat/primitives/kdf/__init__.py
cryptography/hazmat/primitives/kdf/hkdf.py
cryptography/hazmat/primitives/kdf/pbkdf2.py
cryptography/hazmat/primitives/src/constant_time.c
cryptography/hazmat/primitives/src/constant_time.h
cryptography/hazmat/primitives/twofactor/__init__.py
cryptography/hazmat/primitives/twofactor/hotp.py
cryptography/hazmat/primitives/twofactor/totp.py

View file

@ -0,0 +1,3 @@
[cryptography.backends]
openssl = cryptography.hazmat.backends.openssl:backend

View file

@ -0,0 +1,202 @@
../cryptography/utils.py
../cryptography/__about__.py
../cryptography/__init__.py
../cryptography/exceptions.py
../cryptography/fernet.py
../cryptography/hazmat/__init__.py
../cryptography/hazmat/bindings/utils.py
../cryptography/hazmat/bindings/__init__.py
../cryptography/hazmat/primitives/interfaces.py
../cryptography/hazmat/primitives/constant_time.py
../cryptography/hazmat/primitives/__init__.py
../cryptography/hazmat/primitives/hashes.py
../cryptography/hazmat/primitives/hmac.py
../cryptography/hazmat/primitives/padding.py
../cryptography/hazmat/primitives/serialization.py
../cryptography/hazmat/primitives/cmac.py
../cryptography/hazmat/backends/interfaces.py
../cryptography/hazmat/backends/multibackend.py
../cryptography/hazmat/backends/__init__.py
../cryptography/hazmat/bindings/commoncrypto/secimport.py
../cryptography/hazmat/bindings/commoncrypto/common_cryptor.py
../cryptography/hazmat/bindings/commoncrypto/seckeychain.py
../cryptography/hazmat/bindings/commoncrypto/common_hmac.py
../cryptography/hazmat/bindings/commoncrypto/__init__.py
../cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py
../cryptography/hazmat/bindings/commoncrypto/sectransform.py
../cryptography/hazmat/bindings/commoncrypto/binding.py
../cryptography/hazmat/bindings/commoncrypto/common_digest.py
../cryptography/hazmat/bindings/commoncrypto/seckey.py
../cryptography/hazmat/bindings/commoncrypto/secitem.py
../cryptography/hazmat/bindings/commoncrypto/cf.py
../cryptography/hazmat/bindings/openssl/opensslv.py
../cryptography/hazmat/bindings/openssl/ec.py
../cryptography/hazmat/bindings/openssl/x509_vfy.py
../cryptography/hazmat/bindings/openssl/aes.py
../cryptography/hazmat/bindings/openssl/asn1.py
../cryptography/hazmat/bindings/openssl/objects.py
../cryptography/hazmat/bindings/openssl/dsa.py
../cryptography/hazmat/bindings/openssl/x509name.py
../cryptography/hazmat/bindings/openssl/osrandom_engine.py
../cryptography/hazmat/bindings/openssl/rand.py
../cryptography/hazmat/bindings/openssl/cms.py
../cryptography/hazmat/bindings/openssl/engine.py
../cryptography/hazmat/bindings/openssl/__init__.py
../cryptography/hazmat/bindings/openssl/ssl.py
../cryptography/hazmat/bindings/openssl/nid.py
../cryptography/hazmat/bindings/openssl/x509v3.py
../cryptography/hazmat/bindings/openssl/err.py
../cryptography/hazmat/bindings/openssl/bio.py
../cryptography/hazmat/bindings/openssl/ecdsa.py
../cryptography/hazmat/bindings/openssl/pkcs7.py
../cryptography/hazmat/bindings/openssl/bignum.py
../cryptography/hazmat/bindings/openssl/binding.py
../cryptography/hazmat/bindings/openssl/pem.py
../cryptography/hazmat/bindings/openssl/rsa.py
../cryptography/hazmat/bindings/openssl/hmac.py
../cryptography/hazmat/bindings/openssl/conf.py
../cryptography/hazmat/bindings/openssl/dh.py
../cryptography/hazmat/bindings/openssl/x509.py
../cryptography/hazmat/bindings/openssl/ecdh.py
../cryptography/hazmat/bindings/openssl/evp.py
../cryptography/hazmat/bindings/openssl/cmac.py
../cryptography/hazmat/bindings/openssl/crypto.py
../cryptography/hazmat/bindings/openssl/pkcs12.py
../cryptography/hazmat/primitives/kdf/__init__.py
../cryptography/hazmat/primitives/kdf/hkdf.py
../cryptography/hazmat/primitives/kdf/pbkdf2.py
../cryptography/hazmat/primitives/asymmetric/ec.py
../cryptography/hazmat/primitives/asymmetric/dsa.py
../cryptography/hazmat/primitives/asymmetric/__init__.py
../cryptography/hazmat/primitives/asymmetric/rsa.py
../cryptography/hazmat/primitives/asymmetric/padding.py
../cryptography/hazmat/primitives/ciphers/base.py
../cryptography/hazmat/primitives/ciphers/__init__.py
../cryptography/hazmat/primitives/ciphers/modes.py
../cryptography/hazmat/primitives/ciphers/algorithms.py
../cryptography/hazmat/primitives/twofactor/__init__.py
../cryptography/hazmat/primitives/twofactor/totp.py
../cryptography/hazmat/primitives/twofactor/hotp.py
../cryptography/hazmat/backends/commoncrypto/backend.py
../cryptography/hazmat/backends/commoncrypto/__init__.py
../cryptography/hazmat/backends/commoncrypto/hashes.py
../cryptography/hazmat/backends/commoncrypto/hmac.py
../cryptography/hazmat/backends/commoncrypto/ciphers.py
../cryptography/hazmat/backends/openssl/ec.py
../cryptography/hazmat/backends/openssl/dsa.py
../cryptography/hazmat/backends/openssl/backend.py
../cryptography/hazmat/backends/openssl/__init__.py
../cryptography/hazmat/backends/openssl/hashes.py
../cryptography/hazmat/backends/openssl/rsa.py
../cryptography/hazmat/backends/openssl/hmac.py
../cryptography/hazmat/backends/openssl/cmac.py
../cryptography/hazmat/backends/openssl/ciphers.py
../cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_3e31f141x4000d087.c
../cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_7ab3712bx4f158fee.c
../cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_dd416c1exc1767c5a.c
../cryptography/hazmat/primitives/src/constant_time.c
../cryptography/hazmat/primitives/src/constant_time.h
../cryptography/__pycache__/utils.cpython-34.pyc
../cryptography/__pycache__/__about__.cpython-34.pyc
../cryptography/__pycache__/__init__.cpython-34.pyc
../cryptography/__pycache__/exceptions.cpython-34.pyc
../cryptography/__pycache__/fernet.cpython-34.pyc
../cryptography/hazmat/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/bindings/__pycache__/utils.cpython-34.pyc
../cryptography/hazmat/bindings/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/interfaces.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/constant_time.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/hashes.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/hmac.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/padding.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/serialization.cpython-34.pyc
../cryptography/hazmat/primitives/__pycache__/cmac.cpython-34.pyc
../cryptography/hazmat/backends/__pycache__/interfaces.cpython-34.pyc
../cryptography/hazmat/backends/__pycache__/multibackend.cpython-34.pyc
../cryptography/hazmat/backends/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/secimport.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_cryptor.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/seckeychain.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_hmac.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_key_derivation.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/sectransform.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/binding.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_digest.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/seckey.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/secitem.cpython-34.pyc
../cryptography/hazmat/bindings/commoncrypto/__pycache__/cf.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/opensslv.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/ec.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/x509_vfy.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/aes.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/asn1.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/objects.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/dsa.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/x509name.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/osrandom_engine.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/rand.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/cms.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/engine.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/ssl.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/nid.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/x509v3.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/err.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/bio.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/ecdsa.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/pkcs7.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/bignum.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/pem.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/rsa.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/hmac.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/conf.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/dh.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/x509.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/ecdh.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/evp.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/cmac.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/crypto.cpython-34.pyc
../cryptography/hazmat/bindings/openssl/__pycache__/pkcs12.cpython-34.pyc
../cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/primitives/kdf/__pycache__/hkdf.cpython-34.pyc
../cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-34.pyc
../cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-34.pyc
../cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-34.pyc
../cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-34.pyc
../cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-34.pyc
../cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-34.pyc
../cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-34.pyc
../cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-34.pyc
../cryptography/hazmat/primitives/twofactor/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/primitives/twofactor/__pycache__/totp.cpython-34.pyc
../cryptography/hazmat/primitives/twofactor/__pycache__/hotp.cpython-34.pyc
../cryptography/hazmat/backends/commoncrypto/__pycache__/backend.cpython-34.pyc
../cryptography/hazmat/backends/commoncrypto/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/backends/commoncrypto/__pycache__/hashes.cpython-34.pyc
../cryptography/hazmat/backends/commoncrypto/__pycache__/hmac.cpython-34.pyc
../cryptography/hazmat/backends/commoncrypto/__pycache__/ciphers.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/ec.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/dsa.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/hashes.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/rsa.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/hmac.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/cmac.cpython-34.pyc
../cryptography/hazmat/backends/openssl/__pycache__/ciphers.cpython-34.pyc
../cryptography/_Cryptography_cffi_3e31f141x4000d087.cpython-34m.so
../cryptography/_Cryptography_cffi_7ab3712bx4f158fee.cpython-34m.so
../cryptography/_Cryptography_cffi_dd416c1exc1767c5a.cpython-34m.so
./
dependency_links.txt
entry_points.txt
PKG-INFO
SOURCES.txt
not-zip-safe
top_level.txt
requires.txt

View file

@ -0,0 +1,3 @@
cffi>=0.8
six>=1.4.1
setuptools

View file

@ -0,0 +1,4 @@
_Cryptography_cffi_7ab3712bx4f158fee
_Cryptography_cffi_3e31f141x4000d087
cryptography
_Cryptography_cffi_dd416c1exc1767c5a

View file

@ -22,7 +22,7 @@ __summary__ = ("cryptography is a package which provides cryptographic recipes"
" and primitives to Python developers.")
__uri__ = "https://github.com/pyca/cryptography"
__version__ = "0.5.4"
__version__ = "0.6"
__author__ = "The cryptography developers"
__email__ = "cryptography-dev@python.org"

View file

@ -13,13 +13,9 @@
from __future__ import absolute_import, division, print_function
import pkg_resources
from cryptography.hazmat.backends.multibackend import MultiBackend
from cryptography.hazmat.bindings.commoncrypto.binding import (
Binding as CommonCryptoBinding
)
from cryptography.hazmat.bindings.openssl.binding import (
Binding as OpenSSLBinding
)
_available_backends_list = None
@ -29,19 +25,15 @@ def _available_backends():
global _available_backends_list
if _available_backends_list is None:
_available_backends_list = []
if CommonCryptoBinding.is_available():
from cryptography.hazmat.backends import commoncrypto
_available_backends_list.append(commoncrypto.backend)
if OpenSSLBinding.is_available():
from cryptography.hazmat.backends import openssl
_available_backends_list.append(openssl.backend)
_available_backends_list = [
backend.load(require=False)
for backend in pkg_resources.iter_entry_points(
"cryptography.backends"
)
]
return _available_backends_list
_default_backend = None

View file

@ -151,6 +151,12 @@ class _GCMCipherContext(object):
len(mode.initialization_vector)
)
self._backend._check_cipher_response(res)
# CommonCrypto has a bug where calling update without at least one
# call to authenticate_additional_data will result in null byte output
# for ciphertext. The following empty byte string call prevents the
# issue, which is present in at least 10.8 and 10.9.
# Filed as rdar://18314544
self.authenticate_additional_data(b"")
def update(self, data):
buf = self._backend._ffi.new("unsigned char[]", len(data))
@ -164,6 +170,12 @@ class _GCMCipherContext(object):
return self._backend._ffi.buffer(buf)[:]
def finalize(self):
# CommonCrypto has a yet another bug where you must make at least one
# call to update. If you pass just AAD and call finalize without a call
# to update you'll get null bytes for tag. The following update call
# prevents this issue, which is present in at least 10.8 and 10.9.
# Filed as rdar://18314580
self.update(b"")
tag_size = self._cipher.block_size // 8
tag_buf = self._backend._ffi.new("unsigned char[]", tag_size)
tag_len = self._backend._ffi.new("size_t *", tag_size)

View file

@ -70,6 +70,21 @@ class HMACBackend(object):
"""
@six.add_metaclass(abc.ABCMeta)
class CMACBackend(object):
@abc.abstractmethod
def cmac_algorithm_supported(self, algorithm):
"""
Returns True if the block cipher is supported for CMAC by this backend
"""
@abc.abstractmethod
def create_cmac_ctx(self, algorithm):
"""
Create a CMACContext for calculating a message authentication code.
"""
@six.add_metaclass(abc.ABCMeta)
class PBKDF2HMACBackend(object):
@abc.abstractmethod
@ -221,41 +236,6 @@ class DSABackend(object):
"""
@six.add_metaclass(abc.ABCMeta)
class TraditionalOpenSSLSerializationBackend(object):
@abc.abstractmethod
def load_traditional_openssl_pem_private_key(self, data, password):
"""
Load a private key from PEM encoded data, using password if the data
is encrypted.
"""
@six.add_metaclass(abc.ABCMeta)
class PKCS8SerializationBackend(object):
@abc.abstractmethod
def load_pkcs8_pem_private_key(self, data, password):
"""
Load a private key from PEM encoded data, using password if the data
is encrypted.
"""
@six.add_metaclass(abc.ABCMeta)
class CMACBackend(object):
@abc.abstractmethod
def cmac_algorithm_supported(self, algorithm):
"""
Returns True if the block cipher is supported for CMAC by this backend
"""
@abc.abstractmethod
def create_cmac_ctx(self, algorithm):
"""
Create a CMACContext for calculating a message authentication code.
"""
@six.add_metaclass(abc.ABCMeta)
class EllipticCurveBackend(object):
@abc.abstractmethod
@ -280,13 +260,49 @@ class EllipticCurveBackend(object):
"""
@abc.abstractmethod
def elliptic_curve_public_key_from_numbers(self, numbers):
def load_elliptic_curve_public_numbers(self, numbers):
"""
Return an EllipticCurvePublicKey provider using the given numbers.
"""
@abc.abstractmethod
def elliptic_curve_private_key_from_numbers(self, numbers):
def load_elliptic_curve_private_numbers(self, numbers):
"""
Return an EllipticCurvePublicKey provider using the given numbers.
"""
@six.add_metaclass(abc.ABCMeta)
class PEMSerializationBackend(object):
@abc.abstractmethod
def load_pem_private_key(self, data, password):
"""
Loads a private key from PEM encoded data, using the provided password
if the data is encrypted.
"""
@abc.abstractmethod
def load_pem_public_key(self, data):
"""
Loads a public key from PEM encoded data.
"""
@six.add_metaclass(abc.ABCMeta)
class TraditionalOpenSSLSerializationBackend(object):
@abc.abstractmethod
def load_traditional_openssl_pem_private_key(self, data, password):
"""
Load a private key from PEM encoded data, using password if the data
is encrypted.
"""
@six.add_metaclass(abc.ABCMeta)
class PKCS8SerializationBackend(object):
@abc.abstractmethod
def load_pkcs8_pem_private_key(self, data, password):
"""
Load a private key from PKCS8 encoded data, using password if the data
is encrypted.
"""

View file

@ -13,12 +13,15 @@
from __future__ import absolute_import, division, print_function
import warnings
from cryptography import utils
from cryptography.exceptions import UnsupportedAlgorithm, _Reasons
from cryptography.hazmat.backends.interfaces import (
CMACBackend, CipherBackend, DSABackend, EllipticCurveBackend, HMACBackend,
HashBackend, PBKDF2HMACBackend, PKCS8SerializationBackend,
RSABackend, TraditionalOpenSSLSerializationBackend
HashBackend, PBKDF2HMACBackend, PEMSerializationBackend,
PKCS8SerializationBackend, RSABackend,
TraditionalOpenSSLSerializationBackend
)
@ -32,6 +35,7 @@ from cryptography.hazmat.backends.interfaces import (
@utils.register_interface(TraditionalOpenSSLSerializationBackend)
@utils.register_interface(DSABackend)
@utils.register_interface(EllipticCurveBackend)
@utils.register_interface(PEMSerializationBackend)
class MultiBackend(object):
name = "multibackend"
@ -239,6 +243,18 @@ class MultiBackend(object):
raise UnsupportedAlgorithm("DSA is not supported by the backend.",
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM)
def load_dsa_public_numbers(self, numbers):
for b in self._filtered_backends(DSABackend):
return b.load_dsa_public_numbers(numbers)
raise UnsupportedAlgorithm("DSA is not supported by the backend.",
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM)
def load_dsa_private_numbers(self, numbers):
for b in self._filtered_backends(DSABackend):
return b.load_dsa_private_numbers(numbers)
raise UnsupportedAlgorithm("DSA is not supported by the backend.",
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM)
def cmac_algorithm_supported(self, algorithm):
return any(
b.cmac_algorithm_supported(algorithm)
@ -283,6 +299,12 @@ class MultiBackend(object):
)
def elliptic_curve_private_key_from_numbers(self, numbers):
warnings.warn(
"elliptic_curve_private_key_from_numbers is deprecated and will "
"be removed in a future version.",
utils.DeprecatedIn06,
stacklevel=2
)
for b in self._filtered_backends(EllipticCurveBackend):
try:
return b.elliptic_curve_private_key_from_numbers(numbers)
@ -294,7 +316,25 @@ class MultiBackend(object):
_Reasons.UNSUPPORTED_ELLIPTIC_CURVE
)
def load_elliptic_curve_private_numbers(self, numbers):
for b in self._filtered_backends(EllipticCurveBackend):
try:
return b.load_elliptic_curve_private_numbers(numbers)
except UnsupportedAlgorithm:
continue
raise UnsupportedAlgorithm(
"This backend does not support this elliptic curve.",
_Reasons.UNSUPPORTED_ELLIPTIC_CURVE
)
def elliptic_curve_public_key_from_numbers(self, numbers):
warnings.warn(
"elliptic_curve_public_key_from_numbers is deprecated and will "
"be removed in a future version.",
utils.DeprecatedIn06,
stacklevel=2
)
for b in self._filtered_backends(EllipticCurveBackend):
try:
return b.elliptic_curve_public_key_from_numbers(numbers)
@ -306,6 +346,36 @@ class MultiBackend(object):
_Reasons.UNSUPPORTED_ELLIPTIC_CURVE
)
def load_elliptic_curve_public_numbers(self, numbers):
for b in self._filtered_backends(EllipticCurveBackend):
try:
return b.load_elliptic_curve_public_numbers(numbers)
except UnsupportedAlgorithm:
continue
raise UnsupportedAlgorithm(
"This backend does not support this elliptic curve.",
_Reasons.UNSUPPORTED_ELLIPTIC_CURVE
)
def load_pem_private_key(self, data, password):
for b in self._filtered_backends(PEMSerializationBackend):
return b.load_pem_private_key(data, password)
raise UnsupportedAlgorithm(
"This backend does not support this key serialization.",
_Reasons.UNSUPPORTED_SERIALIZATION
)
def load_pem_public_key(self, data):
for b in self._filtered_backends(PEMSerializationBackend):
return b.load_pem_public_key(data)
raise UnsupportedAlgorithm(
"This backend does not support this key serialization.",
_Reasons.UNSUPPORTED_SERIALIZATION
)
def load_pkcs8_pem_private_key(self, data, password):
for b in self._filtered_backends(PKCS8SerializationBackend):
return b.load_pkcs8_pem_private_key(data, password)

View file

@ -16,6 +16,7 @@ from __future__ import absolute_import, division, print_function
import collections
import itertools
import warnings
from contextlib import contextmanager
import six
@ -25,7 +26,8 @@ from cryptography.exceptions import (
)
from cryptography.hazmat.backends.interfaces import (
CMACBackend, CipherBackend, DSABackend, EllipticCurveBackend, HMACBackend,
HashBackend, PBKDF2HMACBackend, PKCS8SerializationBackend, RSABackend,
HashBackend, PBKDF2HMACBackend, PEMSerializationBackend,
PKCS8SerializationBackend, RSABackend,
TraditionalOpenSSLSerializationBackend
)
from cryptography.hazmat.backends.openssl.ciphers import (
@ -74,6 +76,7 @@ _OpenSSLError = collections.namedtuple("_OpenSSLError",
@utils.register_interface(PKCS8SerializationBackend)
@utils.register_interface(RSABackend)
@utils.register_interface(TraditionalOpenSSLSerializationBackend)
@utils.register_interface(PEMSerializationBackend)
class Backend(object):
"""
OpenSSL API binding interfaces.
@ -471,6 +474,39 @@ class Backend(object):
assert dsa_cdata != self._ffi.NULL
dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free)
return _DSAPrivateKey(self, dsa_cdata)
elif (self._lib.Cryptography_HAS_EC == 1 and
type == self._lib.EVP_PKEY_EC):
ec_cdata = self._lib.EVP_PKEY_get1_EC_KEY(evp_pkey)
assert ec_cdata != self._ffi.NULL
ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free)
return _EllipticCurvePrivateKey(self, ec_cdata)
else:
raise UnsupportedAlgorithm("Unsupported key type.")
def _evp_pkey_to_public_key(self, evp_pkey):
"""
Return the appropriate type of PublicKey given an evp_pkey cdata
pointer.
"""
type = evp_pkey.type
if type == self._lib.EVP_PKEY_RSA:
rsa_cdata = self._lib.EVP_PKEY_get1_RSA(evp_pkey)
assert rsa_cdata != self._ffi.NULL
rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free)
return _RSAPublicKey(self, rsa_cdata)
elif type == self._lib.EVP_PKEY_DSA:
dsa_cdata = self._lib.EVP_PKEY_get1_DSA(evp_pkey)
assert dsa_cdata != self._ffi.NULL
dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free)
return _DSAPublicKey(self, dsa_cdata)
elif (self._lib.Cryptography_HAS_EC == 1 and
type == self._lib.EVP_PKEY_EC):
ec_cdata = self._lib.EVP_PKEY_get1_EC_KEY(evp_pkey)
assert ec_cdata != self._ffi.NULL
ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free)
return _EllipticCurvePublicKey(self, ec_cdata)
else:
raise UnsupportedAlgorithm("Unsupported key type.")
@ -490,14 +526,24 @@ class Backend(object):
def pem_password_cb(buf, size, writing, userdata):
pem_password_cb.called += 1
if not password or len(password) >= size:
if not password:
pem_password_cb.exception = TypeError(
"Password was not given but private key is encrypted."
)
return 0
else:
elif len(password) < size:
pw_buf = self._ffi.buffer(buf, size)
pw_buf[:len(password)] = password
return len(password)
else:
pem_password_cb.exception = ValueError(
"Passwords longer than {0} bytes are not supported "
"by this backend.".format(size - 1)
)
return 0
pem_password_cb.called = 0
pem_password_cb.exception = None
return (
self._ffi.callback("int (char *, int, int, void *)",
@ -760,18 +806,47 @@ class Backend(object):
def create_cmac_ctx(self, algorithm):
return _CMACContext(self, algorithm)
def load_traditional_openssl_pem_private_key(self, data, password):
# OpenSSLs API for loading PKCS#8 certs can also load the traditional
# format so we just use that for both of them.
def load_pem_private_key(self, data, password):
return self._load_key(
self._lib.PEM_read_bio_PrivateKey,
self._evp_pkey_to_private_key,
data,
password,
)
return self.load_pkcs8_pem_private_key(data, password)
def load_pem_public_key(self, data):
return self._load_key(
self._lib.PEM_read_bio_PUBKEY,
self._evp_pkey_to_public_key,
data,
None,
)
def load_traditional_openssl_pem_private_key(self, data, password):
warnings.warn(
"load_traditional_openssl_pem_private_key is deprecated and will "
"be removed in a future version, use load_pem_private_key "
"instead.",
utils.DeprecatedIn06,
stacklevel=2
)
return self.load_pem_private_key(data, password)
def load_pkcs8_pem_private_key(self, data, password):
warnings.warn(
"load_pkcs8_pem_private_key is deprecated and will be removed in a"
" future version, use load_pem_private_key instead.",
utils.DeprecatedIn06,
stacklevel=2
)
return self.load_pem_private_key(data, password)
def _load_key(self, openssl_read_func, convert_func, data, password):
mem_bio = self._bytes_to_bio(data)
password_callback, password_func = self._pem_password_cb(password)
evp_pkey = self._lib.PEM_read_bio_PrivateKey(
evp_pkey = openssl_read_func(
mem_bio.bio,
self._ffi.NULL,
password_callback,
@ -779,74 +854,12 @@ class Backend(object):
)
if evp_pkey == self._ffi.NULL:
errors = self._consume_errors()
if not errors:
raise ValueError("Could not unserialize key data.")
if (
errors[0][1:] == (
self._lib.ERR_LIB_PEM,
self._lib.PEM_F_PEM_DO_HEADER,
self._lib.PEM_R_BAD_PASSWORD_READ
)
) or (
errors[0][1:] == (
self._lib.ERR_LIB_PEM,
self._lib.PEM_F_PEM_READ_BIO_PRIVATEKEY,
self._lib.PEM_R_BAD_PASSWORD_READ
)
):
assert not password
raise TypeError(
"Password was not given but private key is encrypted.")
elif errors[0][1:] == (
self._lib.ERR_LIB_EVP,
self._lib.EVP_F_EVP_DECRYPTFINAL_EX,
self._lib.EVP_R_BAD_DECRYPT
):
raise ValueError(
"Bad decrypt. Incorrect password?"
)
elif errors[0][1:] in (
(
self._lib.ERR_LIB_PEM,
self._lib.PEM_F_PEM_GET_EVP_CIPHER_INFO,
self._lib.PEM_R_UNSUPPORTED_ENCRYPTION
),
(
self._lib.ERR_LIB_EVP,
self._lib.EVP_F_EVP_PBE_CIPHERINIT,
self._lib.EVP_R_UNKNOWN_PBE_ALGORITHM
)
):
raise UnsupportedAlgorithm(
"PEM data is encrypted with an unsupported cipher",
_Reasons.UNSUPPORTED_CIPHER
)
elif any(
error[1:] == (
self._lib.ERR_LIB_EVP,
self._lib.EVP_F_EVP_PKCS82PKEY,
self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM
)
for error in errors
):
raise UnsupportedAlgorithm(
"Unsupported public key algorithm.",
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM
)
if password_func.exception is not None:
errors = self._consume_errors()
assert errors
raise password_func.exception
else:
assert errors[0][1] in (
self._lib.ERR_LIB_EVP,
self._lib.ERR_LIB_PEM,
self._lib.ERR_LIB_ASN1,
)
raise ValueError("Could not unserialize key data.")
self._handle_key_loading_error()
evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free)
@ -859,7 +872,59 @@ class Backend(object):
password is None
)
return self._evp_pkey_to_private_key(evp_pkey)
return convert_func(evp_pkey)
def _handle_key_loading_error(self):
errors = self._consume_errors()
if not errors:
raise ValueError("Could not unserialize key data.")
elif errors[0][1:] == (
self._lib.ERR_LIB_EVP,
self._lib.EVP_F_EVP_DECRYPTFINAL_EX,
self._lib.EVP_R_BAD_DECRYPT
):
raise ValueError("Bad decrypt. Incorrect password?")
elif errors[0][1:] in (
(
self._lib.ERR_LIB_PEM,
self._lib.PEM_F_PEM_GET_EVP_CIPHER_INFO,
self._lib.PEM_R_UNSUPPORTED_ENCRYPTION
),
(
self._lib.ERR_LIB_EVP,
self._lib.EVP_F_EVP_PBE_CIPHERINIT,
self._lib.EVP_R_UNKNOWN_PBE_ALGORITHM
)
):
raise UnsupportedAlgorithm(
"PEM data is encrypted with an unsupported cipher",
_Reasons.UNSUPPORTED_CIPHER
)
elif any(
error[1:] == (
self._lib.ERR_LIB_EVP,
self._lib.EVP_F_EVP_PKCS82PKEY,
self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM
)
for error in errors
):
raise UnsupportedAlgorithm(
"Unsupported public key algorithm.",
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM
)
else:
assert errors[0][1] in (
self._lib.ERR_LIB_EVP,
self._lib.ERR_LIB_PEM,
self._lib.ERR_LIB_ASN1,
)
raise ValueError("Could not unserialize key data.")
def elliptic_curve_supported(self, curve):
if self._lib.Cryptography_HAS_EC != 1:
@ -915,17 +980,17 @@ class Backend(object):
if self.elliptic_curve_supported(curve):
curve_nid = self._elliptic_curve_to_nid(curve)
ctx = self._lib.EC_KEY_new_by_curve_name(curve_nid)
assert ctx != self._ffi.NULL
ctx = self._ffi.gc(ctx, self._lib.EC_KEY_free)
ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid)
assert ec_cdata != self._ffi.NULL
ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free)
res = self._lib.EC_KEY_generate_key(ctx)
res = self._lib.EC_KEY_generate_key(ec_cdata)
assert res == 1
res = self._lib.EC_KEY_check_key(ctx)
res = self._lib.EC_KEY_check_key(ec_cdata)
assert res == 1
return _EllipticCurvePrivateKey(self, ctx, curve)
return _EllipticCurvePrivateKey(self, ec_cdata)
else:
raise UnsupportedAlgorithm(
"Backend object does not support {0}.".format(curve.name),
@ -933,35 +998,52 @@ class Backend(object):
)
def elliptic_curve_private_key_from_numbers(self, numbers):
warnings.warn(
"elliptic_curve_private_key_from_numbers is deprecated and will "
"be removed in a future version.",
utils.DeprecatedIn06,
stacklevel=2
)
return self.load_elliptic_curve_private_numbers(numbers)
def load_elliptic_curve_private_numbers(self, numbers):
public = numbers.public_numbers
curve_nid = self._elliptic_curve_to_nid(public.curve)
ctx = self._lib.EC_KEY_new_by_curve_name(curve_nid)
assert ctx != self._ffi.NULL
ctx = self._ffi.gc(ctx, self._lib.EC_KEY_free)
ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid)
assert ec_cdata != self._ffi.NULL
ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free)
ctx = self._ec_key_set_public_key_affine_coordinates(
ctx, public.x, public.y)
ec_cdata = self._ec_key_set_public_key_affine_coordinates(
ec_cdata, public.x, public.y)
res = self._lib.EC_KEY_set_private_key(
ctx, self._int_to_bn(numbers.private_value))
ec_cdata, self._int_to_bn(numbers.private_value))
assert res == 1
return _EllipticCurvePrivateKey(self, ctx,
numbers.public_numbers.curve)
return _EllipticCurvePrivateKey(self, ec_cdata)
def elliptic_curve_public_key_from_numbers(self, numbers):
warnings.warn(
"elliptic_curve_public_key_from_numbers is deprecated and will be "
"removed in a future version.",
utils.DeprecatedIn06,
stacklevel=2
)
return self.load_elliptic_curve_public_numbers(numbers)
def load_elliptic_curve_public_numbers(self, numbers):
curve_nid = self._elliptic_curve_to_nid(numbers.curve)
ctx = self._lib.EC_KEY_new_by_curve_name(curve_nid)
assert ctx != self._ffi.NULL
ctx = self._ffi.gc(ctx, self._lib.EC_KEY_free)
ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid)
assert ec_cdata != self._ffi.NULL
ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free)
ctx = self._ec_key_set_public_key_affine_coordinates(
ctx, numbers.x, numbers.y)
ec_cdata = self._ec_key_set_public_key_affine_coordinates(
ec_cdata, numbers.x, numbers.y)
return _EllipticCurvePublicKey(self, ctx, numbers.curve)
return _EllipticCurvePublicKey(self, ec_cdata)
def _elliptic_curve_to_nid(self, curve):
"""
@ -983,43 +1065,36 @@ class Backend(object):
)
return curve_nid
def _ec_key_set_public_key_affine_coordinates(self, ctx, x, y):
"""
This is a port of EC_KEY_set_public_key_affine_coordinates that was
added in 1.0.1.
@contextmanager
def _tmp_bn_ctx(self):
bn_ctx = self._lib.BN_CTX_new()
assert bn_ctx != self._ffi.NULL
bn_ctx = self._ffi.gc(bn_ctx, self._lib.BN_CTX_free)
self._lib.BN_CTX_start(bn_ctx)
try:
yield bn_ctx
finally:
self._lib.BN_CTX_end(bn_ctx)
Sets the public key point in the EC_KEY context to the affine x and y
values.
def _ec_key_determine_group_get_set_funcs(self, ctx):
"""
Given an EC_KEY determine the group and what methods are required to
get/set point coordinates.
"""
assert ctx != self._ffi.NULL
bn_x = self._int_to_bn(x)
bn_y = self._int_to_bn(y)
nid_two_field = self._lib.OBJ_sn2nid(b"characteristic-two-field")
assert nid_two_field != self._lib.NID_undef
bn_ctx = self._lib.BN_CTX_new()
assert bn_ctx != self._ffi.NULL
bn_ctx = self._ffi.gc(bn_ctx, self._lib.BN_CTX_free)
group = self._lib.EC_KEY_get0_group(ctx)
assert group != self._ffi.NULL
point = self._lib.EC_POINT_new(group)
assert point != self._ffi.NULL
point = self._ffi.gc(point, self._lib.EC_POINT_free)
method = self._lib.EC_GROUP_method_of(group)
assert method != self._ffi.NULL
nid = self._lib.EC_METHOD_get_field_type(method)
assert nid != self._lib.NID_undef
check_x = self._lib.BN_CTX_get(bn_ctx)
check_y = self._lib.BN_CTX_get(bn_ctx)
if nid == nid_two_field and self._lib.Cryptography_HAS_EC2M:
set_func = self._lib.EC_POINT_set_affine_coordinates_GF2m
get_func = self._lib.EC_POINT_get_affine_coordinates_GF2m
@ -1029,17 +1104,43 @@ class Backend(object):
assert set_func and get_func
res = set_func(group, point, bn_x, bn_y, bn_ctx)
assert res == 1
return set_func, get_func, group
res = get_func(group, point, check_x, check_y, bn_ctx)
assert res == 1
def _ec_key_set_public_key_affine_coordinates(self, ctx, x, y):
"""
This is a port of EC_KEY_set_public_key_affine_coordinates that was
added in 1.0.1.
assert (
self._lib.BN_cmp(bn_x, check_x) == 0 and
self._lib.BN_cmp(bn_y, check_y) == 0
Sets the public key point in the EC_KEY context to the affine x and y
values.
"""
bn_x = self._int_to_bn(x)
bn_y = self._int_to_bn(y)
set_func, get_func, group = (
self._ec_key_determine_group_get_set_funcs(ctx)
)
point = self._lib.EC_POINT_new(group)
assert point != self._ffi.NULL
point = self._ffi.gc(point, self._lib.EC_POINT_free)
with self._tmp_bn_ctx() as bn_ctx:
check_x = self._lib.BN_CTX_get(bn_ctx)
check_y = self._lib.BN_CTX_get(bn_ctx)
res = set_func(group, point, bn_x, bn_y, bn_ctx)
assert res == 1
res = get_func(group, point, check_x, check_y, bn_ctx)
assert res == 1
assert (
self._lib.BN_cmp(bn_x, check_x) == 0 and
self._lib.BN_cmp(bn_y, check_y) == 0
)
res = self._lib.EC_KEY_set_public_key(ctx, point)
assert res == 1

View file

@ -128,6 +128,14 @@ class _CipherContext(object):
return self._backend._ffi.buffer(buf)[:outlen[0]]
def finalize(self):
# OpenSSL 1.0.1 on Ubuntu 12.04 (and possibly other distributions)
# appears to have a bug where you must make at least one call to update
# even if you are only using authenticate_additional_data or the
# GCM tag will be wrong. An (empty) call to update resolves this
# and is harmless for all other versions of OpenSSL.
if isinstance(self._mode, GCM):
self.update(b"")
buf = self._backend._ffi.new("unsigned char[]", self._block_size)
outlen = self._backend._ffi.new("int *")
res = self._backend._lib.EVP_CipherFinal_ex(self._ctx, buf, outlen)

View file

@ -24,6 +24,13 @@ from cryptography.hazmat.primitives.asymmetric import ec
def _truncate_digest_for_ecdsa(ec_key_cdata, digest, backend):
"""
This function truncates digests that are longer than a given elliptic
curve key's length so they can be signed. Since elliptic curve keys are
much shorter than RSA keys many digests (e.g. SHA-512) may require
truncation.
"""
_lib = backend._lib
_ffi = backend._ffi
@ -31,17 +38,14 @@ def _truncate_digest_for_ecdsa(ec_key_cdata, digest, backend):
group = _lib.EC_KEY_get0_group(ec_key_cdata)
bn_ctx = _lib.BN_CTX_new()
assert bn_ctx != _ffi.NULL
bn_ctx = _ffi.gc(bn_ctx, _lib.BN_CTX_free)
with backend._tmp_bn_ctx() as bn_ctx:
order = _lib.BN_CTX_get(bn_ctx)
assert order != _ffi.NULL
order = _lib.BN_CTX_get(bn_ctx)
assert order != _ffi.NULL
res = _lib.EC_GROUP_get_order(group, order, bn_ctx)
assert res == 1
res = _lib.EC_GROUP_get_order(group, order, bn_ctx)
assert res == 1
order_bits = _lib.BN_num_bits(order)
order_bits = _lib.BN_num_bits(order)
if 8 * digest_len > order_bits:
digest_len = (order_bits + 7) // 8
@ -59,6 +63,30 @@ def _truncate_digest_for_ecdsa(ec_key_cdata, digest, backend):
return digest
def _ec_key_curve_sn(backend, ec_key):
group = backend._lib.EC_KEY_get0_group(ec_key)
assert group != backend._ffi.NULL
nid = backend._lib.EC_GROUP_get_curve_name(group)
assert nid != backend._lib.NID_undef
curve_name = backend._lib.OBJ_nid2sn(nid)
assert curve_name != backend._ffi.NULL
sn = backend._ffi.string(curve_name).decode('ascii')
return sn
def _sn_to_elliptic_curve(backend, sn):
try:
return ec._CURVE_TYPES[sn]()
except KeyError:
raise UnsupportedAlgorithm(
"{0} is not a supported elliptic curve".format(sn),
_Reasons.UNSUPPORTED_ELLIPTIC_CURVE
)
@utils.register_interface(interfaces.AsymmetricSignatureContext)
class _ECDSASignatureContext(object):
def __init__(self, backend, private_key, algorithm):
@ -125,12 +153,14 @@ class _ECDSAVerificationContext(object):
return True
@utils.register_interface(interfaces.EllipticCurvePrivateKey)
@utils.register_interface(interfaces.EllipticCurvePrivateKeyWithNumbers)
class _EllipticCurvePrivateKey(object):
def __init__(self, backend, ec_key_cdata, curve):
def __init__(self, backend, ec_key_cdata):
self._backend = backend
self._ec_key = ec_key_cdata
self._curve = curve
sn = _ec_key_curve_sn(backend, ec_key_cdata)
self._curve = _sn_to_elliptic_curve(backend, sn)
@property
def curve(self):
@ -165,16 +195,26 @@ class _EllipticCurvePrivateKey(object):
assert res == 1
return _EllipticCurvePublicKey(
self._backend, public_ec_key, self._curve
self._backend, public_ec_key
)
def private_numbers(self):
bn = self._backend._lib.EC_KEY_get0_private_key(self._ec_key)
private_value = self._backend._bn_to_int(bn)
return ec.EllipticCurvePrivateNumbers(
private_value=private_value,
public_numbers=self.public_key().public_numbers()
)
@utils.register_interface(interfaces.EllipticCurvePublicKey)
@utils.register_interface(interfaces.EllipticCurvePublicKeyWithNumbers)
class _EllipticCurvePublicKey(object):
def __init__(self, backend, ec_key_cdata, curve):
def __init__(self, backend, ec_key_cdata):
self._backend = backend
self._ec_key = ec_key_cdata
self._curve = curve
sn = _ec_key_curve_sn(backend, ec_key_cdata)
self._curve = _sn_to_elliptic_curve(backend, sn)
@property
def curve(self):
@ -189,3 +229,26 @@ class _EllipticCurvePublicKey(object):
raise UnsupportedAlgorithm(
"Unsupported elliptic curve signature algorithm.",
_Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM)
def public_numbers(self):
set_func, get_func, group = (
self._backend._ec_key_determine_group_get_set_funcs(self._ec_key)
)
point = self._backend._lib.EC_KEY_get0_public_key(self._ec_key)
assert point != self._backend._ffi.NULL
with self._backend._tmp_bn_ctx() as bn_ctx:
bn_x = self._backend._lib.BN_CTX_get(bn_ctx)
bn_y = self._backend._lib.BN_CTX_get(bn_ctx)
res = get_func(group, point, bn_x, bn_y, bn_ctx)
assert res == 1
x = self._backend._bn_to_int(bn_x)
y = self._backend._bn_to_int(bn_y)
return ec.EllipticCurvePublicNumbers(
x=x,
y=y,
curve=self._curve
)

View file

@ -30,10 +30,7 @@ from cryptography.hazmat.primitives.interfaces import (
def _get_rsa_pss_salt_length(pss, key_size, digest_size):
if pss._mgf._salt_length is not None:
salt = pss._mgf._salt_length
else:
salt = pss._salt_length
salt = pss._salt_length
if salt is MGF1.MAX_LENGTH or salt is PSS.MAX_LENGTH:
# bit length - 1 per RFC 3447
@ -46,6 +43,9 @@ def _get_rsa_pss_salt_length(pss, key_size, digest_size):
def _enc_dec_rsa(backend, key, data, padding):
if not isinstance(padding, interfaces.AsymmetricPadding):
raise TypeError("Padding must be an instance of AsymmetricPadding.")
if isinstance(padding, PKCS1v15):
padding_enum = backend._lib.RSA_PKCS1_PADDING
elif isinstance(padding, OAEP):

View file

@ -13,9 +13,6 @@
from __future__ import absolute_import, division, print_function
import platform
import sys
from cryptography.hazmat.bindings.utils import build_ffi
@ -51,10 +48,7 @@ class Binding(object):
cls.ffi, cls.lib = build_ffi(
module_prefix=cls._module_prefix,
modules=cls._modules,
extra_link_args=["-framework", "Security"]
extra_link_args=[
"-framework", "Security", "-framework", "CoreFoundation"
]
)
@classmethod
def is_available(cls):
return sys.platform == "darwin" and list(map(
int, platform.mac_ver()[0].split("."))) >= [10, 8, 0]

Some files were not shown because too many files have changed in this diff Show more