blob: cec067cacaf0b9f33413275f739051535ed9f214 [file] [log] [blame]
Alex Gaynorc72e63f2013-09-09 21:44:26 -07001Contributing
2============
3
4Process
5-------
6
7As an open source project, ``cryptography`` welcomes contributions of all
8forms. These can include:
9
10* Bug reports and feature requests
11* Pull requests for both code and documentation
12* Patch reviews
13
Alex Gaynor2c67c822013-09-09 23:44:13 -070014You can file bugs and submit pull requests on `GitHub`_. To discuss larger
Alex Gaynorc72e63f2013-09-09 21:44:26 -070015changes you can start a conversation on `our mailing list`_.
16
17Because cryptography is so complex, and the implications of getting it wrong so
18devastating, ``cryptography`` has a strict code review policy:
19
20* Patches must *never* be pushed directly to ``master``, all changes (even the
21 most trivial typo fixes!) must be submitted as a pull request.
22* A committer may *never* merge their own pull request, a second party must
Alex Gaynore6466a52013-10-18 14:53:04 -070023 merge their changes. If multiple people work on a pull request, it must be
24 merged by someone who did not work on it.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070025* A patch which breaks tests, or introduces regressions by changing or removing
26 existing tests should not be merged. Tests must always be passing on
27 ``master``.
28* If somehow the tests get into a failing state on ``master`` (such as by a
29 backwards incompatible release of a dependency) no pull requests may be
30 merged until this is rectified.
Alex Gaynorf3f00182013-12-13 19:22:33 -080031* All merged patches must have 100% test coverage.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070032
33The purpose of these policies is to minimize the chances we merge a change
34which jeopardizes our users' security.
35
Alex Gaynor99b69d92013-10-19 17:52:58 -070036If you believe you've identified a security issue in ``cryptography``, please
37follow the directions on the :doc:`security page </security>`.
Alex Gaynorc72e63f2013-09-09 21:44:26 -070038
39Code
40----
41
42When in doubt, refer to `PEP 8`_ for Python code.
43
44Every code file must start with the boilerplate notice of the Apache License.
45Additionally, every Python code file must contain
46
47.. code-block:: python
48
49 from __future__ import absolute_import, division, print_function
50
Alex Gaynore21b0b22013-12-12 12:39:05 -080051API Considerations
52~~~~~~~~~~~~~~~~~~
53
54Most projects' APIs are designed with a philosophy of "make easy things easy,
55and make hard things possible". One of the perils of writing cryptographic code
56is that code that is secure looks just like code that isn't, and produces
57results that are also difficult to distinguish. As a result ``cryptography``
58has, as a design philosophy: "make it hard to do insecure things". Here are a
59few strategies for API design which should be both followed, and should inspire
60other API choices:
61
62If it is incorrect to ignore the result of a method, it should raise an
63exception, and not return a boolean ``True``/``False`` flag. For example, a
64method to verify a signature should raise ``InvalidSignature``, and not return
65whether the signature was valid.
66
67.. code-block:: python
68
69 # This is bad.
70 def verify(sig):
71 # ...
72 return is_valid
73
74 # Good!
75 def verify(sig):
76 # ...
77 if not is_valid:
78 raise InvalidSignature
79
Alex Gaynor6955ea32013-12-21 19:26:19 -080080Every recipe should include a version or algorithmic marker of some sort in its
81output in order to allow transparent upgrading of the algorithms in use, as
82the algorithms or parameters needed to achieve a given security margin evolve.
83
Alex Gaynore21b0b22013-12-12 12:39:05 -080084APIs at the :doc:`/hazmat/primitives/index` layer should always take an
85explicit backend, APIs at the recipes layer should automatically use the
Alex Gaynorf8796b12013-12-13 20:28:55 -080086:func:`~cryptography.hazmat.backends.default_backend`, but optionally allow
Alex Gaynor2a5b4a82013-12-12 17:53:08 -080087specifying a different backend.
Alex Gaynore21b0b22013-12-12 12:39:05 -080088
Alex Gaynore6466a52013-10-18 14:53:04 -070089C bindings
Alex Gaynor5246e2d2013-12-12 12:23:18 -080090~~~~~~~~~~
Alex Gaynore6466a52013-10-18 14:53:04 -070091
92When binding C code with ``cffi`` we have our own style guide, it's pretty
93simple.
94
95Don't name parameters:
96
97.. code-block:: c
98
99 // Good
100 long f(long);
101 // Bad
102 long f(long x);
103
Paul Kehrer3ed80ba2013-10-19 20:00:26 -0500104...unless they're inside a struct:
105
106.. code-block:: c
107
108 struct my_struct {
109 char *name;
110 int number;
111 ...;
112 };
113
Alex Gaynore6466a52013-10-18 14:53:04 -0700114Don't include stray ``void`` parameters:
115
116.. code-block:: c
117
118 // Good
119 long f();
120 // Bad
121 long f(void);
122
123Wrap lines at 80 characters like so:
124
125.. code-block:: c
126
127 // Pretend this went to 80 characters
128 long f(long, long,
129 int *)
130
Alex Gaynor1e8744a2013-10-18 14:57:18 -0700131Include a space after commas between parameters:
132
133.. code-block:: c
134
135 // Good
136 long f(int, char *)
137 // Bad
138 long f(int,char *)
139
Alex Gaynore6466a52013-10-18 14:53:04 -0700140
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700141Documentation
142-------------
143
144All features should be documented with prose.
145
146Docstrings should be written like this:
147
148.. code-block:: python
149
150 def some_function(some_arg):
151 """
152 Does some things.
153
154 :param some_arg: Some argument.
155 """
156
157So, specifically:
158
Alex Gaynor05a190e2013-10-29 17:11:25 -0700159* Always use three double quotes.
160* Put the three double quotes on their own line.
161* No blank line at the end.
162* Use Sphinx parameter/attribute documentation `syntax`_.
163
Alex Gaynora6596882013-11-13 12:54:03 -0800164Because of the inherent challenges in implementing correct cryptographic
Alex Gaynore9d64d72013-11-13 10:28:01 -0800165systems, we want to make our documentation point people in the right directions
166as much as possible. To that end:
167
168* When documenting a generic interface, use a strong algorithm in examples.
169 (e.g. when showing a hashing example, don't use
170 :class:`cryptography.hazmat.primitives.hashes.MD5`)
Alex Gaynor5cbab0c2013-11-13 11:55:57 -0800171* When giving prescriptive advice, always provide references and supporting
Alex Gaynore9d64d72013-11-13 10:28:01 -0800172 material.
Alex Gaynord118c912013-11-13 11:56:49 -0800173* When there is real disagreement between cryptographic experts, represent both
Alex Gaynor54e04002013-11-15 16:44:41 -0800174 sides of the argument and describe the trade-offs clearly.
Alex Gaynore9d64d72013-11-13 10:28:01 -0800175
Alex Gaynor05a190e2013-10-29 17:11:25 -0700176When documenting a new module in the ``hazmat`` package, its documentation
177should begin with the "Hazardous Materials" warning:
178
179.. code-block:: rest
180
181 .. hazmat::
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700182
Alex Gaynor953ebf82013-12-08 10:28:30 -0800183When referring to a hypothetical individual (such as "a person receiving an
184encrypted message") use gender neutral pronouns (they/them/their).
185
Richard Wall40cde822013-10-01 20:20:15 +0100186Development Environment
187-----------------------
Richard Wall0d9bb142013-10-01 16:17:24 +0100188
189Working on ``cryptography`` requires the installation of a small number of
Alex Gaynor166cbd32013-10-01 13:30:29 -0700190development dependencies. These are listed in ``dev-requirements.txt`` and they
191can be installed in a `virtualenv`_ using `pip`_. Once you've installed the
192dependencies, install ``cryptography`` in ``editable`` mode. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100193
Alex Gaynorae5c9072013-10-06 11:04:08 -0700194.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100195
Alex Gaynor7587ded2013-10-06 12:14:05 -0700196 $ # Create a virtualenv and activate it
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100197 $ pip install --requirement dev-requirements.txt
198 $ pip install --editable .
Richard Wall0d9bb142013-10-01 16:17:24 +0100199
200You are now ready to run the tests and build the documentation.
Richard Wall0d9bb142013-10-01 16:17:24 +0100201
Richard Wall40cde822013-10-01 20:20:15 +0100202Running Tests
Alex Gaynor5246e2d2013-12-12 12:23:18 -0800203~~~~~~~~~~~~~
Richard Wall0d9bb142013-10-01 16:17:24 +0100204
Alex Gaynor166cbd32013-10-01 13:30:29 -0700205``cryptography`` unit tests are found in the ``tests/`` directory and are
206designed to be run using `pytest`_. `pytest`_ will discover the tests
207automatically, so all you have to do is:
Richard Wall0d9bb142013-10-01 16:17:24 +0100208
Alex Gaynorae5c9072013-10-06 11:04:08 -0700209.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100210
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100211 $ py.test
Richard Wall0d9bb142013-10-01 16:17:24 +0100212 ...
213 4294 passed in 15.24 seconds
214
215This runs the tests with the default Python interpreter.
216
217You can also verify that the tests pass on other supported Python interpreters.
Richard Wallc3d1eb52013-10-01 16:29:07 +0100218For this we use `tox`_, which will automatically create a `virtualenv`_ for
Richard Wall40cde822013-10-01 20:20:15 +0100219each supported Python version and run the tests. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100220
Alex Gaynorae5c9072013-10-06 11:04:08 -0700221.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100222
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100223 $ tox
Richard Wall0d9bb142013-10-01 16:17:24 +0100224 ...
Richard Wall40cde822013-10-01 20:20:15 +0100225 ERROR: py26: InterpreterNotFound: python2.6
226 py27: commands succeeded
227 ERROR: pypy: InterpreterNotFound: pypy
228 ERROR: py32: InterpreterNotFound: python3.2
229 py33: commands succeeded
230 docs: commands succeeded
231 pep8: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100232
Alex Gaynor166cbd32013-10-01 13:30:29 -0700233You may not have all the required Python versions installed, in which case you
234will see one or more ``InterpreterNotFound`` errors.
Richard Wall0d9bb142013-10-01 16:17:24 +0100235
236Building Documentation
Alex Gaynor5246e2d2013-12-12 12:23:18 -0800237~~~~~~~~~~~~~~~~~~~~~~
Richard Wall0d9bb142013-10-01 16:17:24 +0100238
Alex Gaynor166cbd32013-10-01 13:30:29 -0700239``cryptography`` documentation is stored in the ``docs/`` directory. It is
240written in `reStructured Text`_ and rendered using `Sphinx`_.
Richard Wall0d9bb142013-10-01 16:17:24 +0100241
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100242Use `tox`_ to build the documentation. For example:
Richard Wall0d9bb142013-10-01 16:17:24 +0100243
Alex Gaynorae5c9072013-10-06 11:04:08 -0700244.. code-block:: console
Richard Wall0d9bb142013-10-01 16:17:24 +0100245
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100246 $ tox -e docs
Richard Wall0d9bb142013-10-01 16:17:24 +0100247 ...
Richard Wallc3d1eb52013-10-01 16:29:07 +0100248 docs: commands succeeded
Richard Wall0d9bb142013-10-01 16:17:24 +0100249 congratulations :)
250
Richard Wall7d4ca1e2013-10-01 21:10:45 +0100251The HTML documentation index can now be found at ``docs/_build/html/index.html``
Richard Wall40cde822013-10-01 20:20:15 +0100252
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700253
Donald Stufft85707942013-10-04 23:55:27 -0400254.. _`GitHub`: https://github.com/pyca/cryptography
Alex Gaynorc72e63f2013-09-09 21:44:26 -0700255.. _`our mailing list`: https://mail.python.org/mailman/listinfo/cryptography-dev
256.. _`PEP 8`: http://www.peps.io/8/
257.. _`syntax`: http://sphinx-doc.org/domains.html#info-field-lists
Richard Wallc3d1eb52013-10-01 16:29:07 +0100258.. _`pytest`: https://pypi.python.org/pypi/pytest
259.. _`tox`: https://pypi.python.org/pypi/tox
260.. _`virtualenv`: https://pypi.python.org/pypi/virtualenv
261.. _`pip`: https://pypi.python.org/pypi/pip
262.. _`sphinx`: https://pypi.python.org/pypi/sphinx
Alex Gaynora05358d2013-11-06 11:01:22 -0800263.. _`reStructured Text`: http://sphinx-doc.org/rest.html