mirror of
https://git.freebsd.org/src.git
synced 2026-01-11 19:57:22 +00:00
crypto/openssl: update vendor update instructions
This change fills out the requirements for doing vendor updates, documents the new vendor update process, and guides whoever needs to do the next version update a bit better than the documentation did prior to this change so everyone can pitch in with version updates a bit better. Convert the document to Markdown while here to make it easier to render/print out the directions in a structured format. MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D53190
This commit is contained in:
parent
8df2e54214
commit
08cdcff58a
2 changed files with 202 additions and 122 deletions
|
|
@ -1,122 +0,0 @@
|
|||
FreeBSD maintainer's guide to OpenSSL
|
||||
=====================================
|
||||
|
||||
These instructions assume you have a clone of the FreeBSD git repo
|
||||
main branch in src/freebsd/main, and will store vendor trees under
|
||||
src/freebsd/vendor/. In addition, this assumes there is a "freebsd"
|
||||
origin pointing to git(repo).freebsd.org/src.git.
|
||||
|
||||
01) Switch to the vendor branch:
|
||||
|
||||
$ cd src/freebsd/main
|
||||
$ git worktree add -b vendor/openssl-X.Y ../vendor/openssl-X.Y freebsd/vendor/openssl-X.Y
|
||||
$ cd ../vendor/openssl-X.Y
|
||||
|
||||
02) Download the latest OpenSSL tarball and signature from the official
|
||||
website (https://www.openssl.org/source/).
|
||||
|
||||
$ (cd .. && fetch https://github.com/openssl/openssl/releases/download/openssl-X.Y.Z/openssl-X.Y.Z.tar.gz)
|
||||
$ (cd .. && fetch https://github.com/openssl/openssl/releases/download/openssl-X.Y.Z/openssl-X.Y.Z.tar.gz.asc)
|
||||
|
||||
03) Verify the signature:
|
||||
|
||||
$ gpg --verify ../openssl-X.Y.Z.tar.gz.asc ../openssl-X.Y.Z.tar.gz
|
||||
|
||||
04) Unpack the OpenSSL tarball to the parent directory:
|
||||
|
||||
$ tar xf ../openssl-X.Y.Z.tar.gz -C ..
|
||||
|
||||
05) Copy to the vendor branch:
|
||||
|
||||
$ rsync --exclude .git --delete -av ../openssl-X.Y.Z/ .
|
||||
|
||||
06) Take care of added / deleted files:
|
||||
|
||||
$ git add -A
|
||||
|
||||
07) Commit:
|
||||
|
||||
$ git commit -m "openssl: Vendor import of OpenSSL X.Y.Z"
|
||||
|
||||
08) Tag:
|
||||
|
||||
$ git tag -a -m "Tag OpenSSL X.Y.Z" vendor/openssl/X.Y.Z
|
||||
|
||||
At this point the vendor branch can be pushed to the FreeBSD repo via:
|
||||
|
||||
$ git push freebsd vendor/openssl-X.Y
|
||||
$ git push freebsd vendor/openssl/X.Y.Z
|
||||
|
||||
Note the second "git push" command is used to push the tag, which is
|
||||
not pushed by default.
|
||||
|
||||
It is also possible to push the branch and tag together, but use
|
||||
--dry-run first to ensure that no undesired tags will be pushed:
|
||||
|
||||
$ git push --dry-run --follow-tags freebsd vendor/openssl-X.Y
|
||||
$ git push --follow-tags freebsd vendor/openssl-X.Y
|
||||
|
||||
The update and tag could instead be pushed later, along with the merge
|
||||
to main, but pushing now allows others to collaborate.
|
||||
|
||||
09) Merge from the vendor branch:
|
||||
|
||||
$ git subtree merge -P crypto/openssl vendor/openssl-X.Y
|
||||
|
||||
A number of files have been deleted from FreeBSD's copy of OpenSSL.
|
||||
If git prompts for these deleted files during the merge, choose 'd'
|
||||
(leaving them deleted).
|
||||
|
||||
10) Resolve conflicts. Remember to bump the version and date in
|
||||
secure/lib/libcrypto/Makefile.inc and
|
||||
crypto/openssl/include/openssl/opensslv.h.
|
||||
|
||||
11) Diff against the vendor branch:
|
||||
|
||||
$ git diff --diff-filter=M vendor/openssl/X.Y.Z HEAD:crypto/openssl
|
||||
|
||||
Review the diff for any unexpected changes.
|
||||
|
||||
12) Re-generate the assembly files:
|
||||
|
||||
$ cd secure/lib/libcrypto
|
||||
$ make cleanasm buildasm
|
||||
|
||||
13) Update the appropriate makefiles to reflect changes in the vendor's
|
||||
build.info files. This is especially important if source files have
|
||||
been added or removed. Keep in mind that the assembly files generated
|
||||
belong to sys/crypto/openssl, and will therefore affect the kernel as
|
||||
well.
|
||||
|
||||
14) If symbols have been added or removed, update the appropriate
|
||||
Version.map to reflect these changes.
|
||||
|
||||
15) Compare compilation flags, the list of files built and included, the
|
||||
list of symbols generated with the corresponding port if available.
|
||||
|
||||
16) Re-generate the manual files:
|
||||
|
||||
$ tar xzf openssl-X.Y.Z.tar.gz
|
||||
$ (cd openssl-X.Y.Z && ./Configure --prefix=/usr --openssldir=/etc/ssl &&
|
||||
make build_man_docs)
|
||||
[...]
|
||||
$ find openssl-X.Y.Z/doc/man/man1 -name '*.1' -exec cp {} secure/usr.bin/openssl/man/ \;
|
||||
$ find openssl-X.Y.Z/doc/man/man3 -name '*.3' -exec cp {} secure/lib/libcrypto/man/man3/ \;
|
||||
$ find openssl-X.Y.Z/doc/man/man5 -name '*.5' -exec cp {} secure/lib/libcrypto/man/man5/ \;
|
||||
$ find openssl-X.Y.Z/doc/man/man7 -name '*.7' -exec cp {} secure/lib/libcrypto/man/man7/ \;
|
||||
$ grep -nrF usr/local secure/lib/libcrypto/man secure/usr.bin/openssl/man
|
||||
[correct the references to the prefix and OpenSSL directories]
|
||||
$ git commit --amend secure/lib/libcrypto/man secure/usr.bin/openssl/man
|
||||
|
||||
Review the diff and tree status for anything requiring attention.
|
||||
|
||||
16) Build and install world, reboot, test.
|
||||
|
||||
17) Test the legacy provider as well: (here with "test" as the password)
|
||||
|
||||
$ echo test | openssl rc4 -provider legacy -e -a -pbkdf2
|
||||
enter RC4 encryption password:
|
||||
Verifying - enter RC4 encryption password:
|
||||
U2FsdGVkX1+JvhqxLMOvlxvTi1/h
|
||||
|
||||
18) Commit and hope you did not miss anything.
|
||||
202
crypto/openssl/FREEBSD-upgrade.md
Normal file
202
crypto/openssl/FREEBSD-upgrade.md
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
# FreeBSD maintainer's guide to OpenSSL
|
||||
|
||||
## Assumptions
|
||||
|
||||
These instructions assume the following:
|
||||
|
||||
- A git clone of FreeBSD will be available at `$GIT_ROOT/src/freebsd/main` with
|
||||
an origin named `freebsd`. Example:
|
||||
`git clone -o freebsd git@gitrepo.freebsd.org:src.git "$GIT_ROOT/src/freebsd/main"`
|
||||
- The vendor trees will be stored under `$GIT_ROOT/src/freebsd/vendor/`.
|
||||
|
||||
## Software requirements
|
||||
|
||||
The following additional software must be installed from ports:
|
||||
|
||||
- lang/perl5
|
||||
- lang/python
|
||||
- net/rsync
|
||||
- security/gnupg
|
||||
|
||||
## Warning
|
||||
|
||||
This is a long and complicated process, in part because OpenSSL is a large,
|
||||
complex, and foundational software component in the FreeBSD distribution. A
|
||||
lot of the overall process has been automated to reduce potential human error,
|
||||
but some rough edges still exist. These rough edges have been highlighted in
|
||||
the directions.
|
||||
|
||||
## Process
|
||||
|
||||
### Notes
|
||||
|
||||
The following directions use X.Y.Z to describe the major, minor, subminor
|
||||
versions, respectively for the OpenSSL release. Please substitute the values as
|
||||
appropriate in the directions below.
|
||||
|
||||
All single commands are prefixed with `%`.
|
||||
|
||||
### Variables
|
||||
|
||||
```
|
||||
% OPENSSL_VER_MAJOR_MINOR=X.Y
|
||||
% OPENSSL_VER_FULL=X.Y.Z
|
||||
% RELEASE_TARFILE="openssl-${OPENSSL_VER_FULL}.tar.gz"
|
||||
% BASE_URL="https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VER_FULL}/${RELEASE_TARFILE}"
|
||||
```
|
||||
|
||||
### Switch to the vendor branch
|
||||
|
||||
```
|
||||
% cd "$GIT_ROOT/src/freebsd/main"
|
||||
% git worktree add -b vendor/openssl-${OPENSSL_VER_MAJOR_MINOR} \
|
||||
../vendor/openssl-${OPENSSL_VER_MAJOR_MINOR} \
|
||||
freebsd/vendor/openssl-${OPENSSL_VER_MAJOR_MINOR}
|
||||
% cd "$GIT_ROOT/src/freebsd/vendor/openssl-${OPENSSL_VER_MAJOR_MINOR}
|
||||
```
|
||||
|
||||
### Download the latest OpenSSL release
|
||||
|
||||
The following instructions demonstrate how to fetch a recent OpenSSL release
|
||||
and its corresponding artifacts (release SHA256 checksum; release PGP
|
||||
signature) from the [official website](https://www.openssl.org/source/).
|
||||
|
||||
```
|
||||
% (cd .. && fetch ${BASE_URL} ${BASE_URL}.asc ${BASE_URL}.sha256)
|
||||
```
|
||||
|
||||
### Verify the release authenticity and integrity
|
||||
|
||||
**NOTE**: this step requires importing the project author's PGP keys beforehand.
|
||||
See the [sources webpage](https://openssl-library.org/source/) for more
|
||||
details.
|
||||
|
||||
This step uses the PGP signature and SHA256 checksum files to verify the release
|
||||
authenticity and integrity, respectively.
|
||||
|
||||
```
|
||||
% (cd .. && sha256sum -c ${RELEASE_TARFILE}.sha256)
|
||||
% (cd .. && gpg --verify ${RELEASE_TARFILE}.asc)
|
||||
```
|
||||
|
||||
### Unpack the OpenSSL tarball to the parent directory
|
||||
|
||||
```
|
||||
% (cd .. && tar xf ../${RELEASE_TARFILE})
|
||||
```
|
||||
|
||||
### Update the sources in the vendor branch
|
||||
|
||||
**IMPORTANT**: the trailing slash in the source directory is required!
|
||||
|
||||
```
|
||||
% rsync --exclude .git --delete -av ../openssl-${OPENSSL_VER_FULL}/ .
|
||||
```
|
||||
|
||||
### Take care of added / deleted files
|
||||
|
||||
```
|
||||
% git add -A
|
||||
```
|
||||
|
||||
### Commit, tag, and push
|
||||
|
||||
```
|
||||
% git commit -m "openssl: Vendor import of OpenSSL ${OPENSSL_VER_FULL}"
|
||||
% git tag -a -m "Tag OpenSSL ${OPENSSL_VER_FULL}" vendor/openssl/${OPENSSL_VER_FULL}
|
||||
```
|
||||
|
||||
The update and tag could instead be pushed later, along with the merge
|
||||
to main, but pushing now allows others to collaborate.
|
||||
|
||||
#### Push branch update and tag separately
|
||||
|
||||
At this point the vendor branch can be pushed to the FreeBSD repo via:
|
||||
```
|
||||
% git push freebsd vendor/openssl-${OPENSSL_VER_MAJOR_MINOR}
|
||||
% git push freebsd vendor/openssl/${OPENSSL_VER_FULL}
|
||||
```
|
||||
|
||||
**NOTE**: the second "git push" command is used to push the tag, which is not
|
||||
pushed by default.
|
||||
|
||||
#### Push branch update and tag simultaneously
|
||||
|
||||
It is also possible to push the branch and tag together, but use
|
||||
`--dry-run` first to ensure that no undesired tags will be pushed:
|
||||
|
||||
```
|
||||
% git push --dry-run --follow-tags freebsd vendor/openssl-${OPENSSL_VER_MAJOR_MINOR}
|
||||
% git push --follow-tags freebsd vendor/openssl-${OPENSSL_VER_MAJOR_MINOR}
|
||||
```
|
||||
|
||||
### Remove any existing patches and generated files.
|
||||
|
||||
```
|
||||
% make clean
|
||||
```
|
||||
|
||||
Please note that this step does not remove any generated manpages: this happens
|
||||
in a later step.
|
||||
|
||||
### Merge from the vendor branch and resolve conflicts
|
||||
|
||||
```
|
||||
% git subtree merge -P crypto/openssl vendor/openssl-${OPENSSL_VER_MAJOR_MINOR}
|
||||
```
|
||||
|
||||
**NOTE**: Some files may have been deleted from FreeBSD's copy of OpenSSL.
|
||||
If git prompts for these deleted files during the merge, choose 'd'
|
||||
(leaving them deleted).
|
||||
|
||||
### Patch, configure, and regenerate all files
|
||||
|
||||
The following commands turn the crank associated with the vendor release
|
||||
update:
|
||||
|
||||
```
|
||||
% make patch
|
||||
% make configure
|
||||
% make all
|
||||
```
|
||||
|
||||
This process updates all generated files, syncs the manpages with the new release,
|
||||
regenerates assembly files, etc.
|
||||
|
||||
For now, any build-related changes, e.g., a assembly source was removed, a manpage
|
||||
was added, etc, will require makefile updates.
|
||||
|
||||
### Diff against the vendor branch
|
||||
|
||||
Review the diff for any unexpected changes:
|
||||
|
||||
```
|
||||
% git diff --diff-filter=M vendor/openssl/${OPENSSL_VER_FULL} HEAD:crypto/openssl
|
||||
```
|
||||
|
||||
The net-result should be just the applied patches from the freebsd/ directory.
|
||||
|
||||
### Make build-related changes
|
||||
|
||||
**IMPORTANT**: manual adjustments/care needed here.
|
||||
|
||||
Update the appropriate makefiles to reflect changes in the vendor's
|
||||
`build.info` metadata file. This is especially important if source files have
|
||||
been added or removed. Keep in mind that the assembly files generated belong in
|
||||
`sys/crypto/openssl`, and will therefore affect the kernel as well.
|
||||
|
||||
If symbols have been added or removed, update the appropriate `Version.map` to
|
||||
reflect these changes. Please try to stick to the new versioning scheme in the
|
||||
target OpenSSL release to improve interoperability with binaries compiled
|
||||
dynamically against the ports version of OpenSSL, for instance.
|
||||
|
||||
Compare compilation flags, the list of files built and included, the list of
|
||||
symbols generated with the corresponding port if available.
|
||||
|
||||
### Build, install, and test
|
||||
|
||||
Build and install a new version of world and the kernel with the newer release
|
||||
of OpenSSL. Reboot the test host and run any appropriate tests using kyua,
|
||||
`make checkworld`, etc.
|
||||
|
||||
### Commit and push
|
||||
Loading…
Add table
Reference in a new issue