Temporarily remove imgcrypt in CRI to fix circular dependency
Signed-off-by: Derek McGowan <derek@mcg.dev>
This commit is contained in:
		
							
								
								
									
										2
									
								
								vendor/github.com/containerd/imgcrypt/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/imgcrypt/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,2 +0,0 @@
 | 
			
		||||
*~
 | 
			
		||||
/bin/
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/containerd/imgcrypt/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containerd/imgcrypt/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,20 +0,0 @@
 | 
			
		||||
linters:
 | 
			
		||||
  enable:
 | 
			
		||||
    - structcheck
 | 
			
		||||
    - varcheck
 | 
			
		||||
    - staticcheck
 | 
			
		||||
    - unconvert
 | 
			
		||||
    - gofmt
 | 
			
		||||
    - goimports
 | 
			
		||||
    - revive
 | 
			
		||||
    - ineffassign
 | 
			
		||||
    - vet
 | 
			
		||||
    - unused
 | 
			
		||||
    - misspell
 | 
			
		||||
 | 
			
		||||
run:
 | 
			
		||||
  skip-dirs:
 | 
			
		||||
    - cmd/ctr/commands/run
 | 
			
		||||
    - cmd/ctr/commands/images
 | 
			
		||||
    - cmd\\ctr\\commands\\run
 | 
			
		||||
    - cmd\\ctr\\commands\\images
 | 
			
		||||
							
								
								
									
										48
									
								
								vendor/github.com/containerd/imgcrypt/CHANGES
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/containerd/imgcrypt/CHANGES
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,48 +0,0 @@
 | 
			
		||||
CHANGES
 | 
			
		||||
 | 
			
		||||
v1.1.7:
 | 
			
		||||
  - Added support for zstd-compressed layers
 | 
			
		||||
  - Update to ocicrypt v1.1.6 for zstd-related dependencies
 | 
			
		||||
  - Update to containerd v1.6.8
 | 
			
		||||
  - Sync'ed ctr-enc with upstream ctr changes to import command
 | 
			
		||||
  - Add support for --all-platforms to encrypt command of ctr-enc
 | 
			
		||||
 | 
			
		||||
v1.1.6:
 | 
			
		||||
  - Update to ocicrypt v1.1.5 for yaml v3.0 dependency
 | 
			
		||||
  - Update to containerd v1.6.6 for runc v1.1.2 dependency
 | 
			
		||||
 | 
			
		||||
v1.1.5:
 | 
			
		||||
  - Update to ocicrypt v1.1.4; sha256 is the default now for padding in OAEP
 | 
			
		||||
    for pkcs11; Set OCICRYPT_OAEP_HASHALG=sha1 environment variable to force
 | 
			
		||||
    sha1 usage, which is required for example for SoftHSM 2.6.1.
 | 
			
		||||
 | 
			
		||||
v1.1.4:
 | 
			
		||||
  - Fixed issue in CheckAuthorization() callpath for images with a ManifestList
 | 
			
		||||
    - CVE-2022-24778
 | 
			
		||||
    - Fix: https://github.com/containerd/imgcrypt/commit/6fdd9818a4d8142107b7ecd767d839c9707700d9
 | 
			
		||||
    - Added test case covering this
 | 
			
		||||
  - Updated to ocicrypt 1.1.3
 | 
			
		||||
  - Updated to containerd 1.6.1
 | 
			
		||||
 | 
			
		||||
v1.1.3:
 | 
			
		||||
  - Release v1.1.3 addresses issue #62 due to re-tagging of v1.1.2
 | 
			
		||||
  - docs: update referenced containerd project branch to main
 | 
			
		||||
  - Update linter to match containerd repo
 | 
			
		||||
  - Update CI golang version
 | 
			
		||||
  - Updated to containerd 1.5.8
 | 
			
		||||
 | 
			
		||||
v1.1.2:
 | 
			
		||||
  - Decouple CreateCryptoConfig() from github.com/urfave/cli
 | 
			
		||||
  - Updated to containerd 1.5.7
 | 
			
		||||
  - Implemented ConvertFunc for image en- and decryption
 | 
			
		||||
  - Replace pkg/errors with errors package
 | 
			
		||||
  - Updated to ocicrypt 1.1.2
 | 
			
		||||
  - Sync'ed ctr-enc with ctr of containerd-1.5.0
 | 
			
		||||
 | 
			
		||||
v1.1.1:
 | 
			
		||||
  - rebased on ocicrypt 1.1.1
 | 
			
		||||
 | 
			
		||||
v1.1.0:
 | 
			
		||||
  - rebased on ocicrypt 1.1.0
 | 
			
		||||
  - added pkcs11 support; experimental
 | 
			
		||||
  - added keyprovider support
 | 
			
		||||
							
								
								
									
										191
									
								
								vendor/github.com/containerd/imgcrypt/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										191
									
								
								vendor/github.com/containerd/imgcrypt/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,191 +0,0 @@
 | 
			
		||||
 | 
			
		||||
                                 Apache License
 | 
			
		||||
                           Version 2.0, January 2004
 | 
			
		||||
                        https://www.apache.org/licenses/
 | 
			
		||||
 | 
			
		||||
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
			
		||||
 | 
			
		||||
   1. Definitions.
 | 
			
		||||
 | 
			
		||||
      "License" shall mean the terms and conditions for use, reproduction,
 | 
			
		||||
      and distribution as defined by Sections 1 through 9 of this document.
 | 
			
		||||
 | 
			
		||||
      "Licensor" shall mean the copyright owner or entity authorized by
 | 
			
		||||
      the copyright owner that is granting the License.
 | 
			
		||||
 | 
			
		||||
      "Legal Entity" shall mean the union of the acting entity and all
 | 
			
		||||
      other entities that control, are controlled by, or are under common
 | 
			
		||||
      control with that entity. For the purposes of this definition,
 | 
			
		||||
      "control" means (i) the power, direct or indirect, to cause the
 | 
			
		||||
      direction or management of such entity, whether by contract or
 | 
			
		||||
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
			
		||||
      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
			
		||||
 | 
			
		||||
      "You" (or "Your") shall mean an individual or Legal Entity
 | 
			
		||||
      exercising permissions granted by this License.
 | 
			
		||||
 | 
			
		||||
      "Source" form shall mean the preferred form for making modifications,
 | 
			
		||||
      including but not limited to software source code, documentation
 | 
			
		||||
      source, and configuration files.
 | 
			
		||||
 | 
			
		||||
      "Object" form shall mean any form resulting from mechanical
 | 
			
		||||
      transformation or translation of a Source form, including but
 | 
			
		||||
      not limited to compiled object code, generated documentation,
 | 
			
		||||
      and conversions to other media types.
 | 
			
		||||
 | 
			
		||||
      "Work" shall mean the work of authorship, whether in Source or
 | 
			
		||||
      Object form, made available under the License, as indicated by a
 | 
			
		||||
      copyright notice that is included in or attached to the work
 | 
			
		||||
      (an example is provided in the Appendix below).
 | 
			
		||||
 | 
			
		||||
      "Derivative Works" shall mean any work, whether in Source or Object
 | 
			
		||||
      form, that is based on (or derived from) the Work and for which the
 | 
			
		||||
      editorial revisions, annotations, elaborations, or other modifications
 | 
			
		||||
      represent, as a whole, an original work of authorship. For the purposes
 | 
			
		||||
      of this License, Derivative Works shall not include works that remain
 | 
			
		||||
      separable from, or merely link (or bind by name) to the interfaces of,
 | 
			
		||||
      the Work and Derivative Works thereof.
 | 
			
		||||
 | 
			
		||||
      "Contribution" shall mean any work of authorship, including
 | 
			
		||||
      the original version of the Work and any modifications or additions
 | 
			
		||||
      to that Work or Derivative Works thereof, that is intentionally
 | 
			
		||||
      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
			
		||||
      or by an individual or Legal Entity authorized to submit on behalf of
 | 
			
		||||
      the copyright owner. For the purposes of this definition, "submitted"
 | 
			
		||||
      means any form of electronic, verbal, or written communication sent
 | 
			
		||||
      to the Licensor or its representatives, including but not limited to
 | 
			
		||||
      communication on electronic mailing lists, source code control systems,
 | 
			
		||||
      and issue tracking systems that are managed by, or on behalf of, the
 | 
			
		||||
      Licensor for the purpose of discussing and improving the Work, but
 | 
			
		||||
      excluding communication that is conspicuously marked or otherwise
 | 
			
		||||
      designated in writing by the copyright owner as "Not a Contribution."
 | 
			
		||||
 | 
			
		||||
      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
			
		||||
      on behalf of whom a Contribution has been received by Licensor and
 | 
			
		||||
      subsequently incorporated within the Work.
 | 
			
		||||
 | 
			
		||||
   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      copyright license to reproduce, prepare Derivative Works of,
 | 
			
		||||
      publicly display, publicly perform, sublicense, and distribute the
 | 
			
		||||
      Work and such Derivative Works in Source or Object form.
 | 
			
		||||
 | 
			
		||||
   3. Grant of Patent License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      (except as stated in this section) patent license to make, have made,
 | 
			
		||||
      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
			
		||||
      where such license applies only to those patent claims licensable
 | 
			
		||||
      by such Contributor that are necessarily infringed by their
 | 
			
		||||
      Contribution(s) alone or by combination of their Contribution(s)
 | 
			
		||||
      with the Work to which such Contribution(s) was submitted. If You
 | 
			
		||||
      institute patent litigation against any entity (including a
 | 
			
		||||
      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
			
		||||
      or a Contribution incorporated within the Work constitutes direct
 | 
			
		||||
      or contributory patent infringement, then any patent licenses
 | 
			
		||||
      granted to You under this License for that Work shall terminate
 | 
			
		||||
      as of the date such litigation is filed.
 | 
			
		||||
 | 
			
		||||
   4. Redistribution. You may reproduce and distribute copies of the
 | 
			
		||||
      Work or Derivative Works thereof in any medium, with or without
 | 
			
		||||
      modifications, and in Source or Object form, provided that You
 | 
			
		||||
      meet the following conditions:
 | 
			
		||||
 | 
			
		||||
      (a) You must give any other recipients of the Work or
 | 
			
		||||
          Derivative Works a copy of this License; and
 | 
			
		||||
 | 
			
		||||
      (b) You must cause any modified files to carry prominent notices
 | 
			
		||||
          stating that You changed the files; and
 | 
			
		||||
 | 
			
		||||
      (c) You must retain, in the Source form of any Derivative Works
 | 
			
		||||
          that You distribute, all copyright, patent, trademark, and
 | 
			
		||||
          attribution notices from the Source form of the Work,
 | 
			
		||||
          excluding those notices that do not pertain to any part of
 | 
			
		||||
          the Derivative Works; and
 | 
			
		||||
 | 
			
		||||
      (d) If the Work includes a "NOTICE" text file as part of its
 | 
			
		||||
          distribution, then any Derivative Works that You distribute must
 | 
			
		||||
          include a readable copy of the attribution notices contained
 | 
			
		||||
          within such NOTICE file, excluding those notices that do not
 | 
			
		||||
          pertain to any part of the Derivative Works, in at least one
 | 
			
		||||
          of the following places: within a NOTICE text file distributed
 | 
			
		||||
          as part of the Derivative Works; within the Source form or
 | 
			
		||||
          documentation, if provided along with the Derivative Works; or,
 | 
			
		||||
          within a display generated by the Derivative Works, if and
 | 
			
		||||
          wherever such third-party notices normally appear. The contents
 | 
			
		||||
          of the NOTICE file are for informational purposes only and
 | 
			
		||||
          do not modify the License. You may add Your own attribution
 | 
			
		||||
          notices within Derivative Works that You distribute, alongside
 | 
			
		||||
          or as an addendum to the NOTICE text from the Work, provided
 | 
			
		||||
          that such additional attribution notices cannot be construed
 | 
			
		||||
          as modifying the License.
 | 
			
		||||
 | 
			
		||||
      You may add Your own copyright statement to Your modifications and
 | 
			
		||||
      may provide additional or different license terms and conditions
 | 
			
		||||
      for use, reproduction, or distribution of Your modifications, or
 | 
			
		||||
      for any such Derivative Works as a whole, provided Your use,
 | 
			
		||||
      reproduction, and distribution of the Work otherwise complies with
 | 
			
		||||
      the conditions stated in this License.
 | 
			
		||||
 | 
			
		||||
   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
			
		||||
      any Contribution intentionally submitted for inclusion in the Work
 | 
			
		||||
      by You to the Licensor shall be under the terms and conditions of
 | 
			
		||||
      this License, without any additional terms or conditions.
 | 
			
		||||
      Notwithstanding the above, nothing herein shall supersede or modify
 | 
			
		||||
      the terms of any separate license agreement you may have executed
 | 
			
		||||
      with Licensor regarding such Contributions.
 | 
			
		||||
 | 
			
		||||
   6. Trademarks. This License does not grant permission to use the trade
 | 
			
		||||
      names, trademarks, service marks, or product names of the Licensor,
 | 
			
		||||
      except as required for reasonable and customary use in describing the
 | 
			
		||||
      origin of the Work and reproducing the content of the NOTICE file.
 | 
			
		||||
 | 
			
		||||
   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
			
		||||
      agreed to in writing, Licensor provides the Work (and each
 | 
			
		||||
      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
			
		||||
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
			
		||||
      implied, including, without limitation, any warranties or conditions
 | 
			
		||||
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
			
		||||
      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
			
		||||
      appropriateness of using or redistributing the Work and assume any
 | 
			
		||||
      risks associated with Your exercise of permissions under this License.
 | 
			
		||||
 | 
			
		||||
   8. Limitation of Liability. In no event and under no legal theory,
 | 
			
		||||
      whether in tort (including negligence), contract, or otherwise,
 | 
			
		||||
      unless required by applicable law (such as deliberate and grossly
 | 
			
		||||
      negligent acts) or agreed to in writing, shall any Contributor be
 | 
			
		||||
      liable to You for damages, including any direct, indirect, special,
 | 
			
		||||
      incidental, or consequential damages of any character arising as a
 | 
			
		||||
      result of this License or out of the use or inability to use the
 | 
			
		||||
      Work (including but not limited to damages for loss of goodwill,
 | 
			
		||||
      work stoppage, computer failure or malfunction, or any and all
 | 
			
		||||
      other commercial damages or losses), even if such Contributor
 | 
			
		||||
      has been advised of the possibility of such damages.
 | 
			
		||||
 | 
			
		||||
   9. Accepting Warranty or Additional Liability. While redistributing
 | 
			
		||||
      the Work or Derivative Works thereof, You may choose to offer,
 | 
			
		||||
      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
			
		||||
      or other liability obligations and/or rights consistent with this
 | 
			
		||||
      License. However, in accepting such obligations, You may act only
 | 
			
		||||
      on Your own behalf and on Your sole responsibility, not on behalf
 | 
			
		||||
      of any other Contributor, and only if You agree to indemnify,
 | 
			
		||||
      defend, and hold each Contributor harmless for any liability
 | 
			
		||||
      incurred by, or claims asserted against, such Contributor by reason
 | 
			
		||||
      of your accepting any such warranty or additional liability.
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
   Copyright The containerd Authors
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       https://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/containerd/imgcrypt/MAINTAINERS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/containerd/imgcrypt/MAINTAINERS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,9 +0,0 @@
 | 
			
		||||
# imgcrypt maintainers
 | 
			
		||||
#
 | 
			
		||||
# As a containerd sub-project, containerd maintainers are also included from https://github.com/containerd/project/blob/main/MAINTAINERS.
 | 
			
		||||
# See https://github.com/containerd/project/blob/main/GOVERNANCE.md for description of maintainer role
 | 
			
		||||
#
 | 
			
		||||
# MAINTAINERS
 | 
			
		||||
# GitHub ID, Name, Email address
 | 
			
		||||
stefanberger, Stefan Berger, stefanb@linux.ibm.com
 | 
			
		||||
lumjjb, Brandon Lum, lumjjb@gmail.com
 | 
			
		||||
							
								
								
									
										67
									
								
								vendor/github.com/containerd/imgcrypt/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										67
									
								
								vendor/github.com/containerd/imgcrypt/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,67 +0,0 @@
 | 
			
		||||
#   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
#   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
#   you may not use this file except in compliance with the License.
 | 
			
		||||
#   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
#       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
#   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
#   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
#   See the License for the specific language governing permissions and
 | 
			
		||||
#   limitations under the License.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Base path used to install.
 | 
			
		||||
DESTDIR ?= /usr/local
 | 
			
		||||
 | 
			
		||||
VERSION=$(shell git describe --match 'v[0-9]*' --dirty='.m' --always)
 | 
			
		||||
 | 
			
		||||
CTR_LDFLAGS=-ldflags '-X github.com/containerd/containerd/version.Version=$(VERSION)'
 | 
			
		||||
COMMANDS=ctd-decoder ctr-enc
 | 
			
		||||
RELEASE_COMMANDS=ctd-decoder
 | 
			
		||||
 | 
			
		||||
BINARIES=$(addprefix bin/,$(COMMANDS))
 | 
			
		||||
RELEASE_BINARIES=$(addprefix bin/,$(RELEASE_COMMANDS))
 | 
			
		||||
 | 
			
		||||
.PHONY: check build ctd-decoder
 | 
			
		||||
 | 
			
		||||
all: build
 | 
			
		||||
 | 
			
		||||
build: $(BINARIES)
 | 
			
		||||
 | 
			
		||||
FORCE:
 | 
			
		||||
 | 
			
		||||
bin/ctd-decoder: cmd/ctd-decoder FORCE
 | 
			
		||||
	go build -o $@ -v ./cmd/ctd-decoder/
 | 
			
		||||
 | 
			
		||||
bin/ctr-enc: cmd/ctr FORCE
 | 
			
		||||
	go build -o $@ ${CTR_LDFLAGS} -v ./cmd/ctr/
 | 
			
		||||
 | 
			
		||||
check:
 | 
			
		||||
	@echo "$@"
 | 
			
		||||
	@golangci-lint run
 | 
			
		||||
	@script/check_format.sh
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
	@echo "$@"
 | 
			
		||||
	@mkdir -p $(DESTDIR)/bin
 | 
			
		||||
	@install $(BINARIES) $(DESTDIR)/bin
 | 
			
		||||
 | 
			
		||||
containerd-release:
 | 
			
		||||
	@echo "$@"
 | 
			
		||||
	@mkdir -p $(DESTDIR)/bin
 | 
			
		||||
	@install $(RELEASE_BINARIES) $(DESTDIR)/bin
 | 
			
		||||
 | 
			
		||||
uninstall:
 | 
			
		||||
	@echo "$@"
 | 
			
		||||
	@rm -f $(addprefix $(DESTDIR)/bin/,$(notdir $(BINARIES)))
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	@echo "$@"
 | 
			
		||||
	@rm -f $(BINARIES)
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
	@echo "$@"
 | 
			
		||||
	@go test ./...
 | 
			
		||||
							
								
								
									
										107
									
								
								vendor/github.com/containerd/imgcrypt/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										107
									
								
								vendor/github.com/containerd/imgcrypt/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,107 +0,0 @@
 | 
			
		||||
# imgcrypt image encryption library and command line tool
 | 
			
		||||
 | 
			
		||||
Project `imgcrypt` is a non-core subproject of containerd.
 | 
			
		||||
 | 
			
		||||
The `imgcrypt` library provides API exensions for containerd to support encrypted container images and implements
 | 
			
		||||
the `ctd-decoder` command line tool for use by containerd to decrypt encrypted container images. An extended version
 | 
			
		||||
of containerd's `ctr` tool (`ctr-enc`) with support for encrypting and decrypting container images is also provided.
 | 
			
		||||
 | 
			
		||||
`imgcrypt` relies on the [`ocicrypt`](https://github.com/containers/ocicrypt) library for crypto functions on image layers.
 | 
			
		||||
 | 
			
		||||
# Usage
 | 
			
		||||
 | 
			
		||||
`imgcrypt` requires containerd 1.3 or later. Containerd 1.4 or later is required when used with Kubernetes.
 | 
			
		||||
For configuration instructions for kubernetes, please consult the [CRI decryption document](https://github.com/containerd/containerd/blob/main/docs/cri/decryption.md).
 | 
			
		||||
 | 
			
		||||
Build and install `imgcrypt`:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# make
 | 
			
		||||
# sudo make install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Start containerd with a configuration file that looks as follows. To avoid interference with a containerd from a Docker
 | 
			
		||||
installation we use /tmp for directories. Also, we build containerd 1.3 from the source but do not install it.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# cat config.toml
 | 
			
		||||
disable_plugins = ["cri"]
 | 
			
		||||
root = "/tmp/var/lib/containerd"
 | 
			
		||||
state = "/tmp/run/containerd"
 | 
			
		||||
[grpc]
 | 
			
		||||
  address = "/tmp/run/containerd/containerd.sock"
 | 
			
		||||
  uid = 0
 | 
			
		||||
  gid = 0
 | 
			
		||||
[stream_processors]
 | 
			
		||||
    [stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
 | 
			
		||||
        accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
 | 
			
		||||
        returns = "application/vnd.oci.image.layer.v1.tar+gzip"
 | 
			
		||||
        path = "/usr/local/bin/ctd-decoder"
 | 
			
		||||
    [stream_processors."io.containerd.ocicrypt.decoder.v1.tar.zstd"]
 | 
			
		||||
        accepts = ["application/vnd.oci.image.layer.v1.tar+zstd+encrypted"]
 | 
			
		||||
        returns = "application/vnd.oci.image.layer.v1.tar+zstd"
 | 
			
		||||
        path = "/usr/local/bin/ctd-decoder"
 | 
			
		||||
    [stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
 | 
			
		||||
        accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
 | 
			
		||||
        returns = "application/vnd.oci.image.layer.v1.tar"
 | 
			
		||||
        path = "/usr/local/bin/ctd-decoder"
 | 
			
		||||
 | 
			
		||||
# sudo ~/src/github.com/containerd/containerd/bin/containerd -c config.toml
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Create an RSA key pair using the openssl command line tool and encrypted an image:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
# openssl genrsa -out mykey.pem
 | 
			
		||||
Generating RSA private key, 2048 bit long modulus (2 primes)
 | 
			
		||||
...............................................+++++
 | 
			
		||||
............................+++++
 | 
			
		||||
e is 65537 (0x010001)
 | 
			
		||||
# openssl rsa -in mykey.pem -pubout -out mypubkey.pem
 | 
			
		||||
writing RSA key
 | 
			
		||||
# sudo chmod 0666 /tmp/run/containerd/containerd.sock
 | 
			
		||||
# CTR="/usr/local/bin/ctr-enc -a /tmp/run/containerd/containerd.sock"
 | 
			
		||||
# $CTR images pull --all-platforms docker.io/library/bash:latest
 | 
			
		||||
[...]
 | 
			
		||||
# $CTR images layerinfo --platform linux/amd64 docker.io/library/bash:latest
 | 
			
		||||
   #                                                                    DIGEST      PLATFORM      SIZE   ENCRYPTION   RECIPIENTS
 | 
			
		||||
   0   sha256:9d48c3bd43c520dc2784e868a780e976b207cbf493eaff8c6596eb871cbd9609   linux/amd64   2789669                          
 | 
			
		||||
   1   sha256:7dd01fd971d4ec7058c5636a505327b24e5fc8bd7f62816a9d518472bd9b15c0   linux/amd64   3174665                          
 | 
			
		||||
   2   sha256:691cfbca522787898c8b37f063dd20e5524e7d103e1a3b298bd2e2b8da54faf5   linux/amd64       340                          
 | 
			
		||||
# $CTR images encrypt --recipient jwe:mypubkey.pem --platform linux/amd64 docker.io/library/bash:latest bash.enc:latest
 | 
			
		||||
Encrypting docker.io/library/bash:latest to bash.enc:latest
 | 
			
		||||
$ $CTR images layerinfo --platform linux/amd64 bash.enc:latest
 | 
			
		||||
   #                                                                    DIGEST      PLATFORM      SIZE   ENCRYPTION   RECIPIENTS
 | 
			
		||||
   0   sha256:360be141b01f69b25427a9085b36ba8ad7d7a335449013fa6b32c1ecb894ab5b   linux/amd64   2789669          jwe        [jwe]
 | 
			
		||||
   1   sha256:ac601e66cdd275ee0e10afead03a2722e153a60982122d2d369880ea54fe82f8   linux/amd64   3174665          jwe        [jwe]
 | 
			
		||||
   2   sha256:41e47064fd00424e328915ad2f7f716bd86ea2d0d8315edaf33ecaa6a2464530   linux/amd64       340          jwe        [jwe]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Start a local image registry so we can push the encrypted image to it. A recent versions of the registry is required
 | 
			
		||||
to accept encrypted container images.
 | 
			
		||||
```
 | 
			
		||||
# docker pull registry:latest
 | 
			
		||||
# docker run -d -p 5000:5000 --restart=always --name registry registry
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Push the encrypted image to the local registry, pull it using `ctr-enc`, and then run the image.
 | 
			
		||||
```
 | 
			
		||||
# $CTR images tag bash.enc:latest localhost:5000/bash.enc:latest
 | 
			
		||||
# $CTR images push localhost:5000/bash.enc:latest
 | 
			
		||||
# $CTR images rm localhost:5000/bash.enc:latest bash.enc:latest
 | 
			
		||||
# $CTR images pull localhost:5000/bash.enc:latest
 | 
			
		||||
# sudo $CTR run --rm localhost:5000/bash.enc:latest test echo 'Hello World!'
 | 
			
		||||
ctr: you are not authorized to use this image: missing private key needed for decryption
 | 
			
		||||
# sudo $CTR run --rm --key mykey.pem localhost:5000/bash.enc:latest test echo 'Hello World!'
 | 
			
		||||
Hello World!
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Project details
 | 
			
		||||
 | 
			
		||||
**imgcrypt** is a non-core containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE).
 | 
			
		||||
As a containerd sub-project, you will find the:
 | 
			
		||||
 * [Project governance](https://github.com/containerd/project/blob/main/GOVERNANCE.md),
 | 
			
		||||
 * [Maintainers](MAINTAINERS),
 | 
			
		||||
 * and [Contributing guidelines](https://github.com/containerd/project/blob/main/CONTRIBUTING.md)
 | 
			
		||||
 | 
			
		||||
information in our [`containerd/project`](https://github.com/containerd/project) repository.
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/any.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/any.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,42 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package encryption
 | 
			
		||||
 | 
			
		||||
import "github.com/gogo/protobuf/types"
 | 
			
		||||
 | 
			
		||||
// pbAny takes proto-generated Any type.
 | 
			
		||||
// https://developers.google.com/protocol-buffers/docs/proto3#any
 | 
			
		||||
type pbAny interface {
 | 
			
		||||
	GetTypeUrl() string
 | 
			
		||||
	GetValue() []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fromAny(from pbAny) *types.Any {
 | 
			
		||||
	if from == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pbany, ok := from.(*types.Any)
 | 
			
		||||
	if ok {
 | 
			
		||||
		return pbany
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &types.Any{
 | 
			
		||||
		TypeUrl: from.GetTypeUrl(),
 | 
			
		||||
		Value:   from.GetValue(),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										80
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										80
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,80 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package encryption
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd"
 | 
			
		||||
	"github.com/containerd/containerd/containers"
 | 
			
		||||
	"github.com/containerd/containerd/diff"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/imgcrypt"
 | 
			
		||||
	"github.com/containerd/typeurl"
 | 
			
		||||
 | 
			
		||||
	encconfig "github.com/containers/ocicrypt/config"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// WithDecryptedUnpack allows to pass parameters the 'layertool' needs to the applier
 | 
			
		||||
func WithDecryptedUnpack(data *imgcrypt.Payload) diff.ApplyOpt {
 | 
			
		||||
	return func(_ context.Context, desc ocispec.Descriptor, c *diff.ApplyConfig) error {
 | 
			
		||||
		data.Descriptor = desc
 | 
			
		||||
		any, err := typeurl.MarshalAny(data)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("failed to marshal payload: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, id := range imgcrypt.PayloadToolIDs {
 | 
			
		||||
			setProcessorPayload(c, id, any)
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithUnpackConfigApplyOpts allows to pass an ApplyOpt
 | 
			
		||||
func WithUnpackConfigApplyOpts(opt diff.ApplyOpt) containerd.UnpackOpt {
 | 
			
		||||
	return func(_ context.Context, uc *containerd.UnpackConfig) error {
 | 
			
		||||
		uc.ApplyOpts = append(uc.ApplyOpts, opt)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithUnpackOpts is used to add unpack options to the unpacker.
 | 
			
		||||
func WithUnpackOpts(opts []containerd.UnpackOpt) containerd.RemoteOpt {
 | 
			
		||||
	return func(_ *containerd.Client, c *containerd.RemoteContext) error {
 | 
			
		||||
		c.UnpackOpts = append(c.UnpackOpts, opts...)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithAuthorizationCheck checks the authorization of keys used for encrypted containers
 | 
			
		||||
// be checked upon creation of a container
 | 
			
		||||
func WithAuthorizationCheck(dc *encconfig.DecryptConfig) containerd.NewContainerOpts {
 | 
			
		||||
	return func(ctx context.Context, client *containerd.Client, c *containers.Container) error {
 | 
			
		||||
		image, err := client.ImageService().Get(ctx, c.Image)
 | 
			
		||||
		if errdefs.IsNotFound(err) {
 | 
			
		||||
			// allow creation of container without a existing image
 | 
			
		||||
			return nil
 | 
			
		||||
		} else if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return CheckAuthorization(ctx, client.ContentStore(), image.Target, dc)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										512
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/encryption.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										512
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/encryption.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,512 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package encryption
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd/content"
 | 
			
		||||
	"github.com/containerd/containerd/errdefs"
 | 
			
		||||
	"github.com/containerd/containerd/images"
 | 
			
		||||
	"github.com/containerd/containerd/images/converter"
 | 
			
		||||
	"github.com/containerd/containerd/platforms"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt"
 | 
			
		||||
	encconfig "github.com/containers/ocicrypt/config"
 | 
			
		||||
	encocispec "github.com/containers/ocicrypt/spec"
 | 
			
		||||
	"github.com/opencontainers/go-digest"
 | 
			
		||||
	"github.com/opencontainers/image-spec/specs-go"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type cryptoOp int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	cryptoOpEncrypt    cryptoOp = iota
 | 
			
		||||
	cryptoOpDecrypt             = iota
 | 
			
		||||
	cryptoOpUnwrapOnly          = iota
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LayerFilter allows to select Layers by certain criteria
 | 
			
		||||
type LayerFilter func(desc ocispec.Descriptor) bool
 | 
			
		||||
 | 
			
		||||
// isLocalPlatform determines whether the given platform matches the local one
 | 
			
		||||
func isLocalPlatform(platform *ocispec.Platform) bool {
 | 
			
		||||
	matcher := platforms.NewMatcher(*platform)
 | 
			
		||||
 | 
			
		||||
	return matcher.Match(platforms.DefaultSpec())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsEncryptedDiff returns true if mediaType is a known encrypted media type.
 | 
			
		||||
func IsEncryptedDiff(ctx context.Context, mediaType string) bool {
 | 
			
		||||
	switch mediaType {
 | 
			
		||||
	case encocispec.MediaTypeLayerZstdEnc, encocispec.MediaTypeLayerGzipEnc, encocispec.MediaTypeLayerEnc:
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasEncryptedLayer returns true if any LayerInfo indicates that the layer is encrypted
 | 
			
		||||
func HasEncryptedLayer(ctx context.Context, layerInfos []ocispec.Descriptor) bool {
 | 
			
		||||
	for i := 0; i < len(layerInfos); i++ {
 | 
			
		||||
		if IsEncryptedDiff(ctx, layerInfos[i].MediaType) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// encryptLayer encrypts the layer using the CryptoConfig and creates a new OCI Descriptor.
 | 
			
		||||
// A call to this function may also only manipulate the wrapped keys list.
 | 
			
		||||
// The caller is expected to store the returned encrypted data and OCI Descriptor
 | 
			
		||||
func encryptLayer(cc *encconfig.CryptoConfig, dataReader content.ReaderAt, desc ocispec.Descriptor) (ocispec.Descriptor, io.Reader, ocicrypt.EncryptLayerFinalizer, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		size int64
 | 
			
		||||
		d    digest.Digest
 | 
			
		||||
		err  error
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	encLayerReader, encLayerFinalizer, err := ocicrypt.EncryptLayer(cc.EncryptConfig, ocicrypt.ReaderFromReaderAt(dataReader), desc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ocispec.Descriptor{}, nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// were data touched ?
 | 
			
		||||
	if encLayerReader != nil {
 | 
			
		||||
		size = 0
 | 
			
		||||
		d = ""
 | 
			
		||||
	} else {
 | 
			
		||||
		size = desc.Size
 | 
			
		||||
		d = desc.Digest
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newDesc := ocispec.Descriptor{
 | 
			
		||||
		Digest:   d,
 | 
			
		||||
		Size:     size,
 | 
			
		||||
		Platform: desc.Platform,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch desc.MediaType {
 | 
			
		||||
	case images.MediaTypeDockerSchema2LayerGzip:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerGzipEnc
 | 
			
		||||
	case images.MediaTypeDockerSchema2Layer:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerEnc
 | 
			
		||||
	case encocispec.MediaTypeLayerGzipEnc:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerGzipEnc
 | 
			
		||||
	case encocispec.MediaTypeLayerZstdEnc:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerZstdEnc
 | 
			
		||||
	case encocispec.MediaTypeLayerEnc:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerEnc
 | 
			
		||||
 | 
			
		||||
	// TODO: Mediatypes to be added in ocispec
 | 
			
		||||
	case ocispec.MediaTypeImageLayerGzip:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerGzipEnc
 | 
			
		||||
	case ocispec.MediaTypeImageLayerZstd:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerZstdEnc
 | 
			
		||||
	case ocispec.MediaTypeImageLayer:
 | 
			
		||||
		newDesc.MediaType = encocispec.MediaTypeLayerEnc
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return ocispec.Descriptor{}, nil, nil, fmt.Errorf("unsupporter layer MediaType: %s", desc.MediaType)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return newDesc, encLayerReader, encLayerFinalizer, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptLayer decrypts the layer using the DecryptConfig and creates a new OCI Descriptor.
 | 
			
		||||
// The caller is expected to store the returned plain data and OCI Descriptor
 | 
			
		||||
func DecryptLayer(dc *encconfig.DecryptConfig, dataReader io.Reader, desc ocispec.Descriptor, unwrapOnly bool) (ocispec.Descriptor, io.Reader, digest.Digest, error) {
 | 
			
		||||
	resultReader, layerDigest, err := ocicrypt.DecryptLayer(dc, dataReader, desc, unwrapOnly)
 | 
			
		||||
	if err != nil || unwrapOnly {
 | 
			
		||||
		return ocispec.Descriptor{}, nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newDesc := ocispec.Descriptor{
 | 
			
		||||
		Size:     0,
 | 
			
		||||
		Platform: desc.Platform,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch desc.MediaType {
 | 
			
		||||
	case encocispec.MediaTypeLayerGzipEnc:
 | 
			
		||||
		newDesc.MediaType = images.MediaTypeDockerSchema2LayerGzip
 | 
			
		||||
	case encocispec.MediaTypeLayerZstdEnc:
 | 
			
		||||
		newDesc.MediaType = ocispec.MediaTypeImageLayerZstd
 | 
			
		||||
	case encocispec.MediaTypeLayerEnc:
 | 
			
		||||
		newDesc.MediaType = images.MediaTypeDockerSchema2Layer
 | 
			
		||||
	default:
 | 
			
		||||
		return ocispec.Descriptor{}, nil, "", fmt.Errorf("unsupporter layer MediaType: %s", desc.MediaType)
 | 
			
		||||
	}
 | 
			
		||||
	return newDesc, resultReader, layerDigest, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// decryptLayer decrypts the layer using the CryptoConfig and creates a new OCI Descriptor.
 | 
			
		||||
// The caller is expected to store the returned plain data and OCI Descriptor
 | 
			
		||||
func decryptLayer(cc *encconfig.CryptoConfig, dataReader content.ReaderAt, desc ocispec.Descriptor, unwrapOnly bool) (ocispec.Descriptor, io.Reader, error) {
 | 
			
		||||
	resultReader, d, err := ocicrypt.DecryptLayer(cc.DecryptConfig, ocicrypt.ReaderFromReaderAt(dataReader), desc, unwrapOnly)
 | 
			
		||||
	if err != nil || unwrapOnly {
 | 
			
		||||
		return ocispec.Descriptor{}, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newDesc := ocispec.Descriptor{
 | 
			
		||||
		Digest:   d,
 | 
			
		||||
		Size:     0,
 | 
			
		||||
		Platform: desc.Platform,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch desc.MediaType {
 | 
			
		||||
	case encocispec.MediaTypeLayerGzipEnc:
 | 
			
		||||
		newDesc.MediaType = images.MediaTypeDockerSchema2LayerGzip
 | 
			
		||||
	case encocispec.MediaTypeLayerZstdEnc:
 | 
			
		||||
		newDesc.MediaType = ocispec.MediaTypeImageLayerZstd
 | 
			
		||||
	case encocispec.MediaTypeLayerEnc:
 | 
			
		||||
		newDesc.MediaType = images.MediaTypeDockerSchema2Layer
 | 
			
		||||
	default:
 | 
			
		||||
		return ocispec.Descriptor{}, nil, fmt.Errorf("unsupporter layer MediaType: %s", desc.MediaType)
 | 
			
		||||
	}
 | 
			
		||||
	return newDesc, resultReader, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cryptLayer handles the changes due to encryption or decryption of a layer
 | 
			
		||||
func cryptLayer(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, cryptoOp cryptoOp) (ocispec.Descriptor, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		resultReader      io.Reader
 | 
			
		||||
		newDesc           ocispec.Descriptor
 | 
			
		||||
		encLayerFinalizer ocicrypt.EncryptLayerFinalizer
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	dataReader, err := cs.ReaderAt(ctx, desc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ocispec.Descriptor{}, err
 | 
			
		||||
	}
 | 
			
		||||
	defer dataReader.Close()
 | 
			
		||||
 | 
			
		||||
	if cryptoOp == cryptoOpEncrypt {
 | 
			
		||||
		newDesc, resultReader, encLayerFinalizer, err = encryptLayer(cc, dataReader, desc)
 | 
			
		||||
	} else {
 | 
			
		||||
		newDesc, resultReader, err = decryptLayer(cc, dataReader, desc, cryptoOp == cryptoOpUnwrapOnly)
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil || cryptoOp == cryptoOpUnwrapOnly {
 | 
			
		||||
		return ocispec.Descriptor{}, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newDesc.Annotations = ocicrypt.FilterOutAnnotations(desc.Annotations)
 | 
			
		||||
 | 
			
		||||
	// some operations, such as changing recipients, may not touch the layer at all
 | 
			
		||||
	if resultReader != nil {
 | 
			
		||||
		var ref string
 | 
			
		||||
		// If we have the digest, write blob with checks
 | 
			
		||||
		haveDigest := newDesc.Digest.String() != ""
 | 
			
		||||
		if haveDigest {
 | 
			
		||||
			ref = fmt.Sprintf("layer-%s", newDesc.Digest.String())
 | 
			
		||||
		} else {
 | 
			
		||||
			ref = fmt.Sprintf("blob-%d-%d", rand.Int(), rand.Int())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if haveDigest {
 | 
			
		||||
			if err := content.WriteBlob(ctx, cs, ref, resultReader, newDesc); err != nil {
 | 
			
		||||
				return ocispec.Descriptor{}, fmt.Errorf("failed to write config: %w", err)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			newDesc.Digest, newDesc.Size, err = ingestReader(ctx, cs, ref, resultReader)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return ocispec.Descriptor{}, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// After performing encryption, call finalizer to get annotations
 | 
			
		||||
	if encLayerFinalizer != nil {
 | 
			
		||||
		annotations, err := encLayerFinalizer()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return ocispec.Descriptor{}, fmt.Errorf("error getting annotations from encLayer finalizer: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
		for k, v := range annotations {
 | 
			
		||||
			newDesc.Annotations[k] = v
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return newDesc, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ingestReader(ctx context.Context, cs content.Ingester, ref string, r io.Reader) (digest.Digest, int64, error) {
 | 
			
		||||
	cw, err := content.OpenWriter(ctx, cs, content.WithRef(ref))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", 0, fmt.Errorf("failed to open writer: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	defer cw.Close()
 | 
			
		||||
 | 
			
		||||
	if _, err := content.CopyReader(cw, r); err != nil {
 | 
			
		||||
		return "", 0, fmt.Errorf("copy failed: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	st, err := cw.Status()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", 0, fmt.Errorf("failed to get state: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := cw.Commit(ctx, st.Offset, ""); err != nil {
 | 
			
		||||
		if !errdefs.IsAlreadyExists(err) {
 | 
			
		||||
			return "", 0, fmt.Errorf("failed commit on ref %q: %w", ref, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return cw.Digest(), st.Offset, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encrypt or decrypt all the Children of a given descriptor
 | 
			
		||||
func cryptChildren(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter, cryptoOp cryptoOp, thisPlatform *ocispec.Platform) (ocispec.Descriptor, bool, error) {
 | 
			
		||||
	children, err := images.Children(ctx, cs, desc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if errdefs.IsNotFound(err) {
 | 
			
		||||
			return desc, false, nil
 | 
			
		||||
		}
 | 
			
		||||
		return ocispec.Descriptor{}, false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var newLayers []ocispec.Descriptor
 | 
			
		||||
	var config ocispec.Descriptor
 | 
			
		||||
	modified := false
 | 
			
		||||
 | 
			
		||||
	for _, child := range children {
 | 
			
		||||
		// we only encrypt child layers and have to update their parents if encryption happened
 | 
			
		||||
		switch child.MediaType {
 | 
			
		||||
		case images.MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig:
 | 
			
		||||
			config = child
 | 
			
		||||
		case images.MediaTypeDockerSchema2LayerGzip, images.MediaTypeDockerSchema2Layer,
 | 
			
		||||
			ocispec.MediaTypeImageLayerGzip, ocispec.MediaTypeImageLayer,
 | 
			
		||||
			ocispec.MediaTypeImageLayerZstd:
 | 
			
		||||
			if cryptoOp == cryptoOpEncrypt && lf(child) {
 | 
			
		||||
				nl, err := cryptLayer(ctx, cs, child, cc, cryptoOp)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return ocispec.Descriptor{}, false, err
 | 
			
		||||
				}
 | 
			
		||||
				modified = true
 | 
			
		||||
				newLayers = append(newLayers, nl)
 | 
			
		||||
			} else {
 | 
			
		||||
				newLayers = append(newLayers, child)
 | 
			
		||||
			}
 | 
			
		||||
		case encocispec.MediaTypeLayerGzipEnc, encocispec.MediaTypeLayerZstdEnc, encocispec.MediaTypeLayerEnc:
 | 
			
		||||
			// this one can be decrypted but also its recipients list changed
 | 
			
		||||
			if lf(child) {
 | 
			
		||||
				nl, err := cryptLayer(ctx, cs, child, cc, cryptoOp)
 | 
			
		||||
				if err != nil || cryptoOp == cryptoOpUnwrapOnly {
 | 
			
		||||
					return ocispec.Descriptor{}, false, err
 | 
			
		||||
				}
 | 
			
		||||
				modified = true
 | 
			
		||||
				newLayers = append(newLayers, nl)
 | 
			
		||||
			} else {
 | 
			
		||||
				newLayers = append(newLayers, child)
 | 
			
		||||
			}
 | 
			
		||||
		case images.MediaTypeDockerSchema2LayerForeign, images.MediaTypeDockerSchema2LayerForeignGzip:
 | 
			
		||||
			// never encrypt/decrypt
 | 
			
		||||
			newLayers = append(newLayers, child)
 | 
			
		||||
		default:
 | 
			
		||||
			return ocispec.Descriptor{}, false, fmt.Errorf("bad/unhandled MediaType %s in encryptChildren", child.MediaType)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if modified && len(newLayers) > 0 {
 | 
			
		||||
		newManifest := ocispec.Manifest{
 | 
			
		||||
			Versioned: specs.Versioned{
 | 
			
		||||
				SchemaVersion: 2,
 | 
			
		||||
			},
 | 
			
		||||
			Config: config,
 | 
			
		||||
			Layers: newLayers,
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mb, err := json.MarshalIndent(newManifest, "", "   ")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return ocispec.Descriptor{}, false, fmt.Errorf("failed to marshal image: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newDesc := ocispec.Descriptor{
 | 
			
		||||
			MediaType: ocispec.MediaTypeImageManifest,
 | 
			
		||||
			Size:      int64(len(mb)),
 | 
			
		||||
			Digest:    digest.Canonical.FromBytes(mb),
 | 
			
		||||
			Platform:  desc.Platform,
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		labels := map[string]string{}
 | 
			
		||||
		labels["containerd.io/gc.ref.content.0"] = newManifest.Config.Digest.String()
 | 
			
		||||
		for i, ch := range newManifest.Layers {
 | 
			
		||||
			labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i+1)] = ch.Digest.String()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ref := fmt.Sprintf("manifest-%s", newDesc.Digest.String())
 | 
			
		||||
 | 
			
		||||
		if err := content.WriteBlob(ctx, cs, ref, bytes.NewReader(mb), newDesc, content.WithLabels(labels)); err != nil {
 | 
			
		||||
			return ocispec.Descriptor{}, false, fmt.Errorf("failed to write config: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
		return newDesc, true, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return desc, modified, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cryptManifest encrypts or decrypts the children of a top level manifest
 | 
			
		||||
func cryptManifest(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter, cryptoOp cryptoOp) (ocispec.Descriptor, bool, error) {
 | 
			
		||||
	p, err := content.ReadBlob(ctx, cs, desc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ocispec.Descriptor{}, false, err
 | 
			
		||||
	}
 | 
			
		||||
	var manifest ocispec.Manifest
 | 
			
		||||
	if err := json.Unmarshal(p, &manifest); err != nil {
 | 
			
		||||
		return ocispec.Descriptor{}, false, err
 | 
			
		||||
	}
 | 
			
		||||
	platform := platforms.DefaultSpec()
 | 
			
		||||
	newDesc, modified, err := cryptChildren(ctx, cs, desc, cc, lf, cryptoOp, &platform)
 | 
			
		||||
	if err != nil || cryptoOp == cryptoOpUnwrapOnly {
 | 
			
		||||
		return ocispec.Descriptor{}, false, err
 | 
			
		||||
	}
 | 
			
		||||
	return newDesc, modified, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cryptManifestList encrypts or decrypts the children of a top level manifest list
 | 
			
		||||
func cryptManifestList(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter, cryptoOp cryptoOp) (ocispec.Descriptor, bool, error) {
 | 
			
		||||
	// read the index; if any layer is encrypted and any manifests change we will need to rewrite it
 | 
			
		||||
	b, err := content.ReadBlob(ctx, cs, desc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ocispec.Descriptor{}, false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var index ocispec.Index
 | 
			
		||||
	if err := json.Unmarshal(b, &index); err != nil {
 | 
			
		||||
		return ocispec.Descriptor{}, false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var newManifests []ocispec.Descriptor
 | 
			
		||||
	modified := false
 | 
			
		||||
	for _, manifest := range index.Manifests {
 | 
			
		||||
		if cryptoOp == cryptoOpUnwrapOnly && !isLocalPlatform(manifest.Platform) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		newManifest, m, err := cryptChildren(ctx, cs, manifest, cc, lf, cryptoOp, manifest.Platform)
 | 
			
		||||
		if err != nil || cryptoOp == cryptoOpUnwrapOnly {
 | 
			
		||||
			return ocispec.Descriptor{}, false, err
 | 
			
		||||
		}
 | 
			
		||||
		if m {
 | 
			
		||||
			modified = true
 | 
			
		||||
		}
 | 
			
		||||
		newManifests = append(newManifests, newManifest)
 | 
			
		||||
	}
 | 
			
		||||
	if cryptoOp == cryptoOpUnwrapOnly {
 | 
			
		||||
		return ocispec.Descriptor{}, false, fmt.Errorf("No manifest found for local platform")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if modified {
 | 
			
		||||
		// we need to update the index
 | 
			
		||||
		newIndex := ocispec.Index{
 | 
			
		||||
			Versioned: index.Versioned,
 | 
			
		||||
			Manifests: newManifests,
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mb, err := json.MarshalIndent(newIndex, "", "   ")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return ocispec.Descriptor{}, false, fmt.Errorf("failed to marshal index: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newDesc := ocispec.Descriptor{
 | 
			
		||||
			MediaType: ocispec.MediaTypeImageIndex,
 | 
			
		||||
			Size:      int64(len(mb)),
 | 
			
		||||
			Digest:    digest.Canonical.FromBytes(mb),
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		labels := map[string]string{}
 | 
			
		||||
		for i, m := range newIndex.Manifests {
 | 
			
		||||
			labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i)] = m.Digest.String()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ref := fmt.Sprintf("index-%s", newDesc.Digest.String())
 | 
			
		||||
 | 
			
		||||
		if err = content.WriteBlob(ctx, cs, ref, bytes.NewReader(mb), newDesc, content.WithLabels(labels)); err != nil {
 | 
			
		||||
			return ocispec.Descriptor{}, false, fmt.Errorf("failed to write index: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
		return newDesc, true, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return desc, false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cryptImage is the dispatcher to encrypt/decrypt an image; it accepts either an OCI descriptor
 | 
			
		||||
// representing a manifest list or a single manifest
 | 
			
		||||
func cryptImage(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter, cryptoOp cryptoOp) (ocispec.Descriptor, bool, error) {
 | 
			
		||||
	if cc == nil {
 | 
			
		||||
		return ocispec.Descriptor{}, false, errors.New("invalid argument: CryptoConfig must not be nil")
 | 
			
		||||
	}
 | 
			
		||||
	switch desc.MediaType {
 | 
			
		||||
	case ocispec.MediaTypeImageIndex, images.MediaTypeDockerSchema2ManifestList:
 | 
			
		||||
		return cryptManifestList(ctx, cs, desc, cc, lf, cryptoOp)
 | 
			
		||||
	case ocispec.MediaTypeImageManifest, images.MediaTypeDockerSchema2Manifest:
 | 
			
		||||
		return cryptManifest(ctx, cs, desc, cc, lf, cryptoOp)
 | 
			
		||||
	default:
 | 
			
		||||
		return ocispec.Descriptor{}, false, fmt.Errorf("unhandled media type: %s", desc.MediaType)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptImage encrypts an image; it accepts either an OCI descriptor representing a manifest list or a single manifest
 | 
			
		||||
func EncryptImage(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter) (ocispec.Descriptor, bool, error) {
 | 
			
		||||
	return cryptImage(ctx, cs, desc, cc, lf, cryptoOpEncrypt)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptImage decrypts an image; it accepts either an OCI descriptor representing a manifest list or a single manifest
 | 
			
		||||
func DecryptImage(ctx context.Context, cs content.Store, desc ocispec.Descriptor, cc *encconfig.CryptoConfig, lf LayerFilter) (ocispec.Descriptor, bool, error) {
 | 
			
		||||
	return cryptImage(ctx, cs, desc, cc, lf, cryptoOpDecrypt)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetImageEncryptConverter returns a converter function for image encryption
 | 
			
		||||
func GetImageEncryptConverter(cc *encconfig.CryptoConfig, lf LayerFilter) converter.ConvertFunc {
 | 
			
		||||
	return func(ctx context.Context, cs content.Store, desc ocispec.Descriptor) (*ocispec.Descriptor, error) {
 | 
			
		||||
		newDesc, _, err := EncryptImage(ctx, cs, desc, cc, lf)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return &newDesc, nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetImageDecryptConverter returns a converter function for image decryption
 | 
			
		||||
func GetImageDecryptConverter(cc *encconfig.CryptoConfig, lf LayerFilter) converter.ConvertFunc {
 | 
			
		||||
	return func(ctx context.Context, cs content.Store, desc ocispec.Descriptor) (*ocispec.Descriptor, error) {
 | 
			
		||||
		newDesc, _, err := DecryptImage(ctx, cs, desc, cc, lf)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return &newDesc, nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CheckAuthorization checks whether a user has the right keys to be allowed to access an image (every layer)
 | 
			
		||||
// It takes decrypting of the layers only as far as decrypting the asymmetrically encrypted data
 | 
			
		||||
// The decryption is only done for the current platform
 | 
			
		||||
func CheckAuthorization(ctx context.Context, cs content.Store, desc ocispec.Descriptor, dc *encconfig.DecryptConfig) error {
 | 
			
		||||
	cc := encconfig.InitDecryption(dc.Parameters)
 | 
			
		||||
 | 
			
		||||
	lf := func(desc ocispec.Descriptor) bool {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, _, err := cryptImage(ctx, cs, desc, &cc, lf, cryptoOpUnwrapOnly)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("you are not authorized to use this image: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										53
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/payload.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/containerd/imgcrypt/images/encryption/payload.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,53 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package encryption
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
 | 
			
		||||
	"github.com/containerd/containerd/diff"
 | 
			
		||||
	"github.com/gogo/protobuf/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var processorPayloadsUseGogo bool
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	var c = &diff.ApplyConfig{}
 | 
			
		||||
	var pbany *types.Any
 | 
			
		||||
 | 
			
		||||
	pp := reflect.TypeOf(c.ProcessorPayloads)
 | 
			
		||||
	processorPayloadsUseGogo = pp.Elem() == reflect.TypeOf(pbany)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func clearProcessorPayloads(c *diff.ApplyConfig) {
 | 
			
		||||
	var empty = reflect.MakeMap(reflect.TypeOf(c.ProcessorPayloads))
 | 
			
		||||
	reflect.ValueOf(&c.ProcessorPayloads).Elem().Set(empty)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setProcessorPayload(c *diff.ApplyConfig, id string, value pbAny) {
 | 
			
		||||
	if c.ProcessorPayloads == nil {
 | 
			
		||||
		clearProcessorPayloads(c)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var v reflect.Value
 | 
			
		||||
	if processorPayloadsUseGogo {
 | 
			
		||||
		v = reflect.ValueOf(fromAny(value))
 | 
			
		||||
	} else {
 | 
			
		||||
		v = reflect.ValueOf(value)
 | 
			
		||||
	}
 | 
			
		||||
	reflect.ValueOf(c.ProcessorPayloads).SetMapIndex(reflect.ValueOf(id), v)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								vendor/github.com/containerd/imgcrypt/payload.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/containerd/imgcrypt/payload.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,44 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package imgcrypt
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/containerd/typeurl"
 | 
			
		||||
 | 
			
		||||
	encconfig "github.com/containers/ocicrypt/config"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	PayloadURI = "io.containerd.ocicrypt.v1.Payload"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var PayloadToolIDs = []string{
 | 
			
		||||
	"io.containerd.ocicrypt.decoder.v1.tar",
 | 
			
		||||
	"io.containerd.ocicrypt.decoder.v1.tar.gzip",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	typeurl.Register(&Payload{}, PayloadURI)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Payload holds data that the external layer decryption tool
 | 
			
		||||
// needs for decrypting a layer
 | 
			
		||||
type Payload struct {
 | 
			
		||||
	DecryptConfig encconfig.DecryptConfig
 | 
			
		||||
	Descriptor    ocispec.Descriptor
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/containerd/typeurl/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/containerd/typeurl/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,2 +0,0 @@
 | 
			
		||||
*.test
 | 
			
		||||
coverage.txt
 | 
			
		||||
							
								
								
									
										191
									
								
								vendor/github.com/containerd/typeurl/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										191
									
								
								vendor/github.com/containerd/typeurl/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,191 +0,0 @@
 | 
			
		||||
 | 
			
		||||
                                 Apache License
 | 
			
		||||
                           Version 2.0, January 2004
 | 
			
		||||
                        https://www.apache.org/licenses/
 | 
			
		||||
 | 
			
		||||
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
			
		||||
 | 
			
		||||
   1. Definitions.
 | 
			
		||||
 | 
			
		||||
      "License" shall mean the terms and conditions for use, reproduction,
 | 
			
		||||
      and distribution as defined by Sections 1 through 9 of this document.
 | 
			
		||||
 | 
			
		||||
      "Licensor" shall mean the copyright owner or entity authorized by
 | 
			
		||||
      the copyright owner that is granting the License.
 | 
			
		||||
 | 
			
		||||
      "Legal Entity" shall mean the union of the acting entity and all
 | 
			
		||||
      other entities that control, are controlled by, or are under common
 | 
			
		||||
      control with that entity. For the purposes of this definition,
 | 
			
		||||
      "control" means (i) the power, direct or indirect, to cause the
 | 
			
		||||
      direction or management of such entity, whether by contract or
 | 
			
		||||
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
			
		||||
      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
			
		||||
 | 
			
		||||
      "You" (or "Your") shall mean an individual or Legal Entity
 | 
			
		||||
      exercising permissions granted by this License.
 | 
			
		||||
 | 
			
		||||
      "Source" form shall mean the preferred form for making modifications,
 | 
			
		||||
      including but not limited to software source code, documentation
 | 
			
		||||
      source, and configuration files.
 | 
			
		||||
 | 
			
		||||
      "Object" form shall mean any form resulting from mechanical
 | 
			
		||||
      transformation or translation of a Source form, including but
 | 
			
		||||
      not limited to compiled object code, generated documentation,
 | 
			
		||||
      and conversions to other media types.
 | 
			
		||||
 | 
			
		||||
      "Work" shall mean the work of authorship, whether in Source or
 | 
			
		||||
      Object form, made available under the License, as indicated by a
 | 
			
		||||
      copyright notice that is included in or attached to the work
 | 
			
		||||
      (an example is provided in the Appendix below).
 | 
			
		||||
 | 
			
		||||
      "Derivative Works" shall mean any work, whether in Source or Object
 | 
			
		||||
      form, that is based on (or derived from) the Work and for which the
 | 
			
		||||
      editorial revisions, annotations, elaborations, or other modifications
 | 
			
		||||
      represent, as a whole, an original work of authorship. For the purposes
 | 
			
		||||
      of this License, Derivative Works shall not include works that remain
 | 
			
		||||
      separable from, or merely link (or bind by name) to the interfaces of,
 | 
			
		||||
      the Work and Derivative Works thereof.
 | 
			
		||||
 | 
			
		||||
      "Contribution" shall mean any work of authorship, including
 | 
			
		||||
      the original version of the Work and any modifications or additions
 | 
			
		||||
      to that Work or Derivative Works thereof, that is intentionally
 | 
			
		||||
      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
			
		||||
      or by an individual or Legal Entity authorized to submit on behalf of
 | 
			
		||||
      the copyright owner. For the purposes of this definition, "submitted"
 | 
			
		||||
      means any form of electronic, verbal, or written communication sent
 | 
			
		||||
      to the Licensor or its representatives, including but not limited to
 | 
			
		||||
      communication on electronic mailing lists, source code control systems,
 | 
			
		||||
      and issue tracking systems that are managed by, or on behalf of, the
 | 
			
		||||
      Licensor for the purpose of discussing and improving the Work, but
 | 
			
		||||
      excluding communication that is conspicuously marked or otherwise
 | 
			
		||||
      designated in writing by the copyright owner as "Not a Contribution."
 | 
			
		||||
 | 
			
		||||
      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
			
		||||
      on behalf of whom a Contribution has been received by Licensor and
 | 
			
		||||
      subsequently incorporated within the Work.
 | 
			
		||||
 | 
			
		||||
   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      copyright license to reproduce, prepare Derivative Works of,
 | 
			
		||||
      publicly display, publicly perform, sublicense, and distribute the
 | 
			
		||||
      Work and such Derivative Works in Source or Object form.
 | 
			
		||||
 | 
			
		||||
   3. Grant of Patent License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      (except as stated in this section) patent license to make, have made,
 | 
			
		||||
      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
			
		||||
      where such license applies only to those patent claims licensable
 | 
			
		||||
      by such Contributor that are necessarily infringed by their
 | 
			
		||||
      Contribution(s) alone or by combination of their Contribution(s)
 | 
			
		||||
      with the Work to which such Contribution(s) was submitted. If You
 | 
			
		||||
      institute patent litigation against any entity (including a
 | 
			
		||||
      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
			
		||||
      or a Contribution incorporated within the Work constitutes direct
 | 
			
		||||
      or contributory patent infringement, then any patent licenses
 | 
			
		||||
      granted to You under this License for that Work shall terminate
 | 
			
		||||
      as of the date such litigation is filed.
 | 
			
		||||
 | 
			
		||||
   4. Redistribution. You may reproduce and distribute copies of the
 | 
			
		||||
      Work or Derivative Works thereof in any medium, with or without
 | 
			
		||||
      modifications, and in Source or Object form, provided that You
 | 
			
		||||
      meet the following conditions:
 | 
			
		||||
 | 
			
		||||
      (a) You must give any other recipients of the Work or
 | 
			
		||||
          Derivative Works a copy of this License; and
 | 
			
		||||
 | 
			
		||||
      (b) You must cause any modified files to carry prominent notices
 | 
			
		||||
          stating that You changed the files; and
 | 
			
		||||
 | 
			
		||||
      (c) You must retain, in the Source form of any Derivative Works
 | 
			
		||||
          that You distribute, all copyright, patent, trademark, and
 | 
			
		||||
          attribution notices from the Source form of the Work,
 | 
			
		||||
          excluding those notices that do not pertain to any part of
 | 
			
		||||
          the Derivative Works; and
 | 
			
		||||
 | 
			
		||||
      (d) If the Work includes a "NOTICE" text file as part of its
 | 
			
		||||
          distribution, then any Derivative Works that You distribute must
 | 
			
		||||
          include a readable copy of the attribution notices contained
 | 
			
		||||
          within such NOTICE file, excluding those notices that do not
 | 
			
		||||
          pertain to any part of the Derivative Works, in at least one
 | 
			
		||||
          of the following places: within a NOTICE text file distributed
 | 
			
		||||
          as part of the Derivative Works; within the Source form or
 | 
			
		||||
          documentation, if provided along with the Derivative Works; or,
 | 
			
		||||
          within a display generated by the Derivative Works, if and
 | 
			
		||||
          wherever such third-party notices normally appear. The contents
 | 
			
		||||
          of the NOTICE file are for informational purposes only and
 | 
			
		||||
          do not modify the License. You may add Your own attribution
 | 
			
		||||
          notices within Derivative Works that You distribute, alongside
 | 
			
		||||
          or as an addendum to the NOTICE text from the Work, provided
 | 
			
		||||
          that such additional attribution notices cannot be construed
 | 
			
		||||
          as modifying the License.
 | 
			
		||||
 | 
			
		||||
      You may add Your own copyright statement to Your modifications and
 | 
			
		||||
      may provide additional or different license terms and conditions
 | 
			
		||||
      for use, reproduction, or distribution of Your modifications, or
 | 
			
		||||
      for any such Derivative Works as a whole, provided Your use,
 | 
			
		||||
      reproduction, and distribution of the Work otherwise complies with
 | 
			
		||||
      the conditions stated in this License.
 | 
			
		||||
 | 
			
		||||
   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
			
		||||
      any Contribution intentionally submitted for inclusion in the Work
 | 
			
		||||
      by You to the Licensor shall be under the terms and conditions of
 | 
			
		||||
      this License, without any additional terms or conditions.
 | 
			
		||||
      Notwithstanding the above, nothing herein shall supersede or modify
 | 
			
		||||
      the terms of any separate license agreement you may have executed
 | 
			
		||||
      with Licensor regarding such Contributions.
 | 
			
		||||
 | 
			
		||||
   6. Trademarks. This License does not grant permission to use the trade
 | 
			
		||||
      names, trademarks, service marks, or product names of the Licensor,
 | 
			
		||||
      except as required for reasonable and customary use in describing the
 | 
			
		||||
      origin of the Work and reproducing the content of the NOTICE file.
 | 
			
		||||
 | 
			
		||||
   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
			
		||||
      agreed to in writing, Licensor provides the Work (and each
 | 
			
		||||
      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
			
		||||
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
			
		||||
      implied, including, without limitation, any warranties or conditions
 | 
			
		||||
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
			
		||||
      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
			
		||||
      appropriateness of using or redistributing the Work and assume any
 | 
			
		||||
      risks associated with Your exercise of permissions under this License.
 | 
			
		||||
 | 
			
		||||
   8. Limitation of Liability. In no event and under no legal theory,
 | 
			
		||||
      whether in tort (including negligence), contract, or otherwise,
 | 
			
		||||
      unless required by applicable law (such as deliberate and grossly
 | 
			
		||||
      negligent acts) or agreed to in writing, shall any Contributor be
 | 
			
		||||
      liable to You for damages, including any direct, indirect, special,
 | 
			
		||||
      incidental, or consequential damages of any character arising as a
 | 
			
		||||
      result of this License or out of the use or inability to use the
 | 
			
		||||
      Work (including but not limited to damages for loss of goodwill,
 | 
			
		||||
      work stoppage, computer failure or malfunction, or any and all
 | 
			
		||||
      other commercial damages or losses), even if such Contributor
 | 
			
		||||
      has been advised of the possibility of such damages.
 | 
			
		||||
 | 
			
		||||
   9. Accepting Warranty or Additional Liability. While redistributing
 | 
			
		||||
      the Work or Derivative Works thereof, You may choose to offer,
 | 
			
		||||
      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
			
		||||
      or other liability obligations and/or rights consistent with this
 | 
			
		||||
      License. However, in accepting such obligations, You may act only
 | 
			
		||||
      on Your own behalf and on Your sole responsibility, not on behalf
 | 
			
		||||
      of any other Contributor, and only if You agree to indemnify,
 | 
			
		||||
      defend, and hold each Contributor harmless for any liability
 | 
			
		||||
      incurred by, or claims asserted against, such Contributor by reason
 | 
			
		||||
      of your accepting any such warranty or additional liability.
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
   Copyright The containerd Authors
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       https://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/containerd/typeurl/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/containerd/typeurl/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,20 +0,0 @@
 | 
			
		||||
# typeurl
 | 
			
		||||
 | 
			
		||||
[](https://pkg.go.dev/github.com/containerd/typeurl)
 | 
			
		||||
[](https://github.com/containerd/typeurl/actions?query=workflow%3ACI)
 | 
			
		||||
[](https://codecov.io/gh/containerd/typeurl)
 | 
			
		||||
[](https://goreportcard.com/report/github.com/containerd/typeurl)
 | 
			
		||||
 | 
			
		||||
A Go package for managing the registration, marshaling, and unmarshaling of encoded types.
 | 
			
		||||
 | 
			
		||||
This package helps when types are sent over a GRPC API and marshaled as a [protobuf.Any](https://github.com/gogo/protobuf/blob/master/protobuf/google/protobuf/any.proto).
 | 
			
		||||
 | 
			
		||||
## Project details
 | 
			
		||||
 | 
			
		||||
**typeurl** is a containerd sub-project, licensed under the [Apache 2.0 license](./LICENSE).
 | 
			
		||||
As a containerd sub-project, you will find the:
 | 
			
		||||
 * [Project governance](https://github.com/containerd/project/blob/master/GOVERNANCE.md),
 | 
			
		||||
 * [Maintainers](https://github.com/containerd/project/blob/master/MAINTAINERS),
 | 
			
		||||
 * and [Contributing guidelines](https://github.com/containerd/project/blob/master/CONTRIBUTING.md)
 | 
			
		||||
 | 
			
		||||
information in our [`containerd/project`](https://github.com/containerd/project) repository.
 | 
			
		||||
							
								
								
									
										83
									
								
								vendor/github.com/containerd/typeurl/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/containerd/typeurl/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,83 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package typeurl
 | 
			
		||||
 | 
			
		||||
// Package typeurl assists with managing the registration, marshaling, and
 | 
			
		||||
// unmarshaling of types encoded as protobuf.Any.
 | 
			
		||||
//
 | 
			
		||||
// A protobuf.Any is a proto message that can contain any arbitrary data. It
 | 
			
		||||
// consists of two components, a TypeUrl and a Value, and its proto definition
 | 
			
		||||
// looks like this:
 | 
			
		||||
//
 | 
			
		||||
//   message Any {
 | 
			
		||||
//     string type_url = 1;
 | 
			
		||||
//     bytes value = 2;
 | 
			
		||||
//   }
 | 
			
		||||
//
 | 
			
		||||
// The TypeUrl is used to distinguish the contents from other proto.Any
 | 
			
		||||
// messages. This typeurl library manages these URLs to enable automagic
 | 
			
		||||
// marshaling and unmarshaling of the contents.
 | 
			
		||||
//
 | 
			
		||||
// For example, consider this go struct:
 | 
			
		||||
//
 | 
			
		||||
//   type Foo struct {
 | 
			
		||||
//     Field1 string
 | 
			
		||||
//     Field2 string
 | 
			
		||||
//   }
 | 
			
		||||
//
 | 
			
		||||
// To use typeurl, types must first be registered. This is typically done in
 | 
			
		||||
// the init function
 | 
			
		||||
//
 | 
			
		||||
//   func init() {
 | 
			
		||||
//      typeurl.Register(&Foo{}, "Foo")
 | 
			
		||||
//   }
 | 
			
		||||
//
 | 
			
		||||
// This will register the type Foo with the url path "Foo". The arguments to
 | 
			
		||||
// Register are variadic, and are used to construct a url path. Consider this
 | 
			
		||||
// example, from the github.com/containerd/containerd/client package:
 | 
			
		||||
//
 | 
			
		||||
//   func init() {
 | 
			
		||||
//     const prefix = "types.containerd.io"
 | 
			
		||||
//     // register TypeUrls for commonly marshaled external types
 | 
			
		||||
//     major := strconv.Itoa(specs.VersionMajor)
 | 
			
		||||
//     typeurl.Register(&specs.Spec{}, prefix, "opencontainers/runtime-spec", major, "Spec")
 | 
			
		||||
//     // this function has more Register calls, which are elided.
 | 
			
		||||
//   }
 | 
			
		||||
//
 | 
			
		||||
// This registers several types under a more complex url, which ends up mapping
 | 
			
		||||
// to `types.containerd.io/opencontainers/runtime-spec/1/Spec` (or some other
 | 
			
		||||
// value for major).
 | 
			
		||||
//
 | 
			
		||||
// Once a type is registered, it can be marshaled to a proto.Any message simply
 | 
			
		||||
// by calling `MarshalAny`, like this:
 | 
			
		||||
//
 | 
			
		||||
//   foo := &Foo{Field1: "value1", Field2: "value2"}
 | 
			
		||||
//   anyFoo, err := typeurl.MarshalAny(foo)
 | 
			
		||||
//
 | 
			
		||||
// MarshalAny will resolve the correct URL for the type. If the type in
 | 
			
		||||
// question implements the proto.Message interface, then it will be marshaled
 | 
			
		||||
// as a proto message. Otherwise, it will be marshaled as json. This means that
 | 
			
		||||
// typeurl will work on any arbitrary data, whether or not it has a proto
 | 
			
		||||
// definition, as long as it can be serialized to json.
 | 
			
		||||
//
 | 
			
		||||
// To unmarshal, the process is simply inverse:
 | 
			
		||||
//
 | 
			
		||||
//   iface, err := typeurl.UnmarshalAny(anyFoo)
 | 
			
		||||
//   foo := iface.(*Foo)
 | 
			
		||||
//
 | 
			
		||||
// The correct type is automatically chosen from the type registry, and the
 | 
			
		||||
// returned interface can be cast straight to that type.
 | 
			
		||||
							
								
								
									
										214
									
								
								vendor/github.com/containerd/typeurl/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										214
									
								
								vendor/github.com/containerd/typeurl/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,214 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package typeurl
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"path"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/gogo/protobuf/proto"
 | 
			
		||||
	"github.com/gogo/protobuf/types"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	mu       sync.RWMutex
 | 
			
		||||
	registry = make(map[reflect.Type]string)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Definitions of common error types used throughout typeurl.
 | 
			
		||||
//
 | 
			
		||||
// These error types are used with errors.Wrap and errors.Wrapf to add context
 | 
			
		||||
// to an error.
 | 
			
		||||
//
 | 
			
		||||
// To detect an error class, use errors.Is() functions to tell whether an
 | 
			
		||||
// error is of this type.
 | 
			
		||||
var (
 | 
			
		||||
	ErrNotFound = errors.New("not found")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Register a type with a base URL for JSON marshaling. When the MarshalAny and
 | 
			
		||||
// UnmarshalAny functions are called they will treat the Any type value as JSON.
 | 
			
		||||
// To use protocol buffers for handling the Any value the proto.Register
 | 
			
		||||
// function should be used instead of this function.
 | 
			
		||||
func Register(v interface{}, args ...string) {
 | 
			
		||||
	var (
 | 
			
		||||
		t = tryDereference(v)
 | 
			
		||||
		p = path.Join(args...)
 | 
			
		||||
	)
 | 
			
		||||
	mu.Lock()
 | 
			
		||||
	defer mu.Unlock()
 | 
			
		||||
	if et, ok := registry[t]; ok {
 | 
			
		||||
		if et != p {
 | 
			
		||||
			panic(errors.Errorf("type registered with alternate path %q != %q", et, p))
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	registry[t] = p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TypeURL returns the type url for a registered type.
 | 
			
		||||
func TypeURL(v interface{}) (string, error) {
 | 
			
		||||
	mu.RLock()
 | 
			
		||||
	u, ok := registry[tryDereference(v)]
 | 
			
		||||
	mu.RUnlock()
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// fallback to the proto registry if it is a proto message
 | 
			
		||||
		pb, ok := v.(proto.Message)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return "", errors.Wrapf(ErrNotFound, "type %s", reflect.TypeOf(v))
 | 
			
		||||
		}
 | 
			
		||||
		return proto.MessageName(pb), nil
 | 
			
		||||
	}
 | 
			
		||||
	return u, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Is returns true if the type of the Any is the same as v.
 | 
			
		||||
func Is(any *types.Any, v interface{}) bool {
 | 
			
		||||
	// call to check that v is a pointer
 | 
			
		||||
	tryDereference(v)
 | 
			
		||||
	url, err := TypeURL(v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return any.TypeUrl == url
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAny marshals the value v into an any with the correct TypeUrl.
 | 
			
		||||
// If the provided object is already a proto.Any message, then it will be
 | 
			
		||||
// returned verbatim. If it is of type proto.Message, it will be marshaled as a
 | 
			
		||||
// protocol buffer. Otherwise, the object will be marshaled to json.
 | 
			
		||||
func MarshalAny(v interface{}) (*types.Any, error) {
 | 
			
		||||
	var marshal func(v interface{}) ([]byte, error)
 | 
			
		||||
	switch t := v.(type) {
 | 
			
		||||
	case *types.Any:
 | 
			
		||||
		// avoid reserializing the type if we have an any.
 | 
			
		||||
		return t, nil
 | 
			
		||||
	case proto.Message:
 | 
			
		||||
		marshal = func(v interface{}) ([]byte, error) {
 | 
			
		||||
			return proto.Marshal(t)
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		marshal = json.Marshal
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url, err := TypeURL(v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data, err := marshal(v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &types.Any{
 | 
			
		||||
		TypeUrl: url,
 | 
			
		||||
		Value:   data,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAny unmarshals the any type into a concrete type.
 | 
			
		||||
func UnmarshalAny(any *types.Any) (interface{}, error) {
 | 
			
		||||
	return UnmarshalByTypeURL(any.TypeUrl, any.Value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalByTypeURL unmarshals the given type and value to into a concrete type.
 | 
			
		||||
func UnmarshalByTypeURL(typeURL string, value []byte) (interface{}, error) {
 | 
			
		||||
	return unmarshal(typeURL, value, nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalTo unmarshals the any type into a concrete type passed in the out
 | 
			
		||||
// argument. It is identical to UnmarshalAny, but lets clients provide a
 | 
			
		||||
// destination type through the out argument.
 | 
			
		||||
func UnmarshalTo(any *types.Any, out interface{}) error {
 | 
			
		||||
	return UnmarshalToByTypeURL(any.TypeUrl, any.Value, out)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalTo unmarshals the given type and value into a concrete type passed
 | 
			
		||||
// in the out argument. It is identical to UnmarshalByTypeURL, but lets clients
 | 
			
		||||
// provide a destination type through the out argument.
 | 
			
		||||
func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error {
 | 
			
		||||
	_, err := unmarshal(typeURL, value, out)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) {
 | 
			
		||||
	t, err := getTypeByUrl(typeURL)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v == nil {
 | 
			
		||||
		v = reflect.New(t.t).Interface()
 | 
			
		||||
	} else {
 | 
			
		||||
		// Validate interface type provided by client
 | 
			
		||||
		vURL, err := TypeURL(v)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if typeURL != vURL {
 | 
			
		||||
			return nil, errors.Errorf("can't unmarshal type %q to output %q", typeURL, vURL)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if t.isProto {
 | 
			
		||||
		err = proto.Unmarshal(value, v.(proto.Message))
 | 
			
		||||
	} else {
 | 
			
		||||
		err = json.Unmarshal(value, v)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return v, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type urlType struct {
 | 
			
		||||
	t       reflect.Type
 | 
			
		||||
	isProto bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getTypeByUrl(url string) (urlType, error) {
 | 
			
		||||
	mu.RLock()
 | 
			
		||||
	for t, u := range registry {
 | 
			
		||||
		if u == url {
 | 
			
		||||
			mu.RUnlock()
 | 
			
		||||
			return urlType{
 | 
			
		||||
				t: t,
 | 
			
		||||
			}, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	mu.RUnlock()
 | 
			
		||||
	// fallback to proto registry
 | 
			
		||||
	t := proto.MessageType(url)
 | 
			
		||||
	if t != nil {
 | 
			
		||||
		return urlType{
 | 
			
		||||
			// get the underlying Elem because proto returns a pointer to the type
 | 
			
		||||
			t:       t.Elem(),
 | 
			
		||||
			isProto: true,
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
	return urlType{}, errors.Wrapf(ErrNotFound, "type with url %s", url)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func tryDereference(v interface{}) reflect.Type {
 | 
			
		||||
	t := reflect.TypeOf(v)
 | 
			
		||||
	if t.Kind() == reflect.Ptr {
 | 
			
		||||
		// require check of pointer but dereference to register
 | 
			
		||||
		return t.Elem()
 | 
			
		||||
	}
 | 
			
		||||
	panic("v is not a pointer to a type")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								vendor/github.com/containers/ocicrypt/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/containers/ocicrypt/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +0,0 @@
 | 
			
		||||
dist: bionic
 | 
			
		||||
language: go
 | 
			
		||||
 | 
			
		||||
os:
 | 
			
		||||
- linux
 | 
			
		||||
 | 
			
		||||
go:
 | 
			
		||||
  - "1.13.x"
 | 
			
		||||
  - "1.16.x"
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
  include:
 | 
			
		||||
    - os: linux
 | 
			
		||||
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    packages:
 | 
			
		||||
    - gnutls-bin
 | 
			
		||||
    - softhsm2
 | 
			
		||||
 | 
			
		||||
go_import_path: github.com/containers/ocicrypt
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.46.2
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - make
 | 
			
		||||
  - make check
 | 
			
		||||
  - make test
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/containers/ocicrypt/ADOPTERS.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/containers/ocicrypt/ADOPTERS.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +0,0 @@
 | 
			
		||||
Below are list of adopters of the `ocicrypt` library or supports use of OCI encrypted images:
 | 
			
		||||
- [skopeo](https://github.com/containers/skopeo)
 | 
			
		||||
- [buildah](https://github.com/containers/buildah)
 | 
			
		||||
- [containerd](https://github.com/containerd/imgcrypt)
 | 
			
		||||
- [nerdctl](https://github.com/containerd/nerdctl)
 | 
			
		||||
- [distribution](https://github.com/distribution/distribution)
 | 
			
		||||
 | 
			
		||||
Below are the list of projects that are in the process of adopting support:
 | 
			
		||||
- [quay](https://github.com/quay/quay)
 | 
			
		||||
- [kata-containers](https://github.com/kata-containers/kata-containers)
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/containers/ocicrypt/CODE-OF-CONDUCT.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containers/ocicrypt/CODE-OF-CONDUCT.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
## The OCIcrypt Library Project Community Code of Conduct
 | 
			
		||||
 | 
			
		||||
The OCIcrypt Library project follows the [Containers Community Code of Conduct](https://github.com/containers/common/blob/master/CODE-OF-CONDUCT.md).
 | 
			
		||||
							
								
								
									
										189
									
								
								vendor/github.com/containers/ocicrypt/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										189
									
								
								vendor/github.com/containers/ocicrypt/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,189 +0,0 @@
 | 
			
		||||
 | 
			
		||||
                                 Apache License
 | 
			
		||||
                           Version 2.0, January 2004
 | 
			
		||||
                        https://www.apache.org/licenses/
 | 
			
		||||
 | 
			
		||||
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
			
		||||
 | 
			
		||||
   1. Definitions.
 | 
			
		||||
 | 
			
		||||
      "License" shall mean the terms and conditions for use, reproduction,
 | 
			
		||||
      and distribution as defined by Sections 1 through 9 of this document.
 | 
			
		||||
 | 
			
		||||
      "Licensor" shall mean the copyright owner or entity authorized by
 | 
			
		||||
      the copyright owner that is granting the License.
 | 
			
		||||
 | 
			
		||||
      "Legal Entity" shall mean the union of the acting entity and all
 | 
			
		||||
      other entities that control, are controlled by, or are under common
 | 
			
		||||
      control with that entity. For the purposes of this definition,
 | 
			
		||||
      "control" means (i) the power, direct or indirect, to cause the
 | 
			
		||||
      direction or management of such entity, whether by contract or
 | 
			
		||||
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
			
		||||
      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
			
		||||
 | 
			
		||||
      "You" (or "Your") shall mean an individual or Legal Entity
 | 
			
		||||
      exercising permissions granted by this License.
 | 
			
		||||
 | 
			
		||||
      "Source" form shall mean the preferred form for making modifications,
 | 
			
		||||
      including but not limited to software source code, documentation
 | 
			
		||||
      source, and configuration files.
 | 
			
		||||
 | 
			
		||||
      "Object" form shall mean any form resulting from mechanical
 | 
			
		||||
      transformation or translation of a Source form, including but
 | 
			
		||||
      not limited to compiled object code, generated documentation,
 | 
			
		||||
      and conversions to other media types.
 | 
			
		||||
 | 
			
		||||
      "Work" shall mean the work of authorship, whether in Source or
 | 
			
		||||
      Object form, made available under the License, as indicated by a
 | 
			
		||||
      copyright notice that is included in or attached to the work
 | 
			
		||||
      (an example is provided in the Appendix below).
 | 
			
		||||
 | 
			
		||||
      "Derivative Works" shall mean any work, whether in Source or Object
 | 
			
		||||
      form, that is based on (or derived from) the Work and for which the
 | 
			
		||||
      editorial revisions, annotations, elaborations, or other modifications
 | 
			
		||||
      represent, as a whole, an original work of authorship. For the purposes
 | 
			
		||||
      of this License, Derivative Works shall not include works that remain
 | 
			
		||||
      separable from, or merely link (or bind by name) to the interfaces of,
 | 
			
		||||
      the Work and Derivative Works thereof.
 | 
			
		||||
 | 
			
		||||
      "Contribution" shall mean any work of authorship, including
 | 
			
		||||
      the original version of the Work and any modifications or additions
 | 
			
		||||
      to that Work or Derivative Works thereof, that is intentionally
 | 
			
		||||
      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
			
		||||
      or by an individual or Legal Entity authorized to submit on behalf of
 | 
			
		||||
      the copyright owner. For the purposes of this definition, "submitted"
 | 
			
		||||
      means any form of electronic, verbal, or written communication sent
 | 
			
		||||
      to the Licensor or its representatives, including but not limited to
 | 
			
		||||
      communication on electronic mailing lists, source code control systems,
 | 
			
		||||
      and issue tracking systems that are managed by, or on behalf of, the
 | 
			
		||||
      Licensor for the purpose of discussing and improving the Work, but
 | 
			
		||||
      excluding communication that is conspicuously marked or otherwise
 | 
			
		||||
      designated in writing by the copyright owner as "Not a Contribution."
 | 
			
		||||
 | 
			
		||||
      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
			
		||||
      on behalf of whom a Contribution has been received by Licensor and
 | 
			
		||||
      subsequently incorporated within the Work.
 | 
			
		||||
 | 
			
		||||
   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      copyright license to reproduce, prepare Derivative Works of,
 | 
			
		||||
      publicly display, publicly perform, sublicense, and distribute the
 | 
			
		||||
      Work and such Derivative Works in Source or Object form.
 | 
			
		||||
 | 
			
		||||
   3. Grant of Patent License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      (except as stated in this section) patent license to make, have made,
 | 
			
		||||
      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
			
		||||
      where such license applies only to those patent claims licensable
 | 
			
		||||
      by such Contributor that are necessarily infringed by their
 | 
			
		||||
      Contribution(s) alone or by combination of their Contribution(s)
 | 
			
		||||
      with the Work to which such Contribution(s) was submitted. If You
 | 
			
		||||
      institute patent litigation against any entity (including a
 | 
			
		||||
      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
			
		||||
      or a Contribution incorporated within the Work constitutes direct
 | 
			
		||||
      or contributory patent infringement, then any patent licenses
 | 
			
		||||
      granted to You under this License for that Work shall terminate
 | 
			
		||||
      as of the date such litigation is filed.
 | 
			
		||||
 | 
			
		||||
   4. Redistribution. You may reproduce and distribute copies of the
 | 
			
		||||
      Work or Derivative Works thereof in any medium, with or without
 | 
			
		||||
      modifications, and in Source or Object form, provided that You
 | 
			
		||||
      meet the following conditions:
 | 
			
		||||
 | 
			
		||||
      (a) You must give any other recipients of the Work or
 | 
			
		||||
          Derivative Works a copy of this License; and
 | 
			
		||||
 | 
			
		||||
      (b) You must cause any modified files to carry prominent notices
 | 
			
		||||
          stating that You changed the files; and
 | 
			
		||||
 | 
			
		||||
      (c) You must retain, in the Source form of any Derivative Works
 | 
			
		||||
          that You distribute, all copyright, patent, trademark, and
 | 
			
		||||
          attribution notices from the Source form of the Work,
 | 
			
		||||
          excluding those notices that do not pertain to any part of
 | 
			
		||||
          the Derivative Works; and
 | 
			
		||||
 | 
			
		||||
      (d) If the Work includes a "NOTICE" text file as part of its
 | 
			
		||||
          distribution, then any Derivative Works that You distribute must
 | 
			
		||||
          include a readable copy of the attribution notices contained
 | 
			
		||||
          within such NOTICE file, excluding those notices that do not
 | 
			
		||||
          pertain to any part of the Derivative Works, in at least one
 | 
			
		||||
          of the following places: within a NOTICE text file distributed
 | 
			
		||||
          as part of the Derivative Works; within the Source form or
 | 
			
		||||
          documentation, if provided along with the Derivative Works; or,
 | 
			
		||||
          within a display generated by the Derivative Works, if and
 | 
			
		||||
          wherever such third-party notices normally appear. The contents
 | 
			
		||||
          of the NOTICE file are for informational purposes only and
 | 
			
		||||
          do not modify the License. You may add Your own attribution
 | 
			
		||||
          notices within Derivative Works that You distribute, alongside
 | 
			
		||||
          or as an addendum to the NOTICE text from the Work, provided
 | 
			
		||||
          that such additional attribution notices cannot be construed
 | 
			
		||||
          as modifying the License.
 | 
			
		||||
 | 
			
		||||
      You may add Your own copyright statement to Your modifications and
 | 
			
		||||
      may provide additional or different license terms and conditions
 | 
			
		||||
      for use, reproduction, or distribution of Your modifications, or
 | 
			
		||||
      for any such Derivative Works as a whole, provided Your use,
 | 
			
		||||
      reproduction, and distribution of the Work otherwise complies with
 | 
			
		||||
      the conditions stated in this License.
 | 
			
		||||
 | 
			
		||||
   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
			
		||||
      any Contribution intentionally submitted for inclusion in the Work
 | 
			
		||||
      by You to the Licensor shall be under the terms and conditions of
 | 
			
		||||
      this License, without any additional terms or conditions.
 | 
			
		||||
      Notwithstanding the above, nothing herein shall supersede or modify
 | 
			
		||||
      the terms of any separate license agreement you may have executed
 | 
			
		||||
      with Licensor regarding such Contributions.
 | 
			
		||||
 | 
			
		||||
   6. Trademarks. This License does not grant permission to use the trade
 | 
			
		||||
      names, trademarks, service marks, or product names of the Licensor,
 | 
			
		||||
      except as required for reasonable and customary use in describing the
 | 
			
		||||
      origin of the Work and reproducing the content of the NOTICE file.
 | 
			
		||||
 | 
			
		||||
   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
			
		||||
      agreed to in writing, Licensor provides the Work (and each
 | 
			
		||||
      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
			
		||||
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
			
		||||
      implied, including, without limitation, any warranties or conditions
 | 
			
		||||
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
			
		||||
      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
			
		||||
      appropriateness of using or redistributing the Work and assume any
 | 
			
		||||
      risks associated with Your exercise of permissions under this License.
 | 
			
		||||
 | 
			
		||||
   8. Limitation of Liability. In no event and under no legal theory,
 | 
			
		||||
      whether in tort (including negligence), contract, or otherwise,
 | 
			
		||||
      unless required by applicable law (such as deliberate and grossly
 | 
			
		||||
      negligent acts) or agreed to in writing, shall any Contributor be
 | 
			
		||||
      liable to You for damages, including any direct, indirect, special,
 | 
			
		||||
      incidental, or consequential damages of any character arising as a
 | 
			
		||||
      result of this License or out of the use or inability to use the
 | 
			
		||||
      Work (including but not limited to damages for loss of goodwill,
 | 
			
		||||
      work stoppage, computer failure or malfunction, or any and all
 | 
			
		||||
      other commercial damages or losses), even if such Contributor
 | 
			
		||||
      has been advised of the possibility of such damages.
 | 
			
		||||
 | 
			
		||||
   9. Accepting Warranty or Additional Liability. While redistributing
 | 
			
		||||
      the Work or Derivative Works thereof, You may choose to offer,
 | 
			
		||||
      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
			
		||||
      or other liability obligations and/or rights consistent with this
 | 
			
		||||
      License. However, in accepting such obligations, You may act only
 | 
			
		||||
      on Your own behalf and on Your sole responsibility, not on behalf
 | 
			
		||||
      of any other Contributor, and only if You agree to indemnify,
 | 
			
		||||
      defend, and hold each Contributor harmless for any liability
 | 
			
		||||
      incurred by, or claims asserted against, such Contributor by reason
 | 
			
		||||
      of your accepting any such warranty or additional liability.
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       https://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/containers/ocicrypt/MAINTAINERS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/containers/ocicrypt/MAINTAINERS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +0,0 @@
 | 
			
		||||
# ocicrypt maintainers
 | 
			
		||||
#
 | 
			
		||||
# Github ID, Name, Email Address
 | 
			
		||||
lumjjb, Brandon Lum, lumjjb@gmail.com
 | 
			
		||||
stefanberger, Stefan Berger, stefanb@linux.ibm.com
 | 
			
		||||
arronwy, Arron Wang, arron.wang@intel.com 
 | 
			
		||||
							
								
								
									
										34
									
								
								vendor/github.com/containers/ocicrypt/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/containers/ocicrypt/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,34 +0,0 @@
 | 
			
		||||
#   Copyright The containerd Authors.
 | 
			
		||||
 | 
			
		||||
#   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
#   you may not use this file except in compliance with the License.
 | 
			
		||||
#   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
#       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
#   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
#   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
#   See the License for the specific language governing permissions and
 | 
			
		||||
#   limitations under the License.
 | 
			
		||||
 | 
			
		||||
.PHONY: check build decoder generate-protobuf
 | 
			
		||||
 | 
			
		||||
all: build
 | 
			
		||||
 | 
			
		||||
FORCE:
 | 
			
		||||
 | 
			
		||||
check:
 | 
			
		||||
	golangci-lint run
 | 
			
		||||
 | 
			
		||||
build: vendor
 | 
			
		||||
	go build ./...
 | 
			
		||||
 | 
			
		||||
vendor:
 | 
			
		||||
	go mod tidy
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
	go test ./... -test.v
 | 
			
		||||
 | 
			
		||||
generate-protobuf:
 | 
			
		||||
	protoc  -I utils/keyprovider/ utils/keyprovider/keyprovider.proto --go_out=plugins=grpc:utils/keyprovider
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/github.com/containers/ocicrypt/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/containers/ocicrypt/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,50 +0,0 @@
 | 
			
		||||
# OCIcrypt Library
 | 
			
		||||
 | 
			
		||||
The `ocicrypt` library is the OCI image spec implementation of container image encryption. More details of the spec can be seen in the [OCI repository](https://github.com/opencontainers/image-spec/pull/775). The purpose of this library is to encode spec structures and consts in code, as well as provide a consistent implementation of image encryption across container runtimes and build tools.
 | 
			
		||||
 | 
			
		||||
Consumers of OCIcrypt:
 | 
			
		||||
 | 
			
		||||
- [containerd/imgcrypt](https://github.com/containerd/imgcrypt)
 | 
			
		||||
- [cri-o](https://github.com/cri-o/cri-o)
 | 
			
		||||
- [skopeo](https://github.com/containers/skopeo)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
There are various levels of usage for this library. The main consumers of these would be runtime/build tools, and a more specific use would be in the ability to extend cryptographic function.
 | 
			
		||||
 | 
			
		||||
### Runtime/Build tool usage
 | 
			
		||||
 | 
			
		||||
The general exposed interface a runtime/build tool would use, would be to perform encryption or decryption of layers:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
package "github.com/containers/ocicrypt"
 | 
			
		||||
func EncryptLayer(ec *config.EncryptConfig, encOrPlainLayerReader io.Reader, desc ocispec.Descriptor) (io.Reader, EncryptLayerFinalizer, error)
 | 
			
		||||
func DecryptLayer(dc *config.DecryptConfig, encLayerReader io.Reader, desc ocispec.Descriptor, unwrapOnly bool) (io.Reader, digest.Digest, error)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The settings/parameters to these functions can be specified via creation of an encryption config with the `github.com/containers/ocicrypt/config` package. We note that because setting of annotations and other fields of the layer descriptor is done through various means in different runtimes/build tools, it is the responsibility of the caller to still ensure that the layer descriptor follows the OCI specification (i.e. encoding, setting annotations, etc.).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Crypto Agility and Extensibility
 | 
			
		||||
 | 
			
		||||
The implementation for both symmetric and asymmetric encryption used in this library are behind 2 main interfaces, which users can extend if need be. These are in the following packages:
 | 
			
		||||
- github.com/containers/ocicrypt/blockcipher - LayerBlockCipher interface for block ciphers
 | 
			
		||||
- github.com/containers/ocicrypt/keywrap - KeyWrapper interface for key wrapping
 | 
			
		||||
 | 
			
		||||
We note that adding interfaces here is risky outside the OCI spec is not recommended, unless for very specialized and confined usecases. Please open an issue or PR if there is a general usecase that could be added to the OCI spec.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Keyprovider interface
 | 
			
		||||
 | 
			
		||||
As part of the keywrap interface, there is a [keyprovider](https://github.com/containers/ocicrypt/blob/main/docs/keyprovider.md) implementation that allows one to call out to a binary or service.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Security Issues
 | 
			
		||||
 | 
			
		||||
We consider security issues related to this library critical. Please report and security related issues by emailing maintainers in the [MAINTAINERS](MAINTAINERS) file.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Ocicrypt Pkcs11 Support
 | 
			
		||||
 | 
			
		||||
Ocicrypt Pkcs11 support is currently experiemental. For more details, please refer to the [this document](docs/pkcs11.md).
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/containers/ocicrypt/SECURITY.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/containers/ocicrypt/SECURITY.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
## Security and Disclosure Information Policy for the OCIcrypt Library Project
 | 
			
		||||
 | 
			
		||||
The OCIcrypt Library Project follows the [Security and Disclosure Information Policy](https://github.com/containers/common/blob/master/SECURITY.md) for the Containers Projects.
 | 
			
		||||
							
								
								
									
										160
									
								
								vendor/github.com/containers/ocicrypt/blockcipher/blockcipher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										160
									
								
								vendor/github.com/containers/ocicrypt/blockcipher/blockcipher.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,160 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package blockcipher
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"github.com/opencontainers/go-digest"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LayerCipherType is the ciphertype as specified in the layer metadata
 | 
			
		||||
type LayerCipherType string
 | 
			
		||||
 | 
			
		||||
// TODO: Should be obtained from OCI spec once included
 | 
			
		||||
const (
 | 
			
		||||
	AES256CTR LayerCipherType = "AES_256_CTR_HMAC_SHA256"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// PrivateLayerBlockCipherOptions includes the information required to encrypt/decrypt
 | 
			
		||||
// an image which are sensitive and should not be in plaintext
 | 
			
		||||
type PrivateLayerBlockCipherOptions struct {
 | 
			
		||||
	// SymmetricKey represents the symmetric key used for encryption/decryption
 | 
			
		||||
	// This field should be populated by Encrypt/Decrypt calls
 | 
			
		||||
	SymmetricKey []byte `json:"symkey"`
 | 
			
		||||
 | 
			
		||||
	// Digest is the digest of the original data for verification.
 | 
			
		||||
	// This is NOT populated by Encrypt/Decrypt calls
 | 
			
		||||
	Digest digest.Digest `json:"digest"`
 | 
			
		||||
 | 
			
		||||
	// CipherOptions contains the cipher metadata used for encryption/decryption
 | 
			
		||||
	// This field should be populated by Encrypt/Decrypt calls
 | 
			
		||||
	CipherOptions map[string][]byte `json:"cipheroptions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PublicLayerBlockCipherOptions includes the information required to encrypt/decrypt
 | 
			
		||||
// an image which are public and can be deduplicated in plaintext across multiple
 | 
			
		||||
// recipients
 | 
			
		||||
type PublicLayerBlockCipherOptions struct {
 | 
			
		||||
	// CipherType denotes the cipher type according to the list of OCI suppported
 | 
			
		||||
	// cipher types.
 | 
			
		||||
	CipherType LayerCipherType `json:"cipher"`
 | 
			
		||||
 | 
			
		||||
	// Hmac contains the hmac string to help verify encryption
 | 
			
		||||
	Hmac []byte `json:"hmac"`
 | 
			
		||||
 | 
			
		||||
	// CipherOptions contains the cipher metadata used for encryption/decryption
 | 
			
		||||
	// This field should be populated by Encrypt/Decrypt calls
 | 
			
		||||
	CipherOptions map[string][]byte `json:"cipheroptions"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LayerBlockCipherOptions contains the public and private LayerBlockCipherOptions
 | 
			
		||||
// required to encrypt/decrypt an image
 | 
			
		||||
type LayerBlockCipherOptions struct {
 | 
			
		||||
	Public  PublicLayerBlockCipherOptions
 | 
			
		||||
	Private PrivateLayerBlockCipherOptions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LayerBlockCipher returns a provider for encrypt/decrypt functionality
 | 
			
		||||
// for handling the layer data for a specific algorithm
 | 
			
		||||
type LayerBlockCipher interface {
 | 
			
		||||
	// GenerateKey creates a symmetric key
 | 
			
		||||
	GenerateKey() ([]byte, error)
 | 
			
		||||
	// Encrypt takes in layer data and returns the ciphertext and relevant LayerBlockCipherOptions
 | 
			
		||||
	Encrypt(layerDataReader io.Reader, opt LayerBlockCipherOptions) (io.Reader, Finalizer, error)
 | 
			
		||||
	// Decrypt takes in layer ciphertext data and returns the plaintext and relevant LayerBlockCipherOptions
 | 
			
		||||
	Decrypt(layerDataReader io.Reader, opt LayerBlockCipherOptions) (io.Reader, LayerBlockCipherOptions, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LayerBlockCipherHandler is the handler for encrypt/decrypt for layers
 | 
			
		||||
type LayerBlockCipherHandler struct {
 | 
			
		||||
	cipherMap map[LayerCipherType]LayerBlockCipher
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Finalizer is called after data blobs are written, and returns the LayerBlockCipherOptions for the encrypted blob
 | 
			
		||||
type Finalizer func() (LayerBlockCipherOptions, error)
 | 
			
		||||
 | 
			
		||||
// GetOpt returns the value of the cipher option and if the option exists
 | 
			
		||||
func (lbco LayerBlockCipherOptions) GetOpt(key string) (value []byte, ok bool) {
 | 
			
		||||
	if v, ok := lbco.Public.CipherOptions[key]; ok {
 | 
			
		||||
		return v, ok
 | 
			
		||||
	} else if v, ok := lbco.Private.CipherOptions[key]; ok {
 | 
			
		||||
		return v, ok
 | 
			
		||||
	} else {
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func wrapFinalizerWithType(fin Finalizer, typ LayerCipherType) Finalizer {
 | 
			
		||||
	return func() (LayerBlockCipherOptions, error) {
 | 
			
		||||
		lbco, err := fin()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return LayerBlockCipherOptions{}, err
 | 
			
		||||
		}
 | 
			
		||||
		lbco.Public.CipherType = typ
 | 
			
		||||
		return lbco, err
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encrypt is the handler for the layer decryption routine
 | 
			
		||||
func (h *LayerBlockCipherHandler) Encrypt(plainDataReader io.Reader, typ LayerCipherType) (io.Reader, Finalizer, error) {
 | 
			
		||||
	if c, ok := h.cipherMap[typ]; ok {
 | 
			
		||||
		sk, err := c.GenerateKey()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, nil, err
 | 
			
		||||
		}
 | 
			
		||||
		opt := LayerBlockCipherOptions{
 | 
			
		||||
			Private: PrivateLayerBlockCipherOptions{
 | 
			
		||||
				SymmetricKey: sk,
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
		encDataReader, fin, err := c.Encrypt(plainDataReader, opt)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			fin = wrapFinalizerWithType(fin, typ)
 | 
			
		||||
		}
 | 
			
		||||
		return encDataReader, fin, err
 | 
			
		||||
	}
 | 
			
		||||
	return nil, nil, errors.Errorf("unsupported cipher type: %s", typ)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Decrypt is the handler for the layer decryption routine
 | 
			
		||||
func (h *LayerBlockCipherHandler) Decrypt(encDataReader io.Reader, opt LayerBlockCipherOptions) (io.Reader, LayerBlockCipherOptions, error) {
 | 
			
		||||
	typ := opt.Public.CipherType
 | 
			
		||||
	if typ == "" {
 | 
			
		||||
		return nil, LayerBlockCipherOptions{}, errors.New("no cipher type provided")
 | 
			
		||||
	}
 | 
			
		||||
	if c, ok := h.cipherMap[LayerCipherType(typ)]; ok {
 | 
			
		||||
		return c.Decrypt(encDataReader, opt)
 | 
			
		||||
	}
 | 
			
		||||
	return nil, LayerBlockCipherOptions{}, errors.Errorf("unsupported cipher type: %s", typ)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewLayerBlockCipherHandler returns a new default handler
 | 
			
		||||
func NewLayerBlockCipherHandler() (*LayerBlockCipherHandler, error) {
 | 
			
		||||
	h := LayerBlockCipherHandler{
 | 
			
		||||
		cipherMap: map[LayerCipherType]LayerBlockCipher{},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	h.cipherMap[AES256CTR], err = NewAESCTRLayerBlockCipher(256)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "unable to set up Cipher AES-256-CTR")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &h, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										193
									
								
								vendor/github.com/containers/ocicrypt/blockcipher/blockcipher_aes_ctr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										193
									
								
								vendor/github.com/containers/ocicrypt/blockcipher/blockcipher_aes_ctr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,193 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package blockcipher
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/aes"
 | 
			
		||||
	"crypto/cipher"
 | 
			
		||||
	"crypto/hmac"
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"crypto/sha256"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"hash"
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt/utils"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// AESCTRLayerBlockCipher implements the AES CTR stream cipher
 | 
			
		||||
type AESCTRLayerBlockCipher struct {
 | 
			
		||||
	keylen         int // in bytes
 | 
			
		||||
	reader         io.Reader
 | 
			
		||||
	encrypt        bool
 | 
			
		||||
	stream         cipher.Stream
 | 
			
		||||
	err            error
 | 
			
		||||
	hmac           hash.Hash
 | 
			
		||||
	expHmac        []byte
 | 
			
		||||
	doneEncrypting bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type aesctrcryptor struct {
 | 
			
		||||
	bc *AESCTRLayerBlockCipher
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewAESCTRLayerBlockCipher returns a new AES SIV block cipher of 256 or 512 bits
 | 
			
		||||
func NewAESCTRLayerBlockCipher(bits int) (LayerBlockCipher, error) {
 | 
			
		||||
	if bits != 256 {
 | 
			
		||||
		return nil, errors.New("AES CTR bit count not supported")
 | 
			
		||||
	}
 | 
			
		||||
	return &AESCTRLayerBlockCipher{keylen: bits / 8}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *aesctrcryptor) Read(p []byte) (int, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		o int
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if r.bc.err != nil {
 | 
			
		||||
		return 0, r.bc.err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	o, err := utils.FillBuffer(r.bc.reader, p)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == io.EOF {
 | 
			
		||||
			r.bc.err = err
 | 
			
		||||
		} else {
 | 
			
		||||
			return 0, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !r.bc.encrypt {
 | 
			
		||||
		if _, err := r.bc.hmac.Write(p[:o]); err != nil {
 | 
			
		||||
			r.bc.err = errors.Wrapf(err, "could not write to hmac")
 | 
			
		||||
			return 0, r.bc.err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if r.bc.err == io.EOF {
 | 
			
		||||
			// Before we return EOF we let the HMAC comparison
 | 
			
		||||
			// provide a verdict
 | 
			
		||||
			if !hmac.Equal(r.bc.hmac.Sum(nil), r.bc.expHmac) {
 | 
			
		||||
				r.bc.err = fmt.Errorf("could not properly decrypt byte stream; exp hmac: '%x', actual hmac: '%s'", r.bc.expHmac, r.bc.hmac.Sum(nil))
 | 
			
		||||
				return 0, r.bc.err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r.bc.stream.XORKeyStream(p[:o], p[:o])
 | 
			
		||||
 | 
			
		||||
	if r.bc.encrypt {
 | 
			
		||||
		if _, err := r.bc.hmac.Write(p[:o]); err != nil {
 | 
			
		||||
			r.bc.err = errors.Wrapf(err, "could not write to hmac")
 | 
			
		||||
			return 0, r.bc.err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if r.bc.err == io.EOF {
 | 
			
		||||
			// Final data encrypted; Do the 'then-MAC' part
 | 
			
		||||
			r.bc.doneEncrypting = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return o, r.bc.err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// init initializes an instance
 | 
			
		||||
func (bc *AESCTRLayerBlockCipher) init(encrypt bool, reader io.Reader, opts LayerBlockCipherOptions) (LayerBlockCipherOptions, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		err error
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	key := opts.Private.SymmetricKey
 | 
			
		||||
	if len(key) != bc.keylen {
 | 
			
		||||
		return LayerBlockCipherOptions{}, fmt.Errorf("invalid key length of %d bytes; need %d bytes", len(key), bc.keylen)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nonce, ok := opts.GetOpt("nonce")
 | 
			
		||||
	if !ok {
 | 
			
		||||
		nonce = make([]byte, aes.BlockSize)
 | 
			
		||||
		if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
 | 
			
		||||
			return LayerBlockCipherOptions{}, errors.Wrap(err, "unable to generate random nonce")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	block, err := aes.NewCipher(key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return LayerBlockCipherOptions{}, errors.Wrap(err, "aes.NewCipher failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bc.reader = reader
 | 
			
		||||
	bc.encrypt = encrypt
 | 
			
		||||
	bc.stream = cipher.NewCTR(block, nonce)
 | 
			
		||||
	bc.err = nil
 | 
			
		||||
	bc.hmac = hmac.New(sha256.New, key)
 | 
			
		||||
	bc.expHmac = opts.Public.Hmac
 | 
			
		||||
	bc.doneEncrypting = false
 | 
			
		||||
 | 
			
		||||
	if !encrypt && len(bc.expHmac) == 0 {
 | 
			
		||||
		return LayerBlockCipherOptions{}, errors.New("HMAC is not provided for decryption process")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lbco := LayerBlockCipherOptions{
 | 
			
		||||
		Private: PrivateLayerBlockCipherOptions{
 | 
			
		||||
			SymmetricKey: key,
 | 
			
		||||
			CipherOptions: map[string][]byte{
 | 
			
		||||
				"nonce": nonce,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return lbco, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GenerateKey creates a synmmetric key
 | 
			
		||||
func (bc *AESCTRLayerBlockCipher) GenerateKey() ([]byte, error) {
 | 
			
		||||
	key := make([]byte, bc.keylen)
 | 
			
		||||
	if _, err := io.ReadFull(rand.Reader, key); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return key, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encrypt takes in layer data and returns the ciphertext and relevant LayerBlockCipherOptions
 | 
			
		||||
func (bc *AESCTRLayerBlockCipher) Encrypt(plainDataReader io.Reader, opt LayerBlockCipherOptions) (io.Reader, Finalizer, error) {
 | 
			
		||||
	lbco, err := bc.init(true, plainDataReader, opt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	finalizer := func() (LayerBlockCipherOptions, error) {
 | 
			
		||||
		if !bc.doneEncrypting {
 | 
			
		||||
			return LayerBlockCipherOptions{}, errors.New("Read()ing not complete, unable to finalize")
 | 
			
		||||
		}
 | 
			
		||||
		if lbco.Public.CipherOptions == nil {
 | 
			
		||||
			lbco.Public.CipherOptions = map[string][]byte{}
 | 
			
		||||
		}
 | 
			
		||||
		lbco.Public.Hmac = bc.hmac.Sum(nil)
 | 
			
		||||
		return lbco, nil
 | 
			
		||||
	}
 | 
			
		||||
	return &aesctrcryptor{bc}, finalizer, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Decrypt takes in layer ciphertext data and returns the plaintext and relevant LayerBlockCipherOptions
 | 
			
		||||
func (bc *AESCTRLayerBlockCipher) Decrypt(encDataReader io.Reader, opt LayerBlockCipherOptions) (io.Reader, LayerBlockCipherOptions, error) {
 | 
			
		||||
	lbco, err := bc.init(false, encDataReader, opt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, LayerBlockCipherOptions{}, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return utils.NewDelayedReader(&aesctrcryptor{bc}, 1024*10), lbco, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								vendor/github.com/containers/ocicrypt/config/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										114
									
								
								vendor/github.com/containers/ocicrypt/config/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,114 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
// EncryptConfig is the container image PGP encryption configuration holding
 | 
			
		||||
// the identifiers of those that will be able to decrypt the container and
 | 
			
		||||
// the PGP public keyring file data that contains their public keys.
 | 
			
		||||
type EncryptConfig struct {
 | 
			
		||||
	// map holding 'gpg-recipients', 'gpg-pubkeyringfile', 'pubkeys', 'x509s'
 | 
			
		||||
	Parameters map[string][][]byte
 | 
			
		||||
 | 
			
		||||
	DecryptConfig DecryptConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptConfig wraps the Parameters map that holds the decryption key
 | 
			
		||||
type DecryptConfig struct {
 | 
			
		||||
	// map holding 'privkeys', 'x509s', 'gpg-privatekeys'
 | 
			
		||||
	Parameters map[string][][]byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CryptoConfig is a common wrapper for EncryptConfig and DecrypConfig that can
 | 
			
		||||
// be passed through functions that share much code for encryption and decryption
 | 
			
		||||
type CryptoConfig struct {
 | 
			
		||||
	EncryptConfig *EncryptConfig
 | 
			
		||||
	DecryptConfig *DecryptConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// InitDecryption initialized a CryptoConfig object with parameters used for decryption
 | 
			
		||||
func InitDecryption(dcparameters map[string][][]byte) CryptoConfig {
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		DecryptConfig: &DecryptConfig{
 | 
			
		||||
			Parameters: dcparameters,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// InitEncryption initializes a CryptoConfig object with parameters used for encryption
 | 
			
		||||
// It also takes dcparameters that may be needed for decryption when adding a recipient
 | 
			
		||||
// to an already encrypted image
 | 
			
		||||
func InitEncryption(parameters, dcparameters map[string][][]byte) CryptoConfig {
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters: parameters,
 | 
			
		||||
			DecryptConfig: DecryptConfig{
 | 
			
		||||
				Parameters: dcparameters,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CombineCryptoConfigs takes a CryptoConfig list and creates a single CryptoConfig
 | 
			
		||||
// containing the crypto configuration of all the key bundles
 | 
			
		||||
func CombineCryptoConfigs(ccs []CryptoConfig) CryptoConfig {
 | 
			
		||||
	ecparam := map[string][][]byte{}
 | 
			
		||||
	ecdcparam := map[string][][]byte{}
 | 
			
		||||
	dcparam := map[string][][]byte{}
 | 
			
		||||
 | 
			
		||||
	for _, cc := range ccs {
 | 
			
		||||
		if ec := cc.EncryptConfig; ec != nil {
 | 
			
		||||
			addToMap(ecparam, ec.Parameters)
 | 
			
		||||
			addToMap(ecdcparam, ec.DecryptConfig.Parameters)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if dc := cc.DecryptConfig; dc != nil {
 | 
			
		||||
			addToMap(dcparam, dc.Parameters)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters: ecparam,
 | 
			
		||||
			DecryptConfig: DecryptConfig{
 | 
			
		||||
				Parameters: ecdcparam,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &DecryptConfig{
 | 
			
		||||
			Parameters: dcparam,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AttachDecryptConfig adds DecryptConfig to the field of EncryptConfig so that
 | 
			
		||||
// the decryption parameters can be used to add recipients to an existing image
 | 
			
		||||
// if the user is able to decrypt it.
 | 
			
		||||
func (ec *EncryptConfig) AttachDecryptConfig(dc *DecryptConfig) {
 | 
			
		||||
	if dc != nil {
 | 
			
		||||
		addToMap(ec.DecryptConfig.Parameters, dc.Parameters)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addToMap(orig map[string][][]byte, add map[string][][]byte) {
 | 
			
		||||
	for k, v := range add {
 | 
			
		||||
		if ov, ok := orig[k]; ok {
 | 
			
		||||
			orig[k] = append(ov, v...)
 | 
			
		||||
		} else {
 | 
			
		||||
			orig[k] = v
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										245
									
								
								vendor/github.com/containers/ocicrypt/config/constructors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										245
									
								
								vendor/github.com/containers/ocicrypt/config/constructors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,245 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/containers/ocicrypt/crypto/pkcs11"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EncryptWithJwe returns a CryptoConfig to encrypt with jwe public keys
 | 
			
		||||
func EncryptWithJwe(pubKeys [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{}
 | 
			
		||||
	ep := map[string][][]byte{
 | 
			
		||||
		"pubkeys": pubKeys,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptWithPkcs7 returns a CryptoConfig to encrypt with pkcs7 x509 certs
 | 
			
		||||
func EncryptWithPkcs7(x509s [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{}
 | 
			
		||||
 | 
			
		||||
	ep := map[string][][]byte{
 | 
			
		||||
		"x509s": x509s,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptWithGpg returns a CryptoConfig to encrypt with configured gpg parameters
 | 
			
		||||
func EncryptWithGpg(gpgRecipients [][]byte, gpgPubRingFile []byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{}
 | 
			
		||||
	ep := map[string][][]byte{
 | 
			
		||||
		"gpg-recipients":     gpgRecipients,
 | 
			
		||||
		"gpg-pubkeyringfile": {gpgPubRingFile},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptWithPkcs11 returns a CryptoConfig to encrypt with configured pkcs11 parameters
 | 
			
		||||
func EncryptWithPkcs11(pkcs11Config *pkcs11.Pkcs11Config, pkcs11Pubkeys, pkcs11Yamls [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{}
 | 
			
		||||
	ep := map[string][][]byte{}
 | 
			
		||||
 | 
			
		||||
	if len(pkcs11Yamls) > 0 {
 | 
			
		||||
		if pkcs11Config == nil {
 | 
			
		||||
			return CryptoConfig{}, errors.New("pkcs11Config must not be nil")
 | 
			
		||||
		}
 | 
			
		||||
		p11confYaml, err := yaml.Marshal(pkcs11Config)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return CryptoConfig{}, errors.Wrapf(err, "Could not marshal Pkcs11Config to Yaml")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dc = DecryptConfig{
 | 
			
		||||
			Parameters: map[string][][]byte{
 | 
			
		||||
				"pkcs11-config": {p11confYaml},
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
		ep["pkcs11-yamls"] = pkcs11Yamls
 | 
			
		||||
	}
 | 
			
		||||
	if len(pkcs11Pubkeys) > 0 {
 | 
			
		||||
		ep["pkcs11-pubkeys"] = pkcs11Pubkeys
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptWithKeyProvider returns a CryptoConfig to encrypt with configured keyprovider parameters
 | 
			
		||||
func EncryptWithKeyProvider(keyProviders [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{}
 | 
			
		||||
	ep := make(map[string][][]byte)
 | 
			
		||||
	for _, keyProvider := range keyProviders {
 | 
			
		||||
		keyProvidersStr := string(keyProvider)
 | 
			
		||||
		idx := strings.Index(keyProvidersStr, ":")
 | 
			
		||||
		if idx > 0 {
 | 
			
		||||
			ep[keyProvidersStr[:idx]] = append(ep[keyProvidersStr[:idx]], []byte(keyProvidersStr[idx+1:]))
 | 
			
		||||
		} else {
 | 
			
		||||
			ep[keyProvidersStr] = append(ep[keyProvidersStr], []byte("Enabled"))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptWithKeyProvider returns a CryptoConfig to decrypt with configured keyprovider parameters
 | 
			
		||||
func DecryptWithKeyProvider(keyProviders [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dp := make(map[string][][]byte)
 | 
			
		||||
	ep := map[string][][]byte{}
 | 
			
		||||
	for _, keyProvider := range keyProviders {
 | 
			
		||||
		keyProvidersStr := string(keyProvider)
 | 
			
		||||
		idx := strings.Index(keyProvidersStr, ":")
 | 
			
		||||
		if idx > 0 {
 | 
			
		||||
			dp[keyProvidersStr[:idx]] = append(dp[keyProvidersStr[:idx]], []byte(keyProvidersStr[idx+1:]))
 | 
			
		||||
		} else {
 | 
			
		||||
			dp[keyProvidersStr] = append(dp[keyProvidersStr], []byte("Enabled"))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	dc := DecryptConfig{
 | 
			
		||||
		Parameters: dp,
 | 
			
		||||
	}
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptWithPrivKeys returns a CryptoConfig to decrypt with configured private keys
 | 
			
		||||
func DecryptWithPrivKeys(privKeys [][]byte, privKeysPasswords [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	if len(privKeys) != len(privKeysPasswords) {
 | 
			
		||||
		return CryptoConfig{}, errors.New("Length of privKeys should match length of privKeysPasswords")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dc := DecryptConfig{
 | 
			
		||||
		Parameters: map[string][][]byte{
 | 
			
		||||
			"privkeys":           privKeys,
 | 
			
		||||
			"privkeys-passwords": privKeysPasswords,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ep := map[string][][]byte{}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptWithX509s returns a CryptoConfig to decrypt with configured x509 certs
 | 
			
		||||
func DecryptWithX509s(x509s [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{
 | 
			
		||||
		Parameters: map[string][][]byte{
 | 
			
		||||
			"x509s": x509s,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ep := map[string][][]byte{}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptWithGpgPrivKeys returns a CryptoConfig to decrypt with configured gpg private keys
 | 
			
		||||
func DecryptWithGpgPrivKeys(gpgPrivKeys, gpgPrivKeysPwds [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	dc := DecryptConfig{
 | 
			
		||||
		Parameters: map[string][][]byte{
 | 
			
		||||
			"gpg-privatekeys":           gpgPrivKeys,
 | 
			
		||||
			"gpg-privatekeys-passwords": gpgPrivKeysPwds,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ep := map[string][][]byte{}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptWithPkcs11Yaml returns a CryptoConfig to decrypt with pkcs11 YAML formatted key files
 | 
			
		||||
func DecryptWithPkcs11Yaml(pkcs11Config *pkcs11.Pkcs11Config, pkcs11Yamls [][]byte) (CryptoConfig, error) {
 | 
			
		||||
	p11confYaml, err := yaml.Marshal(pkcs11Config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return CryptoConfig{}, errors.Wrapf(err, "Could not marshal Pkcs11Config to Yaml")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dc := DecryptConfig{
 | 
			
		||||
		Parameters: map[string][][]byte{
 | 
			
		||||
			"pkcs11-yamls":  pkcs11Yamls,
 | 
			
		||||
			"pkcs11-config": {p11confYaml},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ep := map[string][][]byte{}
 | 
			
		||||
 | 
			
		||||
	return CryptoConfig{
 | 
			
		||||
		EncryptConfig: &EncryptConfig{
 | 
			
		||||
			Parameters:    ep,
 | 
			
		||||
			DecryptConfig: dc,
 | 
			
		||||
		},
 | 
			
		||||
		DecryptConfig: &dc,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										81
									
								
								vendor/github.com/containers/ocicrypt/config/keyprovider-config/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/containers/ocicrypt/config/keyprovider-config/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,81 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package config
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Command describes the structure of command, it consist of path and args, where path defines the location of
 | 
			
		||||
// binary executable and args are passed on to the binary executable
 | 
			
		||||
type Command struct {
 | 
			
		||||
	Path string   `json:"path,omitempty"`
 | 
			
		||||
	Args []string `json:"args,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// KeyProviderAttrs describes the structure of key provider, it defines the way of invocation to key provider
 | 
			
		||||
type KeyProviderAttrs struct {
 | 
			
		||||
	Command *Command `json:"cmd,omitempty"`
 | 
			
		||||
	Grpc    string   `json:"grpc,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OcicryptConfig represents the format of an ocicrypt_provider.conf config file
 | 
			
		||||
type OcicryptConfig struct {
 | 
			
		||||
	KeyProviderConfig map[string]KeyProviderAttrs `json:"key-providers"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const ENVVARNAME = "OCICRYPT_KEYPROVIDER_CONFIG"
 | 
			
		||||
 | 
			
		||||
// parseConfigFile parses a configuration file; it is not an error if the configuration file does
 | 
			
		||||
// not exist, so no error is returned.
 | 
			
		||||
func parseConfigFile(filename string) (*OcicryptConfig, error) {
 | 
			
		||||
	// a non-existent config file is not an error
 | 
			
		||||
	_, err := os.Stat(filename)
 | 
			
		||||
	if os.IsNotExist(err) {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data, err := ioutil.ReadFile(filename)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ic := &OcicryptConfig{}
 | 
			
		||||
	err = json.Unmarshal(data, ic)
 | 
			
		||||
	return ic, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getConfiguration tries to read the configuration file at the following locations
 | 
			
		||||
// ${OCICRYPT_KEYPROVIDER_CONFIG} == "/etc/ocicrypt_keyprovider.yaml"
 | 
			
		||||
// If no configuration file could be found or read a null pointer is returned
 | 
			
		||||
func GetConfiguration() (*OcicryptConfig, error) {
 | 
			
		||||
	var ic *OcicryptConfig
 | 
			
		||||
	var err error
 | 
			
		||||
	filename := os.Getenv(ENVVARNAME)
 | 
			
		||||
	if len(filename) > 0 {
 | 
			
		||||
		ic, err = parseConfigFile(filename)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrap(err, "Error while parsing keyprovider config file")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	return ic, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										134
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										134
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/common.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,134 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	pkcs11uri "github.com/stefanberger/go-pkcs11uri"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Pkcs11KeyFile describes the format of the pkcs11 (private) key file.
 | 
			
		||||
// It also carries pkcs11 module related environment variables that are transferred to the
 | 
			
		||||
// Pkcs11URI object and activated when the pkcs11 module is used.
 | 
			
		||||
type Pkcs11KeyFile struct {
 | 
			
		||||
	Pkcs11 struct {
 | 
			
		||||
		Uri string `yaml:"uri"`
 | 
			
		||||
	} `yaml:"pkcs11"`
 | 
			
		||||
	Module struct {
 | 
			
		||||
		Env map[string]string `yaml:"env,omitempty"`
 | 
			
		||||
	} `yaml:"module"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Pkcs11KeyFileObject is a representation of the Pkcs11KeyFile with the pkcs11 URI as an object
 | 
			
		||||
type Pkcs11KeyFileObject struct {
 | 
			
		||||
	Uri *pkcs11uri.Pkcs11URI
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParsePkcs11Uri parses a pkcs11 URI
 | 
			
		||||
func ParsePkcs11Uri(uri string) (*pkcs11uri.Pkcs11URI, error) {
 | 
			
		||||
	p11uri := pkcs11uri.New()
 | 
			
		||||
	err := p11uri.Parse(uri)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "Could not parse Pkcs11URI from file")
 | 
			
		||||
	}
 | 
			
		||||
	return p11uri, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParsePkcs11KeyFile parses a pkcs11 key file holding a pkcs11 URI describing a private key.
 | 
			
		||||
// The file has the following yaml format:
 | 
			
		||||
// pkcs11:
 | 
			
		||||
//  - uri : <pkcs11 uri>
 | 
			
		||||
// An error is returned if the pkcs11 URI is malformed
 | 
			
		||||
func ParsePkcs11KeyFile(yamlstr []byte) (*Pkcs11KeyFileObject, error) {
 | 
			
		||||
	p11keyfile := Pkcs11KeyFile{}
 | 
			
		||||
 | 
			
		||||
	err := yaml.Unmarshal([]byte(yamlstr), &p11keyfile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "Could not unmarshal pkcs11 keyfile")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p11uri, err := ParsePkcs11Uri(p11keyfile.Pkcs11.Uri)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	p11uri.SetEnvMap(p11keyfile.Module.Env)
 | 
			
		||||
 | 
			
		||||
	return &Pkcs11KeyFileObject{Uri: p11uri}, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPkcs11PrivateKey checks whether the given YAML represents a Pkcs11 private key
 | 
			
		||||
func IsPkcs11PrivateKey(yamlstr []byte) bool {
 | 
			
		||||
	_, err := ParsePkcs11KeyFile(yamlstr)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPkcs11PublicKey checks whether the given YAML represents a Pkcs11 public key
 | 
			
		||||
func IsPkcs11PublicKey(yamlstr []byte) bool {
 | 
			
		||||
	_, err := ParsePkcs11KeyFile(yamlstr)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Pkcs11Config describes the layout of a pkcs11 config file
 | 
			
		||||
// The file has the following yaml format:
 | 
			
		||||
// module-directories:
 | 
			
		||||
// - /usr/lib64/pkcs11/
 | 
			
		||||
// allowd-module-paths
 | 
			
		||||
// - /usr/lib64/pkcs11/libsofthsm2.so
 | 
			
		||||
type Pkcs11Config struct {
 | 
			
		||||
	ModuleDirectories  []string `yaml:"module-directories"`
 | 
			
		||||
	AllowedModulePaths []string `yaml:"allowed-module-paths"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetDefaultModuleDirectories returns module directories covering
 | 
			
		||||
// a variety of Linux distros
 | 
			
		||||
func GetDefaultModuleDirectories() []string {
 | 
			
		||||
	dirs := []string{
 | 
			
		||||
		"/usr/lib64/pkcs11/", // Fedora,RHEL,openSUSE
 | 
			
		||||
		"/usr/lib/pkcs11/",   // Fedora,ArchLinux
 | 
			
		||||
		"/usr/local/lib/pkcs11/",
 | 
			
		||||
		"/usr/lib/softhsm/", // Debian,Ubuntu
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Debian directory: /usr/lib/(x86_64|aarch64|arm|powerpc64le|s390x)-linux-gnu/
 | 
			
		||||
	hosttype, ostype, q := getHostAndOsType()
 | 
			
		||||
	if len(hosttype) > 0 {
 | 
			
		||||
		dir := fmt.Sprintf("/usr/lib/%s-%s-%s/", hosttype, ostype, q)
 | 
			
		||||
		dirs = append(dirs, dir)
 | 
			
		||||
	}
 | 
			
		||||
	return dirs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetDefaultModuleDirectoresFormatted returns the default module directories formatted for YAML
 | 
			
		||||
func GetDefaultModuleDirectoriesYaml(indent string) string {
 | 
			
		||||
	res := ""
 | 
			
		||||
 | 
			
		||||
	for _, dir := range GetDefaultModuleDirectories() {
 | 
			
		||||
		res += indent + "- " + dir + "\n"
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParsePkcs11ConfigFile parses a pkcs11 config file hat influences the module search behavior
 | 
			
		||||
// as well as the set of modules that users are allowed to use
 | 
			
		||||
func ParsePkcs11ConfigFile(yamlstr []byte) (*Pkcs11Config, error) {
 | 
			
		||||
	p11conf := Pkcs11Config{}
 | 
			
		||||
 | 
			
		||||
	err := yaml.Unmarshal([]byte(yamlstr), &p11conf)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return &p11conf, errors.Wrapf(err, "Could not parse Pkcs11Config")
 | 
			
		||||
	}
 | 
			
		||||
	return &p11conf, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										485
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/pkcs11helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										485
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/pkcs11helpers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,485 +0,0 @@
 | 
			
		||||
// +build cgo
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"crypto/rsa"
 | 
			
		||||
	"crypto/sha1"
 | 
			
		||||
	"crypto/sha256"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"hash"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/miekg/pkcs11"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	pkcs11uri "github.com/stefanberger/go-pkcs11uri"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// OAEPLabel defines the label we use for OAEP encryption; this cannot be changed
 | 
			
		||||
	OAEPLabel = []byte("")
 | 
			
		||||
 | 
			
		||||
	// OAEPSha1Params describes the OAEP parameters with sha1 hash algorithm; needed by SoftHSM
 | 
			
		||||
	OAEPSha1Params = &pkcs11.OAEPParams{
 | 
			
		||||
		HashAlg:    pkcs11.CKM_SHA_1,
 | 
			
		||||
		MGF:        pkcs11.CKG_MGF1_SHA1,
 | 
			
		||||
		SourceType: pkcs11.CKZ_DATA_SPECIFIED,
 | 
			
		||||
		SourceData: OAEPLabel,
 | 
			
		||||
	}
 | 
			
		||||
	// OAEPSha256Params describes the OAEP parameters with sha256 hash algorithm
 | 
			
		||||
	OAEPSha256Params = &pkcs11.OAEPParams{
 | 
			
		||||
		HashAlg:    pkcs11.CKM_SHA256,
 | 
			
		||||
		MGF:        pkcs11.CKG_MGF1_SHA256,
 | 
			
		||||
		SourceType: pkcs11.CKZ_DATA_SPECIFIED,
 | 
			
		||||
		SourceData: OAEPLabel,
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// rsaPublicEncryptOAEP encrypts the given plaintext with the given *rsa.PublicKey; the
 | 
			
		||||
// environment variable OCICRYPT_OAEP_HASHALG can be set to 'sha1' to force usage of sha1 for OAEP (SoftHSM).
 | 
			
		||||
// This function is needed by clients who are using a public key file for pkcs11 encryption
 | 
			
		||||
func rsaPublicEncryptOAEP(pubKey *rsa.PublicKey, plaintext []byte) ([]byte, string, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		hashfunc hash.Hash
 | 
			
		||||
		hashalg  string
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	oaephash := os.Getenv("OCICRYPT_OAEP_HASHALG")
 | 
			
		||||
	// The default is sha256 (previously was sha1)
 | 
			
		||||
	switch strings.ToLower(oaephash) {
 | 
			
		||||
	case "sha1":
 | 
			
		||||
		hashfunc = sha1.New()
 | 
			
		||||
		hashalg = "sha1"
 | 
			
		||||
	case "sha256", "":
 | 
			
		||||
		hashfunc = sha256.New()
 | 
			
		||||
		hashalg = "sha256"
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, "", errors.Errorf("Unsupported OAEP hash '%s'", oaephash)
 | 
			
		||||
	}
 | 
			
		||||
	ciphertext, err := rsa.EncryptOAEP(hashfunc, rand.Reader, pubKey, plaintext, OAEPLabel)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", errors.Wrapf(err, "rss.EncryptOAEP failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ciphertext, hashalg, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pkcs11UriGetLoginParameters gets the parameters necessary for login from the Pkcs11URI
 | 
			
		||||
// PIN and module are mandatory; slot-id is optional and if not found -1 will be returned
 | 
			
		||||
// For a privateKeyOperation a PIN is required and if none is given, this function will return an error
 | 
			
		||||
func pkcs11UriGetLoginParameters(p11uri *pkcs11uri.Pkcs11URI, privateKeyOperation bool) (string, string, int64, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		pin string
 | 
			
		||||
		err error
 | 
			
		||||
	)
 | 
			
		||||
	if privateKeyOperation {
 | 
			
		||||
		if !p11uri.HasPIN() {
 | 
			
		||||
			return "", "", 0, errors.New("Missing PIN for private key operation")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// some devices require a PIN to find a *public* key object, others don't
 | 
			
		||||
	pin, _ = p11uri.GetPIN()
 | 
			
		||||
 | 
			
		||||
	module, err := p11uri.GetModule()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", "", 0, errors.Wrap(err, "No module available in pkcs11 URI")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	slotid := int64(-1)
 | 
			
		||||
 | 
			
		||||
	slot, ok := p11uri.GetPathAttribute("slot-id", false)
 | 
			
		||||
	if ok {
 | 
			
		||||
		slotid, err = strconv.ParseInt(slot, 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", "", 0, errors.Wrap(err, "slot-id is not a valid number")
 | 
			
		||||
		}
 | 
			
		||||
		if slotid < 0 {
 | 
			
		||||
			return "", "", 0, fmt.Errorf("slot-id is a negative number")
 | 
			
		||||
		}
 | 
			
		||||
		if uint64(slotid) > 0xffffffff {
 | 
			
		||||
			return "", "", 0, fmt.Errorf("slot-id is larger than 32 bit")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pin, module, slotid, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pkcs11UriGetKeyIdAndLabel gets the key label by retrieving the value of the 'object' attribute
 | 
			
		||||
func pkcs11UriGetKeyIdAndLabel(p11uri *pkcs11uri.Pkcs11URI) (string, string, error) {
 | 
			
		||||
	keyid, ok2 := p11uri.GetPathAttribute("id", false)
 | 
			
		||||
	label, ok1 := p11uri.GetPathAttribute("object", false)
 | 
			
		||||
	if !ok1 && !ok2 {
 | 
			
		||||
		return "", "", errors.New("Neither 'id' nor 'object' attributes were found in pkcs11 URI")
 | 
			
		||||
	}
 | 
			
		||||
	return keyid, label, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pkcs11OpenSession opens a session with a pkcs11 device at the given slot and logs in with the given PIN
 | 
			
		||||
func pkcs11OpenSession(p11ctx *pkcs11.Ctx, slotid uint, pin string) (session pkcs11.SessionHandle, err error) {
 | 
			
		||||
	session, err = p11ctx.OpenSession(uint(slotid), pkcs11.CKF_SERIAL_SESSION|pkcs11.CKF_RW_SESSION)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, errors.Wrapf(err, "OpenSession to slot %d failed", slotid)
 | 
			
		||||
	}
 | 
			
		||||
	if len(pin) > 0 {
 | 
			
		||||
		err = p11ctx.Login(session, pkcs11.CKU_USER, pin)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			_ = p11ctx.CloseSession(session)
 | 
			
		||||
			return 0, errors.Wrap(err, "Could not login to device")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return session, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pkcs11UriLogin uses the given pkcs11 URI to select the pkcs11 module (share libary) and to get
 | 
			
		||||
// the PIN to use for login; if the URI contains a slot-id, the given slot-id will be used, otherwise
 | 
			
		||||
// one slot after the other will be attempted and the first one where login succeeds will be used
 | 
			
		||||
func pkcs11UriLogin(p11uri *pkcs11uri.Pkcs11URI, privateKeyOperation bool) (ctx *pkcs11.Ctx, session pkcs11.SessionHandle, err error) {
 | 
			
		||||
	pin, module, slotid, err := pkcs11UriGetLoginParameters(p11uri, privateKeyOperation)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p11ctx := pkcs11.New(module)
 | 
			
		||||
	if p11ctx == nil {
 | 
			
		||||
		return nil, 0, errors.New("Please check module path, input is: " + module)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = p11ctx.Initialize()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		p11Err := err.(pkcs11.Error)
 | 
			
		||||
		if p11Err != pkcs11.CKR_CRYPTOKI_ALREADY_INITIALIZED {
 | 
			
		||||
			return nil, 0, errors.Wrap(err, "Initialize failed")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if slotid >= 0 {
 | 
			
		||||
		session, err := pkcs11OpenSession(p11ctx, uint(slotid), pin)
 | 
			
		||||
		return p11ctx, session, err
 | 
			
		||||
	} else {
 | 
			
		||||
		slots, err := p11ctx.GetSlotList(true)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, 0, errors.Wrap(err, "GetSlotList failed")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tokenlabel, ok := p11uri.GetPathAttribute("token", false)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return nil, 0, errors.New("Missing 'token' attribute since 'slot-id' was not given")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, slot := range slots {
 | 
			
		||||
			ti, err := p11ctx.GetTokenInfo(slot)
 | 
			
		||||
			if err != nil || ti.Label != tokenlabel {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			session, err = pkcs11OpenSession(p11ctx, slot, pin)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				return p11ctx, session, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if len(pin) > 0 {
 | 
			
		||||
			return nil, 0, errors.New("Could not create session to any slot and/or log in")
 | 
			
		||||
		}
 | 
			
		||||
		return nil, 0, errors.New("Could not create session to any slot")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func pkcs11Logout(ctx *pkcs11.Ctx, session pkcs11.SessionHandle) {
 | 
			
		||||
	_ = ctx.Logout(session)
 | 
			
		||||
	_ = ctx.CloseSession(session)
 | 
			
		||||
	_ = ctx.Finalize()
 | 
			
		||||
	ctx.Destroy()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// findObject finds an object of the given class with the given keyid and/or label
 | 
			
		||||
func findObject(p11ctx *pkcs11.Ctx, session pkcs11.SessionHandle, class uint, keyid, label string) (pkcs11.ObjectHandle, error) {
 | 
			
		||||
	msg := ""
 | 
			
		||||
 | 
			
		||||
	template := []*pkcs11.Attribute{
 | 
			
		||||
		pkcs11.NewAttribute(pkcs11.CKA_CLASS, class),
 | 
			
		||||
	}
 | 
			
		||||
	if len(label) > 0 {
 | 
			
		||||
		template = append(template, pkcs11.NewAttribute(pkcs11.CKA_LABEL, label))
 | 
			
		||||
		msg = fmt.Sprintf("label '%s'", label)
 | 
			
		||||
	}
 | 
			
		||||
	if len(keyid) > 0 {
 | 
			
		||||
		template = append(template, pkcs11.NewAttribute(pkcs11.CKA_ID, keyid))
 | 
			
		||||
		if len(msg) > 0 {
 | 
			
		||||
			msg += " and "
 | 
			
		||||
		}
 | 
			
		||||
		msg += url.PathEscape(keyid)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := p11ctx.FindObjectsInit(session, template); err != nil {
 | 
			
		||||
		return 0, errors.Wrap(err, "FindObjectsInit failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	obj, _, err := p11ctx.FindObjects(session, 100)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, errors.Wrap(err, "FindObjects failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := p11ctx.FindObjectsFinal(session); err != nil {
 | 
			
		||||
		return 0, errors.Wrap(err, "FindObjectsFinal failed")
 | 
			
		||||
	}
 | 
			
		||||
	if len(obj) > 1 {
 | 
			
		||||
		return 0, errors.Errorf("There are too many (=%d) keys with %s", len(obj), msg)
 | 
			
		||||
	} else if len(obj) == 1 {
 | 
			
		||||
		return obj[0], nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0, errors.Errorf("Could not find any object with %s", msg)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// publicEncryptOAEP uses a public key described by a pkcs11 URI to OAEP encrypt the given plaintext
 | 
			
		||||
func publicEncryptOAEP(pubKey *Pkcs11KeyFileObject, plaintext []byte) ([]byte, string, error) {
 | 
			
		||||
	oldenv, err := setEnvVars(pubKey.Uri.GetEnvMap())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
	defer restoreEnv(oldenv)
 | 
			
		||||
 | 
			
		||||
	p11ctx, session, err := pkcs11UriLogin(pubKey.Uri, false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
	defer pkcs11Logout(p11ctx, session)
 | 
			
		||||
 | 
			
		||||
	keyid, label, err := pkcs11UriGetKeyIdAndLabel(pubKey.Uri)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p11PubKey, err := findObject(p11ctx, session, pkcs11.CKO_PUBLIC_KEY, keyid, label)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var hashalg string
 | 
			
		||||
 | 
			
		||||
	var oaep *pkcs11.OAEPParams
 | 
			
		||||
	oaephash := os.Getenv("OCICRYPT_OAEP_HASHALG")
 | 
			
		||||
	// The default is sha256 (previously was sha1)
 | 
			
		||||
	switch strings.ToLower(oaephash) {
 | 
			
		||||
	case "sha1":
 | 
			
		||||
		oaep = OAEPSha1Params
 | 
			
		||||
		hashalg = "sha1"
 | 
			
		||||
	case "sha256", "":
 | 
			
		||||
		oaep = OAEPSha256Params
 | 
			
		||||
		hashalg = "sha256"
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, "", errors.Errorf("Unsupported OAEP hash '%s'", oaephash)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = p11ctx.EncryptInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_RSA_PKCS_OAEP, oaep)}, p11PubKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", errors.Wrap(err, "EncryptInit error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ciphertext, err := p11ctx.Encrypt(session, plaintext)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", errors.Wrap(err, "Encrypt failed")
 | 
			
		||||
	}
 | 
			
		||||
	return ciphertext, hashalg, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// privateDecryptOAEP uses a pkcs11 URI describing a private key to OAEP decrypt a ciphertext
 | 
			
		||||
func privateDecryptOAEP(privKeyObj *Pkcs11KeyFileObject, ciphertext []byte, hashalg string) ([]byte, error) {
 | 
			
		||||
	oldenv, err := setEnvVars(privKeyObj.Uri.GetEnvMap())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer restoreEnv(oldenv)
 | 
			
		||||
 | 
			
		||||
	p11ctx, session, err := pkcs11UriLogin(privKeyObj.Uri, true)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer pkcs11Logout(p11ctx, session)
 | 
			
		||||
 | 
			
		||||
	keyid, label, err := pkcs11UriGetKeyIdAndLabel(privKeyObj.Uri)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p11PrivKey, err := findObject(p11ctx, session, pkcs11.CKO_PRIVATE_KEY, keyid, label)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var oaep *pkcs11.OAEPParams
 | 
			
		||||
 | 
			
		||||
	// An empty string from the Hash in the JSON historically defaults to sha1.
 | 
			
		||||
	switch hashalg {
 | 
			
		||||
	case "sha1", "":
 | 
			
		||||
		oaep = OAEPSha1Params
 | 
			
		||||
	case "sha256":
 | 
			
		||||
		oaep = OAEPSha256Params
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, errors.Errorf("Unsupported hash algorithm '%s' for decryption", hashalg)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = p11ctx.DecryptInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_RSA_PKCS_OAEP, oaep)}, p11PrivKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "DecryptInit failed")
 | 
			
		||||
	}
 | 
			
		||||
	plaintext, err := p11ctx.Decrypt(session, ciphertext)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "Decrypt failed")
 | 
			
		||||
	}
 | 
			
		||||
	return plaintext, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// The following part deals with the JSON formatted message for multiple pkcs11 recipients
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
// Pkcs11Blob holds the encrypted blobs for all recipients; this is what we will put into the image's annotations
 | 
			
		||||
type Pkcs11Blob struct {
 | 
			
		||||
	Version    uint              `json:"version"`
 | 
			
		||||
	Recipients []Pkcs11Recipient `json:"recipients"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Pkcs11Recipient holds the b64-encoded and encrypted blob for a particular recipient
 | 
			
		||||
type Pkcs11Recipient struct {
 | 
			
		||||
	Version uint   `json:"version"`
 | 
			
		||||
	Blob    string `json:"blob"`
 | 
			
		||||
	Hash    string `json:"hash,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptMultiple encrypts for one or multiple pkcs11 devices; the public keys passed to this function
 | 
			
		||||
// may either be *rsa.PublicKey or *pkcs11uri.Pkcs11URI; the returned byte array is a JSON string of the
 | 
			
		||||
// following format:
 | 
			
		||||
// {
 | 
			
		||||
//   recipients: [  // recipient list
 | 
			
		||||
//     {
 | 
			
		||||
//        "version": 0,
 | 
			
		||||
//        "blob": <base64 encoded RSA OAEP encrypted blob>,
 | 
			
		||||
//        "hash": <hash used for OAEP other than 'sha256'>
 | 
			
		||||
//     } ,
 | 
			
		||||
//     {
 | 
			
		||||
//        "version": 0,
 | 
			
		||||
//        "blob": <base64 encoded RSA OAEP encrypted blob>,
 | 
			
		||||
//        "hash": <hash used for OAEP other than 'sha256'>
 | 
			
		||||
//     } ,
 | 
			
		||||
//     [...]
 | 
			
		||||
//   ]
 | 
			
		||||
// }
 | 
			
		||||
func EncryptMultiple(pubKeys []interface{}, data []byte) ([]byte, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		ciphertext []byte
 | 
			
		||||
		err        error
 | 
			
		||||
		pkcs11blob Pkcs11Blob = Pkcs11Blob{Version: 0}
 | 
			
		||||
		hashalg    string
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	for _, pubKey := range pubKeys {
 | 
			
		||||
		switch pkey := pubKey.(type) {
 | 
			
		||||
		case *rsa.PublicKey:
 | 
			
		||||
			ciphertext, hashalg, err = rsaPublicEncryptOAEP(pkey, data)
 | 
			
		||||
		case *Pkcs11KeyFileObject:
 | 
			
		||||
			ciphertext, hashalg, err = publicEncryptOAEP(pkey, data)
 | 
			
		||||
		default:
 | 
			
		||||
			err = errors.Errorf("Unsupported key object type for pkcs11 public key")
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		recipient := Pkcs11Recipient{
 | 
			
		||||
			Version: 0,
 | 
			
		||||
			Blob:    base64.StdEncoding.EncodeToString(ciphertext),
 | 
			
		||||
			Hash:    hashalg,
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pkcs11blob.Recipients = append(pkcs11blob.Recipients, recipient)
 | 
			
		||||
	}
 | 
			
		||||
	return json.Marshal(&pkcs11blob)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Decrypt tries to decrypt one of the recipients' blobs using a pkcs11 private key.
 | 
			
		||||
// The input pkcs11blobstr is a string with the following format:
 | 
			
		||||
// {
 | 
			
		||||
//   recipients: [  // recipient list
 | 
			
		||||
//     {
 | 
			
		||||
//        "version": 0,
 | 
			
		||||
//        "blob": <base64 encoded RSA OAEP encrypted blob>,
 | 
			
		||||
//        "hash": <hash used for OAEP other than 'sha1'>
 | 
			
		||||
//     } ,
 | 
			
		||||
//     {
 | 
			
		||||
//        "version": 0,
 | 
			
		||||
//        "blob": <base64 encoded RSA OAEP encrypted blob>,
 | 
			
		||||
//        "hash": <hash used for OAEP other than 'sha1'>
 | 
			
		||||
//     } ,
 | 
			
		||||
//     [...]
 | 
			
		||||
// }
 | 
			
		||||
// Note: More recent versions of this code explicitly write 'sha1'
 | 
			
		||||
//       while older versions left it empty in case of 'sha1'.
 | 
			
		||||
//
 | 
			
		||||
func Decrypt(privKeyObjs []*Pkcs11KeyFileObject, pkcs11blobstr []byte) ([]byte, error) {
 | 
			
		||||
	pkcs11blob := Pkcs11Blob{}
 | 
			
		||||
	err := json.Unmarshal(pkcs11blobstr, &pkcs11blob)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "Could not parse Pkcs11Blob")
 | 
			
		||||
	}
 | 
			
		||||
	switch pkcs11blob.Version {
 | 
			
		||||
	case 0:
 | 
			
		||||
		// latest supported version
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, errors.Errorf("Found Pkcs11Blob with version %d but maximum supported version is 0.", pkcs11blob.Version)
 | 
			
		||||
	}
 | 
			
		||||
	// since we do trial and error, collect all encountered errors
 | 
			
		||||
	errs := ""
 | 
			
		||||
 | 
			
		||||
	for _, recipient := range pkcs11blob.Recipients {
 | 
			
		||||
		switch recipient.Version {
 | 
			
		||||
		case 0:
 | 
			
		||||
			// last supported version
 | 
			
		||||
		default:
 | 
			
		||||
			return nil, errors.Errorf("Found Pkcs11Recipient with version %d but maximum supported version is 0.", recipient.Version)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ciphertext, err := base64.StdEncoding.DecodeString(recipient.Blob)
 | 
			
		||||
		if err != nil || len(ciphertext) == 0 {
 | 
			
		||||
			// This should never happen... we skip over decoding issues
 | 
			
		||||
			errs += fmt.Sprintf("Base64 decoding failed: %s\n", err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		// try all keys until one works
 | 
			
		||||
		for _, privKeyObj := range privKeyObjs {
 | 
			
		||||
			plaintext, err := privateDecryptOAEP(privKeyObj, ciphertext, recipient.Hash)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				return plaintext, nil
 | 
			
		||||
			}
 | 
			
		||||
			if uri, err2 := privKeyObj.Uri.Format(); err2 == nil {
 | 
			
		||||
				errs += fmt.Sprintf("%s : %s\n", uri, err)
 | 
			
		||||
			} else {
 | 
			
		||||
				errs += fmt.Sprintf("%s\n", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, errors.Errorf("Could not find a pkcs11 key for decryption:\n%s", errs)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/pkcs11helpers_nocgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/pkcs11helpers_nocgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,31 +0,0 @@
 | 
			
		||||
// +build !cgo
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func EncryptMultiple(pubKeys []interface{}, data []byte) ([]byte, error) {
 | 
			
		||||
	return nil, errors.Errorf("ocicrypt pkcs11 not supported on this build")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Decrypt(privKeyObjs []*Pkcs11KeyFileObject, pkcs11blobstr []byte) ([]byte, error) {
 | 
			
		||||
	return nil, errors.Errorf("ocicrypt pkcs11 not supported on this build")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										114
									
								
								vendor/github.com/containers/ocicrypt/crypto/pkcs11/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,114 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	envLock sync.Mutex
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// setEnvVars sets the environment variables given in the map and locks the environment from
 | 
			
		||||
// modification with the same function; if successful, you *must* call restoreEnv with the return
 | 
			
		||||
// value from this function
 | 
			
		||||
func setEnvVars(env map[string]string) ([]string, error) {
 | 
			
		||||
	envLock.Lock()
 | 
			
		||||
 | 
			
		||||
	if len(env) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oldenv := os.Environ()
 | 
			
		||||
 | 
			
		||||
	for k, v := range env {
 | 
			
		||||
		err := os.Setenv(k, v)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			restoreEnv(oldenv)
 | 
			
		||||
			return nil, errors.Wrapf(err, "Could not set environment variable '%s' to '%s'", k, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return oldenv, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func arrayToMap(elements []string) map[string]string {
 | 
			
		||||
	o := make(map[string]string)
 | 
			
		||||
 | 
			
		||||
	for _, element := range elements {
 | 
			
		||||
		p := strings.SplitN(element, "=", 2)
 | 
			
		||||
		if len(p) == 2 {
 | 
			
		||||
			o[p[0]] = p[1]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return o
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// restoreEnv restores the environment to be exactly as given in the array of strings
 | 
			
		||||
// and unlocks the lock
 | 
			
		||||
func restoreEnv(envs []string) {
 | 
			
		||||
	if envs != nil && len(envs) >= 0 {
 | 
			
		||||
		target := arrayToMap(envs)
 | 
			
		||||
		curr := arrayToMap(os.Environ())
 | 
			
		||||
 | 
			
		||||
		for nc, vc := range curr {
 | 
			
		||||
			vt, ok := target[nc]
 | 
			
		||||
			if !ok {
 | 
			
		||||
				os.Unsetenv(nc)
 | 
			
		||||
			} else if vc == vt {
 | 
			
		||||
				delete(target, nc)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for nt, vt := range target {
 | 
			
		||||
			os.Setenv(nt, vt)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	envLock.Unlock()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getHostAndOsType() (string, string, string) {
 | 
			
		||||
	ht := ""
 | 
			
		||||
	ot := ""
 | 
			
		||||
	st := ""
 | 
			
		||||
	switch runtime.GOOS {
 | 
			
		||||
	case "linux":
 | 
			
		||||
		ot = "linux"
 | 
			
		||||
		st = "gnu"
 | 
			
		||||
		switch runtime.GOARCH {
 | 
			
		||||
		case "arm":
 | 
			
		||||
			ht = "arm"
 | 
			
		||||
		case "arm64":
 | 
			
		||||
			ht = "aarch64"
 | 
			
		||||
		case "amd64":
 | 
			
		||||
			ht = "x86_64"
 | 
			
		||||
		case "ppc64le":
 | 
			
		||||
			ht = "powerpc64le"
 | 
			
		||||
		case "s390x":
 | 
			
		||||
			ht = "s390x"
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return ht, ot, st
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										356
									
								
								vendor/github.com/containers/ocicrypt/encryption.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										356
									
								
								vendor/github.com/containers/ocicrypt/encryption.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,356 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package ocicrypt
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	keyproviderconfig "github.com/containers/ocicrypt/config/keyprovider-config"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap/keyprovider"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt/blockcipher"
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap/jwe"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap/pgp"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap/pkcs11"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap/pkcs7"
 | 
			
		||||
	"github.com/opencontainers/go-digest"
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EncryptLayerFinalizer is a finalizer run to return the annotations to set for
 | 
			
		||||
// the encrypted layer
 | 
			
		||||
type EncryptLayerFinalizer func() (map[string]string, error)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	keyWrappers = make(map[string]keywrap.KeyWrapper)
 | 
			
		||||
	keyWrapperAnnotations = make(map[string]string)
 | 
			
		||||
	RegisterKeyWrapper("pgp", pgp.NewKeyWrapper())
 | 
			
		||||
	RegisterKeyWrapper("jwe", jwe.NewKeyWrapper())
 | 
			
		||||
	RegisterKeyWrapper("pkcs7", pkcs7.NewKeyWrapper())
 | 
			
		||||
	RegisterKeyWrapper("pkcs11", pkcs11.NewKeyWrapper())
 | 
			
		||||
	ic, err := keyproviderconfig.GetConfiguration()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error(err)
 | 
			
		||||
	} else if ic != nil {
 | 
			
		||||
		for provider, attrs := range ic.KeyProviderConfig {
 | 
			
		||||
			RegisterKeyWrapper("provider."+provider, keyprovider.NewKeyWrapper(provider, attrs))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var keyWrappers map[string]keywrap.KeyWrapper
 | 
			
		||||
var keyWrapperAnnotations map[string]string
 | 
			
		||||
 | 
			
		||||
// RegisterKeyWrapper allows to register key wrappers by their encryption scheme
 | 
			
		||||
func RegisterKeyWrapper(scheme string, iface keywrap.KeyWrapper) {
 | 
			
		||||
	keyWrappers[scheme] = iface
 | 
			
		||||
	keyWrapperAnnotations[iface.GetAnnotationID()] = scheme
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetKeyWrapper looks up the encryptor interface given an encryption scheme (gpg, jwe)
 | 
			
		||||
func GetKeyWrapper(scheme string) keywrap.KeyWrapper {
 | 
			
		||||
	return keyWrappers[scheme]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetWrappedKeysMap returns a map of wrappedKeys as values in a
 | 
			
		||||
// map with the encryption scheme(s) as the key(s)
 | 
			
		||||
func GetWrappedKeysMap(desc ocispec.Descriptor) map[string]string {
 | 
			
		||||
	wrappedKeysMap := make(map[string]string)
 | 
			
		||||
 | 
			
		||||
	for annotationsID, scheme := range keyWrapperAnnotations {
 | 
			
		||||
		if annotation, ok := desc.Annotations[annotationsID]; ok {
 | 
			
		||||
			wrappedKeysMap[scheme] = annotation
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return wrappedKeysMap
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncryptLayer encrypts the layer by running one encryptor after the other
 | 
			
		||||
func EncryptLayer(ec *config.EncryptConfig, encOrPlainLayerReader io.Reader, desc ocispec.Descriptor) (io.Reader, EncryptLayerFinalizer, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		encLayerReader io.Reader
 | 
			
		||||
		err            error
 | 
			
		||||
		encrypted      bool
 | 
			
		||||
		bcFin          blockcipher.Finalizer
 | 
			
		||||
		privOptsData   []byte
 | 
			
		||||
		pubOptsData    []byte
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if ec == nil {
 | 
			
		||||
		return nil, nil, errors.New("EncryptConfig must not be nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for annotationsID := range keyWrapperAnnotations {
 | 
			
		||||
		annotation := desc.Annotations[annotationsID]
 | 
			
		||||
		if annotation != "" {
 | 
			
		||||
			privOptsData, err = decryptLayerKeyOptsData(&ec.DecryptConfig, desc)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, nil, err
 | 
			
		||||
			}
 | 
			
		||||
			pubOptsData, err = getLayerPubOpts(desc)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, nil, err
 | 
			
		||||
			}
 | 
			
		||||
			// already encrypted!
 | 
			
		||||
			encrypted = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !encrypted {
 | 
			
		||||
		encLayerReader, bcFin, err = commonEncryptLayer(encOrPlainLayerReader, desc.Digest, blockcipher.AES256CTR)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	encLayerFinalizer := func() (map[string]string, error) {
 | 
			
		||||
		// If layer was already encrypted, bcFin should be nil, use existing optsData
 | 
			
		||||
		if bcFin != nil {
 | 
			
		||||
			opts, err := bcFin()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			privOptsData, err = json.Marshal(opts.Private)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errors.Wrapf(err, "could not JSON marshal opts")
 | 
			
		||||
			}
 | 
			
		||||
			pubOptsData, err = json.Marshal(opts.Public)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errors.Wrapf(err, "could not JSON marshal opts")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newAnnotations := make(map[string]string)
 | 
			
		||||
		keysWrapped := false
 | 
			
		||||
		if len(keyWrapperAnnotations) == 0 {
 | 
			
		||||
			return nil, errors.New("missing Annotations needed for decryption")
 | 
			
		||||
		}
 | 
			
		||||
		for annotationsID, scheme := range keyWrapperAnnotations {
 | 
			
		||||
			b64Annotations := desc.Annotations[annotationsID]
 | 
			
		||||
			keywrapper := GetKeyWrapper(scheme)
 | 
			
		||||
			b64Annotations, err = preWrapKeys(keywrapper, ec, b64Annotations, privOptsData)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			if b64Annotations != "" {
 | 
			
		||||
				keysWrapped = true
 | 
			
		||||
				newAnnotations[annotationsID] = b64Annotations
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !keysWrapped {
 | 
			
		||||
			return nil, errors.New("no wrapped keys produced by encryption")
 | 
			
		||||
		}
 | 
			
		||||
		newAnnotations["org.opencontainers.image.enc.pubopts"] = base64.StdEncoding.EncodeToString(pubOptsData)
 | 
			
		||||
 | 
			
		||||
		if len(newAnnotations) == 0 {
 | 
			
		||||
			return nil, errors.New("no encryptor found to handle encryption")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return newAnnotations, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if nothing was encrypted, we just return encLayer = nil
 | 
			
		||||
	return encLayerReader, encLayerFinalizer, err
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// preWrapKeys calls WrapKeys and handles the base64 encoding and concatenation of the
 | 
			
		||||
// annotation data
 | 
			
		||||
func preWrapKeys(keywrapper keywrap.KeyWrapper, ec *config.EncryptConfig, b64Annotations string, optsData []byte) (string, error) {
 | 
			
		||||
	newAnnotation, err := keywrapper.WrapKeys(ec, optsData)
 | 
			
		||||
	if err != nil || len(newAnnotation) == 0 {
 | 
			
		||||
		return b64Annotations, err
 | 
			
		||||
	}
 | 
			
		||||
	b64newAnnotation := base64.StdEncoding.EncodeToString(newAnnotation)
 | 
			
		||||
	if b64Annotations == "" {
 | 
			
		||||
		return b64newAnnotation, nil
 | 
			
		||||
	}
 | 
			
		||||
	return b64Annotations + "," + b64newAnnotation, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecryptLayer decrypts a layer trying one keywrap.KeyWrapper after the other to see whether it
 | 
			
		||||
// can apply the provided private key
 | 
			
		||||
// If unwrapOnly is set we will only try to decrypt the layer encryption key and return
 | 
			
		||||
func DecryptLayer(dc *config.DecryptConfig, encLayerReader io.Reader, desc ocispec.Descriptor, unwrapOnly bool) (io.Reader, digest.Digest, error) {
 | 
			
		||||
	if dc == nil {
 | 
			
		||||
		return nil, "", errors.New("DecryptConfig must not be nil")
 | 
			
		||||
	}
 | 
			
		||||
	privOptsData, err := decryptLayerKeyOptsData(dc, desc)
 | 
			
		||||
	if err != nil || unwrapOnly {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var pubOptsData []byte
 | 
			
		||||
	pubOptsData, err = getLayerPubOpts(desc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return commonDecryptLayer(encLayerReader, privOptsData, pubOptsData)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func decryptLayerKeyOptsData(dc *config.DecryptConfig, desc ocispec.Descriptor) ([]byte, error) {
 | 
			
		||||
	privKeyGiven := false
 | 
			
		||||
	errs := ""
 | 
			
		||||
	if len(keyWrapperAnnotations) == 0 {
 | 
			
		||||
		return nil, errors.New("missing Annotations needed for decryption")
 | 
			
		||||
	}
 | 
			
		||||
	for annotationsID, scheme := range keyWrapperAnnotations {
 | 
			
		||||
		b64Annotation := desc.Annotations[annotationsID]
 | 
			
		||||
		if b64Annotation != "" {
 | 
			
		||||
			keywrapper := GetKeyWrapper(scheme)
 | 
			
		||||
 | 
			
		||||
			if keywrapper.NoPossibleKeys(dc.Parameters) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if len(keywrapper.GetPrivateKeys(dc.Parameters)) > 0 {
 | 
			
		||||
				privKeyGiven = true
 | 
			
		||||
			}
 | 
			
		||||
			optsData, err := preUnwrapKey(keywrapper, dc, b64Annotation)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				// try next keywrap.KeyWrapper
 | 
			
		||||
				errs += fmt.Sprintf("%s\n", err)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if optsData == nil {
 | 
			
		||||
				// try next keywrap.KeyWrapper
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return optsData, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !privKeyGiven {
 | 
			
		||||
		return nil, errors.New("missing private key needed for decryption")
 | 
			
		||||
	}
 | 
			
		||||
	return nil, errors.Errorf("no suitable key unwrapper found or none of the private keys could be used for decryption:\n%s", errs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getLayerPubOpts(desc ocispec.Descriptor) ([]byte, error) {
 | 
			
		||||
	pubOptsString := desc.Annotations["org.opencontainers.image.enc.pubopts"]
 | 
			
		||||
	if pubOptsString == "" {
 | 
			
		||||
		return json.Marshal(blockcipher.PublicLayerBlockCipherOptions{})
 | 
			
		||||
	}
 | 
			
		||||
	return base64.StdEncoding.DecodeString(pubOptsString)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// preUnwrapKey decodes the comma separated base64 strings and calls the Unwrap function
 | 
			
		||||
// of the given keywrapper with it and returns the result in case the Unwrap functions
 | 
			
		||||
// does not return an error. If all attempts fail, an error is returned.
 | 
			
		||||
func preUnwrapKey(keywrapper keywrap.KeyWrapper, dc *config.DecryptConfig, b64Annotations string) ([]byte, error) {
 | 
			
		||||
	if b64Annotations == "" {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	errs := ""
 | 
			
		||||
	for _, b64Annotation := range strings.Split(b64Annotations, ",") {
 | 
			
		||||
		annotation, err := base64.StdEncoding.DecodeString(b64Annotation)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.New("could not base64 decode the annotation")
 | 
			
		||||
		}
 | 
			
		||||
		optsData, err := keywrapper.UnwrapKey(dc, annotation)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errs += fmt.Sprintf("- %s\n", err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return optsData, nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil, errors.Errorf("no suitable key found for decrypting layer key:\n%s", errs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// commonEncryptLayer is a function to encrypt the plain layer using a new random
 | 
			
		||||
// symmetric key and return the LayerBlockCipherHandler's JSON in string form for
 | 
			
		||||
// later use during decryption
 | 
			
		||||
func commonEncryptLayer(plainLayerReader io.Reader, d digest.Digest, typ blockcipher.LayerCipherType) (io.Reader, blockcipher.Finalizer, error) {
 | 
			
		||||
	lbch, err := blockcipher.NewLayerBlockCipherHandler()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	encLayerReader, bcFin, err := lbch.Encrypt(plainLayerReader, typ)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newBcFin := func() (blockcipher.LayerBlockCipherOptions, error) {
 | 
			
		||||
		lbco, err := bcFin()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return blockcipher.LayerBlockCipherOptions{}, err
 | 
			
		||||
		}
 | 
			
		||||
		lbco.Private.Digest = d
 | 
			
		||||
		return lbco, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return encLayerReader, newBcFin, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// commonDecryptLayer decrypts an encrypted layer previously encrypted with commonEncryptLayer
 | 
			
		||||
// by passing along the optsData
 | 
			
		||||
func commonDecryptLayer(encLayerReader io.Reader, privOptsData []byte, pubOptsData []byte) (io.Reader, digest.Digest, error) {
 | 
			
		||||
	privOpts := blockcipher.PrivateLayerBlockCipherOptions{}
 | 
			
		||||
	err := json.Unmarshal(privOptsData, &privOpts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", errors.Wrapf(err, "could not JSON unmarshal privOptsData")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lbch, err := blockcipher.NewLayerBlockCipherHandler()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pubOpts := blockcipher.PublicLayerBlockCipherOptions{}
 | 
			
		||||
	if len(pubOptsData) > 0 {
 | 
			
		||||
		err := json.Unmarshal(pubOptsData, &pubOpts)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, "", errors.Wrapf(err, "could not JSON unmarshal pubOptsData")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	opts := blockcipher.LayerBlockCipherOptions{
 | 
			
		||||
		Private: privOpts,
 | 
			
		||||
		Public:  pubOpts,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	plainLayerReader, opts, err := lbch.Decrypt(encLayerReader, opts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return plainLayerReader, opts.Private.Digest, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FilterOutAnnotations filters out the annotations belonging to the image encryption 'namespace'
 | 
			
		||||
// and returns a map with those taken out
 | 
			
		||||
func FilterOutAnnotations(annotations map[string]string) map[string]string {
 | 
			
		||||
	a := make(map[string]string)
 | 
			
		||||
	if len(annotations) > 0 {
 | 
			
		||||
		for k, v := range annotations {
 | 
			
		||||
			if strings.HasPrefix(k, "org.opencontainers.image.enc.") {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			a[k] = v
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return a
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										425
									
								
								vendor/github.com/containers/ocicrypt/gpg.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										425
									
								
								vendor/github.com/containers/ocicrypt/gpg.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,425 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package ocicrypt
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	ocispec "github.com/opencontainers/image-spec/specs-go/v1"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"golang.org/x/term"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GPGVersion enum representing the GPG client version to use.
 | 
			
		||||
type GPGVersion int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// GPGv2 signifies gpgv2+
 | 
			
		||||
	GPGv2 GPGVersion = iota
 | 
			
		||||
	// GPGv1 signifies gpgv1+
 | 
			
		||||
	GPGv1
 | 
			
		||||
	// GPGVersionUndetermined signifies gpg client version undetermined
 | 
			
		||||
	GPGVersionUndetermined
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GPGClient defines an interface for wrapping the gpg command line tools
 | 
			
		||||
type GPGClient interface {
 | 
			
		||||
	// ReadGPGPubRingFile gets the byte sequence of the gpg public keyring
 | 
			
		||||
	ReadGPGPubRingFile() ([]byte, error)
 | 
			
		||||
	// GetGPGPrivateKey gets the private key bytes of a keyid given a passphrase
 | 
			
		||||
	GetGPGPrivateKey(keyid uint64, passphrase string) ([]byte, error)
 | 
			
		||||
	// GetSecretKeyDetails gets the details of a secret key
 | 
			
		||||
	GetSecretKeyDetails(keyid uint64) ([]byte, bool, error)
 | 
			
		||||
	// GetKeyDetails gets the details of a public key
 | 
			
		||||
	GetKeyDetails(keyid uint64) ([]byte, bool, error)
 | 
			
		||||
	// ResolveRecipients resolves PGP key ids to user names
 | 
			
		||||
	ResolveRecipients([]string) []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// gpgClient contains generic gpg client information
 | 
			
		||||
type gpgClient struct {
 | 
			
		||||
	gpgHomeDir string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// gpgv2Client is a gpg2 client
 | 
			
		||||
type gpgv2Client struct {
 | 
			
		||||
	gpgClient
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// gpgv1Client is a gpg client
 | 
			
		||||
type gpgv1Client struct {
 | 
			
		||||
	gpgClient
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GuessGPGVersion guesses the version of gpg. Defaults to gpg2 if exists, if
 | 
			
		||||
// not defaults to regular gpg.
 | 
			
		||||
func GuessGPGVersion() GPGVersion {
 | 
			
		||||
	if err := exec.Command("gpg2", "--version").Run(); err == nil {
 | 
			
		||||
		return GPGv2
 | 
			
		||||
	} else if err := exec.Command("gpg", "--version").Run(); err == nil {
 | 
			
		||||
		return GPGv1
 | 
			
		||||
	} else {
 | 
			
		||||
		return GPGVersionUndetermined
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewGPGClient creates a new GPGClient object representing the given version
 | 
			
		||||
// and using the given home directory
 | 
			
		||||
func NewGPGClient(gpgVersion, gpgHomeDir string) (GPGClient, error) {
 | 
			
		||||
	v := new(GPGVersion)
 | 
			
		||||
	switch gpgVersion {
 | 
			
		||||
	case "v1":
 | 
			
		||||
		*v = GPGv1
 | 
			
		||||
	case "v2":
 | 
			
		||||
		*v = GPGv2
 | 
			
		||||
	default:
 | 
			
		||||
		v = nil
 | 
			
		||||
	}
 | 
			
		||||
	return newGPGClient(v, gpgHomeDir)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newGPGClient(version *GPGVersion, homedir string) (GPGClient, error) {
 | 
			
		||||
	var gpgVersion GPGVersion
 | 
			
		||||
	if version != nil {
 | 
			
		||||
		gpgVersion = *version
 | 
			
		||||
	} else {
 | 
			
		||||
		gpgVersion = GuessGPGVersion()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch gpgVersion {
 | 
			
		||||
	case GPGv1:
 | 
			
		||||
		return &gpgv1Client{
 | 
			
		||||
			gpgClient: gpgClient{gpgHomeDir: homedir},
 | 
			
		||||
		}, nil
 | 
			
		||||
	case GPGv2:
 | 
			
		||||
		return &gpgv2Client{
 | 
			
		||||
			gpgClient: gpgClient{gpgHomeDir: homedir},
 | 
			
		||||
		}, nil
 | 
			
		||||
	case GPGVersionUndetermined:
 | 
			
		||||
		return nil, fmt.Errorf("unable to determine GPG version")
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, fmt.Errorf("unhandled case: NewGPGClient")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetGPGPrivateKey gets the bytes of a specified keyid, supplying a passphrase
 | 
			
		||||
func (gc *gpgv2Client) GetGPGPrivateKey(keyid uint64, passphrase string) ([]byte, error) {
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if gc.gpgHomeDir != "" {
 | 
			
		||||
		args = append(args, []string{"--homedir", gc.gpgHomeDir}...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rfile, wfile, err := os.Pipe()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "could not create pipe")
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		rfile.Close()
 | 
			
		||||
		wfile.Close()
 | 
			
		||||
	}()
 | 
			
		||||
	// fill pipe in background
 | 
			
		||||
	go func(passphrase string) {
 | 
			
		||||
		_, _ = wfile.Write([]byte(passphrase))
 | 
			
		||||
		wfile.Close()
 | 
			
		||||
	}(passphrase)
 | 
			
		||||
 | 
			
		||||
	args = append(args, []string{"--pinentry-mode", "loopback", "--batch", "--passphrase-fd", fmt.Sprintf("%d", 3), "--export-secret-key", fmt.Sprintf("0x%x", keyid)}...)
 | 
			
		||||
 | 
			
		||||
	cmd := exec.Command("gpg2", args...)
 | 
			
		||||
	cmd.ExtraFiles = []*os.File{rfile}
 | 
			
		||||
 | 
			
		||||
	return runGPGGetOutput(cmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadGPGPubRingFile reads the GPG public key ring file
 | 
			
		||||
func (gc *gpgv2Client) ReadGPGPubRingFile() ([]byte, error) {
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if gc.gpgHomeDir != "" {
 | 
			
		||||
		args = append(args, []string{"--homedir", gc.gpgHomeDir}...)
 | 
			
		||||
	}
 | 
			
		||||
	args = append(args, []string{"--batch", "--export"}...)
 | 
			
		||||
 | 
			
		||||
	cmd := exec.Command("gpg2", args...)
 | 
			
		||||
 | 
			
		||||
	return runGPGGetOutput(cmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (gc *gpgv2Client) getKeyDetails(option string, keyid uint64) ([]byte, bool, error) {
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if gc.gpgHomeDir != "" {
 | 
			
		||||
		args = []string{"--homedir", gc.gpgHomeDir}
 | 
			
		||||
	}
 | 
			
		||||
	args = append(args, option, fmt.Sprintf("0x%x", keyid))
 | 
			
		||||
 | 
			
		||||
	cmd := exec.Command("gpg2", args...)
 | 
			
		||||
 | 
			
		||||
	keydata, err := runGPGGetOutput(cmd)
 | 
			
		||||
	return keydata, err == nil, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSecretKeyDetails retrieves the secret key details of key with keyid.
 | 
			
		||||
// returns a byte array of the details and a bool if the key exists
 | 
			
		||||
func (gc *gpgv2Client) GetSecretKeyDetails(keyid uint64) ([]byte, bool, error) {
 | 
			
		||||
	return gc.getKeyDetails("-K", keyid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetKeyDetails retrieves the public key details of key with keyid.
 | 
			
		||||
// returns a byte array of the details and a bool if the key exists
 | 
			
		||||
func (gc *gpgv2Client) GetKeyDetails(keyid uint64) ([]byte, bool, error) {
 | 
			
		||||
	return gc.getKeyDetails("-k", keyid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResolveRecipients converts PGP keyids to email addresses, if possible
 | 
			
		||||
func (gc *gpgv2Client) ResolveRecipients(recipients []string) []string {
 | 
			
		||||
	return resolveRecipients(gc, recipients)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetGPGPrivateKey gets the bytes of a specified keyid, supplying a passphrase
 | 
			
		||||
func (gc *gpgv1Client) GetGPGPrivateKey(keyid uint64, _ string) ([]byte, error) {
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if gc.gpgHomeDir != "" {
 | 
			
		||||
		args = append(args, []string{"--homedir", gc.gpgHomeDir}...)
 | 
			
		||||
	}
 | 
			
		||||
	args = append(args, []string{"--batch", "--export-secret-key", fmt.Sprintf("0x%x", keyid)}...)
 | 
			
		||||
 | 
			
		||||
	cmd := exec.Command("gpg", args...)
 | 
			
		||||
 | 
			
		||||
	return runGPGGetOutput(cmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadGPGPubRingFile reads the GPG public key ring file
 | 
			
		||||
func (gc *gpgv1Client) ReadGPGPubRingFile() ([]byte, error) {
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if gc.gpgHomeDir != "" {
 | 
			
		||||
		args = append(args, []string{"--homedir", gc.gpgHomeDir}...)
 | 
			
		||||
	}
 | 
			
		||||
	args = append(args, []string{"--batch", "--export"}...)
 | 
			
		||||
 | 
			
		||||
	cmd := exec.Command("gpg", args...)
 | 
			
		||||
 | 
			
		||||
	return runGPGGetOutput(cmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (gc *gpgv1Client) getKeyDetails(option string, keyid uint64) ([]byte, bool, error) {
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if gc.gpgHomeDir != "" {
 | 
			
		||||
		args = []string{"--homedir", gc.gpgHomeDir}
 | 
			
		||||
	}
 | 
			
		||||
	args = append(args, option, fmt.Sprintf("0x%x", keyid))
 | 
			
		||||
 | 
			
		||||
	cmd := exec.Command("gpg", args...)
 | 
			
		||||
 | 
			
		||||
	keydata, err := runGPGGetOutput(cmd)
 | 
			
		||||
 | 
			
		||||
	return keydata, err == nil, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSecretKeyDetails retrieves the secret key details of key with keyid.
 | 
			
		||||
// returns a byte array of the details and a bool if the key exists
 | 
			
		||||
func (gc *gpgv1Client) GetSecretKeyDetails(keyid uint64) ([]byte, bool, error) {
 | 
			
		||||
	return gc.getKeyDetails("-K", keyid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetKeyDetails retrieves the public key details of key with keyid.
 | 
			
		||||
// returns a byte array of the details and a bool if the key exists
 | 
			
		||||
func (gc *gpgv1Client) GetKeyDetails(keyid uint64) ([]byte, bool, error) {
 | 
			
		||||
	return gc.getKeyDetails("-k", keyid)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResolveRecipients converts PGP keyids to email addresses, if possible
 | 
			
		||||
func (gc *gpgv1Client) ResolveRecipients(recipients []string) []string {
 | 
			
		||||
	return resolveRecipients(gc, recipients)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// runGPGGetOutput runs the GPG commandline and returns stdout as byte array
 | 
			
		||||
// and any stderr in the error
 | 
			
		||||
func runGPGGetOutput(cmd *exec.Cmd) ([]byte, error) {
 | 
			
		||||
	stdout, err := cmd.StdoutPipe()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	stderr, err := cmd.StderrPipe()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if err := cmd.Start(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	stdoutstr, err2 := ioutil.ReadAll(stdout)
 | 
			
		||||
	stderrstr, _ := ioutil.ReadAll(stderr)
 | 
			
		||||
 | 
			
		||||
	if err := cmd.Wait(); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("error from %s: %s", cmd.Path, string(stderrstr))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return stdoutstr, err2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// resolveRecipients walks the list of recipients and attempts to convert
 | 
			
		||||
// all keyIds to email addresses; if something goes wrong during the
 | 
			
		||||
// conversion of a recipient, the original string is returned for that
 | 
			
		||||
// recpient
 | 
			
		||||
func resolveRecipients(gc GPGClient, recipients []string) []string {
 | 
			
		||||
	var result []string
 | 
			
		||||
 | 
			
		||||
	for _, recipient := range recipients {
 | 
			
		||||
		keyID, err := strconv.ParseUint(recipient, 0, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			result = append(result, recipient)
 | 
			
		||||
		} else {
 | 
			
		||||
			details, found, _ := gc.GetKeyDetails(keyID)
 | 
			
		||||
			if !found {
 | 
			
		||||
				result = append(result, recipient)
 | 
			
		||||
			} else {
 | 
			
		||||
				email := extractEmailFromDetails(details)
 | 
			
		||||
				if email == "" {
 | 
			
		||||
					result = append(result, recipient)
 | 
			
		||||
				} else {
 | 
			
		||||
					result = append(result, email)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var emailPattern = regexp.MustCompile(`uid\s+\[.*\]\s.*\s<(?P<email>.+)>`)
 | 
			
		||||
 | 
			
		||||
func extractEmailFromDetails(details []byte) string {
 | 
			
		||||
	loc := emailPattern.FindSubmatchIndex(details)
 | 
			
		||||
	if len(loc) == 0 {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return string(emailPattern.Expand(nil, []byte("$email"), details, loc))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// uint64ToStringArray converts an array of uint64's to an array of strings
 | 
			
		||||
// by applying a format string to each uint64
 | 
			
		||||
func uint64ToStringArray(format string, in []uint64) []string {
 | 
			
		||||
	var ret []string
 | 
			
		||||
 | 
			
		||||
	for _, v := range in {
 | 
			
		||||
		ret = append(ret, fmt.Sprintf(format, v))
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GPGGetPrivateKey walks the list of layerInfos and tries to decrypt the
 | 
			
		||||
// wrapped symmetric keys. For this it determines whether a private key is
 | 
			
		||||
// in the GPGVault or on this system and prompts for the passwords for those
 | 
			
		||||
// that are available. If we do not find a private key on the system for
 | 
			
		||||
// getting to the symmetric key of a layer then an error is generated.
 | 
			
		||||
func GPGGetPrivateKey(descs []ocispec.Descriptor, gpgClient GPGClient, gpgVault GPGVault, mustFindKey bool) (gpgPrivKeys [][]byte, gpgPrivKeysPwds [][]byte, err error) {
 | 
			
		||||
	// PrivateKeyData describes a private key
 | 
			
		||||
	type PrivateKeyData struct {
 | 
			
		||||
		KeyData         []byte
 | 
			
		||||
		KeyDataPassword []byte
 | 
			
		||||
	}
 | 
			
		||||
	var pkd PrivateKeyData
 | 
			
		||||
	keyIDPasswordMap := make(map[uint64]PrivateKeyData)
 | 
			
		||||
 | 
			
		||||
	for _, desc := range descs {
 | 
			
		||||
		for scheme, b64pgpPackets := range GetWrappedKeysMap(desc) {
 | 
			
		||||
			if scheme != "pgp" {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			keywrapper := GetKeyWrapper(scheme)
 | 
			
		||||
			if keywrapper == nil {
 | 
			
		||||
				return nil, nil, errors.Errorf("could not get KeyWrapper for %s\n", scheme)
 | 
			
		||||
			}
 | 
			
		||||
			keyIds, err := keywrapper.GetKeyIdsFromPacket(b64pgpPackets)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, nil, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			found := false
 | 
			
		||||
			for _, keyid := range keyIds {
 | 
			
		||||
				// do we have this key? -- first check the vault
 | 
			
		||||
				if gpgVault != nil {
 | 
			
		||||
					_, keydata := gpgVault.GetGPGPrivateKey(keyid)
 | 
			
		||||
					if len(keydata) > 0 {
 | 
			
		||||
						pkd = PrivateKeyData{
 | 
			
		||||
							KeyData:         keydata,
 | 
			
		||||
							KeyDataPassword: nil, // password not supported in this case
 | 
			
		||||
						}
 | 
			
		||||
						keyIDPasswordMap[keyid] = pkd
 | 
			
		||||
						found = true
 | 
			
		||||
						break
 | 
			
		||||
					}
 | 
			
		||||
				} else if gpgClient != nil {
 | 
			
		||||
					// check the local system's gpg installation
 | 
			
		||||
					keyinfo, haveKey, _ := gpgClient.GetSecretKeyDetails(keyid)
 | 
			
		||||
					// this may fail if the key is not here; we ignore the error
 | 
			
		||||
					if !haveKey {
 | 
			
		||||
						// key not on this system
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					_, found = keyIDPasswordMap[keyid]
 | 
			
		||||
					if !found {
 | 
			
		||||
						fmt.Printf("Passphrase required for Key id 0x%x: \n%v", keyid, string(keyinfo))
 | 
			
		||||
						fmt.Printf("Enter passphrase for key with Id 0x%x: ", keyid)
 | 
			
		||||
 | 
			
		||||
						password, err := term.ReadPassword(int(os.Stdin.Fd()))
 | 
			
		||||
						fmt.Printf("\n")
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							return nil, nil, err
 | 
			
		||||
						}
 | 
			
		||||
						keydata, err := gpgClient.GetGPGPrivateKey(keyid, string(password))
 | 
			
		||||
						if err != nil {
 | 
			
		||||
							return nil, nil, err
 | 
			
		||||
						}
 | 
			
		||||
						pkd = PrivateKeyData{
 | 
			
		||||
							KeyData:         keydata,
 | 
			
		||||
							KeyDataPassword: password,
 | 
			
		||||
						}
 | 
			
		||||
						keyIDPasswordMap[keyid] = pkd
 | 
			
		||||
						found = true
 | 
			
		||||
					}
 | 
			
		||||
					break
 | 
			
		||||
				} else {
 | 
			
		||||
					return nil, nil, errors.New("no GPGVault or GPGClient passed")
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !found && len(b64pgpPackets) > 0 && mustFindKey {
 | 
			
		||||
				ids := uint64ToStringArray("0x%x", keyIds)
 | 
			
		||||
 | 
			
		||||
				return nil, nil, errors.Errorf("missing key for decryption of layer %x of %s. Need one of the following keys: %s", desc.Digest, desc.Platform, strings.Join(ids, ", "))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, pkd := range keyIDPasswordMap {
 | 
			
		||||
		gpgPrivKeys = append(gpgPrivKeys, pkd.KeyData)
 | 
			
		||||
		gpgPrivKeysPwds = append(gpgPrivKeysPwds, pkd.KeyDataPassword)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return gpgPrivKeys, gpgPrivKeysPwds, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										100
									
								
								vendor/github.com/containers/ocicrypt/gpgvault.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/containers/ocicrypt/gpgvault.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,100 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package ocicrypt
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"golang.org/x/crypto/openpgp"
 | 
			
		||||
	"golang.org/x/crypto/openpgp/packet"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GPGVault defines an interface for wrapping multiple secret key rings
 | 
			
		||||
type GPGVault interface {
 | 
			
		||||
	// AddSecretKeyRingData adds a secret keyring via its raw byte array
 | 
			
		||||
	AddSecretKeyRingData(gpgSecretKeyRingData []byte) error
 | 
			
		||||
	// AddSecretKeyRingDataArray adds secret keyring via its raw byte arrays
 | 
			
		||||
	AddSecretKeyRingDataArray(gpgSecretKeyRingDataArray [][]byte) error
 | 
			
		||||
	// AddSecretKeyRingFiles adds secret keyrings given their filenames
 | 
			
		||||
	AddSecretKeyRingFiles(filenames []string) error
 | 
			
		||||
	// GetGPGPrivateKey gets the private key bytes of a keyid given a passphrase
 | 
			
		||||
	GetGPGPrivateKey(keyid uint64) ([]openpgp.Key, []byte)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// gpgVault wraps an array of gpgSecretKeyRing
 | 
			
		||||
type gpgVault struct {
 | 
			
		||||
	entityLists []openpgp.EntityList
 | 
			
		||||
	keyDataList [][]byte // the raw data original passed in
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewGPGVault creates an empty GPGVault
 | 
			
		||||
func NewGPGVault() GPGVault {
 | 
			
		||||
	return &gpgVault{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddSecretKeyRingData adds a secret keyring's to the gpgVault; the raw byte
 | 
			
		||||
// array read from the file must be passed and will be parsed by this function
 | 
			
		||||
func (g *gpgVault) AddSecretKeyRingData(gpgSecretKeyRingData []byte) error {
 | 
			
		||||
	// read the private keys
 | 
			
		||||
	r := bytes.NewReader(gpgSecretKeyRingData)
 | 
			
		||||
	entityList, err := openpgp.ReadKeyRing(r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.Wrapf(err, "could not read keyring")
 | 
			
		||||
	}
 | 
			
		||||
	g.entityLists = append(g.entityLists, entityList)
 | 
			
		||||
	g.keyDataList = append(g.keyDataList, gpgSecretKeyRingData)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddSecretKeyRingDataArray adds secret keyrings to the gpgVault; the raw byte
 | 
			
		||||
// arrays read from files must be passed
 | 
			
		||||
func (g *gpgVault) AddSecretKeyRingDataArray(gpgSecretKeyRingDataArray [][]byte) error {
 | 
			
		||||
	for _, gpgSecretKeyRingData := range gpgSecretKeyRingDataArray {
 | 
			
		||||
		if err := g.AddSecretKeyRingData(gpgSecretKeyRingData); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddSecretKeyRingFiles adds the secret key rings given their filenames
 | 
			
		||||
func (g *gpgVault) AddSecretKeyRingFiles(filenames []string) error {
 | 
			
		||||
	for _, filename := range filenames {
 | 
			
		||||
		gpgSecretKeyRingData, err := ioutil.ReadFile(filename)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		err = g.AddSecretKeyRingData(gpgSecretKeyRingData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetGPGPrivateKey gets the bytes of a specified keyid, supplying a passphrase
 | 
			
		||||
func (g *gpgVault) GetGPGPrivateKey(keyid uint64) ([]openpgp.Key, []byte) {
 | 
			
		||||
	for i, el := range g.entityLists {
 | 
			
		||||
		decKeys := el.KeysByIdUsage(keyid, packet.KeyFlagEncryptCommunications)
 | 
			
		||||
		if len(decKeys) > 0 {
 | 
			
		||||
			return decKeys, g.keyDataList[i]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										136
									
								
								vendor/github.com/containers/ocicrypt/keywrap/jwe/keywrapper_jwe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										136
									
								
								vendor/github.com/containers/ocicrypt/keywrap/jwe/keywrapper_jwe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,136 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package jwe
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/ecdsa"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap"
 | 
			
		||||
	"github.com/containers/ocicrypt/utils"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	jose "gopkg.in/square/go-jose.v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type jweKeyWrapper struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) GetAnnotationID() string {
 | 
			
		||||
	return "org.opencontainers.image.enc.keys.jwe"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewKeyWrapper returns a new key wrapping interface using jwe
 | 
			
		||||
func NewKeyWrapper() keywrap.KeyWrapper {
 | 
			
		||||
	return &jweKeyWrapper{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapKeys wraps the session key for recpients and encrypts the optsData, which
 | 
			
		||||
// describe the symmetric key used for encrypting the layer
 | 
			
		||||
func (kw *jweKeyWrapper) WrapKeys(ec *config.EncryptConfig, optsData []byte) ([]byte, error) {
 | 
			
		||||
	var joseRecipients []jose.Recipient
 | 
			
		||||
 | 
			
		||||
	err := addPubKeys(&joseRecipients, ec.Parameters["pubkeys"])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	// no recipients is not an error...
 | 
			
		||||
	if len(joseRecipients) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	encrypter, err := jose.NewMultiEncrypter(jose.A256GCM, joseRecipients, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "jose.NewMultiEncrypter failed")
 | 
			
		||||
	}
 | 
			
		||||
	jwe, err := encrypter.Encrypt(optsData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "JWE Encrypt failed")
 | 
			
		||||
	}
 | 
			
		||||
	return []byte(jwe.FullSerialize()), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) UnwrapKey(dc *config.DecryptConfig, jweString []byte) ([]byte, error) {
 | 
			
		||||
	jwe, err := jose.ParseEncrypted(string(jweString))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.New("jose.ParseEncrypted failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	privKeys := kw.GetPrivateKeys(dc.Parameters)
 | 
			
		||||
	if len(privKeys) == 0 {
 | 
			
		||||
		return nil, errors.New("No private keys found for JWE decryption")
 | 
			
		||||
	}
 | 
			
		||||
	privKeysPasswords := kw.getPrivateKeysPasswords(dc.Parameters)
 | 
			
		||||
	if len(privKeysPasswords) != len(privKeys) {
 | 
			
		||||
		return nil, errors.New("Private key password array length must be same as that of private keys")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for idx, privKey := range privKeys {
 | 
			
		||||
		key, err := utils.ParsePrivateKey(privKey, privKeysPasswords[idx], "JWE")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		_, _, plain, err := jwe.DecryptMulti(key)
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			return plain, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil, errors.New("JWE: No suitable private key found for decryption")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) NoPossibleKeys(dcparameters map[string][][]byte) bool {
 | 
			
		||||
	return len(kw.GetPrivateKeys(dcparameters)) == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) GetPrivateKeys(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return dcparameters["privkeys"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) getPrivateKeysPasswords(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return dcparameters["privkeys-passwords"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) GetKeyIdsFromPacket(b64jwes string) ([]uint64, error) {
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *jweKeyWrapper) GetRecipients(b64jwes string) ([]string, error) {
 | 
			
		||||
	return []string{"[jwe]"}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addPubKeys(joseRecipients *[]jose.Recipient, pubKeys [][]byte) error {
 | 
			
		||||
	if len(pubKeys) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	for _, pubKey := range pubKeys {
 | 
			
		||||
		key, err := utils.ParsePublicKey(pubKey, "JWE")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		alg := jose.RSA_OAEP
 | 
			
		||||
		switch key.(type) {
 | 
			
		||||
		case *ecdsa.PublicKey:
 | 
			
		||||
			alg = jose.ECDH_ES_A256KW
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		*joseRecipients = append(*joseRecipients, jose.Recipient{
 | 
			
		||||
			Algorithm: alg,
 | 
			
		||||
			Key:       key,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										242
									
								
								vendor/github.com/containers/ocicrypt/keywrap/keyprovider/keyprovider.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										242
									
								
								vendor/github.com/containers/ocicrypt/keywrap/keyprovider/keyprovider.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,242 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package keyprovider
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
	keyproviderconfig "github.com/containers/ocicrypt/config/keyprovider-config"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap"
 | 
			
		||||
	"github.com/containers/ocicrypt/utils"
 | 
			
		||||
	keyproviderpb "github.com/containers/ocicrypt/utils/keyprovider"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
	"google.golang.org/grpc"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type keyProviderKeyWrapper struct {
 | 
			
		||||
	provider string
 | 
			
		||||
	attrs    keyproviderconfig.KeyProviderAttrs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *keyProviderKeyWrapper) GetAnnotationID() string {
 | 
			
		||||
	return "org.opencontainers.image.enc.keys.provider." + kw.provider
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewKeyWrapper returns a new key wrapping interface using keyprovider
 | 
			
		||||
func NewKeyWrapper(p string, a keyproviderconfig.KeyProviderAttrs) keywrap.KeyWrapper {
 | 
			
		||||
	return &keyProviderKeyWrapper{provider: p, attrs: a}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KeyProviderKeyWrapProtocolOperation string
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	OpKeyWrap   KeyProviderKeyWrapProtocolOperation = "keywrap"
 | 
			
		||||
	OpKeyUnwrap KeyProviderKeyWrapProtocolOperation = "keyunwrap"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// KeyProviderKeyWrapProtocolInput defines the input to the key provider binary or grpc method.
 | 
			
		||||
type KeyProviderKeyWrapProtocolInput struct {
 | 
			
		||||
	// Operation is either "keywrap" or "keyunwrap"
 | 
			
		||||
	Operation KeyProviderKeyWrapProtocolOperation `json:"op"`
 | 
			
		||||
	// KeyWrapParams encodes the arguments to key wrap if operation is set to wrap
 | 
			
		||||
	KeyWrapParams KeyWrapParams `json:"keywrapparams,omitempty"`
 | 
			
		||||
	// KeyUnwrapParams encodes the arguments to key unwrap if operation is set to unwrap
 | 
			
		||||
	KeyUnwrapParams KeyUnwrapParams `json:"keyunwrapparams,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// KeyProviderKeyWrapProtocolOutput defines the output of the key provider binary or grpc method.
 | 
			
		||||
type KeyProviderKeyWrapProtocolOutput struct {
 | 
			
		||||
	// KeyWrapResult encodes the results to key wrap if operation is to wrap
 | 
			
		||||
	KeyWrapResults KeyWrapResults `json:"keywrapresults,omitempty"`
 | 
			
		||||
	// KeyUnwrapResult encodes the result to key unwrap if operation is to unwrap
 | 
			
		||||
	KeyUnwrapResults KeyUnwrapResults `json:"keyunwrapresults,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KeyWrapParams struct {
 | 
			
		||||
	Ec       *config.EncryptConfig `json:"ec"`
 | 
			
		||||
	OptsData []byte                `json:"optsdata"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KeyUnwrapParams struct {
 | 
			
		||||
	Dc         *config.DecryptConfig `json:"dc"`
 | 
			
		||||
	Annotation []byte                `json:"annotation"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KeyUnwrapResults struct {
 | 
			
		||||
	OptsData []byte `json:"optsdata"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KeyWrapResults struct {
 | 
			
		||||
	Annotation []byte `json:"annotation"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var runner utils.CommandExecuter
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	runner = utils.Runner{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapKeys calls appropriate binary executable/grpc server for wrapping the session key for recipients and gets encrypted optsData, which
 | 
			
		||||
// describe the symmetric key used for encrypting the layer
 | 
			
		||||
func (kw *keyProviderKeyWrapper) WrapKeys(ec *config.EncryptConfig, optsData []byte) ([]byte, error) {
 | 
			
		||||
 | 
			
		||||
	input, err := json.Marshal(KeyProviderKeyWrapProtocolInput{
 | 
			
		||||
		Operation: OpKeyWrap,
 | 
			
		||||
		KeyWrapParams: KeyWrapParams{
 | 
			
		||||
			Ec:       ec,
 | 
			
		||||
			OptsData: optsData,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, ok := ec.Parameters[kw.provider]; ok {
 | 
			
		||||
		if kw.attrs.Command != nil {
 | 
			
		||||
			protocolOuput, err := getProviderCommandOutput(input, kw.attrs.Command)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errors.Wrap(err, "error while retrieving keyprovider protocol command output")
 | 
			
		||||
			}
 | 
			
		||||
			return protocolOuput.KeyWrapResults.Annotation, nil
 | 
			
		||||
		} else if kw.attrs.Grpc != "" {
 | 
			
		||||
			protocolOuput, err := getProviderGRPCOutput(input, kw.attrs.Grpc, OpKeyWrap)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errors.Wrap(err, "error while retrieving keyprovider protocol grpc output")
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return protocolOuput.KeyWrapResults.Annotation, nil
 | 
			
		||||
		} else {
 | 
			
		||||
			return nil, errors.New("Unsupported keyprovider invocation. Supported invocation methods are grpc and cmd")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnwrapKey calls appropriate binary executable/grpc server for unwrapping the session key based on the protocol given in annotation for recipients and gets decrypted optsData,
 | 
			
		||||
// which describe the symmetric key used for decrypting the layer
 | 
			
		||||
func (kw *keyProviderKeyWrapper) UnwrapKey(dc *config.DecryptConfig, jsonString []byte) ([]byte, error) {
 | 
			
		||||
	input, err := json.Marshal(KeyProviderKeyWrapProtocolInput{
 | 
			
		||||
		Operation: OpKeyUnwrap,
 | 
			
		||||
		KeyUnwrapParams: KeyUnwrapParams{
 | 
			
		||||
			Dc:         dc,
 | 
			
		||||
			Annotation: jsonString,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if kw.attrs.Command != nil {
 | 
			
		||||
		protocolOuput, err := getProviderCommandOutput(input, kw.attrs.Command)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// If err is not nil, then ignore it and continue with rest of the given keyproviders
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return protocolOuput.KeyUnwrapResults.OptsData, nil
 | 
			
		||||
	} else if kw.attrs.Grpc != "" {
 | 
			
		||||
		protocolOuput, err := getProviderGRPCOutput(input, kw.attrs.Grpc, OpKeyUnwrap)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// If err is not nil, then ignore it and continue with rest of the given keyproviders
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return protocolOuput.KeyUnwrapResults.OptsData, nil
 | 
			
		||||
	} else {
 | 
			
		||||
		return nil, errors.New("Unsupported keyprovider invocation. Supported invocation methods are grpc and cmd")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getProviderGRPCOutput(input []byte, connString string, operation KeyProviderKeyWrapProtocolOperation) (*KeyProviderKeyWrapProtocolOutput, error) {
 | 
			
		||||
	var protocolOuput KeyProviderKeyWrapProtocolOutput
 | 
			
		||||
	var grpcOutput *keyproviderpb.KeyProviderKeyWrapProtocolOutput
 | 
			
		||||
	cc, err := grpc.Dial(connString, grpc.WithInsecure())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "error while dialing rpc server")
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		derr := cc.Close()
 | 
			
		||||
		if derr != nil {
 | 
			
		||||
			log.WithError(derr).Error("Error closing grpc socket")
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	client := keyproviderpb.NewKeyProviderServiceClient(cc)
 | 
			
		||||
	req := &keyproviderpb.KeyProviderKeyWrapProtocolInput{
 | 
			
		||||
		KeyProviderKeyWrapProtocolInput: input,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if operation == OpKeyWrap {
 | 
			
		||||
		grpcOutput, err = client.WrapKey(context.Background(), req)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrap(err, "Error from grpc method")
 | 
			
		||||
		}
 | 
			
		||||
	} else if operation == OpKeyUnwrap {
 | 
			
		||||
		grpcOutput, err = client.UnWrapKey(context.Background(), req)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrap(err, "Error from grpc method")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		return nil, errors.New("Unsupported operation")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	respBytes := grpcOutput.GetKeyProviderKeyWrapProtocolOutput()
 | 
			
		||||
	err = json.Unmarshal(respBytes, &protocolOuput)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "Error while unmarshalling grpc method output")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &protocolOuput, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getProviderCommandOutput(input []byte, command *keyproviderconfig.Command) (*KeyProviderKeyWrapProtocolOutput, error) {
 | 
			
		||||
	var protocolOuput KeyProviderKeyWrapProtocolOutput
 | 
			
		||||
	// Convert interface to command structure
 | 
			
		||||
	respBytes, err := runner.Exec(command.Path, command.Args, input)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	err = json.Unmarshal(respBytes, &protocolOuput)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "Error while unmarshalling binary executable command output")
 | 
			
		||||
	}
 | 
			
		||||
	return &protocolOuput, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Return false as it is not applicable to keyprovider protocol
 | 
			
		||||
func (kw *keyProviderKeyWrapper) NoPossibleKeys(dcparameters map[string][][]byte) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Return nil as it is not applicable to keyprovider protocol
 | 
			
		||||
func (kw *keyProviderKeyWrapper) GetPrivateKeys(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Return nil as it is not applicable to keyprovider protocol
 | 
			
		||||
func (kw *keyProviderKeyWrapper) GetKeyIdsFromPacket(_ string) ([]uint64, error) {
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Return nil as it is not applicable to keyprovider protocol
 | 
			
		||||
func (kw *keyProviderKeyWrapper) GetRecipients(_ string) ([]string, error) {
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										48
									
								
								vendor/github.com/containers/ocicrypt/keywrap/keywrap.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/containers/ocicrypt/keywrap/keywrap.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,48 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package keywrap
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// KeyWrapper is the interface used for wrapping keys using
 | 
			
		||||
// a specific encryption technology (pgp, jwe)
 | 
			
		||||
type KeyWrapper interface {
 | 
			
		||||
	WrapKeys(ec *config.EncryptConfig, optsData []byte) ([]byte, error)
 | 
			
		||||
	UnwrapKey(dc *config.DecryptConfig, annotation []byte) ([]byte, error)
 | 
			
		||||
	GetAnnotationID() string
 | 
			
		||||
 | 
			
		||||
	// NoPossibleKeys returns true if there is no possibility of performing
 | 
			
		||||
	// decryption for parameters provided.
 | 
			
		||||
	NoPossibleKeys(dcparameters map[string][][]byte) bool
 | 
			
		||||
 | 
			
		||||
	// GetPrivateKeys (optional) gets the array of private keys. It is an optional implementation
 | 
			
		||||
	// as in some key services, a private key may not be exportable (i.e. HSM)
 | 
			
		||||
	// If not implemented, return nil
 | 
			
		||||
	GetPrivateKeys(dcparameters map[string][][]byte) [][]byte
 | 
			
		||||
 | 
			
		||||
	// GetKeyIdsFromPacket (optional) gets a list of key IDs. This is optional as some encryption
 | 
			
		||||
	// schemes may not have a notion of key IDs
 | 
			
		||||
	// If not implemented, return the nil slice
 | 
			
		||||
	GetKeyIdsFromPacket(packet string) ([]uint64, error)
 | 
			
		||||
 | 
			
		||||
	// GetRecipients (optional) gets a list of recipients. It is optional due to the validity of
 | 
			
		||||
	// recipients in a particular encryptiong scheme
 | 
			
		||||
	// If not implemented, return the nil slice
 | 
			
		||||
	GetRecipients(packet string) ([]string, error)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										273
									
								
								vendor/github.com/containers/ocicrypt/keywrap/pgp/keywrapper_gpg.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										273
									
								
								vendor/github.com/containers/ocicrypt/keywrap/pgp/keywrapper_gpg.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,273 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pgp
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto"
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/mail"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"golang.org/x/crypto/openpgp"
 | 
			
		||||
	"golang.org/x/crypto/openpgp/packet"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type gpgKeyWrapper struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewKeyWrapper returns a new key wrapping interface for pgp
 | 
			
		||||
func NewKeyWrapper() keywrap.KeyWrapper {
 | 
			
		||||
	return &gpgKeyWrapper{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// GPGDefaultEncryptConfig is the default configuration for layer encryption/decryption
 | 
			
		||||
	GPGDefaultEncryptConfig = &packet.Config{
 | 
			
		||||
		Rand:              rand.Reader,
 | 
			
		||||
		DefaultHash:       crypto.SHA256,
 | 
			
		||||
		DefaultCipher:     packet.CipherAES256,
 | 
			
		||||
		CompressionConfig: &packet.CompressionConfig{Level: 0}, // No compression
 | 
			
		||||
		RSABits:           2048,
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (kw *gpgKeyWrapper) GetAnnotationID() string {
 | 
			
		||||
	return "org.opencontainers.image.enc.keys.pgp"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapKeys wraps the session key for recpients and encrypts the optsData, which
 | 
			
		||||
// describe the symmetric key used for encrypting the layer
 | 
			
		||||
func (kw *gpgKeyWrapper) WrapKeys(ec *config.EncryptConfig, optsData []byte) ([]byte, error) {
 | 
			
		||||
	ciphertext := new(bytes.Buffer)
 | 
			
		||||
	el, err := kw.createEntityList(ec)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "unable to create entity list")
 | 
			
		||||
	}
 | 
			
		||||
	if len(el) == 0 {
 | 
			
		||||
		// nothing to do -- not an error
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	plaintextWriter, err := openpgp.Encrypt(ciphertext,
 | 
			
		||||
		el,  /*EntityList*/
 | 
			
		||||
		nil, /* Sign*/
 | 
			
		||||
		nil, /* FileHint */
 | 
			
		||||
		GPGDefaultEncryptConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = plaintextWriter.Write(optsData); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if err = plaintextWriter.Close(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ciphertext.Bytes(), err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnwrapKey unwraps the symmetric key with which the layer is encrypted
 | 
			
		||||
// This symmetric key is encrypted in the PGP payload.
 | 
			
		||||
func (kw *gpgKeyWrapper) UnwrapKey(dc *config.DecryptConfig, pgpPacket []byte) ([]byte, error) {
 | 
			
		||||
	pgpPrivateKeys, pgpPrivateKeysPwd, err := kw.getKeyParameters(dc.Parameters)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for idx, pgpPrivateKey := range pgpPrivateKeys {
 | 
			
		||||
		r := bytes.NewBuffer(pgpPrivateKey)
 | 
			
		||||
		entityList, err := openpgp.ReadKeyRing(r)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrap(err, "unable to parse private keys")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var prompt openpgp.PromptFunction
 | 
			
		||||
		if len(pgpPrivateKeysPwd) > idx {
 | 
			
		||||
			responded := false
 | 
			
		||||
			prompt = func(keys []openpgp.Key, symmetric bool) ([]byte, error) {
 | 
			
		||||
				if responded {
 | 
			
		||||
					return nil, fmt.Errorf("don't seem to have the right password")
 | 
			
		||||
				}
 | 
			
		||||
				responded = true
 | 
			
		||||
				for _, key := range keys {
 | 
			
		||||
					if key.PrivateKey != nil {
 | 
			
		||||
						_ = key.PrivateKey.Decrypt(pgpPrivateKeysPwd[idx])
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				return pgpPrivateKeysPwd[idx], nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		r = bytes.NewBuffer(pgpPacket)
 | 
			
		||||
		md, err := openpgp.ReadMessage(r, entityList, prompt, GPGDefaultEncryptConfig)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		// we get the plain key options back
 | 
			
		||||
		optsData, err := ioutil.ReadAll(md.UnverifiedBody)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return optsData, nil
 | 
			
		||||
	}
 | 
			
		||||
	return nil, errors.New("PGP: No suitable key found to unwrap key")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetKeyIdsFromWrappedKeys converts the base64 encoded PGPPacket to uint64 keyIds
 | 
			
		||||
func (kw *gpgKeyWrapper) GetKeyIdsFromPacket(b64pgpPackets string) ([]uint64, error) {
 | 
			
		||||
 | 
			
		||||
	var keyids []uint64
 | 
			
		||||
	for _, b64pgpPacket := range strings.Split(b64pgpPackets, ",") {
 | 
			
		||||
		pgpPacket, err := base64.StdEncoding.DecodeString(b64pgpPacket)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrapf(err, "could not decode base64 encoded PGP packet")
 | 
			
		||||
		}
 | 
			
		||||
		newids, err := kw.getKeyIDs(pgpPacket)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		keyids = append(keyids, newids...)
 | 
			
		||||
	}
 | 
			
		||||
	return keyids, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getKeyIDs parses a PGPPacket and gets the list of recipients' key IDs
 | 
			
		||||
func (kw *gpgKeyWrapper) getKeyIDs(pgpPacket []byte) ([]uint64, error) {
 | 
			
		||||
	var keyids []uint64
 | 
			
		||||
 | 
			
		||||
	kbuf := bytes.NewBuffer(pgpPacket)
 | 
			
		||||
	packets := packet.NewReader(kbuf)
 | 
			
		||||
ParsePackets:
 | 
			
		||||
	for {
 | 
			
		||||
		p, err := packets.Next()
 | 
			
		||||
		if err == io.EOF {
 | 
			
		||||
			break ParsePackets
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return []uint64{}, errors.Wrapf(err, "packets.Next() failed")
 | 
			
		||||
		}
 | 
			
		||||
		switch p := p.(type) {
 | 
			
		||||
		case *packet.EncryptedKey:
 | 
			
		||||
			keyids = append(keyids, p.KeyId)
 | 
			
		||||
		case *packet.SymmetricallyEncrypted:
 | 
			
		||||
			break ParsePackets
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return keyids, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetRecipients converts the wrappedKeys to an array of recipients
 | 
			
		||||
func (kw *gpgKeyWrapper) GetRecipients(b64pgpPackets string) ([]string, error) {
 | 
			
		||||
	keyIds, err := kw.GetKeyIdsFromPacket(b64pgpPackets)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var array []string
 | 
			
		||||
	for _, keyid := range keyIds {
 | 
			
		||||
		array = append(array, "0x"+strconv.FormatUint(keyid, 16))
 | 
			
		||||
	}
 | 
			
		||||
	return array, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *gpgKeyWrapper) NoPossibleKeys(dcparameters map[string][][]byte) bool {
 | 
			
		||||
	return len(kw.GetPrivateKeys(dcparameters)) == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *gpgKeyWrapper) GetPrivateKeys(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return dcparameters["gpg-privatekeys"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *gpgKeyWrapper) getKeyParameters(dcparameters map[string][][]byte) ([][]byte, [][]byte, error) {
 | 
			
		||||
 | 
			
		||||
	privKeys := kw.GetPrivateKeys(dcparameters)
 | 
			
		||||
	if len(privKeys) == 0 {
 | 
			
		||||
		return nil, nil, errors.New("GPG: Missing private key parameter")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return privKeys, dcparameters["gpg-privatekeys-passwords"], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// createEntityList creates the opengpg EntityList by reading the KeyRing
 | 
			
		||||
// first and then filtering out recipients' keys
 | 
			
		||||
func (kw *gpgKeyWrapper) createEntityList(ec *config.EncryptConfig) (openpgp.EntityList, error) {
 | 
			
		||||
	pgpPubringFile := ec.Parameters["gpg-pubkeyringfile"]
 | 
			
		||||
	if len(pgpPubringFile) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	r := bytes.NewReader(pgpPubringFile[0])
 | 
			
		||||
 | 
			
		||||
	entityList, err := openpgp.ReadKeyRing(r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gpgRecipients := ec.Parameters["gpg-recipients"]
 | 
			
		||||
	if len(gpgRecipients) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rSet := make(map[string]int)
 | 
			
		||||
	for _, r := range gpgRecipients {
 | 
			
		||||
		rSet[string(r)] = 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var filteredList openpgp.EntityList
 | 
			
		||||
	for _, entity := range entityList {
 | 
			
		||||
		for k := range entity.Identities {
 | 
			
		||||
			addr, err := mail.ParseAddress(k)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			for _, r := range gpgRecipients {
 | 
			
		||||
				recp := string(r)
 | 
			
		||||
				if strings.Compare(addr.Name, recp) == 0 || strings.Compare(addr.Address, recp) == 0 {
 | 
			
		||||
					filteredList = append(filteredList, entity)
 | 
			
		||||
					rSet[recp] = rSet[recp] + 1
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// make sure we found keys for all the Recipients...
 | 
			
		||||
	var buffer bytes.Buffer
 | 
			
		||||
	notFound := false
 | 
			
		||||
	buffer.WriteString("PGP: No key found for the following recipients: ")
 | 
			
		||||
 | 
			
		||||
	for k, v := range rSet {
 | 
			
		||||
		if v == 0 {
 | 
			
		||||
			if notFound {
 | 
			
		||||
				buffer.WriteString(", ")
 | 
			
		||||
			}
 | 
			
		||||
			buffer.WriteString(k)
 | 
			
		||||
			notFound = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if notFound {
 | 
			
		||||
		return nil, errors.New(buffer.String())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return filteredList, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										147
									
								
								vendor/github.com/containers/ocicrypt/keywrap/pkcs11/keywrapper_pkcs11.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										147
									
								
								vendor/github.com/containers/ocicrypt/keywrap/pkcs11/keywrapper_pkcs11.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,147 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
	"github.com/containers/ocicrypt/crypto/pkcs11"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap"
 | 
			
		||||
	"github.com/containers/ocicrypt/utils"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type pkcs11KeyWrapper struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs11KeyWrapper) GetAnnotationID() string {
 | 
			
		||||
	return "org.opencontainers.image.enc.keys.pkcs11"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewKeyWrapper returns a new key wrapping interface using pkcs11
 | 
			
		||||
func NewKeyWrapper() keywrap.KeyWrapper {
 | 
			
		||||
	return &pkcs11KeyWrapper{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapKeys wraps the session key for recpients and encrypts the optsData, which
 | 
			
		||||
// describe the symmetric key used for encrypting the layer
 | 
			
		||||
func (kw *pkcs11KeyWrapper) WrapKeys(ec *config.EncryptConfig, optsData []byte) ([]byte, error) {
 | 
			
		||||
	pkcs11Recipients, err := addPubKeys(&ec.DecryptConfig, append(ec.Parameters["pkcs11-pubkeys"], ec.Parameters["pkcs11-yamls"]...))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	// no recipients is not an error...
 | 
			
		||||
	if len(pkcs11Recipients) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	jsonString, err := pkcs11.EncryptMultiple(pkcs11Recipients, optsData)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "PKCS11 EncryptMulitple failed")
 | 
			
		||||
	}
 | 
			
		||||
	return jsonString, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs11KeyWrapper) UnwrapKey(dc *config.DecryptConfig, jsonString []byte) ([]byte, error) {
 | 
			
		||||
	var pkcs11PrivKeys []*pkcs11.Pkcs11KeyFileObject
 | 
			
		||||
 | 
			
		||||
	privKeys := kw.GetPrivateKeys(dc.Parameters)
 | 
			
		||||
	if len(privKeys) == 0 {
 | 
			
		||||
		return nil, errors.New("No private keys found for PKCS11 decryption")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p11conf, err := p11confFromParameters(dc.Parameters)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, privKey := range privKeys {
 | 
			
		||||
		key, err := utils.ParsePrivateKey(privKey, nil, "PKCS11")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		switch pkcs11PrivKey := key.(type) {
 | 
			
		||||
		case *pkcs11.Pkcs11KeyFileObject:
 | 
			
		||||
			if p11conf != nil {
 | 
			
		||||
				pkcs11PrivKey.Uri.SetModuleDirectories(p11conf.ModuleDirectories)
 | 
			
		||||
				pkcs11PrivKey.Uri.SetAllowedModulePaths(p11conf.AllowedModulePaths)
 | 
			
		||||
			}
 | 
			
		||||
			pkcs11PrivKeys = append(pkcs11PrivKeys, pkcs11PrivKey)
 | 
			
		||||
		default:
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	plaintext, err := pkcs11.Decrypt(pkcs11PrivKeys, jsonString)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return plaintext, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, errors.Wrapf(err, "PKCS11: No suitable private key found for decryption")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs11KeyWrapper) NoPossibleKeys(dcparameters map[string][][]byte) bool {
 | 
			
		||||
	return len(kw.GetPrivateKeys(dcparameters)) == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs11KeyWrapper) GetPrivateKeys(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return dcparameters["pkcs11-yamls"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs11KeyWrapper) GetKeyIdsFromPacket(_ string) ([]uint64, error) {
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs11KeyWrapper) GetRecipients(_ string) ([]string, error) {
 | 
			
		||||
	return []string{"[pkcs11]"}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addPubKeys(dc *config.DecryptConfig, pubKeys [][]byte) ([]interface{}, error) {
 | 
			
		||||
	var pkcs11Keys []interface{}
 | 
			
		||||
 | 
			
		||||
	if len(pubKeys) == 0 {
 | 
			
		||||
		return pkcs11Keys, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p11conf, err := p11confFromParameters(dc.Parameters)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, pubKey := range pubKeys {
 | 
			
		||||
		key, err := utils.ParsePublicKey(pubKey, "PKCS11")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		switch pkcs11PubKey := key.(type) {
 | 
			
		||||
		case *pkcs11.Pkcs11KeyFileObject:
 | 
			
		||||
			if p11conf != nil {
 | 
			
		||||
				pkcs11PubKey.Uri.SetModuleDirectories(p11conf.ModuleDirectories)
 | 
			
		||||
				pkcs11PubKey.Uri.SetAllowedModulePaths(p11conf.AllowedModulePaths)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		pkcs11Keys = append(pkcs11Keys, key)
 | 
			
		||||
	}
 | 
			
		||||
	return pkcs11Keys, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func p11confFromParameters(dcparameters map[string][][]byte) (*pkcs11.Pkcs11Config, error) {
 | 
			
		||||
	if _, ok := dcparameters["pkcs11-config"]; ok {
 | 
			
		||||
		return pkcs11.ParsePkcs11ConfigFile(dcparameters["pkcs11-config"][0])
 | 
			
		||||
	}
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										136
									
								
								vendor/github.com/containers/ocicrypt/keywrap/pkcs7/keywrapper_pkcs7.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										136
									
								
								vendor/github.com/containers/ocicrypt/keywrap/pkcs7/keywrapper_pkcs7.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,136 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs7
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto"
 | 
			
		||||
	"crypto/x509"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt/config"
 | 
			
		||||
	"github.com/containers/ocicrypt/keywrap"
 | 
			
		||||
	"github.com/containers/ocicrypt/utils"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"go.mozilla.org/pkcs7"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type pkcs7KeyWrapper struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewKeyWrapper returns a new key wrapping interface using jwe
 | 
			
		||||
func NewKeyWrapper() keywrap.KeyWrapper {
 | 
			
		||||
	return &pkcs7KeyWrapper{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs7KeyWrapper) GetAnnotationID() string {
 | 
			
		||||
	return "org.opencontainers.image.enc.keys.pkcs7"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WrapKeys wraps the session key for recpients and encrypts the optsData, which
 | 
			
		||||
// describe the symmetric key used for encrypting the layer
 | 
			
		||||
func (kw *pkcs7KeyWrapper) WrapKeys(ec *config.EncryptConfig, optsData []byte) ([]byte, error) {
 | 
			
		||||
	x509Certs, err := collectX509s(ec.Parameters["x509s"])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	// no recipients is not an error...
 | 
			
		||||
	if len(x509Certs) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pkcs7.ContentEncryptionAlgorithm = pkcs7.EncryptionAlgorithmAES128GCM
 | 
			
		||||
	return pkcs7.Encrypt(optsData, x509Certs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func collectX509s(x509s [][]byte) ([]*x509.Certificate, error) {
 | 
			
		||||
	if len(x509s) == 0 {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	var x509Certs []*x509.Certificate
 | 
			
		||||
	for _, x509 := range x509s {
 | 
			
		||||
		x509Cert, err := utils.ParseCertificate(x509, "PKCS7")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		x509Certs = append(x509Certs, x509Cert)
 | 
			
		||||
	}
 | 
			
		||||
	return x509Certs, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs7KeyWrapper) NoPossibleKeys(dcparameters map[string][][]byte) bool {
 | 
			
		||||
	return len(kw.GetPrivateKeys(dcparameters)) == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs7KeyWrapper) GetPrivateKeys(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return dcparameters["privkeys"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (kw *pkcs7KeyWrapper) getPrivateKeysPasswords(dcparameters map[string][][]byte) [][]byte {
 | 
			
		||||
	return dcparameters["privkeys-passwords"]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnwrapKey unwraps the symmetric key with which the layer is encrypted
 | 
			
		||||
// This symmetric key is encrypted in the PKCS7 payload.
 | 
			
		||||
func (kw *pkcs7KeyWrapper) UnwrapKey(dc *config.DecryptConfig, pkcs7Packet []byte) ([]byte, error) {
 | 
			
		||||
	privKeys := kw.GetPrivateKeys(dc.Parameters)
 | 
			
		||||
	if len(privKeys) == 0 {
 | 
			
		||||
		return nil, errors.New("no private keys found for PKCS7 decryption")
 | 
			
		||||
	}
 | 
			
		||||
	privKeysPasswords := kw.getPrivateKeysPasswords(dc.Parameters)
 | 
			
		||||
	if len(privKeysPasswords) != len(privKeys) {
 | 
			
		||||
		return nil, errors.New("private key password array length must be same as that of private keys")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	x509Certs, err := collectX509s(dc.Parameters["x509s"])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if len(x509Certs) == 0 {
 | 
			
		||||
		return nil, errors.New("no x509 certificates found needed for PKCS7 decryption")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p7, err := pkcs7.Parse(pkcs7Packet)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "could not parse PKCS7 packet")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for idx, privKey := range privKeys {
 | 
			
		||||
		key, err := utils.ParsePrivateKey(privKey, privKeysPasswords[idx], "PKCS7")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		for _, x509Cert := range x509Certs {
 | 
			
		||||
			optsData, err := p7.Decrypt(x509Cert, crypto.PrivateKey(key))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return optsData, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil, errors.New("PKCS7: No suitable private key found for decryption")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetKeyIdsFromWrappedKeys converts the base64 encoded Packet to uint64 keyIds;
 | 
			
		||||
// We cannot do this with pkcs7
 | 
			
		||||
func (kw *pkcs7KeyWrapper) GetKeyIdsFromPacket(b64pkcs7Packets string) ([]uint64, error) {
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetRecipients converts the wrappedKeys to an array of recipients
 | 
			
		||||
// We cannot do this with pkcs7
 | 
			
		||||
func (kw *pkcs7KeyWrapper) GetRecipients(b64pkcs7Packets string) ([]string, error) {
 | 
			
		||||
	return []string{"[pkcs7]"}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										40
									
								
								vendor/github.com/containers/ocicrypt/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/containers/ocicrypt/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,40 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package ocicrypt
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type readerAtReader struct {
 | 
			
		||||
	r   io.ReaderAt
 | 
			
		||||
	off int64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReaderFromReaderAt takes an io.ReaderAt and returns an io.Reader
 | 
			
		||||
func ReaderFromReaderAt(r io.ReaderAt) io.Reader {
 | 
			
		||||
	return &readerAtReader{
 | 
			
		||||
		r:   r,
 | 
			
		||||
		off: 0,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (rar *readerAtReader) Read(p []byte) (n int, err error) {
 | 
			
		||||
	n, err = rar.r.ReadAt(p, rar.off)
 | 
			
		||||
	rar.off += int64(n)
 | 
			
		||||
	return n, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/containers/ocicrypt/spec/spec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/containers/ocicrypt/spec/spec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,16 +0,0 @@
 | 
			
		||||
package spec
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// MediaTypeLayerEnc is MIME type used for encrypted layers.
 | 
			
		||||
	MediaTypeLayerEnc = "application/vnd.oci.image.layer.v1.tar+encrypted"
 | 
			
		||||
	// MediaTypeLayerGzipEnc is MIME type used for encrypted gzip-compressed layers.
 | 
			
		||||
	MediaTypeLayerGzipEnc = "application/vnd.oci.image.layer.v1.tar+gzip+encrypted"
 | 
			
		||||
	// MediaTypeLayerZstdEnc is MIME type used for encrypted zstd-compressed layers.
 | 
			
		||||
	MediaTypeLayerZstdEnc = "application/vnd.oci.image.layer.v1.tar+zstd+encrypted"
 | 
			
		||||
	// MediaTypeLayerNonDistributableEnc is MIME type used for non distributable encrypted layers.
 | 
			
		||||
	MediaTypeLayerNonDistributableEnc = "application/vnd.oci.image.layer.nondistributable.v1.tar+encrypted"
 | 
			
		||||
	// MediaTypeLayerGzipEnc is MIME type used for non distributable encrypted gzip-compressed layers.
 | 
			
		||||
	MediaTypeLayerNonDistributableGzipEnc = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip+encrypted"
 | 
			
		||||
	// MediaTypeLayerZstdEnc is MIME type used for non distributable encrypted zstd-compressed layers.
 | 
			
		||||
	MediaTypeLayerNonDistributableZsdtEnc = "application/vnd.oci.image.layer.nondistributable.v1.tar+zstd+encrypted"
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										109
									
								
								vendor/github.com/containers/ocicrypt/utils/delayedreader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										109
									
								
								vendor/github.com/containers/ocicrypt/utils/delayedreader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,109 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func min(a, b int) int {
 | 
			
		||||
	if a < b {
 | 
			
		||||
		return a
 | 
			
		||||
	}
 | 
			
		||||
	return b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DelayedReader wraps a io.Reader and allows a client to use the Reader
 | 
			
		||||
// interface. The DelayedReader holds back some buffer to the client
 | 
			
		||||
// so that it can report any error that occurred on the Reader it wraps
 | 
			
		||||
// early to the client while it may still have held some data back.
 | 
			
		||||
type DelayedReader struct {
 | 
			
		||||
	reader   io.Reader // Reader to Read() bytes from and delay them
 | 
			
		||||
	err      error     // error that occurred on the reader
 | 
			
		||||
	buffer   []byte    // delay buffer
 | 
			
		||||
	bufbytes int       // number of bytes in the delay buffer to give to Read(); on '0' we return 'EOF' to caller
 | 
			
		||||
	bufoff   int       // offset in the delay buffer to give to Read()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewDelayedReader wraps a io.Reader and allocates a delay buffer of bufsize bytes
 | 
			
		||||
func NewDelayedReader(reader io.Reader, bufsize uint) io.Reader {
 | 
			
		||||
	return &DelayedReader{
 | 
			
		||||
		reader: reader,
 | 
			
		||||
		buffer: make([]byte, bufsize),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Read implements the io.Reader interface
 | 
			
		||||
func (dr *DelayedReader) Read(p []byte) (int, error) {
 | 
			
		||||
	if dr.err != nil && dr.err != io.EOF {
 | 
			
		||||
		return 0, dr.err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if we are completely drained, return io.EOF
 | 
			
		||||
	if dr.err == io.EOF && dr.bufbytes == 0 {
 | 
			
		||||
		return 0, io.EOF
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// only at the beginning we fill our delay buffer in an extra step
 | 
			
		||||
	if dr.bufbytes < len(dr.buffer) && dr.err == nil {
 | 
			
		||||
		dr.bufbytes, dr.err = FillBuffer(dr.reader, dr.buffer)
 | 
			
		||||
		if dr.err != nil && dr.err != io.EOF {
 | 
			
		||||
			return 0, dr.err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// dr.err != nil means we have EOF and can drain the delay buffer
 | 
			
		||||
	// otherwise we need to still read from the reader
 | 
			
		||||
 | 
			
		||||
	var tmpbuf []byte
 | 
			
		||||
	tmpbufbytes := 0
 | 
			
		||||
	if dr.err == nil {
 | 
			
		||||
		tmpbuf = make([]byte, len(p))
 | 
			
		||||
		tmpbufbytes, dr.err = FillBuffer(dr.reader, tmpbuf)
 | 
			
		||||
		if dr.err != nil && dr.err != io.EOF {
 | 
			
		||||
			return 0, dr.err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// copy out of the delay buffer into 'p'
 | 
			
		||||
	tocopy1 := min(len(p), dr.bufbytes)
 | 
			
		||||
	c1 := copy(p[:tocopy1], dr.buffer[dr.bufoff:])
 | 
			
		||||
	dr.bufoff += c1
 | 
			
		||||
	dr.bufbytes -= c1
 | 
			
		||||
 | 
			
		||||
	c2 := 0
 | 
			
		||||
	// can p still hold more data?
 | 
			
		||||
	if c1 < len(p) {
 | 
			
		||||
		// copy out of the tmpbuf into 'p'
 | 
			
		||||
		c2 = copy(p[tocopy1:], tmpbuf[:tmpbufbytes])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if tmpbuf holds data we need to hold onto, copy them
 | 
			
		||||
	// into the delay buffer
 | 
			
		||||
	if tmpbufbytes-c2 > 0 {
 | 
			
		||||
		// left-shift the delay buffer and append the tmpbuf's remaining data
 | 
			
		||||
		dr.buffer = dr.buffer[dr.bufoff : dr.bufoff+dr.bufbytes]
 | 
			
		||||
		dr.buffer = append(dr.buffer, tmpbuf[c2:tmpbufbytes]...)
 | 
			
		||||
		dr.bufoff = 0
 | 
			
		||||
		dr.bufbytes = len(dr.buffer)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	if dr.bufbytes == 0 {
 | 
			
		||||
		err = io.EOF
 | 
			
		||||
	}
 | 
			
		||||
	return c1 + c2, err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								vendor/github.com/containers/ocicrypt/utils/ioutils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/containers/ocicrypt/utils/ioutils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,56 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os/exec"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FillBuffer fills the given buffer with as many bytes from the reader as possible. It returns
 | 
			
		||||
// EOF if an EOF was encountered or any other error.
 | 
			
		||||
func FillBuffer(reader io.Reader, buffer []byte) (int, error) {
 | 
			
		||||
	n, err := io.ReadFull(reader, buffer)
 | 
			
		||||
	if err == io.ErrUnexpectedEOF {
 | 
			
		||||
		return n, io.EOF
 | 
			
		||||
	}
 | 
			
		||||
	return n, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// first argument is the command, like cat or echo,
 | 
			
		||||
// the second is the list of args to pass to it
 | 
			
		||||
type CommandExecuter interface {
 | 
			
		||||
	Exec(string, []string, []byte) ([]byte, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Runner struct{}
 | 
			
		||||
 | 
			
		||||
// ExecuteCommand is used to execute a linux command line command and return the output of the command with an error if it exists.
 | 
			
		||||
func (r Runner) Exec(cmdName string, args []string, input []byte) ([]byte, error) {
 | 
			
		||||
	var out bytes.Buffer
 | 
			
		||||
	stdInputBuffer := bytes.NewBuffer(input)
 | 
			
		||||
	cmd := exec.Command(cmdName, args...)
 | 
			
		||||
	cmd.Stdin = stdInputBuffer
 | 
			
		||||
	cmd.Stdout = &out
 | 
			
		||||
	err := cmd.Run()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "Error while running command: %s", cmdName)
 | 
			
		||||
	}
 | 
			
		||||
	return out.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										243
									
								
								vendor/github.com/containers/ocicrypt/utils/keyprovider/keyprovider.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										243
									
								
								vendor/github.com/containers/ocicrypt/utils/keyprovider/keyprovider.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,243 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
			
		||||
// source: keyprovider.proto
 | 
			
		||||
 | 
			
		||||
package keyprovider
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	context "context"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/golang/protobuf/proto"
 | 
			
		||||
	grpc "google.golang.org/grpc"
 | 
			
		||||
	codes "google.golang.org/grpc/codes"
 | 
			
		||||
	status "google.golang.org/grpc/status"
 | 
			
		||||
	math "math"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
type KeyProviderKeyWrapProtocolInput struct {
 | 
			
		||||
	KeyProviderKeyWrapProtocolInput []byte   `protobuf:"bytes,1,opt,name=KeyProviderKeyWrapProtocolInput,proto3" json:"KeyProviderKeyWrapProtocolInput,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral            struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized                []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache                   int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) Reset()         { *m = KeyProviderKeyWrapProtocolInput{} }
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*KeyProviderKeyWrapProtocolInput) ProtoMessage()    {}
 | 
			
		||||
func (*KeyProviderKeyWrapProtocolInput) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_da74c8e785ad390c, []int{0}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_KeyProviderKeyWrapProtocolInput.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_KeyProviderKeyWrapProtocolInput.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_KeyProviderKeyWrapProtocolInput.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_KeyProviderKeyWrapProtocolInput.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_KeyProviderKeyWrapProtocolInput.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_KeyProviderKeyWrapProtocolInput proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolInput) GetKeyProviderKeyWrapProtocolInput() []byte {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.KeyProviderKeyWrapProtocolInput
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type KeyProviderKeyWrapProtocolOutput struct {
 | 
			
		||||
	KeyProviderKeyWrapProtocolOutput []byte   `protobuf:"bytes,1,opt,name=KeyProviderKeyWrapProtocolOutput,proto3" json:"KeyProviderKeyWrapProtocolOutput,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral             struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized                 []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache                    int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) Reset()         { *m = KeyProviderKeyWrapProtocolOutput{} }
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*KeyProviderKeyWrapProtocolOutput) ProtoMessage()    {}
 | 
			
		||||
func (*KeyProviderKeyWrapProtocolOutput) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_da74c8e785ad390c, []int{1}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_KeyProviderKeyWrapProtocolOutput.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_KeyProviderKeyWrapProtocolOutput.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_KeyProviderKeyWrapProtocolOutput.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_KeyProviderKeyWrapProtocolOutput.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_KeyProviderKeyWrapProtocolOutput.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_KeyProviderKeyWrapProtocolOutput proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *KeyProviderKeyWrapProtocolOutput) GetKeyProviderKeyWrapProtocolOutput() []byte {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.KeyProviderKeyWrapProtocolOutput
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*KeyProviderKeyWrapProtocolInput)(nil), "keyprovider.keyProviderKeyWrapProtocolInput")
 | 
			
		||||
	proto.RegisterType((*KeyProviderKeyWrapProtocolOutput)(nil), "keyprovider.keyProviderKeyWrapProtocolOutput")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterFile("keyprovider.proto", fileDescriptor_da74c8e785ad390c)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_da74c8e785ad390c = []byte{
 | 
			
		||||
	// 169 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x12, 0xcc, 0x4e, 0xad, 0x2c,
 | 
			
		||||
	0x28, 0xca, 0x2f, 0xcb, 0x4c, 0x49, 0x2d, 0xd2, 0x03, 0x32, 0x4a, 0xf2, 0x85, 0xb8, 0x91, 0x84,
 | 
			
		||||
	0x94, 0xb2, 0xb9, 0xe4, 0x81, 0xdc, 0x00, 0x28, 0xd7, 0x3b, 0xb5, 0x32, 0xbc, 0x28, 0xb1, 0x20,
 | 
			
		||||
	0x00, 0xa4, 0x2e, 0x39, 0x3f, 0xc7, 0x33, 0xaf, 0xa0, 0xb4, 0x44, 0xc8, 0x83, 0x4b, 0xde, 0x1b,
 | 
			
		||||
	0xbf, 0x12, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x42, 0xca, 0x94, 0xf2, 0xb8, 0x14, 0x70,
 | 
			
		||||
	0x5b, 0xe6, 0x5f, 0x5a, 0x02, 0xb2, 0xcd, 0x8b, 0x4b, 0xc1, 0x9b, 0x80, 0x1a, 0xa8, 0x75, 0x04,
 | 
			
		||||
	0xd5, 0x19, 0xbd, 0x62, 0xe4, 0x12, 0x42, 0x52, 0x14, 0x9c, 0x5a, 0x54, 0x96, 0x99, 0x9c, 0x2a,
 | 
			
		||||
	0x94, 0xc1, 0xc5, 0x0e, 0x52, 0x0c, 0x94, 0x11, 0xd2, 0xd1, 0x43, 0x0e, 0x1f, 0x02, 0x21, 0x21,
 | 
			
		||||
	0xa5, 0x4b, 0xa4, 0x6a, 0x88, 0xf5, 0x4a, 0x0c, 0x42, 0x59, 0x5c, 0x9c, 0xa1, 0x79, 0xf4, 0xb1,
 | 
			
		||||
	0xcb, 0x89, 0x37, 0x0a, 0x39, 0x62, 0x93, 0xd8, 0xc0, 0x91, 0x6d, 0x0c, 0x08, 0x00, 0x00, 0xff,
 | 
			
		||||
	0xff, 0x9a, 0x10, 0xcb, 0xf9, 0x01, 0x02, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ context.Context
 | 
			
		||||
var _ grpc.ClientConnInterface
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the grpc package it is being compiled against.
 | 
			
		||||
const _ = grpc.SupportPackageIsVersion6
 | 
			
		||||
 | 
			
		||||
// KeyProviderServiceClient is the client API for KeyProviderService service.
 | 
			
		||||
//
 | 
			
		||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
 | 
			
		||||
type KeyProviderServiceClient interface {
 | 
			
		||||
	WrapKey(ctx context.Context, in *KeyProviderKeyWrapProtocolInput, opts ...grpc.CallOption) (*KeyProviderKeyWrapProtocolOutput, error)
 | 
			
		||||
	UnWrapKey(ctx context.Context, in *KeyProviderKeyWrapProtocolInput, opts ...grpc.CallOption) (*KeyProviderKeyWrapProtocolOutput, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type keyProviderServiceClient struct {
 | 
			
		||||
	cc grpc.ClientConnInterface
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewKeyProviderServiceClient(cc grpc.ClientConnInterface) KeyProviderServiceClient {
 | 
			
		||||
	return &keyProviderServiceClient{cc}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *keyProviderServiceClient) WrapKey(ctx context.Context, in *KeyProviderKeyWrapProtocolInput, opts ...grpc.CallOption) (*KeyProviderKeyWrapProtocolOutput, error) {
 | 
			
		||||
	out := new(KeyProviderKeyWrapProtocolOutput)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/keyprovider.KeyProviderService/WrapKey", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *keyProviderServiceClient) UnWrapKey(ctx context.Context, in *KeyProviderKeyWrapProtocolInput, opts ...grpc.CallOption) (*KeyProviderKeyWrapProtocolOutput, error) {
 | 
			
		||||
	out := new(KeyProviderKeyWrapProtocolOutput)
 | 
			
		||||
	err := c.cc.Invoke(ctx, "/keyprovider.KeyProviderService/UnWrapKey", in, out, opts...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return out, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// KeyProviderServiceServer is the server API for KeyProviderService service.
 | 
			
		||||
type KeyProviderServiceServer interface {
 | 
			
		||||
	WrapKey(context.Context, *KeyProviderKeyWrapProtocolInput) (*KeyProviderKeyWrapProtocolOutput, error)
 | 
			
		||||
	UnWrapKey(context.Context, *KeyProviderKeyWrapProtocolInput) (*KeyProviderKeyWrapProtocolOutput, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnimplementedKeyProviderServiceServer can be embedded to have forward compatible implementations.
 | 
			
		||||
type UnimplementedKeyProviderServiceServer struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*UnimplementedKeyProviderServiceServer) WrapKey(ctx context.Context, req *KeyProviderKeyWrapProtocolInput) (*KeyProviderKeyWrapProtocolOutput, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method WrapKey not implemented")
 | 
			
		||||
}
 | 
			
		||||
func (*UnimplementedKeyProviderServiceServer) UnWrapKey(ctx context.Context, req *KeyProviderKeyWrapProtocolInput) (*KeyProviderKeyWrapProtocolOutput, error) {
 | 
			
		||||
	return nil, status.Errorf(codes.Unimplemented, "method UnWrapKey not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterKeyProviderServiceServer(s *grpc.Server, srv KeyProviderServiceServer) {
 | 
			
		||||
	s.RegisterService(&_KeyProviderService_serviceDesc, srv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _KeyProviderService_WrapKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(KeyProviderKeyWrapProtocolInput)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(KeyProviderServiceServer).WrapKey(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/keyprovider.KeyProviderService/WrapKey",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(KeyProviderServiceServer).WrapKey(ctx, req.(*KeyProviderKeyWrapProtocolInput))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func _KeyProviderService_UnWrapKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
 | 
			
		||||
	in := new(KeyProviderKeyWrapProtocolInput)
 | 
			
		||||
	if err := dec(in); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if interceptor == nil {
 | 
			
		||||
		return srv.(KeyProviderServiceServer).UnWrapKey(ctx, in)
 | 
			
		||||
	}
 | 
			
		||||
	info := &grpc.UnaryServerInfo{
 | 
			
		||||
		Server:     srv,
 | 
			
		||||
		FullMethod: "/keyprovider.KeyProviderService/UnWrapKey",
 | 
			
		||||
	}
 | 
			
		||||
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 | 
			
		||||
		return srv.(KeyProviderServiceServer).UnWrapKey(ctx, req.(*KeyProviderKeyWrapProtocolInput))
 | 
			
		||||
	}
 | 
			
		||||
	return interceptor(ctx, in, info, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _KeyProviderService_serviceDesc = grpc.ServiceDesc{
 | 
			
		||||
	ServiceName: "keyprovider.KeyProviderService",
 | 
			
		||||
	HandlerType: (*KeyProviderServiceServer)(nil),
 | 
			
		||||
	Methods: []grpc.MethodDesc{
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "WrapKey",
 | 
			
		||||
			Handler:    _KeyProviderService_WrapKey_Handler,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			MethodName: "UnWrapKey",
 | 
			
		||||
			Handler:    _KeyProviderService_UnWrapKey_Handler,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	Streams:  []grpc.StreamDesc{},
 | 
			
		||||
	Metadata: "keyprovider.proto",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/containers/ocicrypt/utils/keyprovider/keyprovider.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/containers/ocicrypt/utils/keyprovider/keyprovider.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,17 +0,0 @@
 | 
			
		||||
syntax = "proto3";
 | 
			
		||||
 | 
			
		||||
package keyprovider;
 | 
			
		||||
option go_package = "keyprovider";
 | 
			
		||||
 | 
			
		||||
message keyProviderKeyWrapProtocolInput {
 | 
			
		||||
    bytes KeyProviderKeyWrapProtocolInput = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message keyProviderKeyWrapProtocolOutput {
 | 
			
		||||
    bytes KeyProviderKeyWrapProtocolOutput = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
service KeyProviderService {
 | 
			
		||||
    rpc WrapKey(keyProviderKeyWrapProtocolInput) returns (keyProviderKeyWrapProtocolOutput) {};
 | 
			
		||||
    rpc UnWrapKey(keyProviderKeyWrapProtocolInput) returns (keyProviderKeyWrapProtocolOutput) {};
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										166
									
								
								vendor/github.com/containers/ocicrypt/utils/testing.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										166
									
								
								vendor/github.com/containers/ocicrypt/utils/testing.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,166 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/ecdsa"
 | 
			
		||||
	"crypto/elliptic"
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"crypto/rsa"
 | 
			
		||||
	"crypto/x509"
 | 
			
		||||
	"crypto/x509/pkix"
 | 
			
		||||
	"encoding/pem"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CreateRSAKey creates an RSA key
 | 
			
		||||
func CreateRSAKey(bits int) (*rsa.PrivateKey, error) {
 | 
			
		||||
	key, err := rsa.GenerateKey(rand.Reader, bits)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "rsa.GenerateKey failed")
 | 
			
		||||
	}
 | 
			
		||||
	return key, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateRSATestKey creates an RSA key of the given size and returns
 | 
			
		||||
// the public and private key in PEM or DER format
 | 
			
		||||
func CreateRSATestKey(bits int, password []byte, pemencode bool) ([]byte, []byte, error) {
 | 
			
		||||
	key, err := CreateRSAKey(bits)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pubData, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, errors.Wrap(err, "x509.MarshalPKIXPublicKey failed")
 | 
			
		||||
	}
 | 
			
		||||
	privData := x509.MarshalPKCS1PrivateKey(key)
 | 
			
		||||
 | 
			
		||||
	// no more encoding needed for DER
 | 
			
		||||
	if !pemencode {
 | 
			
		||||
		return pubData, privData, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	publicKey := pem.EncodeToMemory(&pem.Block{
 | 
			
		||||
		Type:  "PUBLIC KEY",
 | 
			
		||||
		Bytes: pubData,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	var block *pem.Block
 | 
			
		||||
 | 
			
		||||
	typ := "RSA PRIVATE KEY"
 | 
			
		||||
	if len(password) > 0 {
 | 
			
		||||
		block, err = x509.EncryptPEMBlock(rand.Reader, typ, privData, password, x509.PEMCipherAES256) //nolint:staticcheck // ignore SA1019, which is kept for backward compatibility
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, nil, errors.Wrap(err, "x509.EncryptPEMBlock failed")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		block = &pem.Block{
 | 
			
		||||
			Type:  typ,
 | 
			
		||||
			Bytes: privData,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	privateKey := pem.EncodeToMemory(block)
 | 
			
		||||
 | 
			
		||||
	return publicKey, privateKey, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateECDSATestKey creates and elliptic curve key for the given curve and returns
 | 
			
		||||
// the public and private key in DER format
 | 
			
		||||
func CreateECDSATestKey(curve elliptic.Curve) ([]byte, []byte, error) {
 | 
			
		||||
	key, err := ecdsa.GenerateKey(curve, rand.Reader)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, errors.Wrapf(err, "ecdsa.GenerateKey failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pubData, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, errors.Wrapf(err, "x509.MarshalPKIXPublicKey failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	privData, err := x509.MarshalECPrivateKey(key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, errors.Wrapf(err, "x509.MarshalECPrivateKey failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pubData, privData, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CreateTestCA creates a root CA for testing
 | 
			
		||||
func CreateTestCA() (*rsa.PrivateKey, *x509.Certificate, error) {
 | 
			
		||||
	key, err := rsa.GenerateKey(rand.Reader, 2048)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, nil, errors.Wrap(err, "rsa.GenerateKey failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ca := &x509.Certificate{
 | 
			
		||||
		SerialNumber: big.NewInt(1),
 | 
			
		||||
		Subject: pkix.Name{
 | 
			
		||||
			CommonName: "test-ca",
 | 
			
		||||
		},
 | 
			
		||||
		NotBefore:             time.Now(),
 | 
			
		||||
		NotAfter:              time.Now().AddDate(1, 0, 0),
 | 
			
		||||
		IsCA:                  true,
 | 
			
		||||
		KeyUsage:              x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
 | 
			
		||||
		BasicConstraintsValid: true,
 | 
			
		||||
	}
 | 
			
		||||
	caCert, err := certifyKey(&key.PublicKey, ca, key, ca)
 | 
			
		||||
 | 
			
		||||
	return key, caCert, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CertifyKey certifies a public key using the given CA's private key and cert;
 | 
			
		||||
// The certificate template for the public key is optional
 | 
			
		||||
func CertifyKey(pubbytes []byte, template *x509.Certificate, caKey *rsa.PrivateKey, caCert *x509.Certificate) (*x509.Certificate, error) {
 | 
			
		||||
	pubKey, err := ParsePublicKey(pubbytes, "CertifyKey")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return certifyKey(pubKey, template, caKey, caCert)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func certifyKey(pub interface{}, template *x509.Certificate, caKey *rsa.PrivateKey, caCert *x509.Certificate) (*x509.Certificate, error) {
 | 
			
		||||
	if template == nil {
 | 
			
		||||
		template = &x509.Certificate{
 | 
			
		||||
			SerialNumber: big.NewInt(1),
 | 
			
		||||
			Subject: pkix.Name{
 | 
			
		||||
				CommonName: "testkey",
 | 
			
		||||
			},
 | 
			
		||||
			NotBefore:             time.Now(),
 | 
			
		||||
			NotAfter:              time.Now().Add(time.Hour),
 | 
			
		||||
			IsCA:                  false,
 | 
			
		||||
			KeyUsage:              x509.KeyUsageDigitalSignature,
 | 
			
		||||
			BasicConstraintsValid: true,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	certDER, err := x509.CreateCertificate(rand.Reader, template, caCert, pub, caKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "x509.CreateCertificate failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cert, err := x509.ParseCertificate(certDER)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrap(err, "x509.ParseCertificate failed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return cert, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										250
									
								
								vendor/github.com/containers/ocicrypt/utils/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										250
									
								
								vendor/github.com/containers/ocicrypt/utils/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,250 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   Copyright The ocicrypt Authors.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/x509"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"encoding/pem"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/containers/ocicrypt/crypto/pkcs11"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"golang.org/x/crypto/openpgp"
 | 
			
		||||
	json "gopkg.in/square/go-jose.v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// parseJWKPrivateKey parses the input byte array as a JWK and makes sure it's a private key
 | 
			
		||||
func parseJWKPrivateKey(privKey []byte, prefix string) (interface{}, error) {
 | 
			
		||||
	jwk := json.JSONWebKey{}
 | 
			
		||||
	err := jwk.UnmarshalJSON(privKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "%s: Could not parse input as JWK", prefix)
 | 
			
		||||
	}
 | 
			
		||||
	if jwk.IsPublic() {
 | 
			
		||||
		return nil, fmt.Errorf("%s: JWK is not a private key", prefix)
 | 
			
		||||
	}
 | 
			
		||||
	return &jwk, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// parseJWKPublicKey parses the input byte array as a JWK
 | 
			
		||||
func parseJWKPublicKey(privKey []byte, prefix string) (interface{}, error) {
 | 
			
		||||
	jwk := json.JSONWebKey{}
 | 
			
		||||
	err := jwk.UnmarshalJSON(privKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.Wrapf(err, "%s: Could not parse input as JWK", prefix)
 | 
			
		||||
	}
 | 
			
		||||
	if !jwk.IsPublic() {
 | 
			
		||||
		return nil, fmt.Errorf("%s: JWK is not a public key", prefix)
 | 
			
		||||
	}
 | 
			
		||||
	return &jwk, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// parsePkcs11PrivateKeyYaml parses the input byte array as pkcs11 key file yaml format)
 | 
			
		||||
func parsePkcs11PrivateKeyYaml(yaml []byte, prefix string) (*pkcs11.Pkcs11KeyFileObject, error) {
 | 
			
		||||
	// if the URI does not have enough attributes, we will throw an error when decrypting
 | 
			
		||||
	return pkcs11.ParsePkcs11KeyFile(yaml)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// parsePkcs11URIPublicKey parses the input byte array as a pkcs11 key file yaml
 | 
			
		||||
func parsePkcs11PublicKeyYaml(yaml []byte, prefix string) (*pkcs11.Pkcs11KeyFileObject, error) {
 | 
			
		||||
	// if the URI does not have enough attributes, we will throw an error when decrypting
 | 
			
		||||
	return pkcs11.ParsePkcs11KeyFile(yaml)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPasswordError checks whether an error is related to a missing or wrong
 | 
			
		||||
// password
 | 
			
		||||
func IsPasswordError(err error) bool {
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	msg := strings.ToLower(err.Error())
 | 
			
		||||
 | 
			
		||||
	return strings.Contains(msg, "password") &&
 | 
			
		||||
		(strings.Contains(msg, "missing") || strings.Contains(msg, "wrong"))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParsePrivateKey tries to parse a private key in DER format first and
 | 
			
		||||
// PEM format after, returning an error if the parsing failed
 | 
			
		||||
func ParsePrivateKey(privKey, privKeyPassword []byte, prefix string) (interface{}, error) {
 | 
			
		||||
	key, err := x509.ParsePKCS8PrivateKey(privKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		key, err = x509.ParsePKCS1PrivateKey(privKey)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			key, err = x509.ParseECPrivateKey(privKey)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		block, _ := pem.Decode(privKey)
 | 
			
		||||
		if block != nil {
 | 
			
		||||
			var der []byte
 | 
			
		||||
			if x509.IsEncryptedPEMBlock(block) { //nolint:staticcheck // ignore SA1019, which is kept for backward compatibility
 | 
			
		||||
				if privKeyPassword == nil {
 | 
			
		||||
					return nil, errors.Errorf("%s: Missing password for encrypted private key", prefix)
 | 
			
		||||
				}
 | 
			
		||||
				der, err = x509.DecryptPEMBlock(block, privKeyPassword) //nolint:staticcheck // ignore SA1019, which is kept for backward compatibility
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, errors.Errorf("%s: Wrong password: could not decrypt private key", prefix)
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				der = block.Bytes
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			key, err = x509.ParsePKCS8PrivateKey(der)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				key, err = x509.ParsePKCS1PrivateKey(der)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, errors.Wrapf(err, "%s: Could not parse private key", prefix)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			key, err = parseJWKPrivateKey(privKey, prefix)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				key, err = parsePkcs11PrivateKeyYaml(privKey, prefix)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return key, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPrivateKey returns true in case the given byte array represents a private key
 | 
			
		||||
// It returns an error if for example the password is wrong
 | 
			
		||||
func IsPrivateKey(data []byte, password []byte) (bool, error) {
 | 
			
		||||
	_, err := ParsePrivateKey(data, password, "")
 | 
			
		||||
	return err == nil, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPkcs11PrivateKey returns true in case the given byte array represents a pkcs11 private key
 | 
			
		||||
func IsPkcs11PrivateKey(data []byte) bool {
 | 
			
		||||
	return pkcs11.IsPkcs11PrivateKey(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParsePublicKey tries to parse a public key in DER format first and
 | 
			
		||||
// PEM format after, returning an error if the parsing failed
 | 
			
		||||
func ParsePublicKey(pubKey []byte, prefix string) (interface{}, error) {
 | 
			
		||||
	key, err := x509.ParsePKIXPublicKey(pubKey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		block, _ := pem.Decode(pubKey)
 | 
			
		||||
		if block != nil {
 | 
			
		||||
			key, err = x509.ParsePKIXPublicKey(block.Bytes)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errors.Wrapf(err, "%s: Could not parse public key", prefix)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			key, err = parseJWKPublicKey(pubKey, prefix)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				key, err = parsePkcs11PublicKeyYaml(pubKey, prefix)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return key, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPublicKey returns true in case the given byte array represents a public key
 | 
			
		||||
func IsPublicKey(data []byte) bool {
 | 
			
		||||
	_, err := ParsePublicKey(data, "")
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsPkcs11PublicKey returns true in case the given byte array represents a pkcs11 public key
 | 
			
		||||
func IsPkcs11PublicKey(data []byte) bool {
 | 
			
		||||
	return pkcs11.IsPkcs11PublicKey(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseCertificate tries to parse a public key in DER format first and
 | 
			
		||||
// PEM format after, returning an error if the parsing failed
 | 
			
		||||
func ParseCertificate(certBytes []byte, prefix string) (*x509.Certificate, error) {
 | 
			
		||||
	x509Cert, err := x509.ParseCertificate(certBytes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		block, _ := pem.Decode(certBytes)
 | 
			
		||||
		if block == nil {
 | 
			
		||||
			return nil, fmt.Errorf("%s: Could not PEM decode x509 certificate", prefix)
 | 
			
		||||
		}
 | 
			
		||||
		x509Cert, err = x509.ParseCertificate(block.Bytes)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.Wrapf(err, "%s: Could not parse x509 certificate", prefix)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return x509Cert, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsCertificate returns true in case the given byte array represents an x.509 certificate
 | 
			
		||||
func IsCertificate(data []byte) bool {
 | 
			
		||||
	_, err := ParseCertificate(data, "")
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsGPGPrivateKeyRing returns true in case the given byte array represents a GPG private key ring file
 | 
			
		||||
func IsGPGPrivateKeyRing(data []byte) bool {
 | 
			
		||||
	r := bytes.NewBuffer(data)
 | 
			
		||||
	_, err := openpgp.ReadKeyRing(r)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SortDecryptionKeys parses a list of comma separated base64 entries and sorts the data into
 | 
			
		||||
// a map. Each entry in the list may be either a GPG private key ring, private key, or x.509
 | 
			
		||||
// certificate
 | 
			
		||||
func SortDecryptionKeys(b64ItemList string) (map[string][][]byte, error) {
 | 
			
		||||
	dcparameters := make(map[string][][]byte)
 | 
			
		||||
 | 
			
		||||
	for _, b64Item := range strings.Split(b64ItemList, ",") {
 | 
			
		||||
		var password []byte
 | 
			
		||||
		b64Data := strings.Split(b64Item, ":")
 | 
			
		||||
		keyData, err := base64.StdEncoding.DecodeString(b64Data[0])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, errors.New("Could not base64 decode a passed decryption key")
 | 
			
		||||
		}
 | 
			
		||||
		if len(b64Data) == 2 {
 | 
			
		||||
			password, err = base64.StdEncoding.DecodeString(b64Data[1])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, errors.New("Could not base64 decode a passed decryption key password")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		var key string
 | 
			
		||||
		isPrivKey, err := IsPrivateKey(keyData, password)
 | 
			
		||||
		if IsPasswordError(err) {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if isPrivKey {
 | 
			
		||||
			key = "privkeys"
 | 
			
		||||
			if _, ok := dcparameters["privkeys-passwords"]; !ok {
 | 
			
		||||
				dcparameters["privkeys-passwords"] = [][]byte{password}
 | 
			
		||||
			} else {
 | 
			
		||||
				dcparameters["privkeys-passwords"] = append(dcparameters["privkeys-passwords"], password)
 | 
			
		||||
			}
 | 
			
		||||
		} else if IsCertificate(keyData) {
 | 
			
		||||
			key = "x509s"
 | 
			
		||||
		} else if IsGPGPrivateKeyRing(keyData) {
 | 
			
		||||
			key = "gpg-privatekeys"
 | 
			
		||||
		}
 | 
			
		||||
		if key != "" {
 | 
			
		||||
			values := dcparameters[key]
 | 
			
		||||
			if values == nil {
 | 
			
		||||
				dcparameters[key] = [][]byte{keyData}
 | 
			
		||||
			} else {
 | 
			
		||||
				dcparameters[key] = append(dcparameters[key], keyData)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			return nil, errors.New("Unknown decryption key type")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dcparameters, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										140
									
								
								vendor/github.com/gogo/protobuf/types/any.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										140
									
								
								vendor/github.com/gogo/protobuf/types/any.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,140 +0,0 @@
 | 
			
		||||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
// This file implements functions to marshal proto.Message to/from
 | 
			
		||||
// google.protobuf.Any message.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/gogo/protobuf/proto"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const googleApis = "type.googleapis.com/"
 | 
			
		||||
 | 
			
		||||
// AnyMessageName returns the name of the message contained in a google.protobuf.Any message.
 | 
			
		||||
//
 | 
			
		||||
// Note that regular type assertions should be done using the Is
 | 
			
		||||
// function. AnyMessageName is provided for less common use cases like filtering a
 | 
			
		||||
// sequence of Any messages based on a set of allowed message type names.
 | 
			
		||||
func AnyMessageName(any *Any) (string, error) {
 | 
			
		||||
	if any == nil {
 | 
			
		||||
		return "", fmt.Errorf("message is nil")
 | 
			
		||||
	}
 | 
			
		||||
	slash := strings.LastIndex(any.TypeUrl, "/")
 | 
			
		||||
	if slash < 0 {
 | 
			
		||||
		return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl)
 | 
			
		||||
	}
 | 
			
		||||
	return any.TypeUrl[slash+1:], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any.
 | 
			
		||||
func MarshalAny(pb proto.Message) (*Any, error) {
 | 
			
		||||
	value, err := proto.Marshal(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DynamicAny is a value that can be passed to UnmarshalAny to automatically
 | 
			
		||||
// allocate a proto.Message for the type specified in a google.protobuf.Any
 | 
			
		||||
// message. The allocated message is stored in the embedded proto.Message.
 | 
			
		||||
//
 | 
			
		||||
// Example:
 | 
			
		||||
//
 | 
			
		||||
//   var x ptypes.DynamicAny
 | 
			
		||||
//   if err := ptypes.UnmarshalAny(a, &x); err != nil { ... }
 | 
			
		||||
//   fmt.Printf("unmarshaled message: %v", x.Message)
 | 
			
		||||
type DynamicAny struct {
 | 
			
		||||
	proto.Message
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Empty returns a new proto.Message of the type specified in a
 | 
			
		||||
// google.protobuf.Any message. It returns an error if corresponding message
 | 
			
		||||
// type isn't linked in.
 | 
			
		||||
func EmptyAny(any *Any) (proto.Message, error) {
 | 
			
		||||
	aname, err := AnyMessageName(any)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t := proto.MessageType(aname)
 | 
			
		||||
	if t == nil {
 | 
			
		||||
		return nil, fmt.Errorf("any: message type %q isn't linked in", aname)
 | 
			
		||||
	}
 | 
			
		||||
	return reflect.New(t.Elem()).Interface().(proto.Message), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any
 | 
			
		||||
// message and places the decoded result in pb. It returns an error if type of
 | 
			
		||||
// contents of Any message does not match type of pb message.
 | 
			
		||||
//
 | 
			
		||||
// pb can be a proto.Message, or a *DynamicAny.
 | 
			
		||||
func UnmarshalAny(any *Any, pb proto.Message) error {
 | 
			
		||||
	if d, ok := pb.(*DynamicAny); ok {
 | 
			
		||||
		if d.Message == nil {
 | 
			
		||||
			var err error
 | 
			
		||||
			d.Message, err = EmptyAny(any)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return UnmarshalAny(any, d.Message)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	aname, err := AnyMessageName(any)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mname := proto.MessageName(pb)
 | 
			
		||||
	if aname != mname {
 | 
			
		||||
		return fmt.Errorf("mismatched message type: got %q want %q", aname, mname)
 | 
			
		||||
	}
 | 
			
		||||
	return proto.Unmarshal(any.Value, pb)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Is returns true if any value contains a given message type.
 | 
			
		||||
func Is(any *Any, pb proto.Message) bool {
 | 
			
		||||
	// The following is equivalent to AnyMessageName(any) == proto.MessageName(pb),
 | 
			
		||||
	// but it avoids scanning TypeUrl for the slash.
 | 
			
		||||
	if any == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	name := proto.MessageName(pb)
 | 
			
		||||
	prefix := len(any.TypeUrl) - len(name)
 | 
			
		||||
	return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										694
									
								
								vendor/github.com/gogo/protobuf/types/any.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										694
									
								
								vendor/github.com/gogo/protobuf/types/any.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,694 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/any.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	bytes "bytes"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	strings "strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// `Any` contains an arbitrary serialized protocol buffer message along with a
 | 
			
		||||
// URL that describes the type of the serialized message.
 | 
			
		||||
//
 | 
			
		||||
// Protobuf library provides support to pack/unpack Any values in the form
 | 
			
		||||
// of utility functions or additional generated methods of the Any type.
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Pack and unpack a message in C++.
 | 
			
		||||
//
 | 
			
		||||
//     Foo foo = ...;
 | 
			
		||||
//     Any any;
 | 
			
		||||
//     any.PackFrom(foo);
 | 
			
		||||
//     ...
 | 
			
		||||
//     if (any.UnpackTo(&foo)) {
 | 
			
		||||
//       ...
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Pack and unpack a message in Java.
 | 
			
		||||
//
 | 
			
		||||
//     Foo foo = ...;
 | 
			
		||||
//     Any any = Any.pack(foo);
 | 
			
		||||
//     ...
 | 
			
		||||
//     if (any.is(Foo.class)) {
 | 
			
		||||
//       foo = any.unpack(Foo.class);
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//  Example 3: Pack and unpack a message in Python.
 | 
			
		||||
//
 | 
			
		||||
//     foo = Foo(...)
 | 
			
		||||
//     any = Any()
 | 
			
		||||
//     any.Pack(foo)
 | 
			
		||||
//     ...
 | 
			
		||||
//     if any.Is(Foo.DESCRIPTOR):
 | 
			
		||||
//       any.Unpack(foo)
 | 
			
		||||
//       ...
 | 
			
		||||
//
 | 
			
		||||
//  Example 4: Pack and unpack a message in Go
 | 
			
		||||
//
 | 
			
		||||
//      foo := &pb.Foo{...}
 | 
			
		||||
//      any, err := ptypes.MarshalAny(foo)
 | 
			
		||||
//      ...
 | 
			
		||||
//      foo := &pb.Foo{}
 | 
			
		||||
//      if err := ptypes.UnmarshalAny(any, foo); err != nil {
 | 
			
		||||
//        ...
 | 
			
		||||
//      }
 | 
			
		||||
//
 | 
			
		||||
// The pack methods provided by protobuf library will by default use
 | 
			
		||||
// 'type.googleapis.com/full.type.name' as the type URL and the unpack
 | 
			
		||||
// methods only use the fully qualified type name after the last '/'
 | 
			
		||||
// in the type URL, for example "foo.bar.com/x/y.z" will yield type
 | 
			
		||||
// name "y.z".
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// JSON
 | 
			
		||||
// ====
 | 
			
		||||
// The JSON representation of an `Any` value uses the regular
 | 
			
		||||
// representation of the deserialized, embedded message, with an
 | 
			
		||||
// additional field `@type` which contains the type URL. Example:
 | 
			
		||||
//
 | 
			
		||||
//     package google.profile;
 | 
			
		||||
//     message Person {
 | 
			
		||||
//       string first_name = 1;
 | 
			
		||||
//       string last_name = 2;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       "@type": "type.googleapis.com/google.profile.Person",
 | 
			
		||||
//       "firstName": <string>,
 | 
			
		||||
//       "lastName": <string>
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// If the embedded message type is well-known and has a custom JSON
 | 
			
		||||
// representation, that representation will be embedded adding a field
 | 
			
		||||
// `value` which holds the custom JSON in addition to the `@type`
 | 
			
		||||
// field. Example (for message [google.protobuf.Duration][]):
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       "@type": "type.googleapis.com/google.protobuf.Duration",
 | 
			
		||||
//       "value": "1.212s"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
type Any struct {
 | 
			
		||||
	// A URL/resource name that uniquely identifies the type of the serialized
 | 
			
		||||
	// protocol buffer message. This string must contain at least
 | 
			
		||||
	// one "/" character. The last segment of the URL's path must represent
 | 
			
		||||
	// the fully qualified name of the type (as in
 | 
			
		||||
	// `path/google.protobuf.Duration`). The name should be in a canonical form
 | 
			
		||||
	// (e.g., leading "." is not accepted).
 | 
			
		||||
	//
 | 
			
		||||
	// In practice, teams usually precompile into the binary all types that they
 | 
			
		||||
	// expect it to use in the context of Any. However, for URLs which use the
 | 
			
		||||
	// scheme `http`, `https`, or no scheme, one can optionally set up a type
 | 
			
		||||
	// server that maps type URLs to message definitions as follows:
 | 
			
		||||
	//
 | 
			
		||||
	// * If no scheme is provided, `https` is assumed.
 | 
			
		||||
	// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
 | 
			
		||||
	//   value in binary format, or produce an error.
 | 
			
		||||
	// * Applications are allowed to cache lookup results based on the
 | 
			
		||||
	//   URL, or have them precompiled into a binary to avoid any
 | 
			
		||||
	//   lookup. Therefore, binary compatibility needs to be preserved
 | 
			
		||||
	//   on changes to types. (Use versioned type names to manage
 | 
			
		||||
	//   breaking changes.)
 | 
			
		||||
	//
 | 
			
		||||
	// Note: this functionality is not currently available in the official
 | 
			
		||||
	// protobuf release, and it is not used for type URLs beginning with
 | 
			
		||||
	// type.googleapis.com.
 | 
			
		||||
	//
 | 
			
		||||
	// Schemes other than `http`, `https` (or the empty scheme) might be
 | 
			
		||||
	// used with implementation specific semantics.
 | 
			
		||||
	//
 | 
			
		||||
	TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"`
 | 
			
		||||
	// Must be a valid serialized protocol buffer of the above specified type.
 | 
			
		||||
	Value                []byte   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Any) Reset()      { *m = Any{} }
 | 
			
		||||
func (*Any) ProtoMessage() {}
 | 
			
		||||
func (*Any) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_b53526c13ae22eb4, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (*Any) XXX_WellKnownType() string { return "Any" }
 | 
			
		||||
func (m *Any) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_Any.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Any.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Any.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Any proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *Any) GetTypeUrl() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.TypeUrl
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Any) GetValue() []byte {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Value
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Any) XXX_MessageName() string {
 | 
			
		||||
	return "google.protobuf.Any"
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Any)(nil), "google.protobuf.Any")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_b53526c13ae22eb4 = []byte{
 | 
			
		||||
	// 211 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4,
 | 
			
		||||
	0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a,
 | 
			
		||||
	0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46,
 | 
			
		||||
	0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7,
 | 
			
		||||
	0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xaa, 0xbf, 0xf1, 0x50, 0x8e,
 | 
			
		||||
	0xe1, 0xc3, 0x43, 0x39, 0xc6, 0x1f, 0x0f, 0xe5, 0x18, 0x1b, 0x1e, 0xc9, 0x31, 0xae, 0x78, 0x24,
 | 
			
		||||
	0xc7, 0x78, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78,
 | 
			
		||||
	0x24, 0xc7, 0xf0, 0x01, 0x24, 0xfe, 0x58, 0x8e, 0xf1, 0xc4, 0x63, 0x39, 0x46, 0x2e, 0xe1, 0xe4,
 | 
			
		||||
	0xfc, 0x5c, 0x3d, 0x34, 0xeb, 0x9d, 0x38, 0x1c, 0xf3, 0x2a, 0x03, 0x40, 0x9c, 0x00, 0xc6, 0x28,
 | 
			
		||||
	0x56, 0x90, 0x8d, 0xc5, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x94,
 | 
			
		||||
	0x06, 0x40, 0x95, 0xea, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80, 0x94,
 | 
			
		||||
	0x25, 0xb1, 0x81, 0xcd, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x81, 0x82, 0xd3, 0xed,
 | 
			
		||||
	0x00, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *Any) Compare(that interface{}) int {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Any)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Any)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if this.TypeUrl != that1.TypeUrl {
 | 
			
		||||
		if this.TypeUrl < that1.TypeUrl {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.Value, that1.Value); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
func (this *Any) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Any)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Any)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.TypeUrl != that1.TypeUrl {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.Value, that1.Value) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *Any) GoString() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := make([]string, 0, 6)
 | 
			
		||||
	s = append(s, "&types.Any{")
 | 
			
		||||
	s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n")
 | 
			
		||||
	s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n")
 | 
			
		||||
	if this.XXX_unrecognized != nil {
 | 
			
		||||
		s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
 | 
			
		||||
	}
 | 
			
		||||
	s = append(s, "}")
 | 
			
		||||
	return strings.Join(s, "")
 | 
			
		||||
}
 | 
			
		||||
func valueToGoStringAny(v interface{}, typ string) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Any) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Any) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		i -= len(m.XXX_unrecognized)
 | 
			
		||||
		copy(dAtA[i:], m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	if len(m.Value) > 0 {
 | 
			
		||||
		i -= len(m.Value)
 | 
			
		||||
		copy(dAtA[i:], m.Value)
 | 
			
		||||
		i = encodeVarintAny(dAtA, i, uint64(len(m.Value)))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0x12
 | 
			
		||||
	}
 | 
			
		||||
	if len(m.TypeUrl) > 0 {
 | 
			
		||||
		i -= len(m.TypeUrl)
 | 
			
		||||
		copy(dAtA[i:], m.TypeUrl)
 | 
			
		||||
		i = encodeVarintAny(dAtA, i, uint64(len(m.TypeUrl)))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0xa
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintAny(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovAny(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedAny(r randyAny, easy bool) *Any {
 | 
			
		||||
	this := &Any{}
 | 
			
		||||
	this.TypeUrl = string(randStringAny(r))
 | 
			
		||||
	v1 := r.Intn(100)
 | 
			
		||||
	this.Value = make([]byte, v1)
 | 
			
		||||
	for i := 0; i < v1; i++ {
 | 
			
		||||
		this.Value[i] = byte(r.Intn(256))
 | 
			
		||||
	}
 | 
			
		||||
	if !easy && r.Intn(10) != 0 {
 | 
			
		||||
		this.XXX_unrecognized = randUnrecognizedAny(r, 3)
 | 
			
		||||
	}
 | 
			
		||||
	return this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type randyAny interface {
 | 
			
		||||
	Float32() float32
 | 
			
		||||
	Float64() float64
 | 
			
		||||
	Int63() int64
 | 
			
		||||
	Int31() int32
 | 
			
		||||
	Uint32() uint32
 | 
			
		||||
	Intn(n int) int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func randUTF8RuneAny(r randyAny) rune {
 | 
			
		||||
	ru := r.Intn(62)
 | 
			
		||||
	if ru < 10 {
 | 
			
		||||
		return rune(ru + 48)
 | 
			
		||||
	} else if ru < 36 {
 | 
			
		||||
		return rune(ru + 55)
 | 
			
		||||
	}
 | 
			
		||||
	return rune(ru + 61)
 | 
			
		||||
}
 | 
			
		||||
func randStringAny(r randyAny) string {
 | 
			
		||||
	v2 := r.Intn(100)
 | 
			
		||||
	tmps := make([]rune, v2)
 | 
			
		||||
	for i := 0; i < v2; i++ {
 | 
			
		||||
		tmps[i] = randUTF8RuneAny(r)
 | 
			
		||||
	}
 | 
			
		||||
	return string(tmps)
 | 
			
		||||
}
 | 
			
		||||
func randUnrecognizedAny(r randyAny, maxFieldNumber int) (dAtA []byte) {
 | 
			
		||||
	l := r.Intn(5)
 | 
			
		||||
	for i := 0; i < l; i++ {
 | 
			
		||||
		wire := r.Intn(4)
 | 
			
		||||
		if wire == 3 {
 | 
			
		||||
			wire = 5
 | 
			
		||||
		}
 | 
			
		||||
		fieldNumber := maxFieldNumber + r.Intn(100)
 | 
			
		||||
		dAtA = randFieldAny(dAtA, r, fieldNumber, wire)
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func randFieldAny(dAtA []byte, r randyAny, fieldNumber int, wire int) []byte {
 | 
			
		||||
	key := uint32(fieldNumber)<<3 | uint32(wire)
 | 
			
		||||
	switch wire {
 | 
			
		||||
	case 0:
 | 
			
		||||
		dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
 | 
			
		||||
		v3 := r.Int63()
 | 
			
		||||
		if r.Intn(2) == 0 {
 | 
			
		||||
			v3 *= -1
 | 
			
		||||
		}
 | 
			
		||||
		dAtA = encodeVarintPopulateAny(dAtA, uint64(v3))
 | 
			
		||||
	case 1:
 | 
			
		||||
		dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	case 2:
 | 
			
		||||
		dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
 | 
			
		||||
		ll := r.Intn(100)
 | 
			
		||||
		dAtA = encodeVarintPopulateAny(dAtA, uint64(ll))
 | 
			
		||||
		for j := 0; j < ll; j++ {
 | 
			
		||||
			dAtA = append(dAtA, byte(r.Intn(256)))
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func encodeVarintPopulateAny(dAtA []byte, v uint64) []byte {
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
 | 
			
		||||
		v >>= 7
 | 
			
		||||
	}
 | 
			
		||||
	dAtA = append(dAtA, uint8(v))
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = len(m.TypeUrl)
 | 
			
		||||
	if l > 0 {
 | 
			
		||||
		n += 1 + l + sovAny(uint64(l))
 | 
			
		||||
	}
 | 
			
		||||
	l = len(m.Value)
 | 
			
		||||
	if l > 0 {
 | 
			
		||||
		n += 1 + l + sovAny(uint64(l))
 | 
			
		||||
	}
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		n += len(m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovAny(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozAny(x uint64) (n int) {
 | 
			
		||||
	return sovAny(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (this *Any) String() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := strings.Join([]string{`&Any{`,
 | 
			
		||||
		`TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`,
 | 
			
		||||
		`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
 | 
			
		||||
		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
 | 
			
		||||
		`}`,
 | 
			
		||||
	}, "")
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
func valueToStringAny(v interface{}) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("*%v", pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowAny
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: Any: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: Any: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var stringLen uint64
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowAny
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				stringLen |= uint64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			intStringLen := int(stringLen)
 | 
			
		||||
			if intStringLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthAny
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + intStringLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthAny
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.TypeUrl = string(dAtA[iNdEx:postIndex])
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var byteLen int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowAny
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				byteLen |= int(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if byteLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthAny
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + byteLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthAny
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...)
 | 
			
		||||
			if m.Value == nil {
 | 
			
		||||
				m.Value = []byte{}
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipAny(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthAny
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipAny(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowAny
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowAny
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowAny
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthAny
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupAny
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthAny
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthAny        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowAny          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupAny = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										2134
									
								
								vendor/github.com/gogo/protobuf/types/api.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2134
									
								
								vendor/github.com/gogo/protobuf/types/api.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										35
									
								
								vendor/github.com/gogo/protobuf/types/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/gogo/protobuf/types/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,35 +0,0 @@
 | 
			
		||||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Package types contains code for interacting with well-known types.
 | 
			
		||||
*/
 | 
			
		||||
package types
 | 
			
		||||
							
								
								
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,100 +0,0 @@
 | 
			
		||||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
// This file implements conversions between google.protobuf.Duration
 | 
			
		||||
// and time.Duration.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Range of a Duration in seconds, as specified in
 | 
			
		||||
	// google/protobuf/duration.proto. This is about 10,000 years in seconds.
 | 
			
		||||
	maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60)
 | 
			
		||||
	minSeconds = -maxSeconds
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// validateDuration determines whether the Duration is valid according to the
 | 
			
		||||
// definition in google/protobuf/duration.proto. A valid Duration
 | 
			
		||||
// may still be too large to fit into a time.Duration (the range of Duration
 | 
			
		||||
// is about 10,000 years, and the range of time.Duration is about 290).
 | 
			
		||||
func validateDuration(d *Duration) error {
 | 
			
		||||
	if d == nil {
 | 
			
		||||
		return errors.New("duration: nil Duration")
 | 
			
		||||
	}
 | 
			
		||||
	if d.Seconds < minSeconds || d.Seconds > maxSeconds {
 | 
			
		||||
		return fmt.Errorf("duration: %#v: seconds out of range", d)
 | 
			
		||||
	}
 | 
			
		||||
	if d.Nanos <= -1e9 || d.Nanos >= 1e9 {
 | 
			
		||||
		return fmt.Errorf("duration: %#v: nanos out of range", d)
 | 
			
		||||
	}
 | 
			
		||||
	// Seconds and Nanos must have the same sign, unless d.Nanos is zero.
 | 
			
		||||
	if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) {
 | 
			
		||||
		return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DurationFromProto converts a Duration to a time.Duration. DurationFromProto
 | 
			
		||||
// returns an error if the Duration is invalid or is too large to be
 | 
			
		||||
// represented in a time.Duration.
 | 
			
		||||
func DurationFromProto(p *Duration) (time.Duration, error) {
 | 
			
		||||
	if err := validateDuration(p); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	d := time.Duration(p.Seconds) * time.Second
 | 
			
		||||
	if int64(d/time.Second) != p.Seconds {
 | 
			
		||||
		return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p)
 | 
			
		||||
	}
 | 
			
		||||
	if p.Nanos != 0 {
 | 
			
		||||
		d += time.Duration(p.Nanos) * time.Nanosecond
 | 
			
		||||
		if (d < 0) != (p.Nanos < 0) {
 | 
			
		||||
			return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return d, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DurationProto converts a time.Duration to a Duration.
 | 
			
		||||
func DurationProto(d time.Duration) *Duration {
 | 
			
		||||
	nanos := d.Nanoseconds()
 | 
			
		||||
	secs := nanos / 1e9
 | 
			
		||||
	nanos -= secs * 1e9
 | 
			
		||||
	return &Duration{
 | 
			
		||||
		Seconds: secs,
 | 
			
		||||
		Nanos:   int32(nanos),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										517
									
								
								vendor/github.com/gogo/protobuf/types/duration.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										517
									
								
								vendor/github.com/gogo/protobuf/types/duration.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,517 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/duration.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	bytes "bytes"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	strings "strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// A Duration represents a signed, fixed-length span of time represented
 | 
			
		||||
// as a count of seconds and fractions of seconds at nanosecond
 | 
			
		||||
// resolution. It is independent of any calendar and concepts like "day"
 | 
			
		||||
// or "month". It is related to Timestamp in that the difference between
 | 
			
		||||
// two Timestamp values is a Duration and it can be added or subtracted
 | 
			
		||||
// from a Timestamp. Range is approximately +-10,000 years.
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Compute Duration from two Timestamps in pseudo code.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp start = ...;
 | 
			
		||||
//     Timestamp end = ...;
 | 
			
		||||
//     Duration duration = ...;
 | 
			
		||||
//
 | 
			
		||||
//     duration.seconds = end.seconds - start.seconds;
 | 
			
		||||
//     duration.nanos = end.nanos - start.nanos;
 | 
			
		||||
//
 | 
			
		||||
//     if (duration.seconds < 0 && duration.nanos > 0) {
 | 
			
		||||
//       duration.seconds += 1;
 | 
			
		||||
//       duration.nanos -= 1000000000;
 | 
			
		||||
//     } else if (durations.seconds > 0 && duration.nanos < 0) {
 | 
			
		||||
//       duration.seconds -= 1;
 | 
			
		||||
//       duration.nanos += 1000000000;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp start = ...;
 | 
			
		||||
//     Duration duration = ...;
 | 
			
		||||
//     Timestamp end = ...;
 | 
			
		||||
//
 | 
			
		||||
//     end.seconds = start.seconds + duration.seconds;
 | 
			
		||||
//     end.nanos = start.nanos + duration.nanos;
 | 
			
		||||
//
 | 
			
		||||
//     if (end.nanos < 0) {
 | 
			
		||||
//       end.seconds -= 1;
 | 
			
		||||
//       end.nanos += 1000000000;
 | 
			
		||||
//     } else if (end.nanos >= 1000000000) {
 | 
			
		||||
//       end.seconds += 1;
 | 
			
		||||
//       end.nanos -= 1000000000;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 3: Compute Duration from datetime.timedelta in Python.
 | 
			
		||||
//
 | 
			
		||||
//     td = datetime.timedelta(days=3, minutes=10)
 | 
			
		||||
//     duration = Duration()
 | 
			
		||||
//     duration.FromTimedelta(td)
 | 
			
		||||
//
 | 
			
		||||
// # JSON Mapping
 | 
			
		||||
//
 | 
			
		||||
// In JSON format, the Duration type is encoded as a string rather than an
 | 
			
		||||
// object, where the string ends in the suffix "s" (indicating seconds) and
 | 
			
		||||
// is preceded by the number of seconds, with nanoseconds expressed as
 | 
			
		||||
// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
 | 
			
		||||
// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
 | 
			
		||||
// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
 | 
			
		||||
// microsecond should be expressed in JSON format as "3.000001s".
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
type Duration struct {
 | 
			
		||||
	// Signed seconds of the span of time. Must be from -315,576,000,000
 | 
			
		||||
	// to +315,576,000,000 inclusive. Note: these bounds are computed from:
 | 
			
		||||
	// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
 | 
			
		||||
	Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
 | 
			
		||||
	// Signed fractions of a second at nanosecond resolution of the span
 | 
			
		||||
	// of time. Durations less than one second are represented with a 0
 | 
			
		||||
	// `seconds` field and a positive or negative `nanos` field. For durations
 | 
			
		||||
	// of one second or more, a non-zero value for the `nanos` field must be
 | 
			
		||||
	// of the same sign as the `seconds` field. Must be from -999,999,999
 | 
			
		||||
	// to +999,999,999 inclusive.
 | 
			
		||||
	Nanos                int32    `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Duration) Reset()      { *m = Duration{} }
 | 
			
		||||
func (*Duration) ProtoMessage() {}
 | 
			
		||||
func (*Duration) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_23597b2ebd7ac6c5, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (*Duration) XXX_WellKnownType() string { return "Duration" }
 | 
			
		||||
func (m *Duration) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_Duration.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Duration.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Duration.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Duration proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *Duration) GetSeconds() int64 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Seconds
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Duration) GetNanos() int32 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Nanos
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Duration) XXX_MessageName() string {
 | 
			
		||||
	return "google.protobuf.Duration"
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Duration)(nil), "google.protobuf.Duration")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_23597b2ebd7ac6c5 = []byte{
 | 
			
		||||
	// 209 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a,
 | 
			
		||||
	0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56,
 | 
			
		||||
	0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5,
 | 
			
		||||
	0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e,
 | 
			
		||||
	0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0x7f, 0xe3, 0xa1, 0x1c,
 | 
			
		||||
	0xc3, 0x87, 0x87, 0x72, 0x8c, 0x2b, 0x1e, 0xc9, 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91,
 | 
			
		||||
	0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, 0x1e, 0xc9, 0x31, 0x7c, 0x78, 0x24, 0xc7, 0xb8, 0xe2,
 | 
			
		||||
	0xb1, 0x1c, 0xe3, 0x89, 0xc7, 0x72, 0x8c, 0x5c, 0xc2, 0xc9, 0xf9, 0xb9, 0x7a, 0x68, 0x56, 0x3b,
 | 
			
		||||
	0xf1, 0xc2, 0x2c, 0x0e, 0x00, 0x89, 0x04, 0x30, 0x46, 0xb1, 0x96, 0x54, 0x16, 0xa4, 0x16, 0xff,
 | 
			
		||||
	0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0xa2, 0x25, 0x00,
 | 
			
		||||
	0xaa, 0x45, 0x2f, 0x3c, 0x35, 0x27, 0xc7, 0x3b, 0x2f, 0xbf, 0x3c, 0x2f, 0x04, 0xa4, 0x32, 0x89,
 | 
			
		||||
	0x0d, 0x6c, 0x96, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x1c, 0x64, 0x4e, 0xf6, 0x00, 0x00,
 | 
			
		||||
	0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *Duration) Compare(that interface{}) int {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Duration)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Duration)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if this.Seconds != that1.Seconds {
 | 
			
		||||
		if this.Seconds < that1.Seconds {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	if this.Nanos != that1.Nanos {
 | 
			
		||||
		if this.Nanos < that1.Nanos {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
func (this *Duration) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Duration)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Duration)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.Seconds != that1.Seconds {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.Nanos != that1.Nanos {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *Duration) GoString() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := make([]string, 0, 6)
 | 
			
		||||
	s = append(s, "&types.Duration{")
 | 
			
		||||
	s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n")
 | 
			
		||||
	s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n")
 | 
			
		||||
	if this.XXX_unrecognized != nil {
 | 
			
		||||
		s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
 | 
			
		||||
	}
 | 
			
		||||
	s = append(s, "}")
 | 
			
		||||
	return strings.Join(s, "")
 | 
			
		||||
}
 | 
			
		||||
func valueToGoStringDuration(v interface{}, typ string) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Duration) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Duration) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		i -= len(m.XXX_unrecognized)
 | 
			
		||||
		copy(dAtA[i:], m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	if m.Nanos != 0 {
 | 
			
		||||
		i = encodeVarintDuration(dAtA, i, uint64(m.Nanos))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0x10
 | 
			
		||||
	}
 | 
			
		||||
	if m.Seconds != 0 {
 | 
			
		||||
		i = encodeVarintDuration(dAtA, i, uint64(m.Seconds))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0x8
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintDuration(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovDuration(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.Seconds != 0 {
 | 
			
		||||
		n += 1 + sovDuration(uint64(m.Seconds))
 | 
			
		||||
	}
 | 
			
		||||
	if m.Nanos != 0 {
 | 
			
		||||
		n += 1 + sovDuration(uint64(m.Nanos))
 | 
			
		||||
	}
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		n += len(m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovDuration(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozDuration(x uint64) (n int) {
 | 
			
		||||
	return sovDuration(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowDuration
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: Duration: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: Duration: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			m.Seconds = 0
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowDuration
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				m.Seconds |= int64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			m.Nanos = 0
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowDuration
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				m.Nanos |= int32(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipDuration(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthDuration
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipDuration(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowDuration
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowDuration
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowDuration
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthDuration
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupDuration
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthDuration
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthDuration        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowDuration          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupDuration = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration_gogo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/gogo/protobuf/types/duration_gogo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,100 +0,0 @@
 | 
			
		||||
// Protocol Buffers for Go with Gadgets
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
 | 
			
		||||
// http://github.com/gogo/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewPopulatedDuration(r interface {
 | 
			
		||||
	Int63() int64
 | 
			
		||||
}, easy bool) *Duration {
 | 
			
		||||
	this := &Duration{}
 | 
			
		||||
	maxSecs := time.Hour.Nanoseconds() / 1e9
 | 
			
		||||
	max := 2 * maxSecs
 | 
			
		||||
	s := int64(r.Int63()) % max
 | 
			
		||||
	s -= maxSecs
 | 
			
		||||
	neg := int64(1)
 | 
			
		||||
	if s < 0 {
 | 
			
		||||
		neg = -1
 | 
			
		||||
	}
 | 
			
		||||
	this.Seconds = s
 | 
			
		||||
	this.Nanos = int32(neg * (r.Int63() % 1e9))
 | 
			
		||||
	return this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *Duration) String() string {
 | 
			
		||||
	td, err := DurationFromProto(d)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Sprintf("(%v)", err)
 | 
			
		||||
	}
 | 
			
		||||
	return td.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPopulatedStdDuration(r interface {
 | 
			
		||||
	Int63() int64
 | 
			
		||||
}, easy bool) *time.Duration {
 | 
			
		||||
	dur := NewPopulatedDuration(r, easy)
 | 
			
		||||
	d, err := DurationFromProto(dur)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return &d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdDuration(d time.Duration) int {
 | 
			
		||||
	dur := DurationProto(d)
 | 
			
		||||
	return dur.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdDurationMarshal(d time.Duration) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdDuration(d)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdDurationMarshalTo(d, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdDurationMarshalTo(d time.Duration, data []byte) (int, error) {
 | 
			
		||||
	dur := DurationProto(d)
 | 
			
		||||
	return dur.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdDurationUnmarshal(d *time.Duration, data []byte) error {
 | 
			
		||||
	dur := &Duration{}
 | 
			
		||||
	if err := dur.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	dd, err := DurationFromProto(dur)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*d = dd
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										462
									
								
								vendor/github.com/gogo/protobuf/types/empty.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										462
									
								
								vendor/github.com/gogo/protobuf/types/empty.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,462 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/empty.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	bytes "bytes"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	strings "strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// A generic empty message that you can re-use to avoid defining duplicated
 | 
			
		||||
// empty messages in your APIs. A typical example is to use it as the request
 | 
			
		||||
// or the response type of an API method. For instance:
 | 
			
		||||
//
 | 
			
		||||
//     service Foo {
 | 
			
		||||
//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// The JSON representation for `Empty` is empty JSON object `{}`.
 | 
			
		||||
type Empty struct {
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Empty) Reset()      { *m = Empty{} }
 | 
			
		||||
func (*Empty) ProtoMessage() {}
 | 
			
		||||
func (*Empty) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_900544acb223d5b8, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (*Empty) XXX_WellKnownType() string { return "Empty" }
 | 
			
		||||
func (m *Empty) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Empty.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Empty.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Empty proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (*Empty) XXX_MessageName() string {
 | 
			
		||||
	return "google.protobuf.Empty"
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Empty)(nil), "google.protobuf.Empty")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/empty.proto", fileDescriptor_900544acb223d5b8) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_900544acb223d5b8 = []byte{
 | 
			
		||||
	// 176 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcd, 0x2d, 0x28,
 | 
			
		||||
	0xa9, 0xd4, 0x03, 0x73, 0x85, 0xf8, 0x21, 0x92, 0x7a, 0x30, 0x49, 0x25, 0x76, 0x2e, 0x56, 0x57,
 | 
			
		||||
	0x90, 0xbc, 0x53, 0x0b, 0xe3, 0x8d, 0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xfe, 0x78, 0x28,
 | 
			
		||||
	0xc7, 0xd8, 0xf0, 0x48, 0x8e, 0x71, 0xc5, 0x23, 0x39, 0xc6, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c,
 | 
			
		||||
	0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0xf1, 0xc5, 0x23, 0x39, 0x86, 0x0f, 0x20, 0xf1, 0xc7, 0x72,
 | 
			
		||||
	0x8c, 0x27, 0x1e, 0xcb, 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x19, 0xe8, 0xc4, 0x05,
 | 
			
		||||
	0x36, 0x2e, 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0xfe, 0xc1, 0xc8,
 | 
			
		||||
	0xb8, 0x88, 0x89, 0xd9, 0x3d, 0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x7d, 0x00, 0x54, 0xbd,
 | 
			
		||||
	0x5e, 0x78, 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x65, 0x12, 0x1b, 0xd8,
 | 
			
		||||
	0x20, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x21, 0xbe, 0xb6, 0x31, 0xc6, 0x00, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *Empty) Compare(that interface{}) int {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Empty)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Empty)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
func (this *Empty) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Empty)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Empty)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *Empty) GoString() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := make([]string, 0, 4)
 | 
			
		||||
	s = append(s, "&types.Empty{")
 | 
			
		||||
	if this.XXX_unrecognized != nil {
 | 
			
		||||
		s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
 | 
			
		||||
	}
 | 
			
		||||
	s = append(s, "}")
 | 
			
		||||
	return strings.Join(s, "")
 | 
			
		||||
}
 | 
			
		||||
func valueToGoStringEmpty(v interface{}, typ string) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Empty) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		i -= len(m.XXX_unrecognized)
 | 
			
		||||
		copy(dAtA[i:], m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintEmpty(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovEmpty(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedEmpty(r randyEmpty, easy bool) *Empty {
 | 
			
		||||
	this := &Empty{}
 | 
			
		||||
	if !easy && r.Intn(10) != 0 {
 | 
			
		||||
		this.XXX_unrecognized = randUnrecognizedEmpty(r, 1)
 | 
			
		||||
	}
 | 
			
		||||
	return this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type randyEmpty interface {
 | 
			
		||||
	Float32() float32
 | 
			
		||||
	Float64() float64
 | 
			
		||||
	Int63() int64
 | 
			
		||||
	Int31() int32
 | 
			
		||||
	Uint32() uint32
 | 
			
		||||
	Intn(n int) int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func randUTF8RuneEmpty(r randyEmpty) rune {
 | 
			
		||||
	ru := r.Intn(62)
 | 
			
		||||
	if ru < 10 {
 | 
			
		||||
		return rune(ru + 48)
 | 
			
		||||
	} else if ru < 36 {
 | 
			
		||||
		return rune(ru + 55)
 | 
			
		||||
	}
 | 
			
		||||
	return rune(ru + 61)
 | 
			
		||||
}
 | 
			
		||||
func randStringEmpty(r randyEmpty) string {
 | 
			
		||||
	v1 := r.Intn(100)
 | 
			
		||||
	tmps := make([]rune, v1)
 | 
			
		||||
	for i := 0; i < v1; i++ {
 | 
			
		||||
		tmps[i] = randUTF8RuneEmpty(r)
 | 
			
		||||
	}
 | 
			
		||||
	return string(tmps)
 | 
			
		||||
}
 | 
			
		||||
func randUnrecognizedEmpty(r randyEmpty, maxFieldNumber int) (dAtA []byte) {
 | 
			
		||||
	l := r.Intn(5)
 | 
			
		||||
	for i := 0; i < l; i++ {
 | 
			
		||||
		wire := r.Intn(4)
 | 
			
		||||
		if wire == 3 {
 | 
			
		||||
			wire = 5
 | 
			
		||||
		}
 | 
			
		||||
		fieldNumber := maxFieldNumber + r.Intn(100)
 | 
			
		||||
		dAtA = randFieldEmpty(dAtA, r, fieldNumber, wire)
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func randFieldEmpty(dAtA []byte, r randyEmpty, fieldNumber int, wire int) []byte {
 | 
			
		||||
	key := uint32(fieldNumber)<<3 | uint32(wire)
 | 
			
		||||
	switch wire {
 | 
			
		||||
	case 0:
 | 
			
		||||
		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
 | 
			
		||||
		v2 := r.Int63()
 | 
			
		||||
		if r.Intn(2) == 0 {
 | 
			
		||||
			v2 *= -1
 | 
			
		||||
		}
 | 
			
		||||
		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(v2))
 | 
			
		||||
	case 1:
 | 
			
		||||
		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	case 2:
 | 
			
		||||
		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
 | 
			
		||||
		ll := r.Intn(100)
 | 
			
		||||
		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(ll))
 | 
			
		||||
		for j := 0; j < ll; j++ {
 | 
			
		||||
			dAtA = append(dAtA, byte(r.Intn(256)))
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func encodeVarintPopulateEmpty(dAtA []byte, v uint64) []byte {
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
 | 
			
		||||
		v >>= 7
 | 
			
		||||
	}
 | 
			
		||||
	dAtA = append(dAtA, uint8(v))
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		n += len(m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovEmpty(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozEmpty(x uint64) (n int) {
 | 
			
		||||
	return sovEmpty(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (this *Empty) String() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := strings.Join([]string{`&Empty{`,
 | 
			
		||||
		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
 | 
			
		||||
		`}`,
 | 
			
		||||
	}, "")
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
func valueToStringEmpty(v interface{}) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("*%v", pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *Empty) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowEmpty
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: Empty: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipEmpty(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthEmpty
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipEmpty(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowEmpty
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowEmpty
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowEmpty
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthEmpty
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupEmpty
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthEmpty
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthEmpty        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowEmpty          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupEmpty = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										738
									
								
								vendor/github.com/gogo/protobuf/types/field_mask.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										738
									
								
								vendor/github.com/gogo/protobuf/types/field_mask.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,738 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/field_mask.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	bytes "bytes"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	strings "strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// `FieldMask` represents a set of symbolic field paths, for example:
 | 
			
		||||
//
 | 
			
		||||
//     paths: "f.a"
 | 
			
		||||
//     paths: "f.b.d"
 | 
			
		||||
//
 | 
			
		||||
// Here `f` represents a field in some root message, `a` and `b`
 | 
			
		||||
// fields in the message found in `f`, and `d` a field found in the
 | 
			
		||||
// message in `f.b`.
 | 
			
		||||
//
 | 
			
		||||
// Field masks are used to specify a subset of fields that should be
 | 
			
		||||
// returned by a get operation or modified by an update operation.
 | 
			
		||||
// Field masks also have a custom JSON encoding (see below).
 | 
			
		||||
//
 | 
			
		||||
// # Field Masks in Projections
 | 
			
		||||
//
 | 
			
		||||
// When used in the context of a projection, a response message or
 | 
			
		||||
// sub-message is filtered by the API to only contain those fields as
 | 
			
		||||
// specified in the mask. For example, if the mask in the previous
 | 
			
		||||
// example is applied to a response message as follows:
 | 
			
		||||
//
 | 
			
		||||
//     f {
 | 
			
		||||
//       a : 22
 | 
			
		||||
//       b {
 | 
			
		||||
//         d : 1
 | 
			
		||||
//         x : 2
 | 
			
		||||
//       }
 | 
			
		||||
//       y : 13
 | 
			
		||||
//     }
 | 
			
		||||
//     z: 8
 | 
			
		||||
//
 | 
			
		||||
// The result will not contain specific values for fields x,y and z
 | 
			
		||||
// (their value will be set to the default, and omitted in proto text
 | 
			
		||||
// output):
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//     f {
 | 
			
		||||
//       a : 22
 | 
			
		||||
//       b {
 | 
			
		||||
//         d : 1
 | 
			
		||||
//       }
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// A repeated field is not allowed except at the last position of a
 | 
			
		||||
// paths string.
 | 
			
		||||
//
 | 
			
		||||
// If a FieldMask object is not present in a get operation, the
 | 
			
		||||
// operation applies to all fields (as if a FieldMask of all fields
 | 
			
		||||
// had been specified).
 | 
			
		||||
//
 | 
			
		||||
// Note that a field mask does not necessarily apply to the
 | 
			
		||||
// top-level response message. In case of a REST get operation, the
 | 
			
		||||
// field mask applies directly to the response, but in case of a REST
 | 
			
		||||
// list operation, the mask instead applies to each individual message
 | 
			
		||||
// in the returned resource list. In case of a REST custom method,
 | 
			
		||||
// other definitions may be used. Where the mask applies will be
 | 
			
		||||
// clearly documented together with its declaration in the API.  In
 | 
			
		||||
// any case, the effect on the returned resource/resources is required
 | 
			
		||||
// behavior for APIs.
 | 
			
		||||
//
 | 
			
		||||
// # Field Masks in Update Operations
 | 
			
		||||
//
 | 
			
		||||
// A field mask in update operations specifies which fields of the
 | 
			
		||||
// targeted resource are going to be updated. The API is required
 | 
			
		||||
// to only change the values of the fields as specified in the mask
 | 
			
		||||
// and leave the others untouched. If a resource is passed in to
 | 
			
		||||
// describe the updated values, the API ignores the values of all
 | 
			
		||||
// fields not covered by the mask.
 | 
			
		||||
//
 | 
			
		||||
// If a repeated field is specified for an update operation, new values will
 | 
			
		||||
// be appended to the existing repeated field in the target resource. Note that
 | 
			
		||||
// a repeated field is only allowed in the last position of a `paths` string.
 | 
			
		||||
//
 | 
			
		||||
// If a sub-message is specified in the last position of the field mask for an
 | 
			
		||||
// update operation, then new value will be merged into the existing sub-message
 | 
			
		||||
// in the target resource.
 | 
			
		||||
//
 | 
			
		||||
// For example, given the target message:
 | 
			
		||||
//
 | 
			
		||||
//     f {
 | 
			
		||||
//       b {
 | 
			
		||||
//         d: 1
 | 
			
		||||
//         x: 2
 | 
			
		||||
//       }
 | 
			
		||||
//       c: [1]
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// And an update message:
 | 
			
		||||
//
 | 
			
		||||
//     f {
 | 
			
		||||
//       b {
 | 
			
		||||
//         d: 10
 | 
			
		||||
//       }
 | 
			
		||||
//       c: [2]
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// then if the field mask is:
 | 
			
		||||
//
 | 
			
		||||
//  paths: ["f.b", "f.c"]
 | 
			
		||||
//
 | 
			
		||||
// then the result will be:
 | 
			
		||||
//
 | 
			
		||||
//     f {
 | 
			
		||||
//       b {
 | 
			
		||||
//         d: 10
 | 
			
		||||
//         x: 2
 | 
			
		||||
//       }
 | 
			
		||||
//       c: [1, 2]
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// An implementation may provide options to override this default behavior for
 | 
			
		||||
// repeated and message fields.
 | 
			
		||||
//
 | 
			
		||||
// In order to reset a field's value to the default, the field must
 | 
			
		||||
// be in the mask and set to the default value in the provided resource.
 | 
			
		||||
// Hence, in order to reset all fields of a resource, provide a default
 | 
			
		||||
// instance of the resource and set all fields in the mask, or do
 | 
			
		||||
// not provide a mask as described below.
 | 
			
		||||
//
 | 
			
		||||
// If a field mask is not present on update, the operation applies to
 | 
			
		||||
// all fields (as if a field mask of all fields has been specified).
 | 
			
		||||
// Note that in the presence of schema evolution, this may mean that
 | 
			
		||||
// fields the client does not know and has therefore not filled into
 | 
			
		||||
// the request will be reset to their default. If this is unwanted
 | 
			
		||||
// behavior, a specific service may require a client to always specify
 | 
			
		||||
// a field mask, producing an error if not.
 | 
			
		||||
//
 | 
			
		||||
// As with get operations, the location of the resource which
 | 
			
		||||
// describes the updated values in the request message depends on the
 | 
			
		||||
// operation kind. In any case, the effect of the field mask is
 | 
			
		||||
// required to be honored by the API.
 | 
			
		||||
//
 | 
			
		||||
// ## Considerations for HTTP REST
 | 
			
		||||
//
 | 
			
		||||
// The HTTP kind of an update operation which uses a field mask must
 | 
			
		||||
// be set to PATCH instead of PUT in order to satisfy HTTP semantics
 | 
			
		||||
// (PUT must only be used for full updates).
 | 
			
		||||
//
 | 
			
		||||
// # JSON Encoding of Field Masks
 | 
			
		||||
//
 | 
			
		||||
// In JSON, a field mask is encoded as a single string where paths are
 | 
			
		||||
// separated by a comma. Fields name in each path are converted
 | 
			
		||||
// to/from lower-camel naming conventions.
 | 
			
		||||
//
 | 
			
		||||
// As an example, consider the following message declarations:
 | 
			
		||||
//
 | 
			
		||||
//     message Profile {
 | 
			
		||||
//       User user = 1;
 | 
			
		||||
//       Photo photo = 2;
 | 
			
		||||
//     }
 | 
			
		||||
//     message User {
 | 
			
		||||
//       string display_name = 1;
 | 
			
		||||
//       string address = 2;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// In proto a field mask for `Profile` may look as such:
 | 
			
		||||
//
 | 
			
		||||
//     mask {
 | 
			
		||||
//       paths: "user.display_name"
 | 
			
		||||
//       paths: "photo"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// In JSON, the same mask is represented as below:
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       mask: "user.displayName,photo"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// # Field Masks and Oneof Fields
 | 
			
		||||
//
 | 
			
		||||
// Field masks treat fields in oneofs just as regular fields. Consider the
 | 
			
		||||
// following message:
 | 
			
		||||
//
 | 
			
		||||
//     message SampleMessage {
 | 
			
		||||
//       oneof test_oneof {
 | 
			
		||||
//         string name = 4;
 | 
			
		||||
//         SubMessage sub_message = 9;
 | 
			
		||||
//       }
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// The field mask can be:
 | 
			
		||||
//
 | 
			
		||||
//     mask {
 | 
			
		||||
//       paths: "name"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Or:
 | 
			
		||||
//
 | 
			
		||||
//     mask {
 | 
			
		||||
//       paths: "sub_message"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Note that oneof type names ("test_oneof" in this case) cannot be used in
 | 
			
		||||
// paths.
 | 
			
		||||
//
 | 
			
		||||
// ## Field Mask Verification
 | 
			
		||||
//
 | 
			
		||||
// The implementation of any API method which has a FieldMask type field in the
 | 
			
		||||
// request should verify the included field paths, and return an
 | 
			
		||||
// `INVALID_ARGUMENT` error if any path is duplicated or unmappable.
 | 
			
		||||
type FieldMask struct {
 | 
			
		||||
	// The set of field mask paths.
 | 
			
		||||
	Paths                []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *FieldMask) Reset()      { *m = FieldMask{} }
 | 
			
		||||
func (*FieldMask) ProtoMessage() {}
 | 
			
		||||
func (*FieldMask) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_5158202634f0da48, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_FieldMask.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_FieldMask.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_FieldMask.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_FieldMask proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *FieldMask) GetPaths() []string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Paths
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*FieldMask) XXX_MessageName() string {
 | 
			
		||||
	return "google.protobuf.FieldMask"
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/field_mask.proto", fileDescriptor_5158202634f0da48) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_5158202634f0da48 = []byte{
 | 
			
		||||
	// 203 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcb, 0x4c, 0xcd,
 | 
			
		||||
	0x49, 0x89, 0xcf, 0x4d, 0x2c, 0xce, 0xd6, 0x03, 0x8b, 0x09, 0xf1, 0x43, 0x54, 0xe8, 0xc1, 0x54,
 | 
			
		||||
	0x28, 0x29, 0x72, 0x71, 0xba, 0x81, 0x14, 0xf9, 0x26, 0x16, 0x67, 0x0b, 0x89, 0x70, 0xb1, 0x16,
 | 
			
		||||
	0x24, 0x96, 0x64, 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6b, 0x70, 0x06, 0x41, 0x38, 0x4e, 0x1d, 0x8c,
 | 
			
		||||
	0x37, 0x1e, 0xca, 0x31, 0x7c, 0x78, 0x28, 0xc7, 0xf8, 0xe3, 0xa1, 0x1c, 0x63, 0xc3, 0x23, 0x39,
 | 
			
		||||
	0xc6, 0x15, 0x8f, 0xe4, 0x18, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23,
 | 
			
		||||
	0x39, 0xc6, 0x17, 0x8f, 0xe4, 0x18, 0x3e, 0x80, 0xc4, 0x1f, 0xcb, 0x31, 0x9e, 0x78, 0x2c, 0xc7,
 | 
			
		||||
	0xc8, 0x25, 0x9c, 0x9c, 0x9f, 0xab, 0x87, 0x66, 0x95, 0x13, 0x1f, 0xdc, 0xa2, 0x00, 0x90, 0x50,
 | 
			
		||||
	0x00, 0x63, 0x14, 0x6b, 0x49, 0x65, 0x41, 0x6a, 0xf1, 0x0f, 0x46, 0xc6, 0x45, 0x4c, 0xcc, 0xee,
 | 
			
		||||
	0x01, 0x4e, 0xab, 0x98, 0xe4, 0xdc, 0x21, 0x7a, 0x02, 0xa0, 0x7a, 0xf4, 0xc2, 0x53, 0x73, 0x72,
 | 
			
		||||
	0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, 0x2a, 0x93, 0xd8, 0xc0, 0x86, 0x19, 0x03, 0x02, 0x00,
 | 
			
		||||
	0x00, 0xff, 0xff, 0x43, 0xa0, 0x83, 0xd0, 0xe9, 0x00, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *FieldMask) Compare(that interface{}) int {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*FieldMask)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(FieldMask)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if len(this.Paths) != len(that1.Paths) {
 | 
			
		||||
		if len(this.Paths) < len(that1.Paths) {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	for i := range this.Paths {
 | 
			
		||||
		if this.Paths[i] != that1.Paths[i] {
 | 
			
		||||
			if this.Paths[i] < that1.Paths[i] {
 | 
			
		||||
				return -1
 | 
			
		||||
			}
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
func (this *FieldMask) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*FieldMask)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(FieldMask)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if len(this.Paths) != len(that1.Paths) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	for i := range this.Paths {
 | 
			
		||||
		if this.Paths[i] != that1.Paths[i] {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *FieldMask) GoString() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := make([]string, 0, 5)
 | 
			
		||||
	s = append(s, "&types.FieldMask{")
 | 
			
		||||
	s = append(s, "Paths: "+fmt.Sprintf("%#v", this.Paths)+",\n")
 | 
			
		||||
	if this.XXX_unrecognized != nil {
 | 
			
		||||
		s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
 | 
			
		||||
	}
 | 
			
		||||
	s = append(s, "}")
 | 
			
		||||
	return strings.Join(s, "")
 | 
			
		||||
}
 | 
			
		||||
func valueToGoStringFieldMask(v interface{}, typ string) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *FieldMask) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *FieldMask) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		i -= len(m.XXX_unrecognized)
 | 
			
		||||
		copy(dAtA[i:], m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	if len(m.Paths) > 0 {
 | 
			
		||||
		for iNdEx := len(m.Paths) - 1; iNdEx >= 0; iNdEx-- {
 | 
			
		||||
			i -= len(m.Paths[iNdEx])
 | 
			
		||||
			copy(dAtA[i:], m.Paths[iNdEx])
 | 
			
		||||
			i = encodeVarintFieldMask(dAtA, i, uint64(len(m.Paths[iNdEx])))
 | 
			
		||||
			i--
 | 
			
		||||
			dAtA[i] = 0xa
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintFieldMask(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovFieldMask(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedFieldMask(r randyFieldMask, easy bool) *FieldMask {
 | 
			
		||||
	this := &FieldMask{}
 | 
			
		||||
	v1 := r.Intn(10)
 | 
			
		||||
	this.Paths = make([]string, v1)
 | 
			
		||||
	for i := 0; i < v1; i++ {
 | 
			
		||||
		this.Paths[i] = string(randStringFieldMask(r))
 | 
			
		||||
	}
 | 
			
		||||
	if !easy && r.Intn(10) != 0 {
 | 
			
		||||
		this.XXX_unrecognized = randUnrecognizedFieldMask(r, 2)
 | 
			
		||||
	}
 | 
			
		||||
	return this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type randyFieldMask interface {
 | 
			
		||||
	Float32() float32
 | 
			
		||||
	Float64() float64
 | 
			
		||||
	Int63() int64
 | 
			
		||||
	Int31() int32
 | 
			
		||||
	Uint32() uint32
 | 
			
		||||
	Intn(n int) int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func randUTF8RuneFieldMask(r randyFieldMask) rune {
 | 
			
		||||
	ru := r.Intn(62)
 | 
			
		||||
	if ru < 10 {
 | 
			
		||||
		return rune(ru + 48)
 | 
			
		||||
	} else if ru < 36 {
 | 
			
		||||
		return rune(ru + 55)
 | 
			
		||||
	}
 | 
			
		||||
	return rune(ru + 61)
 | 
			
		||||
}
 | 
			
		||||
func randStringFieldMask(r randyFieldMask) string {
 | 
			
		||||
	v2 := r.Intn(100)
 | 
			
		||||
	tmps := make([]rune, v2)
 | 
			
		||||
	for i := 0; i < v2; i++ {
 | 
			
		||||
		tmps[i] = randUTF8RuneFieldMask(r)
 | 
			
		||||
	}
 | 
			
		||||
	return string(tmps)
 | 
			
		||||
}
 | 
			
		||||
func randUnrecognizedFieldMask(r randyFieldMask, maxFieldNumber int) (dAtA []byte) {
 | 
			
		||||
	l := r.Intn(5)
 | 
			
		||||
	for i := 0; i < l; i++ {
 | 
			
		||||
		wire := r.Intn(4)
 | 
			
		||||
		if wire == 3 {
 | 
			
		||||
			wire = 5
 | 
			
		||||
		}
 | 
			
		||||
		fieldNumber := maxFieldNumber + r.Intn(100)
 | 
			
		||||
		dAtA = randFieldFieldMask(dAtA, r, fieldNumber, wire)
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func randFieldFieldMask(dAtA []byte, r randyFieldMask, fieldNumber int, wire int) []byte {
 | 
			
		||||
	key := uint32(fieldNumber)<<3 | uint32(wire)
 | 
			
		||||
	switch wire {
 | 
			
		||||
	case 0:
 | 
			
		||||
		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
 | 
			
		||||
		v3 := r.Int63()
 | 
			
		||||
		if r.Intn(2) == 0 {
 | 
			
		||||
			v3 *= -1
 | 
			
		||||
		}
 | 
			
		||||
		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(v3))
 | 
			
		||||
	case 1:
 | 
			
		||||
		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	case 2:
 | 
			
		||||
		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
 | 
			
		||||
		ll := r.Intn(100)
 | 
			
		||||
		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(ll))
 | 
			
		||||
		for j := 0; j < ll; j++ {
 | 
			
		||||
			dAtA = append(dAtA, byte(r.Intn(256)))
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func encodeVarintPopulateFieldMask(dAtA []byte, v uint64) []byte {
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
 | 
			
		||||
		v >>= 7
 | 
			
		||||
	}
 | 
			
		||||
	dAtA = append(dAtA, uint8(v))
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if len(m.Paths) > 0 {
 | 
			
		||||
		for _, s := range m.Paths {
 | 
			
		||||
			l = len(s)
 | 
			
		||||
			n += 1 + l + sovFieldMask(uint64(l))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		n += len(m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovFieldMask(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozFieldMask(x uint64) (n int) {
 | 
			
		||||
	return sovFieldMask(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (this *FieldMask) String() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := strings.Join([]string{`&FieldMask{`,
 | 
			
		||||
		`Paths:` + fmt.Sprintf("%v", this.Paths) + `,`,
 | 
			
		||||
		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
 | 
			
		||||
		`}`,
 | 
			
		||||
	}, "")
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
func valueToStringFieldMask(v interface{}) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("*%v", pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *FieldMask) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: FieldMask: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: FieldMask: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var stringLen uint64
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowFieldMask
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				stringLen |= uint64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			intStringLen := int(stringLen)
 | 
			
		||||
			if intStringLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + intStringLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex]))
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipFieldMask(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipFieldMask(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowFieldMask
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowFieldMask
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupFieldMask
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthFieldMask
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthFieldMask        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowFieldMask          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupFieldMask = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										34
									
								
								vendor/github.com/gogo/protobuf/types/protosize.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/gogo/protobuf/types/protosize.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,34 +0,0 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
func (m *Any) ProtoSize() (n int)               { return m.Size() }
 | 
			
		||||
func (m *Api) ProtoSize() (n int)               { return m.Size() }
 | 
			
		||||
func (m *Method) ProtoSize() (n int)            { return m.Size() }
 | 
			
		||||
func (m *Mixin) ProtoSize() (n int)             { return m.Size() }
 | 
			
		||||
func (m *Duration) ProtoSize() (n int)          { return m.Size() }
 | 
			
		||||
func (m *Empty) ProtoSize() (n int)             { return m.Size() }
 | 
			
		||||
func (m *FieldMask) ProtoSize() (n int)         { return m.Size() }
 | 
			
		||||
func (m *SourceContext) ProtoSize() (n int)     { return m.Size() }
 | 
			
		||||
func (m *Struct) ProtoSize() (n int)            { return m.Size() }
 | 
			
		||||
func (m *Value) ProtoSize() (n int)             { return m.Size() }
 | 
			
		||||
func (m *Value_NullValue) ProtoSize() (n int)   { return m.Size() }
 | 
			
		||||
func (m *Value_NumberValue) ProtoSize() (n int) { return m.Size() }
 | 
			
		||||
func (m *Value_StringValue) ProtoSize() (n int) { return m.Size() }
 | 
			
		||||
func (m *Value_BoolValue) ProtoSize() (n int)   { return m.Size() }
 | 
			
		||||
func (m *Value_StructValue) ProtoSize() (n int) { return m.Size() }
 | 
			
		||||
func (m *Value_ListValue) ProtoSize() (n int)   { return m.Size() }
 | 
			
		||||
func (m *ListValue) ProtoSize() (n int)         { return m.Size() }
 | 
			
		||||
func (m *Timestamp) ProtoSize() (n int)         { return m.Size() }
 | 
			
		||||
func (m *Type) ProtoSize() (n int)              { return m.Size() }
 | 
			
		||||
func (m *Field) ProtoSize() (n int)             { return m.Size() }
 | 
			
		||||
func (m *Enum) ProtoSize() (n int)              { return m.Size() }
 | 
			
		||||
func (m *EnumValue) ProtoSize() (n int)         { return m.Size() }
 | 
			
		||||
func (m *Option) ProtoSize() (n int)            { return m.Size() }
 | 
			
		||||
func (m *DoubleValue) ProtoSize() (n int)       { return m.Size() }
 | 
			
		||||
func (m *FloatValue) ProtoSize() (n int)        { return m.Size() }
 | 
			
		||||
func (m *Int64Value) ProtoSize() (n int)        { return m.Size() }
 | 
			
		||||
func (m *UInt64Value) ProtoSize() (n int)       { return m.Size() }
 | 
			
		||||
func (m *Int32Value) ProtoSize() (n int)        { return m.Size() }
 | 
			
		||||
func (m *UInt32Value) ProtoSize() (n int)       { return m.Size() }
 | 
			
		||||
func (m *BoolValue) ProtoSize() (n int)         { return m.Size() }
 | 
			
		||||
func (m *StringValue) ProtoSize() (n int)       { return m.Size() }
 | 
			
		||||
func (m *BytesValue) ProtoSize() (n int)        { return m.Size() }
 | 
			
		||||
							
								
								
									
										524
									
								
								vendor/github.com/gogo/protobuf/types/source_context.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										524
									
								
								vendor/github.com/gogo/protobuf/types/source_context.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,524 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/source_context.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	bytes "bytes"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	strings "strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// `SourceContext` represents information about the source of a
 | 
			
		||||
// protobuf element, like the file in which it is defined.
 | 
			
		||||
type SourceContext struct {
 | 
			
		||||
	// The path-qualified name of the .proto file that contained the associated
 | 
			
		||||
	// protobuf element.  For example: `"google/protobuf/source_context.proto"`.
 | 
			
		||||
	FileName             string   `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *SourceContext) Reset()      { *m = SourceContext{} }
 | 
			
		||||
func (*SourceContext) ProtoMessage() {}
 | 
			
		||||
func (*SourceContext) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_b686cdb126d509db, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_SourceContext.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_SourceContext.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_SourceContext.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_SourceContext proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *SourceContext) GetFileName() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.FileName
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*SourceContext) XXX_MessageName() string {
 | 
			
		||||
	return "google.protobuf.SourceContext"
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*SourceContext)(nil), "google.protobuf.SourceContext")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterFile("google/protobuf/source_context.proto", fileDescriptor_b686cdb126d509db)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_b686cdb126d509db = []byte{
 | 
			
		||||
	// 212 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xce, 0x2f, 0x2d,
 | 
			
		||||
	0x4a, 0x4e, 0x8d, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xad, 0x28, 0xd1, 0x03, 0x8b, 0x0b, 0xf1, 0x43,
 | 
			
		||||
	0x54, 0xe9, 0xc1, 0x54, 0x29, 0xe9, 0x70, 0xf1, 0x06, 0x83, 0x15, 0x3a, 0x43, 0xd4, 0x09, 0x49,
 | 
			
		||||
	0x73, 0x71, 0xa6, 0x65, 0xe6, 0xa4, 0xc6, 0xe7, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a,
 | 
			
		||||
	0x70, 0x06, 0x71, 0x80, 0x04, 0xfc, 0x12, 0x73, 0x53, 0x9d, 0x3a, 0x19, 0x6f, 0x3c, 0x94, 0x63,
 | 
			
		||||
	0xf8, 0xf0, 0x50, 0x8e, 0xf1, 0xc7, 0x43, 0x39, 0xc6, 0x86, 0x47, 0x72, 0x8c, 0x2b, 0x1e, 0xc9,
 | 
			
		||||
	0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f, 0x1e,
 | 
			
		||||
	0xc9, 0x31, 0x7c, 0x00, 0x89, 0x3f, 0x96, 0x63, 0x3c, 0xf1, 0x58, 0x8e, 0x91, 0x4b, 0x38, 0x39,
 | 
			
		||||
	0x3f, 0x57, 0x0f, 0xcd, 0x56, 0x27, 0x21, 0x14, 0x3b, 0x03, 0x40, 0xc2, 0x01, 0x8c, 0x51, 0xac,
 | 
			
		||||
	0x25, 0x95, 0x05, 0xa9, 0xc5, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43,
 | 
			
		||||
	0x34, 0x05, 0x40, 0x35, 0xe9, 0x85, 0xa7, 0xe6, 0xe4, 0x78, 0xe7, 0xe5, 0x97, 0xe7, 0x85, 0x80,
 | 
			
		||||
	0x94, 0x25, 0xb1, 0x81, 0x4d, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x37, 0x2a, 0xa1,
 | 
			
		||||
	0xf9, 0x00, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *SourceContext) Compare(that interface{}) int {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*SourceContext)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(SourceContext)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if this.FileName != that1.FileName {
 | 
			
		||||
		if this.FileName < that1.FileName {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
func (this *SourceContext) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*SourceContext)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(SourceContext)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.FileName != that1.FileName {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *SourceContext) GoString() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := make([]string, 0, 5)
 | 
			
		||||
	s = append(s, "&types.SourceContext{")
 | 
			
		||||
	s = append(s, "FileName: "+fmt.Sprintf("%#v", this.FileName)+",\n")
 | 
			
		||||
	if this.XXX_unrecognized != nil {
 | 
			
		||||
		s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
 | 
			
		||||
	}
 | 
			
		||||
	s = append(s, "}")
 | 
			
		||||
	return strings.Join(s, "")
 | 
			
		||||
}
 | 
			
		||||
func valueToGoStringSourceContext(v interface{}, typ string) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *SourceContext) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *SourceContext) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		i -= len(m.XXX_unrecognized)
 | 
			
		||||
		copy(dAtA[i:], m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	if len(m.FileName) > 0 {
 | 
			
		||||
		i -= len(m.FileName)
 | 
			
		||||
		copy(dAtA[i:], m.FileName)
 | 
			
		||||
		i = encodeVarintSourceContext(dAtA, i, uint64(len(m.FileName)))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0xa
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintSourceContext(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovSourceContext(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedSourceContext(r randySourceContext, easy bool) *SourceContext {
 | 
			
		||||
	this := &SourceContext{}
 | 
			
		||||
	this.FileName = string(randStringSourceContext(r))
 | 
			
		||||
	if !easy && r.Intn(10) != 0 {
 | 
			
		||||
		this.XXX_unrecognized = randUnrecognizedSourceContext(r, 2)
 | 
			
		||||
	}
 | 
			
		||||
	return this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type randySourceContext interface {
 | 
			
		||||
	Float32() float32
 | 
			
		||||
	Float64() float64
 | 
			
		||||
	Int63() int64
 | 
			
		||||
	Int31() int32
 | 
			
		||||
	Uint32() uint32
 | 
			
		||||
	Intn(n int) int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func randUTF8RuneSourceContext(r randySourceContext) rune {
 | 
			
		||||
	ru := r.Intn(62)
 | 
			
		||||
	if ru < 10 {
 | 
			
		||||
		return rune(ru + 48)
 | 
			
		||||
	} else if ru < 36 {
 | 
			
		||||
		return rune(ru + 55)
 | 
			
		||||
	}
 | 
			
		||||
	return rune(ru + 61)
 | 
			
		||||
}
 | 
			
		||||
func randStringSourceContext(r randySourceContext) string {
 | 
			
		||||
	v1 := r.Intn(100)
 | 
			
		||||
	tmps := make([]rune, v1)
 | 
			
		||||
	for i := 0; i < v1; i++ {
 | 
			
		||||
		tmps[i] = randUTF8RuneSourceContext(r)
 | 
			
		||||
	}
 | 
			
		||||
	return string(tmps)
 | 
			
		||||
}
 | 
			
		||||
func randUnrecognizedSourceContext(r randySourceContext, maxFieldNumber int) (dAtA []byte) {
 | 
			
		||||
	l := r.Intn(5)
 | 
			
		||||
	for i := 0; i < l; i++ {
 | 
			
		||||
		wire := r.Intn(4)
 | 
			
		||||
		if wire == 3 {
 | 
			
		||||
			wire = 5
 | 
			
		||||
		}
 | 
			
		||||
		fieldNumber := maxFieldNumber + r.Intn(100)
 | 
			
		||||
		dAtA = randFieldSourceContext(dAtA, r, fieldNumber, wire)
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func randFieldSourceContext(dAtA []byte, r randySourceContext, fieldNumber int, wire int) []byte {
 | 
			
		||||
	key := uint32(fieldNumber)<<3 | uint32(wire)
 | 
			
		||||
	switch wire {
 | 
			
		||||
	case 0:
 | 
			
		||||
		dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key))
 | 
			
		||||
		v2 := r.Int63()
 | 
			
		||||
		if r.Intn(2) == 0 {
 | 
			
		||||
			v2 *= -1
 | 
			
		||||
		}
 | 
			
		||||
		dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(v2))
 | 
			
		||||
	case 1:
 | 
			
		||||
		dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	case 2:
 | 
			
		||||
		dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key))
 | 
			
		||||
		ll := r.Intn(100)
 | 
			
		||||
		dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(ll))
 | 
			
		||||
		for j := 0; j < ll; j++ {
 | 
			
		||||
			dAtA = append(dAtA, byte(r.Intn(256)))
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		dAtA = encodeVarintPopulateSourceContext(dAtA, uint64(key))
 | 
			
		||||
		dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func encodeVarintPopulateSourceContext(dAtA []byte, v uint64) []byte {
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
 | 
			
		||||
		v >>= 7
 | 
			
		||||
	}
 | 
			
		||||
	dAtA = append(dAtA, uint8(v))
 | 
			
		||||
	return dAtA
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	l = len(m.FileName)
 | 
			
		||||
	if l > 0 {
 | 
			
		||||
		n += 1 + l + sovSourceContext(uint64(l))
 | 
			
		||||
	}
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		n += len(m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovSourceContext(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozSourceContext(x uint64) (n int) {
 | 
			
		||||
	return sovSourceContext(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (this *SourceContext) String() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := strings.Join([]string{`&SourceContext{`,
 | 
			
		||||
		`FileName:` + fmt.Sprintf("%v", this.FileName) + `,`,
 | 
			
		||||
		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
 | 
			
		||||
		`}`,
 | 
			
		||||
	}, "")
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
func valueToStringSourceContext(v interface{}) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("*%v", pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *SourceContext) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: SourceContext: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: SourceContext: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 2 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field FileName", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			var stringLen uint64
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowSourceContext
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				stringLen |= uint64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			intStringLen := int(stringLen)
 | 
			
		||||
			if intStringLen < 0 {
 | 
			
		||||
				return ErrInvalidLengthSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			postIndex := iNdEx + intStringLen
 | 
			
		||||
			if postIndex < 0 {
 | 
			
		||||
				return ErrInvalidLengthSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			if postIndex > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.FileName = string(dAtA[iNdEx:postIndex])
 | 
			
		||||
			iNdEx = postIndex
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipSourceContext(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipSourceContext(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowSourceContext
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowSourceContext
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupSourceContext
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthSourceContext
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthSourceContext        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowSourceContext          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupSourceContext = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										2271
									
								
								vendor/github.com/gogo/protobuf/types/struct.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2271
									
								
								vendor/github.com/gogo/protobuf/types/struct.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										130
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										130
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,130 +0,0 @@
 | 
			
		||||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
// This file implements operations on google.protobuf.Timestamp.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Seconds field of the earliest valid Timestamp.
 | 
			
		||||
	// This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
 | 
			
		||||
	minValidSeconds = -62135596800
 | 
			
		||||
	// Seconds field just after the latest valid Timestamp.
 | 
			
		||||
	// This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
 | 
			
		||||
	maxValidSeconds = 253402300800
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// validateTimestamp determines whether a Timestamp is valid.
 | 
			
		||||
// A valid timestamp represents a time in the range
 | 
			
		||||
// [0001-01-01, 10000-01-01) and has a Nanos field
 | 
			
		||||
// in the range [0, 1e9).
 | 
			
		||||
//
 | 
			
		||||
// If the Timestamp is valid, validateTimestamp returns nil.
 | 
			
		||||
// Otherwise, it returns an error that describes
 | 
			
		||||
// the problem.
 | 
			
		||||
//
 | 
			
		||||
// Every valid Timestamp can be represented by a time.Time, but the converse is not true.
 | 
			
		||||
func validateTimestamp(ts *Timestamp) error {
 | 
			
		||||
	if ts == nil {
 | 
			
		||||
		return errors.New("timestamp: nil Timestamp")
 | 
			
		||||
	}
 | 
			
		||||
	if ts.Seconds < minValidSeconds {
 | 
			
		||||
		return fmt.Errorf("timestamp: %#v before 0001-01-01", ts)
 | 
			
		||||
	}
 | 
			
		||||
	if ts.Seconds >= maxValidSeconds {
 | 
			
		||||
		return fmt.Errorf("timestamp: %#v after 10000-01-01", ts)
 | 
			
		||||
	}
 | 
			
		||||
	if ts.Nanos < 0 || ts.Nanos >= 1e9 {
 | 
			
		||||
		return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time.
 | 
			
		||||
// It returns an error if the argument is invalid.
 | 
			
		||||
//
 | 
			
		||||
// Unlike most Go functions, if Timestamp returns an error, the first return value
 | 
			
		||||
// is not the zero time.Time. Instead, it is the value obtained from the
 | 
			
		||||
// time.Unix function when passed the contents of the Timestamp, in the UTC
 | 
			
		||||
// locale. This may or may not be a meaningful time; many invalid Timestamps
 | 
			
		||||
// do map to valid time.Times.
 | 
			
		||||
//
 | 
			
		||||
// A nil Timestamp returns an error. The first return value in that case is
 | 
			
		||||
// undefined.
 | 
			
		||||
func TimestampFromProto(ts *Timestamp) (time.Time, error) {
 | 
			
		||||
	// Don't return the zero value on error, because corresponds to a valid
 | 
			
		||||
	// timestamp. Instead return whatever time.Unix gives us.
 | 
			
		||||
	var t time.Time
 | 
			
		||||
	if ts == nil {
 | 
			
		||||
		t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp
 | 
			
		||||
	} else {
 | 
			
		||||
		t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC()
 | 
			
		||||
	}
 | 
			
		||||
	return t, validateTimestamp(ts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampNow returns a google.protobuf.Timestamp for the current time.
 | 
			
		||||
func TimestampNow() *Timestamp {
 | 
			
		||||
	ts, err := TimestampProto(time.Now())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic("ptypes: time.Now() out of Timestamp range")
 | 
			
		||||
	}
 | 
			
		||||
	return ts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto.
 | 
			
		||||
// It returns an error if the resulting Timestamp is invalid.
 | 
			
		||||
func TimestampProto(t time.Time) (*Timestamp, error) {
 | 
			
		||||
	ts := &Timestamp{
 | 
			
		||||
		Seconds: t.Unix(),
 | 
			
		||||
		Nanos:   int32(t.Nanosecond()),
 | 
			
		||||
	}
 | 
			
		||||
	if err := validateTimestamp(ts); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid
 | 
			
		||||
// Timestamps, it returns an error message in parentheses.
 | 
			
		||||
func TimestampString(ts *Timestamp) string {
 | 
			
		||||
	t, err := TimestampFromProto(ts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Sprintf("(%v)", err)
 | 
			
		||||
	}
 | 
			
		||||
	return t.Format(time.RFC3339Nano)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										539
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										539
									
								
								vendor/github.com/gogo/protobuf/types/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,539 +0,0 @@
 | 
			
		||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/timestamp.proto
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	bytes "bytes"
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/gogo/protobuf/proto"
 | 
			
		||||
	io "io"
 | 
			
		||||
	math "math"
 | 
			
		||||
	math_bits "math/bits"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
	strings "strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone or local
 | 
			
		||||
// calendar, encoded as a count of seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution. The count is relative to an epoch at UTC midnight on
 | 
			
		||||
// January 1, 1970, in the proleptic Gregorian calendar which extends the
 | 
			
		||||
// Gregorian calendar backwards to year one.
 | 
			
		||||
//
 | 
			
		||||
// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
 | 
			
		||||
// second table is needed for interpretation, using a [24-hour linear
 | 
			
		||||
// smear](https://developers.google.com/time/smear).
 | 
			
		||||
//
 | 
			
		||||
// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
 | 
			
		||||
// restricting to that range, we ensure that we can convert to and from [RFC
 | 
			
		||||
// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Compute Timestamp from POSIX `time()`.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds(time(NULL));
 | 
			
		||||
//     timestamp.set_nanos(0);
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
 | 
			
		||||
//
 | 
			
		||||
//     struct timeval tv;
 | 
			
		||||
//     gettimeofday(&tv, NULL);
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds(tv.tv_sec);
 | 
			
		||||
//     timestamp.set_nanos(tv.tv_usec * 1000);
 | 
			
		||||
//
 | 
			
		||||
// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
 | 
			
		||||
//
 | 
			
		||||
//     FILETIME ft;
 | 
			
		||||
//     GetSystemTimeAsFileTime(&ft);
 | 
			
		||||
//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
 | 
			
		||||
//
 | 
			
		||||
//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
 | 
			
		||||
//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
 | 
			
		||||
//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
 | 
			
		||||
//
 | 
			
		||||
// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
 | 
			
		||||
//
 | 
			
		||||
//     long millis = System.currentTimeMillis();
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
 | 
			
		||||
//         .setNanos((int) ((millis % 1000) * 1000000)).build();
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// Example 5: Compute Timestamp from current time in Python.
 | 
			
		||||
//
 | 
			
		||||
//     timestamp = Timestamp()
 | 
			
		||||
//     timestamp.GetCurrentTime()
 | 
			
		||||
//
 | 
			
		||||
// # JSON Mapping
 | 
			
		||||
//
 | 
			
		||||
// In JSON format, the Timestamp type is encoded as a string in the
 | 
			
		||||
// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
 | 
			
		||||
// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
 | 
			
		||||
// where {year} is always expressed using four digits while {month}, {day},
 | 
			
		||||
// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
 | 
			
		||||
// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
 | 
			
		||||
// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
 | 
			
		||||
// is required. A proto3 JSON serializer should always use UTC (as indicated by
 | 
			
		||||
// "Z") when printing the Timestamp type and a proto3 JSON parser should be
 | 
			
		||||
// able to accept both UTC and other timezones (as indicated by an offset).
 | 
			
		||||
//
 | 
			
		||||
// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
 | 
			
		||||
// 01:30 UTC on January 15, 2017.
 | 
			
		||||
//
 | 
			
		||||
// In JavaScript, one can convert a Date object to this format using the
 | 
			
		||||
// standard
 | 
			
		||||
// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
 | 
			
		||||
// method. In Python, a standard `datetime.datetime` object can be converted
 | 
			
		||||
// to this format using
 | 
			
		||||
// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
 | 
			
		||||
// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
 | 
			
		||||
// the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
 | 
			
		||||
// ) to obtain a formatter capable of generating timestamps in this format.
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
type Timestamp struct {
 | 
			
		||||
	// Represents seconds of UTC time since Unix epoch
 | 
			
		||||
	// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
 | 
			
		||||
	// 9999-12-31T23:59:59Z inclusive.
 | 
			
		||||
	Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
 | 
			
		||||
	// Non-negative fractions of a second at nanosecond resolution. Negative
 | 
			
		||||
	// second values with fractions must still have non-negative nanos values
 | 
			
		||||
	// that count forward in time. Must be from 0 to 999,999,999
 | 
			
		||||
	// inclusive.
 | 
			
		||||
	Nanos                int32    `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) Reset()      { *m = Timestamp{} }
 | 
			
		||||
func (*Timestamp) ProtoMessage() {}
 | 
			
		||||
func (*Timestamp) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_292007bbfe81227e, []int{0}
 | 
			
		||||
}
 | 
			
		||||
func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" }
 | 
			
		||||
func (m *Timestamp) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return m.Unmarshal(b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if deterministic {
 | 
			
		||||
		return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic)
 | 
			
		||||
	} else {
 | 
			
		||||
		b = b[:cap(b)]
 | 
			
		||||
		n, err := m.MarshalToSizedBuffer(b)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return b[:n], nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Timestamp.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Size() int {
 | 
			
		||||
	return m.Size()
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Timestamp.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Timestamp proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) GetSeconds() int64 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Seconds
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) GetNanos() int32 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Nanos
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Timestamp) XXX_MessageName() string {
 | 
			
		||||
	return "google.protobuf.Timestamp"
 | 
			
		||||
}
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_292007bbfe81227e = []byte{
 | 
			
		||||
	// 212 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d,
 | 
			
		||||
	0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28,
 | 
			
		||||
	0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5,
 | 
			
		||||
	0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89,
 | 
			
		||||
	0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x03, 0xe3, 0x8d,
 | 
			
		||||
	0x87, 0x72, 0x0c, 0x1f, 0x1e, 0xca, 0x31, 0xae, 0x78, 0x24, 0xc7, 0x78, 0xe2, 0x91, 0x1c, 0xe3,
 | 
			
		||||
	0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0xbe, 0x78, 0x24, 0xc7, 0xf0, 0xe1, 0x91, 0x1c,
 | 
			
		||||
	0xe3, 0x8a, 0xc7, 0x72, 0x8c, 0x27, 0x1e, 0xcb, 0x31, 0x72, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1,
 | 
			
		||||
	0x59, 0xee, 0xc4, 0x07, 0xb7, 0x3a, 0x00, 0x24, 0x14, 0xc0, 0x18, 0xc5, 0x5a, 0x52, 0x59, 0x90,
 | 
			
		||||
	0x5a, 0xfc, 0x83, 0x91, 0x71, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88,
 | 
			
		||||
	0x9e, 0x00, 0xa8, 0x1e, 0xbd, 0xf0, 0xd4, 0x9c, 0x1c, 0xef, 0xbc, 0xfc, 0xf2, 0xbc, 0x10, 0x90,
 | 
			
		||||
	0xca, 0x24, 0x36, 0xb0, 0x61, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x23, 0x83, 0xdd,
 | 
			
		||||
	0xfa, 0x00, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *Timestamp) Compare(that interface{}) int {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Timestamp)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Timestamp)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		if this == nil {
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return -1
 | 
			
		||||
	}
 | 
			
		||||
	if this.Seconds != that1.Seconds {
 | 
			
		||||
		if this.Seconds < that1.Seconds {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	if this.Nanos != that1.Nanos {
 | 
			
		||||
		if this.Nanos < that1.Nanos {
 | 
			
		||||
			return -1
 | 
			
		||||
		}
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	if c := bytes.Compare(this.XXX_unrecognized, that1.XXX_unrecognized); c != 0 {
 | 
			
		||||
		return c
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
func (this *Timestamp) Equal(that interface{}) bool {
 | 
			
		||||
	if that == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	that1, ok := that.(*Timestamp)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		that2, ok := that.(Timestamp)
 | 
			
		||||
		if ok {
 | 
			
		||||
			that1 = &that2
 | 
			
		||||
		} else {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if that1 == nil {
 | 
			
		||||
		return this == nil
 | 
			
		||||
	} else if this == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.Seconds != that1.Seconds {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if this.Nanos != that1.Nanos {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
func (this *Timestamp) GoString() string {
 | 
			
		||||
	if this == nil {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	s := make([]string, 0, 6)
 | 
			
		||||
	s = append(s, "&types.Timestamp{")
 | 
			
		||||
	s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n")
 | 
			
		||||
	s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n")
 | 
			
		||||
	if this.XXX_unrecognized != nil {
 | 
			
		||||
		s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
 | 
			
		||||
	}
 | 
			
		||||
	s = append(s, "}")
 | 
			
		||||
	return strings.Join(s, "")
 | 
			
		||||
}
 | 
			
		||||
func valueToGoStringTimestamp(v interface{}, typ string) string {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return "nil"
 | 
			
		||||
	}
 | 
			
		||||
	pv := reflect.Indirect(rv).Interface()
 | 
			
		||||
	return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) Marshal() (dAtA []byte, err error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	dAtA = make([]byte, size)
 | 
			
		||||
	n, err := m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return dAtA[:n], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) MarshalTo(dAtA []byte) (int, error) {
 | 
			
		||||
	size := m.Size()
 | 
			
		||||
	return m.MarshalToSizedBuffer(dAtA[:size])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 | 
			
		||||
	i := len(dAtA)
 | 
			
		||||
	_ = i
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		i -= len(m.XXX_unrecognized)
 | 
			
		||||
		copy(dAtA[i:], m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	if m.Nanos != 0 {
 | 
			
		||||
		i = encodeVarintTimestamp(dAtA, i, uint64(m.Nanos))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0x10
 | 
			
		||||
	}
 | 
			
		||||
	if m.Seconds != 0 {
 | 
			
		||||
		i = encodeVarintTimestamp(dAtA, i, uint64(m.Seconds))
 | 
			
		||||
		i--
 | 
			
		||||
		dAtA[i] = 0x8
 | 
			
		||||
	}
 | 
			
		||||
	return len(dAtA) - i, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encodeVarintTimestamp(dAtA []byte, offset int, v uint64) int {
 | 
			
		||||
	offset -= sovTimestamp(v)
 | 
			
		||||
	base := offset
 | 
			
		||||
	for v >= 1<<7 {
 | 
			
		||||
		dAtA[offset] = uint8(v&0x7f | 0x80)
 | 
			
		||||
		v >>= 7
 | 
			
		||||
		offset++
 | 
			
		||||
	}
 | 
			
		||||
	dAtA[offset] = uint8(v)
 | 
			
		||||
	return base
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) Size() (n int) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	var l int
 | 
			
		||||
	_ = l
 | 
			
		||||
	if m.Seconds != 0 {
 | 
			
		||||
		n += 1 + sovTimestamp(uint64(m.Seconds))
 | 
			
		||||
	}
 | 
			
		||||
	if m.Nanos != 0 {
 | 
			
		||||
		n += 1 + sovTimestamp(uint64(m.Nanos))
 | 
			
		||||
	}
 | 
			
		||||
	if m.XXX_unrecognized != nil {
 | 
			
		||||
		n += len(m.XXX_unrecognized)
 | 
			
		||||
	}
 | 
			
		||||
	return n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sovTimestamp(x uint64) (n int) {
 | 
			
		||||
	return (math_bits.Len64(x|1) + 6) / 7
 | 
			
		||||
}
 | 
			
		||||
func sozTimestamp(x uint64) (n int) {
 | 
			
		||||
	return sovTimestamp(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) Unmarshal(dAtA []byte) error {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		preIndex := iNdEx
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return ErrIntOverflowTimestamp
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= uint64(b&0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		fieldNum := int32(wire >> 3)
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		if wireType == 4 {
 | 
			
		||||
			return fmt.Errorf("proto: Timestamp: wiretype end group for non-group")
 | 
			
		||||
		}
 | 
			
		||||
		if fieldNum <= 0 {
 | 
			
		||||
			return fmt.Errorf("proto: Timestamp: illegal tag %d (wire type %d)", fieldNum, wire)
 | 
			
		||||
		}
 | 
			
		||||
		switch fieldNum {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			m.Seconds = 0
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowTimestamp
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				m.Seconds |= int64(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 2:
 | 
			
		||||
			if wireType != 0 {
 | 
			
		||||
				return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType)
 | 
			
		||||
			}
 | 
			
		||||
			m.Nanos = 0
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return ErrIntOverflowTimestamp
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				m.Nanos |= int32(b&0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			iNdEx = preIndex
 | 
			
		||||
			skippy, err := skipTimestamp(dAtA[iNdEx:])
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if (skippy < 0) || (iNdEx+skippy) < 0 {
 | 
			
		||||
				return ErrInvalidLengthTimestamp
 | 
			
		||||
			}
 | 
			
		||||
			if (iNdEx + skippy) > l {
 | 
			
		||||
				return io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
 | 
			
		||||
			iNdEx += skippy
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if iNdEx > l {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func skipTimestamp(dAtA []byte) (n int, err error) {
 | 
			
		||||
	l := len(dAtA)
 | 
			
		||||
	iNdEx := 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
	for iNdEx < l {
 | 
			
		||||
		var wire uint64
 | 
			
		||||
		for shift := uint(0); ; shift += 7 {
 | 
			
		||||
			if shift >= 64 {
 | 
			
		||||
				return 0, ErrIntOverflowTimestamp
 | 
			
		||||
			}
 | 
			
		||||
			if iNdEx >= l {
 | 
			
		||||
				return 0, io.ErrUnexpectedEOF
 | 
			
		||||
			}
 | 
			
		||||
			b := dAtA[iNdEx]
 | 
			
		||||
			iNdEx++
 | 
			
		||||
			wire |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
			if b < 0x80 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		wireType := int(wire & 0x7)
 | 
			
		||||
		switch wireType {
 | 
			
		||||
		case 0:
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowTimestamp
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				if dAtA[iNdEx-1] < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case 1:
 | 
			
		||||
			iNdEx += 8
 | 
			
		||||
		case 2:
 | 
			
		||||
			var length int
 | 
			
		||||
			for shift := uint(0); ; shift += 7 {
 | 
			
		||||
				if shift >= 64 {
 | 
			
		||||
					return 0, ErrIntOverflowTimestamp
 | 
			
		||||
				}
 | 
			
		||||
				if iNdEx >= l {
 | 
			
		||||
					return 0, io.ErrUnexpectedEOF
 | 
			
		||||
				}
 | 
			
		||||
				b := dAtA[iNdEx]
 | 
			
		||||
				iNdEx++
 | 
			
		||||
				length |= (int(b) & 0x7F) << shift
 | 
			
		||||
				if b < 0x80 {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if length < 0 {
 | 
			
		||||
				return 0, ErrInvalidLengthTimestamp
 | 
			
		||||
			}
 | 
			
		||||
			iNdEx += length
 | 
			
		||||
		case 3:
 | 
			
		||||
			depth++
 | 
			
		||||
		case 4:
 | 
			
		||||
			if depth == 0 {
 | 
			
		||||
				return 0, ErrUnexpectedEndOfGroupTimestamp
 | 
			
		||||
			}
 | 
			
		||||
			depth--
 | 
			
		||||
		case 5:
 | 
			
		||||
			iNdEx += 4
 | 
			
		||||
		default:
 | 
			
		||||
			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
 | 
			
		||||
		}
 | 
			
		||||
		if iNdEx < 0 {
 | 
			
		||||
			return 0, ErrInvalidLengthTimestamp
 | 
			
		||||
		}
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return iNdEx, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0, io.ErrUnexpectedEOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrInvalidLengthTimestamp        = fmt.Errorf("proto: negative length found during unmarshaling")
 | 
			
		||||
	ErrIntOverflowTimestamp          = fmt.Errorf("proto: integer overflow")
 | 
			
		||||
	ErrUnexpectedEndOfGroupTimestamp = fmt.Errorf("proto: unexpected end of group")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										94
									
								
								vendor/github.com/gogo/protobuf/types/timestamp_gogo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										94
									
								
								vendor/github.com/gogo/protobuf/types/timestamp_gogo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,94 +0,0 @@
 | 
			
		||||
// Protocol Buffers for Go with Gadgets
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
 | 
			
		||||
// http://github.com/gogo/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewPopulatedTimestamp(r interface {
 | 
			
		||||
	Int63() int64
 | 
			
		||||
}, easy bool) *Timestamp {
 | 
			
		||||
	this := &Timestamp{}
 | 
			
		||||
	ns := int64(r.Int63())
 | 
			
		||||
	this.Seconds = ns / 1e9
 | 
			
		||||
	this.Nanos = int32(ns % 1e9)
 | 
			
		||||
	return this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ts *Timestamp) String() string {
 | 
			
		||||
	return TimestampString(ts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPopulatedStdTime(r interface {
 | 
			
		||||
	Int63() int64
 | 
			
		||||
}, easy bool) *time.Time {
 | 
			
		||||
	timestamp := NewPopulatedTimestamp(r, easy)
 | 
			
		||||
	t, err := TimestampFromProto(timestamp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return &t
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdTime(t time.Time) int {
 | 
			
		||||
	ts, err := TimestampProto(t)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	return ts.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdTimeMarshal(t time.Time) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdTime(t)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdTimeMarshalTo(t, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdTimeMarshalTo(t time.Time, data []byte) (int, error) {
 | 
			
		||||
	ts, err := TimestampProto(t)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return ts.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdTimeUnmarshal(t *time.Time, data []byte) error {
 | 
			
		||||
	ts := &Timestamp{}
 | 
			
		||||
	if err := ts.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	tt, err := TimestampFromProto(ts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*t = tt
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3355
									
								
								vendor/github.com/gogo/protobuf/types/type.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3355
									
								
								vendor/github.com/gogo/protobuf/types/type.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2703
									
								
								vendor/github.com/gogo/protobuf/types/wrappers.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2703
									
								
								vendor/github.com/gogo/protobuf/types/wrappers.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										300
									
								
								vendor/github.com/gogo/protobuf/types/wrappers_gogo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										300
									
								
								vendor/github.com/gogo/protobuf/types/wrappers_gogo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,300 +0,0 @@
 | 
			
		||||
// Protocol Buffers for Go with Gadgets
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2018, The GoGo Authors. All rights reserved.
 | 
			
		||||
// http://github.com/gogo/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
func NewPopulatedStdDouble(r randyWrappers, easy bool) *float64 {
 | 
			
		||||
	v := NewPopulatedDoubleValue(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdDouble(v float64) int {
 | 
			
		||||
	pv := &DoubleValue{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdDoubleMarshal(v float64) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdDouble(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdDoubleMarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdDoubleMarshalTo(v float64, data []byte) (int, error) {
 | 
			
		||||
	pv := &DoubleValue{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdDoubleUnmarshal(v *float64, data []byte) error {
 | 
			
		||||
	pv := &DoubleValue{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdFloat(r randyWrappers, easy bool) *float32 {
 | 
			
		||||
	v := NewPopulatedFloatValue(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdFloat(v float32) int {
 | 
			
		||||
	pv := &FloatValue{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdFloatMarshal(v float32) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdFloat(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdFloatMarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdFloatMarshalTo(v float32, data []byte) (int, error) {
 | 
			
		||||
	pv := &FloatValue{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdFloatUnmarshal(v *float32, data []byte) error {
 | 
			
		||||
	pv := &FloatValue{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdInt64(r randyWrappers, easy bool) *int64 {
 | 
			
		||||
	v := NewPopulatedInt64Value(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdInt64(v int64) int {
 | 
			
		||||
	pv := &Int64Value{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdInt64Marshal(v int64) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdInt64(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdInt64MarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdInt64MarshalTo(v int64, data []byte) (int, error) {
 | 
			
		||||
	pv := &Int64Value{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdInt64Unmarshal(v *int64, data []byte) error {
 | 
			
		||||
	pv := &Int64Value{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdUInt64(r randyWrappers, easy bool) *uint64 {
 | 
			
		||||
	v := NewPopulatedUInt64Value(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdUInt64(v uint64) int {
 | 
			
		||||
	pv := &UInt64Value{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdUInt64Marshal(v uint64) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdUInt64(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdUInt64MarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdUInt64MarshalTo(v uint64, data []byte) (int, error) {
 | 
			
		||||
	pv := &UInt64Value{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdUInt64Unmarshal(v *uint64, data []byte) error {
 | 
			
		||||
	pv := &UInt64Value{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdInt32(r randyWrappers, easy bool) *int32 {
 | 
			
		||||
	v := NewPopulatedInt32Value(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdInt32(v int32) int {
 | 
			
		||||
	pv := &Int32Value{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdInt32Marshal(v int32) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdInt32(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdInt32MarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdInt32MarshalTo(v int32, data []byte) (int, error) {
 | 
			
		||||
	pv := &Int32Value{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdInt32Unmarshal(v *int32, data []byte) error {
 | 
			
		||||
	pv := &Int32Value{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdUInt32(r randyWrappers, easy bool) *uint32 {
 | 
			
		||||
	v := NewPopulatedUInt32Value(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdUInt32(v uint32) int {
 | 
			
		||||
	pv := &UInt32Value{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdUInt32Marshal(v uint32) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdUInt32(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdUInt32MarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdUInt32MarshalTo(v uint32, data []byte) (int, error) {
 | 
			
		||||
	pv := &UInt32Value{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdUInt32Unmarshal(v *uint32, data []byte) error {
 | 
			
		||||
	pv := &UInt32Value{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdBool(r randyWrappers, easy bool) *bool {
 | 
			
		||||
	v := NewPopulatedBoolValue(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdBool(v bool) int {
 | 
			
		||||
	pv := &BoolValue{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdBoolMarshal(v bool) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdBool(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdBoolMarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdBoolMarshalTo(v bool, data []byte) (int, error) {
 | 
			
		||||
	pv := &BoolValue{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdBoolUnmarshal(v *bool, data []byte) error {
 | 
			
		||||
	pv := &BoolValue{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdString(r randyWrappers, easy bool) *string {
 | 
			
		||||
	v := NewPopulatedStringValue(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdString(v string) int {
 | 
			
		||||
	pv := &StringValue{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdStringMarshal(v string) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdString(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdStringMarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdStringMarshalTo(v string, data []byte) (int, error) {
 | 
			
		||||
	pv := &StringValue{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdStringUnmarshal(v *string, data []byte) error {
 | 
			
		||||
	pv := &StringValue{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func NewPopulatedStdBytes(r randyWrappers, easy bool) *[]byte {
 | 
			
		||||
	v := NewPopulatedBytesValue(r, easy)
 | 
			
		||||
	return &v.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SizeOfStdBytes(v []byte) int {
 | 
			
		||||
	pv := &BytesValue{Value: v}
 | 
			
		||||
	return pv.Size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdBytesMarshal(v []byte) ([]byte, error) {
 | 
			
		||||
	size := SizeOfStdBytes(v)
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
	_, err := StdBytesMarshalTo(v, buf)
 | 
			
		||||
	return buf, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdBytesMarshalTo(v []byte, data []byte) (int, error) {
 | 
			
		||||
	pv := &BytesValue{Value: v}
 | 
			
		||||
	return pv.MarshalTo(data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StdBytesUnmarshal(v *[]byte, data []byte) error {
 | 
			
		||||
	pv := &BytesValue{}
 | 
			
		||||
	if err := pv.Unmarshal(data); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	*v = pv.Value
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/miekg/pkcs11/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/miekg/pkcs11/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
tags
 | 
			
		||||
test_db/*/generation
 | 
			
		||||
test_db/*/*.lock
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/miekg/pkcs11/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/miekg/pkcs11/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +0,0 @@
 | 
			
		||||
Copyright (c) 2013 Miek Gieben. All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
met:
 | 
			
		||||
 | 
			
		||||
   * Redistributions of source code must retain the above copyright
 | 
			
		||||
notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   * Redistributions in binary form must reproduce the above
 | 
			
		||||
copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
in the documentation and/or other materials provided with the
 | 
			
		||||
distribution.
 | 
			
		||||
   * Neither the name of Miek Gieben nor the names of its
 | 
			
		||||
contributors may be used to endorse or promote products derived from
 | 
			
		||||
this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
							
								
								
									
										57
									
								
								vendor/github.com/miekg/pkcs11/Makefile.release
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/miekg/pkcs11/Makefile.release
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,57 +0,0 @@
 | 
			
		||||
# Makefile for releasing.
 | 
			
		||||
#
 | 
			
		||||
# The release is controlled from version.go. The version found there is
 | 
			
		||||
# used to tag the git repo, we're not building any artifects so there is nothing
 | 
			
		||||
# to upload to github.
 | 
			
		||||
#
 | 
			
		||||
# * Up the version in version.go
 | 
			
		||||
# * Run: make -f Makefile.release release
 | 
			
		||||
#   * will *commit* your change with 'Release $VERSION'
 | 
			
		||||
#   * push to github
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
define GO
 | 
			
		||||
//+build ignore
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/miekg/pkcs11"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	fmt.Println(pkcs11.Release.String())
 | 
			
		||||
}
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
$(file > version_release.go,$(GO))
 | 
			
		||||
VERSION:=$(shell go run -tags release version_release.go)
 | 
			
		||||
TAG="v$(VERSION)"
 | 
			
		||||
 | 
			
		||||
all:
 | 
			
		||||
	rm -f version_release.go
 | 
			
		||||
	@echo Use the \'release\' target to start a release $(VERSION)
 | 
			
		||||
 | 
			
		||||
.PHONY: run
 | 
			
		||||
run:
 | 
			
		||||
	rm -f version_release.go
 | 
			
		||||
	@echo $(VERSION)
 | 
			
		||||
 | 
			
		||||
.PHONY: release
 | 
			
		||||
release: commit push
 | 
			
		||||
	@echo Released $(VERSION)
 | 
			
		||||
 | 
			
		||||
.PHONY: commit
 | 
			
		||||
commit:
 | 
			
		||||
	rm -f version_release.go
 | 
			
		||||
	@echo Committing release $(VERSION)
 | 
			
		||||
	git commit -am"Release $(VERSION)"
 | 
			
		||||
	git tag $(TAG)
 | 
			
		||||
 | 
			
		||||
.PHONY: push
 | 
			
		||||
push:
 | 
			
		||||
	@echo Pushing release $(VERSION) to master
 | 
			
		||||
	git push --tags
 | 
			
		||||
	git push
 | 
			
		||||
							
								
								
									
										68
									
								
								vendor/github.com/miekg/pkcs11/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										68
									
								
								vendor/github.com/miekg/pkcs11/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,68 +0,0 @@
 | 
			
		||||
# PKCS#11
 | 
			
		||||
 | 
			
		||||
This is a Go implementation of the PKCS#11 API. It wraps the library closely, but uses Go idiom where
 | 
			
		||||
it makes sense. It has been tested with SoftHSM.
 | 
			
		||||
 | 
			
		||||
## SoftHSM
 | 
			
		||||
 | 
			
		||||
 *  Make it use a custom configuration file `export SOFTHSM_CONF=$PWD/softhsm.conf`
 | 
			
		||||
 | 
			
		||||
 *  Then use `softhsm` to init it
 | 
			
		||||
 | 
			
		||||
    ~~~
 | 
			
		||||
    softhsm --init-token --slot 0 --label test --pin 1234
 | 
			
		||||
    ~~~
 | 
			
		||||
 | 
			
		||||
 *  Then use `libsofthsm2.so` as the pkcs11 module:
 | 
			
		||||
 | 
			
		||||
    ~~~ go
 | 
			
		||||
    p := pkcs11.New("/usr/lib/softhsm/libsofthsm2.so")
 | 
			
		||||
    ~~~
 | 
			
		||||
 | 
			
		||||
## Examples
 | 
			
		||||
 | 
			
		||||
A skeleton program would look somewhat like this (yes, pkcs#11 is verbose):
 | 
			
		||||
 | 
			
		||||
~~~ go
 | 
			
		||||
p := pkcs11.New("/usr/lib/softhsm/libsofthsm2.so")
 | 
			
		||||
err := p.Initialize()
 | 
			
		||||
if err != nil {
 | 
			
		||||
    panic(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
defer p.Destroy()
 | 
			
		||||
defer p.Finalize()
 | 
			
		||||
 | 
			
		||||
slots, err := p.GetSlotList(true)
 | 
			
		||||
if err != nil {
 | 
			
		||||
    panic(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
session, err := p.OpenSession(slots[0], pkcs11.CKF_SERIAL_SESSION|pkcs11.CKF_RW_SESSION)
 | 
			
		||||
if err != nil {
 | 
			
		||||
    panic(err)
 | 
			
		||||
}
 | 
			
		||||
defer p.CloseSession(session)
 | 
			
		||||
 | 
			
		||||
err = p.Login(session, pkcs11.CKU_USER, "1234")
 | 
			
		||||
if err != nil {
 | 
			
		||||
    panic(err)
 | 
			
		||||
}
 | 
			
		||||
defer p.Logout(session)
 | 
			
		||||
 | 
			
		||||
p.DigestInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_SHA_1, nil)})
 | 
			
		||||
hash, err := p.Digest(session, []byte("this is a string"))
 | 
			
		||||
if err != nil {
 | 
			
		||||
    panic(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for _, d := range hash {
 | 
			
		||||
        fmt.Printf("%x", d)
 | 
			
		||||
}
 | 
			
		||||
fmt.Println()
 | 
			
		||||
~~~
 | 
			
		||||
 | 
			
		||||
Further examples are included in the tests.
 | 
			
		||||
 | 
			
		||||
To expose PKCS#11 keys using the [crypto.Signer interface](https://golang.org/pkg/crypto/#Signer),
 | 
			
		||||
please see [github.com/thalesignite/crypto11](https://github.com/thalesignite/crypto11).
 | 
			
		||||
							
								
								
									
										98
									
								
								vendor/github.com/miekg/pkcs11/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										98
									
								
								vendor/github.com/miekg/pkcs11/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,98 +0,0 @@
 | 
			
		||||
// Copyright 2013 Miek Gieben. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
// awk '/#define CKR_/{ print $3":\""$2"\"," }' pkcs11t.h
 | 
			
		||||
 | 
			
		||||
var strerror = map[uint]string{
 | 
			
		||||
	0x00000000: "CKR_OK",
 | 
			
		||||
	0x00000001: "CKR_CANCEL",
 | 
			
		||||
	0x00000002: "CKR_HOST_MEMORY",
 | 
			
		||||
	0x00000003: "CKR_SLOT_ID_INVALID",
 | 
			
		||||
	0x00000005: "CKR_GENERAL_ERROR",
 | 
			
		||||
	0x00000006: "CKR_FUNCTION_FAILED",
 | 
			
		||||
	0x00000007: "CKR_ARGUMENTS_BAD",
 | 
			
		||||
	0x00000008: "CKR_NO_EVENT",
 | 
			
		||||
	0x00000009: "CKR_NEED_TO_CREATE_THREADS",
 | 
			
		||||
	0x0000000A: "CKR_CANT_LOCK",
 | 
			
		||||
	0x00000010: "CKR_ATTRIBUTE_READ_ONLY",
 | 
			
		||||
	0x00000011: "CKR_ATTRIBUTE_SENSITIVE",
 | 
			
		||||
	0x00000012: "CKR_ATTRIBUTE_TYPE_INVALID",
 | 
			
		||||
	0x00000013: "CKR_ATTRIBUTE_VALUE_INVALID",
 | 
			
		||||
	0x00000020: "CKR_DATA_INVALID",
 | 
			
		||||
	0x00000021: "CKR_DATA_LEN_RANGE",
 | 
			
		||||
	0x00000030: "CKR_DEVICE_ERROR",
 | 
			
		||||
	0x00000031: "CKR_DEVICE_MEMORY",
 | 
			
		||||
	0x00000032: "CKR_DEVICE_REMOVED",
 | 
			
		||||
	0x00000040: "CKR_ENCRYPTED_DATA_INVALID",
 | 
			
		||||
	0x00000041: "CKR_ENCRYPTED_DATA_LEN_RANGE",
 | 
			
		||||
	0x00000050: "CKR_FUNCTION_CANCELED",
 | 
			
		||||
	0x00000051: "CKR_FUNCTION_NOT_PARALLEL",
 | 
			
		||||
	0x00000054: "CKR_FUNCTION_NOT_SUPPORTED",
 | 
			
		||||
	0x00000060: "CKR_KEY_HANDLE_INVALID",
 | 
			
		||||
	0x00000062: "CKR_KEY_SIZE_RANGE",
 | 
			
		||||
	0x00000063: "CKR_KEY_TYPE_INCONSISTENT",
 | 
			
		||||
	0x00000064: "CKR_KEY_NOT_NEEDED",
 | 
			
		||||
	0x00000065: "CKR_KEY_CHANGED",
 | 
			
		||||
	0x00000066: "CKR_KEY_NEEDED",
 | 
			
		||||
	0x00000067: "CKR_KEY_INDIGESTIBLE",
 | 
			
		||||
	0x00000068: "CKR_KEY_FUNCTION_NOT_PERMITTED",
 | 
			
		||||
	0x00000069: "CKR_KEY_NOT_WRAPPABLE",
 | 
			
		||||
	0x0000006A: "CKR_KEY_UNEXTRACTABLE",
 | 
			
		||||
	0x00000070: "CKR_MECHANISM_INVALID",
 | 
			
		||||
	0x00000071: "CKR_MECHANISM_PARAM_INVALID",
 | 
			
		||||
	0x00000082: "CKR_OBJECT_HANDLE_INVALID",
 | 
			
		||||
	0x00000090: "CKR_OPERATION_ACTIVE",
 | 
			
		||||
	0x00000091: "CKR_OPERATION_NOT_INITIALIZED",
 | 
			
		||||
	0x000000A0: "CKR_PIN_INCORRECT",
 | 
			
		||||
	0x000000A1: "CKR_PIN_INVALID",
 | 
			
		||||
	0x000000A2: "CKR_PIN_LEN_RANGE",
 | 
			
		||||
	0x000000A3: "CKR_PIN_EXPIRED",
 | 
			
		||||
	0x000000A4: "CKR_PIN_LOCKED",
 | 
			
		||||
	0x000000B0: "CKR_SESSION_CLOSED",
 | 
			
		||||
	0x000000B1: "CKR_SESSION_COUNT",
 | 
			
		||||
	0x000000B3: "CKR_SESSION_HANDLE_INVALID",
 | 
			
		||||
	0x000000B4: "CKR_SESSION_PARALLEL_NOT_SUPPORTED",
 | 
			
		||||
	0x000000B5: "CKR_SESSION_READ_ONLY",
 | 
			
		||||
	0x000000B6: "CKR_SESSION_EXISTS",
 | 
			
		||||
	0x000000B7: "CKR_SESSION_READ_ONLY_EXISTS",
 | 
			
		||||
	0x000000B8: "CKR_SESSION_READ_WRITE_SO_EXISTS",
 | 
			
		||||
	0x000000C0: "CKR_SIGNATURE_INVALID",
 | 
			
		||||
	0x000000C1: "CKR_SIGNATURE_LEN_RANGE",
 | 
			
		||||
	0x000000D0: "CKR_TEMPLATE_INCOMPLETE",
 | 
			
		||||
	0x000000D1: "CKR_TEMPLATE_INCONSISTENT",
 | 
			
		||||
	0x000000E0: "CKR_TOKEN_NOT_PRESENT",
 | 
			
		||||
	0x000000E1: "CKR_TOKEN_NOT_RECOGNIZED",
 | 
			
		||||
	0x000000E2: "CKR_TOKEN_WRITE_PROTECTED",
 | 
			
		||||
	0x000000F0: "CKR_UNWRAPPING_KEY_HANDLE_INVALID",
 | 
			
		||||
	0x000000F1: "CKR_UNWRAPPING_KEY_SIZE_RANGE",
 | 
			
		||||
	0x000000F2: "CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT",
 | 
			
		||||
	0x00000100: "CKR_USER_ALREADY_LOGGED_IN",
 | 
			
		||||
	0x00000101: "CKR_USER_NOT_LOGGED_IN",
 | 
			
		||||
	0x00000102: "CKR_USER_PIN_NOT_INITIALIZED",
 | 
			
		||||
	0x00000103: "CKR_USER_TYPE_INVALID",
 | 
			
		||||
	0x00000104: "CKR_USER_ANOTHER_ALREADY_LOGGED_IN",
 | 
			
		||||
	0x00000105: "CKR_USER_TOO_MANY_TYPES",
 | 
			
		||||
	0x00000110: "CKR_WRAPPED_KEY_INVALID",
 | 
			
		||||
	0x00000112: "CKR_WRAPPED_KEY_LEN_RANGE",
 | 
			
		||||
	0x00000113: "CKR_WRAPPING_KEY_HANDLE_INVALID",
 | 
			
		||||
	0x00000114: "CKR_WRAPPING_KEY_SIZE_RANGE",
 | 
			
		||||
	0x00000115: "CKR_WRAPPING_KEY_TYPE_INCONSISTENT",
 | 
			
		||||
	0x00000120: "CKR_RANDOM_SEED_NOT_SUPPORTED",
 | 
			
		||||
	0x00000121: "CKR_RANDOM_NO_RNG",
 | 
			
		||||
	0x00000130: "CKR_DOMAIN_PARAMS_INVALID",
 | 
			
		||||
	0x00000150: "CKR_BUFFER_TOO_SMALL",
 | 
			
		||||
	0x00000160: "CKR_SAVED_STATE_INVALID",
 | 
			
		||||
	0x00000170: "CKR_INFORMATION_SENSITIVE",
 | 
			
		||||
	0x00000180: "CKR_STATE_UNSAVEABLE",
 | 
			
		||||
	0x00000190: "CKR_CRYPTOKI_NOT_INITIALIZED",
 | 
			
		||||
	0x00000191: "CKR_CRYPTOKI_ALREADY_INITIALIZED",
 | 
			
		||||
	0x000001A0: "CKR_MUTEX_BAD",
 | 
			
		||||
	0x000001A1: "CKR_MUTEX_NOT_LOCKED",
 | 
			
		||||
	0x000001B0: "CKR_NEW_PIN_MODE",
 | 
			
		||||
	0x000001B1: "CKR_NEXT_OTP",
 | 
			
		||||
	0x00000200: "CKR_FUNCTION_REJECTED",
 | 
			
		||||
	0x80000000: "CKR_VENDOR_DEFINED",
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								vendor/github.com/miekg/pkcs11/hsm.db
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								vendor/github.com/miekg/pkcs11/hsm.db
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										190
									
								
								vendor/github.com/miekg/pkcs11/params.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										190
									
								
								vendor/github.com/miekg/pkcs11/params.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,190 +0,0 @@
 | 
			
		||||
// Copyright 2013 Miek Gieben. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "pkcs11go.h"
 | 
			
		||||
 | 
			
		||||
static inline void putOAEPParams(CK_RSA_PKCS_OAEP_PARAMS_PTR params, CK_VOID_PTR pSourceData, CK_ULONG ulSourceDataLen)
 | 
			
		||||
{
 | 
			
		||||
	params->pSourceData = pSourceData;
 | 
			
		||||
	params->ulSourceDataLen = ulSourceDataLen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void putECDH1SharedParams(CK_ECDH1_DERIVE_PARAMS_PTR params, CK_VOID_PTR pSharedData, CK_ULONG ulSharedDataLen)
 | 
			
		||||
{
 | 
			
		||||
	params->pSharedData = pSharedData;
 | 
			
		||||
	params->ulSharedDataLen = ulSharedDataLen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void putECDH1PublicParams(CK_ECDH1_DERIVE_PARAMS_PTR params, CK_VOID_PTR pPublicData, CK_ULONG ulPublicDataLen)
 | 
			
		||||
{
 | 
			
		||||
	params->pPublicData = pPublicData;
 | 
			
		||||
	params->ulPublicDataLen = ulPublicDataLen;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
import "unsafe"
 | 
			
		||||
 | 
			
		||||
// GCMParams represents the parameters for the AES-GCM mechanism.
 | 
			
		||||
type GCMParams struct {
 | 
			
		||||
	arena
 | 
			
		||||
	params  *C.CK_GCM_PARAMS
 | 
			
		||||
	iv      []byte
 | 
			
		||||
	aad     []byte
 | 
			
		||||
	tagSize int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewGCMParams returns a pointer to AES-GCM parameters that can be used with the CKM_AES_GCM mechanism.
 | 
			
		||||
// The Free() method must be called after the operation is complete.
 | 
			
		||||
//
 | 
			
		||||
// Note that some HSMs, like CloudHSM, will ignore the IV you pass in and write their
 | 
			
		||||
// own. As a result, to support all libraries, memory is not freed
 | 
			
		||||
// automatically, so that after the EncryptInit/Encrypt operation the HSM's IV
 | 
			
		||||
// can be read back out. It is up to the caller to ensure that Free() is called
 | 
			
		||||
// on the GCMParams object at an appropriate time, which is after
 | 
			
		||||
//
 | 
			
		||||
// Encrypt/Decrypt. As an example:
 | 
			
		||||
//
 | 
			
		||||
//    gcmParams := pkcs11.NewGCMParams(make([]byte, 12), nil, 128)
 | 
			
		||||
//    p.ctx.EncryptInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_AES_GCM, gcmParams)},
 | 
			
		||||
//			aesObjHandle)
 | 
			
		||||
//    ct, _ := p.ctx.Encrypt(session, pt)
 | 
			
		||||
//    iv := gcmParams.IV()
 | 
			
		||||
//    gcmParams.Free()
 | 
			
		||||
//
 | 
			
		||||
func NewGCMParams(iv, aad []byte, tagSize int) *GCMParams {
 | 
			
		||||
	return &GCMParams{
 | 
			
		||||
		iv:      iv,
 | 
			
		||||
		aad:     aad,
 | 
			
		||||
		tagSize: tagSize,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cGCMParams(p *GCMParams) []byte {
 | 
			
		||||
	params := C.CK_GCM_PARAMS{
 | 
			
		||||
		ulTagBits: C.CK_ULONG(p.tagSize),
 | 
			
		||||
	}
 | 
			
		||||
	var arena arena
 | 
			
		||||
	if len(p.iv) > 0 {
 | 
			
		||||
		iv, ivLen := arena.Allocate(p.iv)
 | 
			
		||||
		params.pIv = C.CK_BYTE_PTR(iv)
 | 
			
		||||
		params.ulIvLen = ivLen
 | 
			
		||||
		params.ulIvBits = ivLen * 8
 | 
			
		||||
	}
 | 
			
		||||
	if len(p.aad) > 0 {
 | 
			
		||||
		aad, aadLen := arena.Allocate(p.aad)
 | 
			
		||||
		params.pAAD = C.CK_BYTE_PTR(aad)
 | 
			
		||||
		params.ulAADLen = aadLen
 | 
			
		||||
	}
 | 
			
		||||
	p.Free()
 | 
			
		||||
	p.arena = arena
 | 
			
		||||
	p.params = ¶ms
 | 
			
		||||
	return C.GoBytes(unsafe.Pointer(¶ms), C.int(unsafe.Sizeof(params)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IV returns a copy of the actual IV used for the operation.
 | 
			
		||||
//
 | 
			
		||||
// Some HSMs may ignore the user-specified IV and write their own at the end of
 | 
			
		||||
// the encryption operation; this method allows you to retrieve it.
 | 
			
		||||
func (p *GCMParams) IV() []byte {
 | 
			
		||||
	if p == nil || p.params == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	newIv := C.GoBytes(unsafe.Pointer(p.params.pIv), C.int(p.params.ulIvLen))
 | 
			
		||||
	iv := make([]byte, len(newIv))
 | 
			
		||||
	copy(iv, newIv)
 | 
			
		||||
	return iv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Free deallocates the memory reserved for the HSM to write back the actual IV.
 | 
			
		||||
//
 | 
			
		||||
// This must be called after the entire operation is complete, i.e. after
 | 
			
		||||
// Encrypt or EncryptFinal. It is safe to call Free multiple times.
 | 
			
		||||
func (p *GCMParams) Free() {
 | 
			
		||||
	if p == nil || p.arena == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.arena.Free()
 | 
			
		||||
	p.params = nil
 | 
			
		||||
	p.arena = nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewPSSParams creates a CK_RSA_PKCS_PSS_PARAMS structure and returns it as a byte array for use with the CKM_RSA_PKCS_PSS mechanism.
 | 
			
		||||
func NewPSSParams(hashAlg, mgf, saltLength uint) []byte {
 | 
			
		||||
	p := C.CK_RSA_PKCS_PSS_PARAMS{
 | 
			
		||||
		hashAlg: C.CK_MECHANISM_TYPE(hashAlg),
 | 
			
		||||
		mgf:     C.CK_RSA_PKCS_MGF_TYPE(mgf),
 | 
			
		||||
		sLen:    C.CK_ULONG(saltLength),
 | 
			
		||||
	}
 | 
			
		||||
	return C.GoBytes(unsafe.Pointer(&p), C.int(unsafe.Sizeof(p)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OAEPParams can be passed to NewMechanism to implement CKM_RSA_PKCS_OAEP.
 | 
			
		||||
type OAEPParams struct {
 | 
			
		||||
	HashAlg    uint
 | 
			
		||||
	MGF        uint
 | 
			
		||||
	SourceType uint
 | 
			
		||||
	SourceData []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewOAEPParams creates a CK_RSA_PKCS_OAEP_PARAMS structure suitable for use with the CKM_RSA_PKCS_OAEP mechanism.
 | 
			
		||||
func NewOAEPParams(hashAlg, mgf, sourceType uint, sourceData []byte) *OAEPParams {
 | 
			
		||||
	return &OAEPParams{
 | 
			
		||||
		HashAlg:    hashAlg,
 | 
			
		||||
		MGF:        mgf,
 | 
			
		||||
		SourceType: sourceType,
 | 
			
		||||
		SourceData: sourceData,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cOAEPParams(p *OAEPParams, arena arena) ([]byte, arena) {
 | 
			
		||||
	params := C.CK_RSA_PKCS_OAEP_PARAMS{
 | 
			
		||||
		hashAlg: C.CK_MECHANISM_TYPE(p.HashAlg),
 | 
			
		||||
		mgf:     C.CK_RSA_PKCS_MGF_TYPE(p.MGF),
 | 
			
		||||
		source:  C.CK_RSA_PKCS_OAEP_SOURCE_TYPE(p.SourceType),
 | 
			
		||||
	}
 | 
			
		||||
	if len(p.SourceData) != 0 {
 | 
			
		||||
		buf, len := arena.Allocate(p.SourceData)
 | 
			
		||||
		// field is unaligned on windows so this has to call into C
 | 
			
		||||
		C.putOAEPParams(¶ms, buf, len)
 | 
			
		||||
	}
 | 
			
		||||
	return C.GoBytes(unsafe.Pointer(¶ms), C.int(unsafe.Sizeof(params))), arena
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ECDH1DeriveParams can be passed to NewMechanism to implement CK_ECDH1_DERIVE_PARAMS.
 | 
			
		||||
type ECDH1DeriveParams struct {
 | 
			
		||||
	KDF           uint
 | 
			
		||||
	SharedData    []byte
 | 
			
		||||
	PublicKeyData []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewECDH1DeriveParams creates a CK_ECDH1_DERIVE_PARAMS structure suitable for use with the CKM_ECDH1_DERIVE mechanism.
 | 
			
		||||
func NewECDH1DeriveParams(kdf uint, sharedData []byte, publicKeyData []byte) *ECDH1DeriveParams {
 | 
			
		||||
	return &ECDH1DeriveParams{
 | 
			
		||||
		KDF:           kdf,
 | 
			
		||||
		SharedData:    sharedData,
 | 
			
		||||
		PublicKeyData: publicKeyData,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cECDH1DeriveParams(p *ECDH1DeriveParams, arena arena) ([]byte, arena) {
 | 
			
		||||
	params := C.CK_ECDH1_DERIVE_PARAMS{
 | 
			
		||||
		kdf: C.CK_EC_KDF_TYPE(p.KDF),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// SharedData MUST be null if key derivation function (KDF) is CKD_NULL
 | 
			
		||||
	if len(p.SharedData) != 0 {
 | 
			
		||||
		sharedData, sharedDataLen := arena.Allocate(p.SharedData)
 | 
			
		||||
		C.putECDH1SharedParams(¶ms, sharedData, sharedDataLen)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	publicKeyData, publicKeyDataLen := arena.Allocate(p.PublicKeyData)
 | 
			
		||||
	C.putECDH1PublicParams(¶ms, publicKeyData, publicKeyDataLen)
 | 
			
		||||
 | 
			
		||||
	return C.GoBytes(unsafe.Pointer(¶ms), C.int(unsafe.Sizeof(params))), arena
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1609
									
								
								vendor/github.com/miekg/pkcs11/pkcs11.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1609
									
								
								vendor/github.com/miekg/pkcs11/pkcs11.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										265
									
								
								vendor/github.com/miekg/pkcs11/pkcs11.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										265
									
								
								vendor/github.com/miekg/pkcs11/pkcs11.h
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,265 +0,0 @@
 | 
			
		||||
/* Copyright (c) OASIS Open 2016. All Rights Reserved./
 | 
			
		||||
 * /Distributed under the terms of the OASIS IPR Policy,
 | 
			
		||||
 * [http://www.oasis-open.org/policies-guidelines/ipr], AS-IS, WITHOUT ANY
 | 
			
		||||
 * IMPLIED OR EXPRESS WARRANTY; there is no warranty of MERCHANTABILITY, FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE or NONINFRINGEMENT of the rights of others.
 | 
			
		||||
 */
 | 
			
		||||
        
 | 
			
		||||
/* Latest version of the specification:
 | 
			
		||||
 * http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.html
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _PKCS11_H_
 | 
			
		||||
#define _PKCS11_H_ 1
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Before including this file (pkcs11.h) (or pkcs11t.h by
 | 
			
		||||
 * itself), 5 platform-specific macros must be defined.  These
 | 
			
		||||
 * macros are described below, and typical definitions for them
 | 
			
		||||
 * are also given.  Be advised that these definitions can depend
 | 
			
		||||
 * on both the platform and the compiler used (and possibly also
 | 
			
		||||
 * on whether a Cryptoki library is linked statically or
 | 
			
		||||
 * dynamically).
 | 
			
		||||
 *
 | 
			
		||||
 * In addition to defining these 5 macros, the packing convention
 | 
			
		||||
 * for Cryptoki structures should be set.  The Cryptoki
 | 
			
		||||
 * convention on packing is that structures should be 1-byte
 | 
			
		||||
 * aligned.
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using Microsoft Developer Studio 5.0 to produce
 | 
			
		||||
 * Win32 stuff, this might be done by using the following
 | 
			
		||||
 * preprocessor directive before including pkcs11.h or pkcs11t.h:
 | 
			
		||||
 *
 | 
			
		||||
 * #pragma pack(push, cryptoki, 1)
 | 
			
		||||
 *
 | 
			
		||||
 * and using the following preprocessor directive after including
 | 
			
		||||
 * pkcs11.h or pkcs11t.h:
 | 
			
		||||
 *
 | 
			
		||||
 * #pragma pack(pop, cryptoki)
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using an earlier version of Microsoft Developer
 | 
			
		||||
 * Studio to produce Win16 stuff, this might be done by using
 | 
			
		||||
 * the following preprocessor directive before including
 | 
			
		||||
 * pkcs11.h or pkcs11t.h:
 | 
			
		||||
 *
 | 
			
		||||
 * #pragma pack(1)
 | 
			
		||||
 *
 | 
			
		||||
 * In a UNIX environment, you're on your own for this.  You might
 | 
			
		||||
 * not need to do (or be able to do!) anything.
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Now for the macros:
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * 1. CK_PTR: The indirection string for making a pointer to an
 | 
			
		||||
 * object.  It can be used like this:
 | 
			
		||||
 *
 | 
			
		||||
 * typedef CK_BYTE CK_PTR CK_BYTE_PTR;
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using Microsoft Developer Studio 5.0 to produce
 | 
			
		||||
 * Win32 stuff, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_PTR *
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using an earlier version of Microsoft Developer
 | 
			
		||||
 * Studio to produce Win16 stuff, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_PTR far *
 | 
			
		||||
 *
 | 
			
		||||
 * In a typical UNIX environment, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_PTR *
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * 2. CK_DECLARE_FUNCTION(returnType, name): A macro which makes
 | 
			
		||||
 * an importable Cryptoki library function declaration out of a
 | 
			
		||||
 * return type and a function name.  It should be used in the
 | 
			
		||||
 * following fashion:
 | 
			
		||||
 *
 | 
			
		||||
 * extern CK_DECLARE_FUNCTION(CK_RV, C_Initialize)(
 | 
			
		||||
 *   CK_VOID_PTR pReserved
 | 
			
		||||
 * );
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using Microsoft Developer Studio 5.0 to declare a
 | 
			
		||||
 * function in a Win32 Cryptoki .dll, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_DECLARE_FUNCTION(returnType, name) \
 | 
			
		||||
 *   returnType __declspec(dllimport) name
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using an earlier version of Microsoft Developer
 | 
			
		||||
 * Studio to declare a function in a Win16 Cryptoki .dll, it
 | 
			
		||||
 * might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_DECLARE_FUNCTION(returnType, name) \
 | 
			
		||||
 *   returnType __export _far _pascal name
 | 
			
		||||
 *
 | 
			
		||||
 * In a UNIX environment, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_DECLARE_FUNCTION(returnType, name) \
 | 
			
		||||
 *   returnType name
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * 3. CK_DECLARE_FUNCTION_POINTER(returnType, name): A macro
 | 
			
		||||
 * which makes a Cryptoki API function pointer declaration or
 | 
			
		||||
 * function pointer type declaration out of a return type and a
 | 
			
		||||
 * function name.  It should be used in the following fashion:
 | 
			
		||||
 *
 | 
			
		||||
 * // Define funcPtr to be a pointer to a Cryptoki API function
 | 
			
		||||
 * // taking arguments args and returning CK_RV.
 | 
			
		||||
 * CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtr)(args);
 | 
			
		||||
 *
 | 
			
		||||
 * or
 | 
			
		||||
 *
 | 
			
		||||
 * // Define funcPtrType to be the type of a pointer to a
 | 
			
		||||
 * // Cryptoki API function taking arguments args and returning
 | 
			
		||||
 * // CK_RV, and then define funcPtr to be a variable of type
 | 
			
		||||
 * // funcPtrType.
 | 
			
		||||
 * typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtrType)(args);
 | 
			
		||||
 * funcPtrType funcPtr;
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using Microsoft Developer Studio 5.0 to access
 | 
			
		||||
 * functions in a Win32 Cryptoki .dll, in might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \
 | 
			
		||||
 *   returnType __declspec(dllimport) (* name)
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using an earlier version of Microsoft Developer
 | 
			
		||||
 * Studio to access functions in a Win16 Cryptoki .dll, it might
 | 
			
		||||
 * be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \
 | 
			
		||||
 *   returnType __export _far _pascal (* name)
 | 
			
		||||
 *
 | 
			
		||||
 * In a UNIX environment, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \
 | 
			
		||||
 *   returnType (* name)
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * 4. CK_CALLBACK_FUNCTION(returnType, name): A macro which makes
 | 
			
		||||
 * a function pointer type for an application callback out of
 | 
			
		||||
 * a return type for the callback and a name for the callback.
 | 
			
		||||
 * It should be used in the following fashion:
 | 
			
		||||
 *
 | 
			
		||||
 * CK_CALLBACK_FUNCTION(CK_RV, myCallback)(args);
 | 
			
		||||
 *
 | 
			
		||||
 * to declare a function pointer, myCallback, to a callback
 | 
			
		||||
 * which takes arguments args and returns a CK_RV.  It can also
 | 
			
		||||
 * be used like this:
 | 
			
		||||
 *
 | 
			
		||||
 * typedef CK_CALLBACK_FUNCTION(CK_RV, myCallbackType)(args);
 | 
			
		||||
 * myCallbackType myCallback;
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using Microsoft Developer Studio 5.0 to do Win32
 | 
			
		||||
 * Cryptoki development, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_CALLBACK_FUNCTION(returnType, name) \
 | 
			
		||||
 *   returnType (* name)
 | 
			
		||||
 *
 | 
			
		||||
 * If you're using an earlier version of Microsoft Developer
 | 
			
		||||
 * Studio to do Win16 development, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_CALLBACK_FUNCTION(returnType, name) \
 | 
			
		||||
 *   returnType _far _pascal (* name)
 | 
			
		||||
 *
 | 
			
		||||
 * In a UNIX environment, it might be defined by:
 | 
			
		||||
 *
 | 
			
		||||
 * #define CK_CALLBACK_FUNCTION(returnType, name) \
 | 
			
		||||
 *   returnType (* name)
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * 5. NULL_PTR: This macro is the value of a NULL pointer.
 | 
			
		||||
 *
 | 
			
		||||
 * In any ANSI/ISO C environment (and in many others as well),
 | 
			
		||||
 * this should best be defined by
 | 
			
		||||
 *
 | 
			
		||||
 * #ifndef NULL_PTR
 | 
			
		||||
 * #define NULL_PTR 0
 | 
			
		||||
 * #endif
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* All the various Cryptoki types and #define'd values are in the
 | 
			
		||||
 * file pkcs11t.h.
 | 
			
		||||
 */
 | 
			
		||||
#include "pkcs11t.h"
 | 
			
		||||
 | 
			
		||||
#define __PASTE(x,y)      x##y
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ==============================================================
 | 
			
		||||
 * Define the "extern" form of all the entry points.
 | 
			
		||||
 * ==============================================================
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define CK_NEED_ARG_LIST  1
 | 
			
		||||
#define CK_PKCS11_FUNCTION_INFO(name) \
 | 
			
		||||
  extern CK_DECLARE_FUNCTION(CK_RV, name)
 | 
			
		||||
 | 
			
		||||
/* pkcs11f.h has all the information about the Cryptoki
 | 
			
		||||
 * function prototypes.
 | 
			
		||||
 */
 | 
			
		||||
#include "pkcs11f.h"
 | 
			
		||||
 | 
			
		||||
#undef CK_NEED_ARG_LIST
 | 
			
		||||
#undef CK_PKCS11_FUNCTION_INFO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ==============================================================
 | 
			
		||||
 * Define the typedef form of all the entry points.  That is, for
 | 
			
		||||
 * each Cryptoki function C_XXX, define a type CK_C_XXX which is
 | 
			
		||||
 * a pointer to that kind of function.
 | 
			
		||||
 * ==============================================================
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define CK_NEED_ARG_LIST  1
 | 
			
		||||
#define CK_PKCS11_FUNCTION_INFO(name) \
 | 
			
		||||
  typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, __PASTE(CK_,name))
 | 
			
		||||
 | 
			
		||||
/* pkcs11f.h has all the information about the Cryptoki
 | 
			
		||||
 * function prototypes.
 | 
			
		||||
 */
 | 
			
		||||
#include "pkcs11f.h"
 | 
			
		||||
 | 
			
		||||
#undef CK_NEED_ARG_LIST
 | 
			
		||||
#undef CK_PKCS11_FUNCTION_INFO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* ==============================================================
 | 
			
		||||
 * Define structed vector of entry points.  A CK_FUNCTION_LIST
 | 
			
		||||
 * contains a CK_VERSION indicating a library's Cryptoki version
 | 
			
		||||
 * and then a whole slew of function pointers to the routines in
 | 
			
		||||
 * the library.  This type was declared, but not defined, in
 | 
			
		||||
 * pkcs11t.h.
 | 
			
		||||
 * ==============================================================
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define CK_PKCS11_FUNCTION_INFO(name) \
 | 
			
		||||
  __PASTE(CK_,name) name;
 | 
			
		||||
 | 
			
		||||
struct CK_FUNCTION_LIST {
 | 
			
		||||
 | 
			
		||||
  CK_VERSION    version;  /* Cryptoki version */
 | 
			
		||||
 | 
			
		||||
/* Pile all the function pointers into the CK_FUNCTION_LIST. */
 | 
			
		||||
/* pkcs11f.h has all the information about the Cryptoki
 | 
			
		||||
 * function prototypes.
 | 
			
		||||
 */
 | 
			
		||||
#include "pkcs11f.h"
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#undef CK_PKCS11_FUNCTION_INFO
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#undef __PASTE
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* _PKCS11_H_ */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										939
									
								
								vendor/github.com/miekg/pkcs11/pkcs11f.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										939
									
								
								vendor/github.com/miekg/pkcs11/pkcs11f.h
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,939 +0,0 @@
 | 
			
		||||
/* Copyright (c) OASIS Open 2016. All Rights Reserved./
 | 
			
		||||
 * /Distributed under the terms of the OASIS IPR Policy,
 | 
			
		||||
 * [http://www.oasis-open.org/policies-guidelines/ipr], AS-IS, WITHOUT ANY
 | 
			
		||||
 * IMPLIED OR EXPRESS WARRANTY; there is no warranty of MERCHANTABILITY, FITNESS FOR A
 | 
			
		||||
 * PARTICULAR PURPOSE or NONINFRINGEMENT of the rights of others.
 | 
			
		||||
 */
 | 
			
		||||
        
 | 
			
		||||
/* Latest version of the specification:
 | 
			
		||||
 * http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.html
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This header file contains pretty much everything about all the
 | 
			
		||||
 * Cryptoki function prototypes.  Because this information is
 | 
			
		||||
 * used for more than just declaring function prototypes, the
 | 
			
		||||
 * order of the functions appearing herein is important, and
 | 
			
		||||
 * should not be altered.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* General-purpose */
 | 
			
		||||
 | 
			
		||||
/* C_Initialize initializes the Cryptoki library. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Initialize)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_VOID_PTR   pInitArgs  /* if this is not NULL_PTR, it gets
 | 
			
		||||
                            * cast to CK_C_INITIALIZE_ARGS_PTR
 | 
			
		||||
                            * and dereferenced
 | 
			
		||||
                            */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Finalize indicates that an application is done with the
 | 
			
		||||
 * Cryptoki library.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Finalize)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_VOID_PTR   pReserved  /* reserved.  Should be NULL_PTR */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetInfo returns general information about Cryptoki. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetInfo)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_INFO_PTR   pInfo  /* location that receives information */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetFunctionList returns the function list. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetFunctionList)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_FUNCTION_LIST_PTR_PTR ppFunctionList  /* receives pointer to
 | 
			
		||||
                                            * function list
 | 
			
		||||
                                            */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Slot and token management */
 | 
			
		||||
 | 
			
		||||
/* C_GetSlotList obtains a list of slots in the system. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetSlotList)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_BBOOL       tokenPresent,  /* only slots with tokens */
 | 
			
		||||
  CK_SLOT_ID_PTR pSlotList,     /* receives array of slot IDs */
 | 
			
		||||
  CK_ULONG_PTR   pulCount       /* receives number of slots */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetSlotInfo obtains information about a particular slot in
 | 
			
		||||
 * the system.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetSlotInfo)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID       slotID,  /* the ID of the slot */
 | 
			
		||||
  CK_SLOT_INFO_PTR pInfo    /* receives the slot information */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetTokenInfo obtains information about a particular token
 | 
			
		||||
 * in the system.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetTokenInfo)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID        slotID,  /* ID of the token's slot */
 | 
			
		||||
  CK_TOKEN_INFO_PTR pInfo    /* receives the token information */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetMechanismList obtains a list of mechanism types
 | 
			
		||||
 * supported by a token.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetMechanismList)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID            slotID,          /* ID of token's slot */
 | 
			
		||||
  CK_MECHANISM_TYPE_PTR pMechanismList,  /* gets mech. array */
 | 
			
		||||
  CK_ULONG_PTR          pulCount         /* gets # of mechs. */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetMechanismInfo obtains information about a particular
 | 
			
		||||
 * mechanism possibly supported by a token.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetMechanismInfo)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID            slotID,  /* ID of the token's slot */
 | 
			
		||||
  CK_MECHANISM_TYPE     type,    /* type of mechanism */
 | 
			
		||||
  CK_MECHANISM_INFO_PTR pInfo    /* receives mechanism info */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_InitToken initializes a token. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_InitToken)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID      slotID,    /* ID of the token's slot */
 | 
			
		||||
  CK_UTF8CHAR_PTR pPin,      /* the SO's initial PIN */
 | 
			
		||||
  CK_ULONG        ulPinLen,  /* length in bytes of the PIN */
 | 
			
		||||
  CK_UTF8CHAR_PTR pLabel     /* 32-byte token label (blank padded) */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_InitPIN initializes the normal user's PIN. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_InitPIN)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_UTF8CHAR_PTR   pPin,      /* the normal user's PIN */
 | 
			
		||||
  CK_ULONG          ulPinLen   /* length in bytes of the PIN */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SetPIN modifies the PIN of the user who is logged in. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SetPIN)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_UTF8CHAR_PTR   pOldPin,   /* the old PIN */
 | 
			
		||||
  CK_ULONG          ulOldLen,  /* length of the old PIN */
 | 
			
		||||
  CK_UTF8CHAR_PTR   pNewPin,   /* the new PIN */
 | 
			
		||||
  CK_ULONG          ulNewLen   /* length of the new PIN */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Session management */
 | 
			
		||||
 | 
			
		||||
/* C_OpenSession opens a session between an application and a
 | 
			
		||||
 * token.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_OpenSession)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID            slotID,        /* the slot's ID */
 | 
			
		||||
  CK_FLAGS              flags,         /* from CK_SESSION_INFO */
 | 
			
		||||
  CK_VOID_PTR           pApplication,  /* passed to callback */
 | 
			
		||||
  CK_NOTIFY             Notify,        /* callback function */
 | 
			
		||||
  CK_SESSION_HANDLE_PTR phSession      /* gets session handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_CloseSession closes a session between an application and a
 | 
			
		||||
 * token.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_CloseSession)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession  /* the session's handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_CloseAllSessions closes all sessions with a token. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_CloseAllSessions)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SLOT_ID     slotID  /* the token's slot */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetSessionInfo obtains information about the session. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetSessionInfo)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE   hSession,  /* the session's handle */
 | 
			
		||||
  CK_SESSION_INFO_PTR pInfo      /* receives session info */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetOperationState obtains the state of the cryptographic operation
 | 
			
		||||
 * in a session.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetOperationState)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,             /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pOperationState,      /* gets state */
 | 
			
		||||
  CK_ULONG_PTR      pulOperationStateLen  /* gets state length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SetOperationState restores the state of the cryptographic
 | 
			
		||||
 * operation in a session.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SetOperationState)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR      pOperationState,      /* holds state */
 | 
			
		||||
  CK_ULONG         ulOperationStateLen,  /* holds state length */
 | 
			
		||||
  CK_OBJECT_HANDLE hEncryptionKey,       /* en/decryption key */
 | 
			
		||||
  CK_OBJECT_HANDLE hAuthenticationKey    /* sign/verify key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Login logs a user into a token. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Login)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_USER_TYPE      userType,  /* the user type */
 | 
			
		||||
  CK_UTF8CHAR_PTR   pPin,      /* the user's PIN */
 | 
			
		||||
  CK_ULONG          ulPinLen   /* the length of the PIN */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Logout logs a user out from a token. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Logout)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession  /* the session's handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Object management */
 | 
			
		||||
 | 
			
		||||
/* C_CreateObject creates a new object. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_CreateObject)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_ATTRIBUTE_PTR  pTemplate,   /* the object's template */
 | 
			
		||||
  CK_ULONG          ulCount,     /* attributes in template */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phObject  /* gets new object's handle. */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_CopyObject copies an object, creating a new object for the
 | 
			
		||||
 * copy.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_CopyObject)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE    hSession,    /* the session's handle */
 | 
			
		||||
  CK_OBJECT_HANDLE     hObject,     /* the object's handle */
 | 
			
		||||
  CK_ATTRIBUTE_PTR     pTemplate,   /* template for new object */
 | 
			
		||||
  CK_ULONG             ulCount,     /* attributes in template */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phNewObject  /* receives handle of copy */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DestroyObject destroys an object. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DestroyObject)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_OBJECT_HANDLE  hObject    /* the object's handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetObjectSize gets the size of an object in bytes. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetObjectSize)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_OBJECT_HANDLE  hObject,   /* the object's handle */
 | 
			
		||||
  CK_ULONG_PTR      pulSize    /* receives size of object */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GetAttributeValue obtains the value of one or more object
 | 
			
		||||
 * attributes.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetAttributeValue)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,   /* the session's handle */
 | 
			
		||||
  CK_OBJECT_HANDLE  hObject,    /* the object's handle */
 | 
			
		||||
  CK_ATTRIBUTE_PTR  pTemplate,  /* specifies attrs; gets vals */
 | 
			
		||||
  CK_ULONG          ulCount     /* attributes in template */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SetAttributeValue modifies the value of one or more object
 | 
			
		||||
 * attributes.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SetAttributeValue)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,   /* the session's handle */
 | 
			
		||||
  CK_OBJECT_HANDLE  hObject,    /* the object's handle */
 | 
			
		||||
  CK_ATTRIBUTE_PTR  pTemplate,  /* specifies attrs and values */
 | 
			
		||||
  CK_ULONG          ulCount     /* attributes in template */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_FindObjectsInit initializes a search for token and session
 | 
			
		||||
 * objects that match a template.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_FindObjectsInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,   /* the session's handle */
 | 
			
		||||
  CK_ATTRIBUTE_PTR  pTemplate,  /* attribute values to match */
 | 
			
		||||
  CK_ULONG          ulCount     /* attrs in search template */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_FindObjects continues a search for token and session
 | 
			
		||||
 * objects that match a template, obtaining additional object
 | 
			
		||||
 * handles.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_FindObjects)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
 CK_SESSION_HANDLE    hSession,          /* session's handle */
 | 
			
		||||
 CK_OBJECT_HANDLE_PTR phObject,          /* gets obj. handles */
 | 
			
		||||
 CK_ULONG             ulMaxObjectCount,  /* max handles to get */
 | 
			
		||||
 CK_ULONG_PTR         pulObjectCount     /* actual # returned */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_FindObjectsFinal finishes a search for token and session
 | 
			
		||||
 * objects.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_FindObjectsFinal)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession  /* the session's handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Encryption and decryption */
 | 
			
		||||
 | 
			
		||||
/* C_EncryptInit initializes an encryption operation. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_EncryptInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism,  /* the encryption mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey         /* handle of encryption key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Encrypt encrypts single-part data. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Encrypt)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pData,               /* the plaintext data */
 | 
			
		||||
  CK_ULONG          ulDataLen,           /* bytes of plaintext */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedData,      /* gets ciphertext */
 | 
			
		||||
  CK_ULONG_PTR      pulEncryptedDataLen  /* gets c-text size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_EncryptUpdate continues a multiple-part encryption
 | 
			
		||||
 * operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_EncryptUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,           /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pPart,              /* the plaintext data */
 | 
			
		||||
  CK_ULONG          ulPartLen,          /* plaintext data len */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedPart,     /* gets ciphertext */
 | 
			
		||||
  CK_ULONG_PTR      pulEncryptedPartLen /* gets c-text size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_EncryptFinal finishes a multiple-part encryption
 | 
			
		||||
 * operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_EncryptFinal)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,                /* session handle */
 | 
			
		||||
  CK_BYTE_PTR       pLastEncryptedPart,      /* last c-text */
 | 
			
		||||
  CK_ULONG_PTR      pulLastEncryptedPartLen  /* gets last size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DecryptInit initializes a decryption operation. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DecryptInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism,  /* the decryption mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey         /* handle of decryption key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Decrypt decrypts encrypted data in a single part. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Decrypt)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,           /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedData,     /* ciphertext */
 | 
			
		||||
  CK_ULONG          ulEncryptedDataLen, /* ciphertext length */
 | 
			
		||||
  CK_BYTE_PTR       pData,              /* gets plaintext */
 | 
			
		||||
  CK_ULONG_PTR      pulDataLen          /* gets p-text size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DecryptUpdate continues a multiple-part decryption
 | 
			
		||||
 * operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DecryptUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedPart,      /* encrypted data */
 | 
			
		||||
  CK_ULONG          ulEncryptedPartLen,  /* input length */
 | 
			
		||||
  CK_BYTE_PTR       pPart,               /* gets plaintext */
 | 
			
		||||
  CK_ULONG_PTR      pulPartLen           /* p-text size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DecryptFinal finishes a multiple-part decryption
 | 
			
		||||
 * operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DecryptFinal)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,       /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pLastPart,      /* gets plaintext */
 | 
			
		||||
  CK_ULONG_PTR      pulLastPartLen  /* p-text size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Message digesting */
 | 
			
		||||
 | 
			
		||||
/* C_DigestInit initializes a message-digesting operation. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DigestInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,   /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism  /* the digesting mechanism */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Digest digests data in a single part. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Digest)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,     /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pData,        /* data to be digested */
 | 
			
		||||
  CK_ULONG          ulDataLen,    /* bytes of data to digest */
 | 
			
		||||
  CK_BYTE_PTR       pDigest,      /* gets the message digest */
 | 
			
		||||
  CK_ULONG_PTR      pulDigestLen  /* gets digest length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DigestUpdate continues a multiple-part message-digesting
 | 
			
		||||
 * operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DigestUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pPart,     /* data to be digested */
 | 
			
		||||
  CK_ULONG          ulPartLen  /* bytes of data to be digested */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DigestKey continues a multi-part message-digesting
 | 
			
		||||
 * operation, by digesting the value of a secret key as part of
 | 
			
		||||
 * the data already digested.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DigestKey)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey       /* secret key to digest */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DigestFinal finishes a multiple-part message-digesting
 | 
			
		||||
 * operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DigestFinal)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,     /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pDigest,      /* gets the message digest */
 | 
			
		||||
  CK_ULONG_PTR      pulDigestLen  /* gets byte count of digest */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Signing and MACing */
 | 
			
		||||
 | 
			
		||||
/* C_SignInit initializes a signature (private key encryption)
 | 
			
		||||
 * operation, where the signature is (will be) an appendix to
 | 
			
		||||
 * the data, and plaintext cannot be recovered from the
 | 
			
		||||
 * signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SignInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism,  /* the signature mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey         /* handle of signature key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Sign signs (encrypts with private key) data in a single
 | 
			
		||||
 * part, where the signature is (will be) an appendix to the
 | 
			
		||||
 * data, and plaintext cannot be recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Sign)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,        /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pData,           /* the data to sign */
 | 
			
		||||
  CK_ULONG          ulDataLen,       /* count of bytes to sign */
 | 
			
		||||
  CK_BYTE_PTR       pSignature,      /* gets the signature */
 | 
			
		||||
  CK_ULONG_PTR      pulSignatureLen  /* gets signature length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SignUpdate continues a multiple-part signature operation,
 | 
			
		||||
 * where the signature is (will be) an appendix to the data,
 | 
			
		||||
 * and plaintext cannot be recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SignUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pPart,     /* the data to sign */
 | 
			
		||||
  CK_ULONG          ulPartLen  /* count of bytes to sign */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SignFinal finishes a multiple-part signature operation,
 | 
			
		||||
 * returning the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SignFinal)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,        /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pSignature,      /* gets the signature */
 | 
			
		||||
  CK_ULONG_PTR      pulSignatureLen  /* gets signature length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SignRecoverInit initializes a signature operation, where
 | 
			
		||||
 * the data can be recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SignRecoverInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,   /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism, /* the signature mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey        /* handle of the signature key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SignRecover signs data in a single operation, where the
 | 
			
		||||
 * data can be recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SignRecover)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,        /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pData,           /* the data to sign */
 | 
			
		||||
  CK_ULONG          ulDataLen,       /* count of bytes to sign */
 | 
			
		||||
  CK_BYTE_PTR       pSignature,      /* gets the signature */
 | 
			
		||||
  CK_ULONG_PTR      pulSignatureLen  /* gets signature length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Verifying signatures and MACs */
 | 
			
		||||
 | 
			
		||||
/* C_VerifyInit initializes a verification operation, where the
 | 
			
		||||
 * signature is an appendix to the data, and plaintext cannot
 | 
			
		||||
 * cannot be recovered from the signature (e.g. DSA).
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_VerifyInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism,  /* the verification mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey         /* verification key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_Verify verifies a signature in a single-part operation,
 | 
			
		||||
 * where the signature is an appendix to the data, and plaintext
 | 
			
		||||
 * cannot be recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_Verify)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,       /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pData,          /* signed data */
 | 
			
		||||
  CK_ULONG          ulDataLen,      /* length of signed data */
 | 
			
		||||
  CK_BYTE_PTR       pSignature,     /* signature */
 | 
			
		||||
  CK_ULONG          ulSignatureLen  /* signature length*/
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_VerifyUpdate continues a multiple-part verification
 | 
			
		||||
 * operation, where the signature is an appendix to the data,
 | 
			
		||||
 * and plaintext cannot be recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_VerifyUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pPart,     /* signed data */
 | 
			
		||||
  CK_ULONG          ulPartLen  /* length of signed data */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_VerifyFinal finishes a multiple-part verification
 | 
			
		||||
 * operation, checking the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_VerifyFinal)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,       /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pSignature,     /* signature to verify */
 | 
			
		||||
  CK_ULONG          ulSignatureLen  /* signature length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_VerifyRecoverInit initializes a signature verification
 | 
			
		||||
 * operation, where the data is recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_VerifyRecoverInit)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism,  /* the verification mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey         /* verification key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_VerifyRecover verifies a signature in a single-part
 | 
			
		||||
 * operation, where the data is recovered from the signature.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_VerifyRecover)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,        /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pSignature,      /* signature to verify */
 | 
			
		||||
  CK_ULONG          ulSignatureLen,  /* signature length */
 | 
			
		||||
  CK_BYTE_PTR       pData,           /* gets signed data */
 | 
			
		||||
  CK_ULONG_PTR      pulDataLen       /* gets signed data len */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Dual-function cryptographic operations */
 | 
			
		||||
 | 
			
		||||
/* C_DigestEncryptUpdate continues a multiple-part digesting
 | 
			
		||||
 * and encryption operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DigestEncryptUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pPart,               /* the plaintext data */
 | 
			
		||||
  CK_ULONG          ulPartLen,           /* plaintext length */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedPart,      /* gets ciphertext */
 | 
			
		||||
  CK_ULONG_PTR      pulEncryptedPartLen  /* gets c-text length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DecryptDigestUpdate continues a multiple-part decryption and
 | 
			
		||||
 * digesting operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DecryptDigestUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedPart,      /* ciphertext */
 | 
			
		||||
  CK_ULONG          ulEncryptedPartLen,  /* ciphertext length */
 | 
			
		||||
  CK_BYTE_PTR       pPart,               /* gets plaintext */
 | 
			
		||||
  CK_ULONG_PTR      pulPartLen           /* gets plaintext len */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_SignEncryptUpdate continues a multiple-part signing and
 | 
			
		||||
 * encryption operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SignEncryptUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pPart,               /* the plaintext data */
 | 
			
		||||
  CK_ULONG          ulPartLen,           /* plaintext length */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedPart,      /* gets ciphertext */
 | 
			
		||||
  CK_ULONG_PTR      pulEncryptedPartLen  /* gets c-text length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DecryptVerifyUpdate continues a multiple-part decryption and
 | 
			
		||||
 * verify operation.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DecryptVerifyUpdate)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,            /* session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pEncryptedPart,      /* ciphertext */
 | 
			
		||||
  CK_ULONG          ulEncryptedPartLen,  /* ciphertext length */
 | 
			
		||||
  CK_BYTE_PTR       pPart,               /* gets plaintext */
 | 
			
		||||
  CK_ULONG_PTR      pulPartLen           /* gets p-text length */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Key management */
 | 
			
		||||
 | 
			
		||||
/* C_GenerateKey generates a secret key, creating a new key
 | 
			
		||||
 * object.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GenerateKey)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE    hSession,    /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR     pMechanism,  /* key generation mech. */
 | 
			
		||||
  CK_ATTRIBUTE_PTR     pTemplate,   /* template for new key */
 | 
			
		||||
  CK_ULONG             ulCount,     /* # of attrs in template */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phKey        /* gets handle of new key */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GenerateKeyPair generates a public-key/private-key pair,
 | 
			
		||||
 * creating new key objects.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GenerateKeyPair)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE    hSession,                    /* session handle */
 | 
			
		||||
  CK_MECHANISM_PTR     pMechanism,                  /* key-gen mech. */
 | 
			
		||||
  CK_ATTRIBUTE_PTR     pPublicKeyTemplate,          /* template for pub. key */
 | 
			
		||||
  CK_ULONG             ulPublicKeyAttributeCount,   /* # pub. attrs. */
 | 
			
		||||
  CK_ATTRIBUTE_PTR     pPrivateKeyTemplate,         /* template for priv. key */
 | 
			
		||||
  CK_ULONG             ulPrivateKeyAttributeCount,  /* # priv.  attrs. */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phPublicKey,                 /* gets pub. key handle */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phPrivateKey                 /* gets priv. key handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_WrapKey wraps (i.e., encrypts) a key. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_WrapKey)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,        /* the session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR  pMechanism,      /* the wrapping mechanism */
 | 
			
		||||
  CK_OBJECT_HANDLE  hWrappingKey,    /* wrapping key */
 | 
			
		||||
  CK_OBJECT_HANDLE  hKey,            /* key to be wrapped */
 | 
			
		||||
  CK_BYTE_PTR       pWrappedKey,     /* gets wrapped key */
 | 
			
		||||
  CK_ULONG_PTR      pulWrappedKeyLen /* gets wrapped key size */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_UnwrapKey unwraps (decrypts) a wrapped key, creating a new
 | 
			
		||||
 * key object.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_UnwrapKey)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE    hSession,          /* session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR     pMechanism,        /* unwrapping mech. */
 | 
			
		||||
  CK_OBJECT_HANDLE     hUnwrappingKey,    /* unwrapping key */
 | 
			
		||||
  CK_BYTE_PTR          pWrappedKey,       /* the wrapped key */
 | 
			
		||||
  CK_ULONG             ulWrappedKeyLen,   /* wrapped key len */
 | 
			
		||||
  CK_ATTRIBUTE_PTR     pTemplate,         /* new key template */
 | 
			
		||||
  CK_ULONG             ulAttributeCount,  /* template length */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phKey              /* gets new handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_DeriveKey derives a key from a base key, creating a new key
 | 
			
		||||
 * object.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_DeriveKey)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE    hSession,          /* session's handle */
 | 
			
		||||
  CK_MECHANISM_PTR     pMechanism,        /* key deriv. mech. */
 | 
			
		||||
  CK_OBJECT_HANDLE     hBaseKey,          /* base key */
 | 
			
		||||
  CK_ATTRIBUTE_PTR     pTemplate,         /* new key template */
 | 
			
		||||
  CK_ULONG             ulAttributeCount,  /* template length */
 | 
			
		||||
  CK_OBJECT_HANDLE_PTR phKey              /* gets new handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Random number generation */
 | 
			
		||||
 | 
			
		||||
/* C_SeedRandom mixes additional seed material into the token's
 | 
			
		||||
 * random number generator.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_SeedRandom)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,  /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       pSeed,     /* the seed material */
 | 
			
		||||
  CK_ULONG          ulSeedLen  /* length of seed material */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_GenerateRandom generates random data. */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GenerateRandom)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession,    /* the session's handle */
 | 
			
		||||
  CK_BYTE_PTR       RandomData,  /* receives the random data */
 | 
			
		||||
  CK_ULONG          ulRandomLen  /* # of bytes to generate */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Parallel function management */
 | 
			
		||||
 | 
			
		||||
/* C_GetFunctionStatus is a legacy function; it obtains an
 | 
			
		||||
 * updated status of a function running in parallel with an
 | 
			
		||||
 * application.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_GetFunctionStatus)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession  /* the session's handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_CancelFunction is a legacy function; it cancels a function
 | 
			
		||||
 * running in parallel.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_CancelFunction)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_SESSION_HANDLE hSession  /* the session's handle */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* C_WaitForSlotEvent waits for a slot event (token insertion,
 | 
			
		||||
 * removal, etc.) to occur.
 | 
			
		||||
 */
 | 
			
		||||
CK_PKCS11_FUNCTION_INFO(C_WaitForSlotEvent)
 | 
			
		||||
#ifdef CK_NEED_ARG_LIST
 | 
			
		||||
(
 | 
			
		||||
  CK_FLAGS flags,        /* blocking/nonblocking flag */
 | 
			
		||||
  CK_SLOT_ID_PTR pSlot,  /* location that receives the slot ID */
 | 
			
		||||
  CK_VOID_PTR pRserved   /* reserved.  Should be NULL_PTR */
 | 
			
		||||
);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/github.com/miekg/pkcs11/pkcs11go.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/miekg/pkcs11/pkcs11go.h
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,33 +0,0 @@
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#define CK_PTR *
 | 
			
		||||
#ifndef NULL_PTR
 | 
			
		||||
#define NULL_PTR 0
 | 
			
		||||
#endif
 | 
			
		||||
#define CK_DEFINE_FUNCTION(returnType, name) returnType name
 | 
			
		||||
#define CK_DECLARE_FUNCTION(returnType, name) returnType name
 | 
			
		||||
#define CK_DECLARE_FUNCTION_POINTER(returnType, name) returnType (* name)
 | 
			
		||||
#define CK_CALLBACK_FUNCTION(returnType, name) returnType (* name)
 | 
			
		||||
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#ifdef PACKED_STRUCTURES
 | 
			
		||||
# pragma pack(push, 1)
 | 
			
		||||
# include "pkcs11.h"
 | 
			
		||||
# pragma pack(pop)
 | 
			
		||||
#else
 | 
			
		||||
# include "pkcs11.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Copy of CK_INFO but with default alignment (not packed). Go hides unaligned
 | 
			
		||||
// struct fields so copying to an aligned struct is necessary to read CK_INFO
 | 
			
		||||
// from Go on Windows where packing is required.
 | 
			
		||||
typedef struct ckInfo {
 | 
			
		||||
	CK_VERSION cryptokiVersion;
 | 
			
		||||
	CK_UTF8CHAR manufacturerID[32];
 | 
			
		||||
	CK_FLAGS flags;
 | 
			
		||||
	CK_UTF8CHAR libraryDescription[32];
 | 
			
		||||
	CK_VERSION libraryVersion;
 | 
			
		||||
} ckInfo, *ckInfoPtr;
 | 
			
		||||
							
								
								
									
										2047
									
								
								vendor/github.com/miekg/pkcs11/pkcs11t.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2047
									
								
								vendor/github.com/miekg/pkcs11/pkcs11t.h
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										18
									
								
								vendor/github.com/miekg/pkcs11/release.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/miekg/pkcs11/release.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,18 +0,0 @@
 | 
			
		||||
//go:build release
 | 
			
		||||
// +build release
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
import "fmt"
 | 
			
		||||
 | 
			
		||||
// Release is current version of the pkcs11 library.
 | 
			
		||||
var Release = R{1, 1, 1}
 | 
			
		||||
 | 
			
		||||
// R holds the version of this library.
 | 
			
		||||
type R struct {
 | 
			
		||||
	Major, Minor, Patch int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r R) String() string {
 | 
			
		||||
	return fmt.Sprintf("%d.%d.%d", r.Major, r.Minor, r.Patch)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/miekg/pkcs11/softhsm.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/miekg/pkcs11/softhsm.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1 +0,0 @@
 | 
			
		||||
0:hsm.db
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/miekg/pkcs11/softhsm2.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/miekg/pkcs11/softhsm2.conf
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +0,0 @@
 | 
			
		||||
log.level = INFO
 | 
			
		||||
objectstore.backend = file
 | 
			
		||||
directories.tokendir = test_data
 | 
			
		||||
slots.removable = false
 | 
			
		||||
							
								
								
									
										315
									
								
								vendor/github.com/miekg/pkcs11/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										315
									
								
								vendor/github.com/miekg/pkcs11/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,315 +0,0 @@
 | 
			
		||||
// Copyright 2013 Miek Gieben. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "pkcs11go.h"
 | 
			
		||||
 | 
			
		||||
CK_ULONG Index(CK_ULONG_PTR array, CK_ULONG i)
 | 
			
		||||
{
 | 
			
		||||
	return array[i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void putAttributePval(CK_ATTRIBUTE_PTR a, CK_VOID_PTR pValue)
 | 
			
		||||
{
 | 
			
		||||
	a->pValue = pValue;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void putMechanismParam(CK_MECHANISM_PTR m, CK_VOID_PTR pParameter)
 | 
			
		||||
{
 | 
			
		||||
	m->pParameter = pParameter;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
import "C"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type arena []unsafe.Pointer
 | 
			
		||||
 | 
			
		||||
func (a *arena) Allocate(obj []byte) (C.CK_VOID_PTR, C.CK_ULONG) {
 | 
			
		||||
	cobj := C.calloc(C.size_t(len(obj)), 1)
 | 
			
		||||
	*a = append(*a, cobj)
 | 
			
		||||
	C.memmove(cobj, unsafe.Pointer(&obj[0]), C.size_t(len(obj)))
 | 
			
		||||
	return C.CK_VOID_PTR(cobj), C.CK_ULONG(len(obj))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a arena) Free() {
 | 
			
		||||
	for _, p := range a {
 | 
			
		||||
		C.free(p)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// toList converts from a C style array to a []uint.
 | 
			
		||||
func toList(clist C.CK_ULONG_PTR, size C.CK_ULONG) []uint {
 | 
			
		||||
	l := make([]uint, int(size))
 | 
			
		||||
	for i := 0; i < len(l); i++ {
 | 
			
		||||
		l[i] = uint(C.Index(clist, C.CK_ULONG(i)))
 | 
			
		||||
	}
 | 
			
		||||
	defer C.free(unsafe.Pointer(clist))
 | 
			
		||||
	return l
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cBBool converts a bool to a CK_BBOOL.
 | 
			
		||||
func cBBool(x bool) C.CK_BBOOL {
 | 
			
		||||
	if x {
 | 
			
		||||
		return C.CK_BBOOL(C.CK_TRUE)
 | 
			
		||||
	}
 | 
			
		||||
	return C.CK_BBOOL(C.CK_FALSE)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func uintToBytes(x uint64) []byte {
 | 
			
		||||
	ul := C.CK_ULONG(x)
 | 
			
		||||
	return C.GoBytes(unsafe.Pointer(&ul), C.int(unsafe.Sizeof(ul)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Error represents an PKCS#11 error.
 | 
			
		||||
type Error uint
 | 
			
		||||
 | 
			
		||||
func (e Error) Error() string {
 | 
			
		||||
	return fmt.Sprintf("pkcs11: 0x%X: %s", uint(e), strerror[uint(e)])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func toError(e C.CK_RV) error {
 | 
			
		||||
	if e == C.CKR_OK {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return Error(e)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SessionHandle is a Cryptoki-assigned value that identifies a session.
 | 
			
		||||
type SessionHandle uint
 | 
			
		||||
 | 
			
		||||
// ObjectHandle is a token-specific identifier for an object.
 | 
			
		||||
type ObjectHandle uint
 | 
			
		||||
 | 
			
		||||
// Version represents any version information from the library.
 | 
			
		||||
type Version struct {
 | 
			
		||||
	Major byte
 | 
			
		||||
	Minor byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func toVersion(version C.CK_VERSION) Version {
 | 
			
		||||
	return Version{byte(version.major), byte(version.minor)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SlotEvent holds the SlotID which for which an slot event (token insertion,
 | 
			
		||||
// removal, etc.) occurred.
 | 
			
		||||
type SlotEvent struct {
 | 
			
		||||
	SlotID uint
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Info provides information about the library and hardware used.
 | 
			
		||||
type Info struct {
 | 
			
		||||
	CryptokiVersion    Version
 | 
			
		||||
	ManufacturerID     string
 | 
			
		||||
	Flags              uint
 | 
			
		||||
	LibraryDescription string
 | 
			
		||||
	LibraryVersion     Version
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SlotInfo provides information about a slot.
 | 
			
		||||
type SlotInfo struct {
 | 
			
		||||
	SlotDescription string // 64 bytes.
 | 
			
		||||
	ManufacturerID  string // 32 bytes.
 | 
			
		||||
	Flags           uint
 | 
			
		||||
	HardwareVersion Version
 | 
			
		||||
	FirmwareVersion Version
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TokenInfo provides information about a token.
 | 
			
		||||
type TokenInfo struct {
 | 
			
		||||
	Label              string
 | 
			
		||||
	ManufacturerID     string
 | 
			
		||||
	Model              string
 | 
			
		||||
	SerialNumber       string
 | 
			
		||||
	Flags              uint
 | 
			
		||||
	MaxSessionCount    uint
 | 
			
		||||
	SessionCount       uint
 | 
			
		||||
	MaxRwSessionCount  uint
 | 
			
		||||
	RwSessionCount     uint
 | 
			
		||||
	MaxPinLen          uint
 | 
			
		||||
	MinPinLen          uint
 | 
			
		||||
	TotalPublicMemory  uint
 | 
			
		||||
	FreePublicMemory   uint
 | 
			
		||||
	TotalPrivateMemory uint
 | 
			
		||||
	FreePrivateMemory  uint
 | 
			
		||||
	HardwareVersion    Version
 | 
			
		||||
	FirmwareVersion    Version
 | 
			
		||||
	UTCTime            string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SessionInfo provides information about a session.
 | 
			
		||||
type SessionInfo struct {
 | 
			
		||||
	SlotID      uint
 | 
			
		||||
	State       uint
 | 
			
		||||
	Flags       uint
 | 
			
		||||
	DeviceError uint
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attribute holds an attribute type/value combination.
 | 
			
		||||
type Attribute struct {
 | 
			
		||||
	Type  uint
 | 
			
		||||
	Value []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewAttribute allocates a Attribute and returns a pointer to it.
 | 
			
		||||
// Note that this is merely a convenience function, as values returned
 | 
			
		||||
// from the HSM are not converted back to Go values, those are just raw
 | 
			
		||||
// byte slices.
 | 
			
		||||
func NewAttribute(typ uint, x interface{}) *Attribute {
 | 
			
		||||
	// This function nicely transforms *to* an attribute, but there is
 | 
			
		||||
	// no corresponding function that transform back *from* an attribute,
 | 
			
		||||
	// which in PKCS#11 is just an byte array.
 | 
			
		||||
	a := new(Attribute)
 | 
			
		||||
	a.Type = typ
 | 
			
		||||
	if x == nil {
 | 
			
		||||
		return a
 | 
			
		||||
	}
 | 
			
		||||
	switch v := x.(type) {
 | 
			
		||||
	case bool:
 | 
			
		||||
		if v {
 | 
			
		||||
			a.Value = []byte{1}
 | 
			
		||||
		} else {
 | 
			
		||||
			a.Value = []byte{0}
 | 
			
		||||
		}
 | 
			
		||||
	case int:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case int16:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case int32:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case int64:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case uint:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case uint16:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case uint32:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case uint64:
 | 
			
		||||
		a.Value = uintToBytes(uint64(v))
 | 
			
		||||
	case string:
 | 
			
		||||
		a.Value = []byte(v)
 | 
			
		||||
	case []byte:
 | 
			
		||||
		a.Value = v
 | 
			
		||||
	case time.Time: // for CKA_DATE
 | 
			
		||||
		a.Value = cDate(v)
 | 
			
		||||
	default:
 | 
			
		||||
		panic("pkcs11: unhandled attribute type")
 | 
			
		||||
	}
 | 
			
		||||
	return a
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cAttribute returns the start address and the length of an attribute list.
 | 
			
		||||
func cAttributeList(a []*Attribute) (arena, C.CK_ATTRIBUTE_PTR, C.CK_ULONG) {
 | 
			
		||||
	var arena arena
 | 
			
		||||
	if len(a) == 0 {
 | 
			
		||||
		return nil, nil, 0
 | 
			
		||||
	}
 | 
			
		||||
	pa := make([]C.CK_ATTRIBUTE, len(a))
 | 
			
		||||
	for i, attr := range a {
 | 
			
		||||
		pa[i]._type = C.CK_ATTRIBUTE_TYPE(attr.Type)
 | 
			
		||||
		if len(attr.Value) != 0 {
 | 
			
		||||
			buf, len := arena.Allocate(attr.Value)
 | 
			
		||||
			// field is unaligned on windows so this has to call into C
 | 
			
		||||
			C.putAttributePval(&pa[i], buf)
 | 
			
		||||
			pa[i].ulValueLen = len
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return arena, &pa[0], C.CK_ULONG(len(a))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cDate(t time.Time) []byte {
 | 
			
		||||
	b := make([]byte, 8)
 | 
			
		||||
	year, month, day := t.Date()
 | 
			
		||||
	y := fmt.Sprintf("%4d", year)
 | 
			
		||||
	m := fmt.Sprintf("%02d", month)
 | 
			
		||||
	d1 := fmt.Sprintf("%02d", day)
 | 
			
		||||
	b[0], b[1], b[2], b[3] = y[0], y[1], y[2], y[3]
 | 
			
		||||
	b[4], b[5] = m[0], m[1]
 | 
			
		||||
	b[6], b[7] = d1[0], d1[1]
 | 
			
		||||
	return b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mechanism holds an mechanism type/value combination.
 | 
			
		||||
type Mechanism struct {
 | 
			
		||||
	Mechanism uint
 | 
			
		||||
	Parameter []byte
 | 
			
		||||
	generator interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewMechanism returns a pointer to an initialized Mechanism.
 | 
			
		||||
func NewMechanism(mech uint, x interface{}) *Mechanism {
 | 
			
		||||
	m := new(Mechanism)
 | 
			
		||||
	m.Mechanism = mech
 | 
			
		||||
	if x == nil {
 | 
			
		||||
		return m
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch p := x.(type) {
 | 
			
		||||
	case *GCMParams, *OAEPParams, *ECDH1DeriveParams:
 | 
			
		||||
		// contains pointers; defer serialization until cMechanism
 | 
			
		||||
		m.generator = p
 | 
			
		||||
	case []byte:
 | 
			
		||||
		m.Parameter = p
 | 
			
		||||
	default:
 | 
			
		||||
		panic("parameter must be one of type: []byte, *GCMParams, *OAEPParams, *ECDH1DeriveParams")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cMechanism(mechList []*Mechanism) (arena, *C.CK_MECHANISM) {
 | 
			
		||||
	if len(mechList) != 1 {
 | 
			
		||||
		panic("expected exactly one mechanism")
 | 
			
		||||
	}
 | 
			
		||||
	mech := mechList[0]
 | 
			
		||||
	cmech := &C.CK_MECHANISM{mechanism: C.CK_MECHANISM_TYPE(mech.Mechanism)}
 | 
			
		||||
	// params that contain pointers are allocated here
 | 
			
		||||
	param := mech.Parameter
 | 
			
		||||
	var arena arena
 | 
			
		||||
	switch p := mech.generator.(type) {
 | 
			
		||||
	case *GCMParams:
 | 
			
		||||
		// uses its own arena because it has to outlive this function call (yuck)
 | 
			
		||||
		param = cGCMParams(p)
 | 
			
		||||
	case *OAEPParams:
 | 
			
		||||
		param, arena = cOAEPParams(p, arena)
 | 
			
		||||
	case *ECDH1DeriveParams:
 | 
			
		||||
		param, arena = cECDH1DeriveParams(p, arena)
 | 
			
		||||
	}
 | 
			
		||||
	if len(param) != 0 {
 | 
			
		||||
		buf, len := arena.Allocate(param)
 | 
			
		||||
		// field is unaligned on windows so this has to call into C
 | 
			
		||||
		C.putMechanismParam(cmech, buf)
 | 
			
		||||
		cmech.ulParameterLen = len
 | 
			
		||||
	}
 | 
			
		||||
	return arena, cmech
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MechanismInfo provides information about a particular mechanism.
 | 
			
		||||
type MechanismInfo struct {
 | 
			
		||||
	MinKeySize uint
 | 
			
		||||
	MaxKeySize uint
 | 
			
		||||
	Flags      uint
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// stubData is a persistent nonempty byte array used by cMessage.
 | 
			
		||||
var stubData = []byte{0}
 | 
			
		||||
 | 
			
		||||
// cMessage returns the pointer/length pair corresponding to data.
 | 
			
		||||
func cMessage(data []byte) (dataPtr C.CK_BYTE_PTR) {
 | 
			
		||||
	l := len(data)
 | 
			
		||||
	if l == 0 {
 | 
			
		||||
		// &data[0] is forbidden in this case, so use a nontrivial array instead.
 | 
			
		||||
		data = stubData
 | 
			
		||||
	}
 | 
			
		||||
	return C.CK_BYTE_PTR(unsafe.Pointer(&data[0]))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										127
									
								
								vendor/github.com/miekg/pkcs11/vendor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								vendor/github.com/miekg/pkcs11/vendor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,127 +0,0 @@
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
// Vendor specific range for Ncipher network HSM.
 | 
			
		||||
const (
 | 
			
		||||
	NFCK_VENDOR_NCIPHER = 0xde436972
 | 
			
		||||
	CKA_NCIPHER         = NFCK_VENDOR_NCIPHER
 | 
			
		||||
	CKM_NCIPHER         = NFCK_VENDOR_NCIPHER
 | 
			
		||||
	CKK_NCIPHER         = NFCK_VENDOR_NCIPHER
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Vendor specific mechanisms for HMAC on Ncipher HSMs where Ncipher does not allow use of generic_secret keys.
 | 
			
		||||
const (
 | 
			
		||||
	CKM_NC_SHA_1_HMAC_KEY_GEN  = CKM_NCIPHER + 0x3  /* no params */
 | 
			
		||||
	CKM_NC_MD5_HMAC_KEY_GEN    = CKM_NCIPHER + 0x6  /* no params */
 | 
			
		||||
	CKM_NC_SHA224_HMAC_KEY_GEN = CKM_NCIPHER + 0x24 /* no params */
 | 
			
		||||
	CKM_NC_SHA256_HMAC_KEY_GEN = CKM_NCIPHER + 0x25 /* no params */
 | 
			
		||||
	CKM_NC_SHA384_HMAC_KEY_GEN = CKM_NCIPHER + 0x26 /* no params */
 | 
			
		||||
	CKM_NC_SHA512_HMAC_KEY_GEN = CKM_NCIPHER + 0x27 /* no params */
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Vendor specific range for Mozilla NSS.
 | 
			
		||||
const (
 | 
			
		||||
	NSSCK_VENDOR_NSS   = 0x4E534350
 | 
			
		||||
	CKO_NSS            = CKO_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
	CKK_NSS            = CKK_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
	CKC_NSS            = CKC_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
	CKA_NSS            = CKA_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
	CKA_TRUST          = CKA_NSS + 0x2000
 | 
			
		||||
	CKM_NSS            = CKM_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
	CKR_NSS            = CKM_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
	CKT_VENDOR_DEFINED = 0x80000000
 | 
			
		||||
	CKT_NSS            = CKT_VENDOR_DEFINED | NSSCK_VENDOR_NSS
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Vendor specific values for Mozilla NSS.
 | 
			
		||||
const (
 | 
			
		||||
	CKO_NSS_CRL                               = CKO_NSS + 1
 | 
			
		||||
	CKO_NSS_SMIME                             = CKO_NSS + 2
 | 
			
		||||
	CKO_NSS_TRUST                             = CKO_NSS + 3
 | 
			
		||||
	CKO_NSS_BUILTIN_ROOT_LIST                 = CKO_NSS + 4
 | 
			
		||||
	CKO_NSS_NEWSLOT                           = CKO_NSS + 5
 | 
			
		||||
	CKO_NSS_DELSLOT                           = CKO_NSS + 6
 | 
			
		||||
	CKK_NSS_PKCS8                             = CKK_NSS + 1
 | 
			
		||||
	CKK_NSS_JPAKE_ROUND1                      = CKK_NSS + 2
 | 
			
		||||
	CKK_NSS_JPAKE_ROUND2                      = CKK_NSS + 3
 | 
			
		||||
	CKK_NSS_CHACHA20                          = CKK_NSS + 4
 | 
			
		||||
	CKA_NSS_URL                               = CKA_NSS + 1
 | 
			
		||||
	CKA_NSS_EMAIL                             = CKA_NSS + 2
 | 
			
		||||
	CKA_NSS_SMIME_INFO                        = CKA_NSS + 3
 | 
			
		||||
	CKA_NSS_SMIME_TIMESTAMP                   = CKA_NSS + 4
 | 
			
		||||
	CKA_NSS_PKCS8_SALT                        = CKA_NSS + 5
 | 
			
		||||
	CKA_NSS_PASSWORD_CHECK                    = CKA_NSS + 6
 | 
			
		||||
	CKA_NSS_EXPIRES                           = CKA_NSS + 7
 | 
			
		||||
	CKA_NSS_KRL                               = CKA_NSS + 8
 | 
			
		||||
	CKA_NSS_PQG_COUNTER                       = CKA_NSS + 20
 | 
			
		||||
	CKA_NSS_PQG_SEED                          = CKA_NSS + 21
 | 
			
		||||
	CKA_NSS_PQG_H                             = CKA_NSS + 22
 | 
			
		||||
	CKA_NSS_PQG_SEED_BITS                     = CKA_NSS + 23
 | 
			
		||||
	CKA_NSS_MODULE_SPEC                       = CKA_NSS + 24
 | 
			
		||||
	CKA_NSS_OVERRIDE_EXTENSIONS               = CKA_NSS + 25
 | 
			
		||||
	CKA_NSS_JPAKE_SIGNERID                    = CKA_NSS + 26
 | 
			
		||||
	CKA_NSS_JPAKE_PEERID                      = CKA_NSS + 27
 | 
			
		||||
	CKA_NSS_JPAKE_GX1                         = CKA_NSS + 28
 | 
			
		||||
	CKA_NSS_JPAKE_GX2                         = CKA_NSS + 29
 | 
			
		||||
	CKA_NSS_JPAKE_GX3                         = CKA_NSS + 30
 | 
			
		||||
	CKA_NSS_JPAKE_GX4                         = CKA_NSS + 31
 | 
			
		||||
	CKA_NSS_JPAKE_X2                          = CKA_NSS + 32
 | 
			
		||||
	CKA_NSS_JPAKE_X2S                         = CKA_NSS + 33
 | 
			
		||||
	CKA_NSS_MOZILLA_CA_POLICY                 = CKA_NSS + 34
 | 
			
		||||
	CKA_TRUST_DIGITAL_SIGNATURE               = CKA_TRUST + 1
 | 
			
		||||
	CKA_TRUST_NON_REPUDIATION                 = CKA_TRUST + 2
 | 
			
		||||
	CKA_TRUST_KEY_ENCIPHERMENT                = CKA_TRUST + 3
 | 
			
		||||
	CKA_TRUST_DATA_ENCIPHERMENT               = CKA_TRUST + 4
 | 
			
		||||
	CKA_TRUST_KEY_AGREEMENT                   = CKA_TRUST + 5
 | 
			
		||||
	CKA_TRUST_KEY_CERT_SIGN                   = CKA_TRUST + 6
 | 
			
		||||
	CKA_TRUST_CRL_SIGN                        = CKA_TRUST + 7
 | 
			
		||||
	CKA_TRUST_SERVER_AUTH                     = CKA_TRUST + 8
 | 
			
		||||
	CKA_TRUST_CLIENT_AUTH                     = CKA_TRUST + 9
 | 
			
		||||
	CKA_TRUST_CODE_SIGNING                    = CKA_TRUST + 10
 | 
			
		||||
	CKA_TRUST_EMAIL_PROTECTION                = CKA_TRUST + 11
 | 
			
		||||
	CKA_TRUST_IPSEC_END_SYSTEM                = CKA_TRUST + 12
 | 
			
		||||
	CKA_TRUST_IPSEC_TUNNEL                    = CKA_TRUST + 13
 | 
			
		||||
	CKA_TRUST_IPSEC_USER                      = CKA_TRUST + 14
 | 
			
		||||
	CKA_TRUST_TIME_STAMPING                   = CKA_TRUST + 15
 | 
			
		||||
	CKA_TRUST_STEP_UP_APPROVED                = CKA_TRUST + 16
 | 
			
		||||
	CKA_CERT_SHA1_HASH                        = CKA_TRUST + 100
 | 
			
		||||
	CKA_CERT_MD5_HASH                         = CKA_TRUST + 101
 | 
			
		||||
	CKM_NSS_AES_KEY_WRAP                      = CKM_NSS + 1
 | 
			
		||||
	CKM_NSS_AES_KEY_WRAP_PAD                  = CKM_NSS + 2
 | 
			
		||||
	CKM_NSS_HKDF_SHA1                         = CKM_NSS + 3
 | 
			
		||||
	CKM_NSS_HKDF_SHA256                       = CKM_NSS + 4
 | 
			
		||||
	CKM_NSS_HKDF_SHA384                       = CKM_NSS + 5
 | 
			
		||||
	CKM_NSS_HKDF_SHA512                       = CKM_NSS + 6
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND1_SHA1                 = CKM_NSS + 7
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND1_SHA256               = CKM_NSS + 8
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND1_SHA384               = CKM_NSS + 9
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND1_SHA512               = CKM_NSS + 10
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND2_SHA1                 = CKM_NSS + 11
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND2_SHA256               = CKM_NSS + 12
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND2_SHA384               = CKM_NSS + 13
 | 
			
		||||
	CKM_NSS_JPAKE_ROUND2_SHA512               = CKM_NSS + 14
 | 
			
		||||
	CKM_NSS_JPAKE_FINAL_SHA1                  = CKM_NSS + 15
 | 
			
		||||
	CKM_NSS_JPAKE_FINAL_SHA256                = CKM_NSS + 16
 | 
			
		||||
	CKM_NSS_JPAKE_FINAL_SHA384                = CKM_NSS + 17
 | 
			
		||||
	CKM_NSS_JPAKE_FINAL_SHA512                = CKM_NSS + 18
 | 
			
		||||
	CKM_NSS_HMAC_CONSTANT_TIME                = CKM_NSS + 19
 | 
			
		||||
	CKM_NSS_SSL3_MAC_CONSTANT_TIME            = CKM_NSS + 20
 | 
			
		||||
	CKM_NSS_TLS_PRF_GENERAL_SHA256            = CKM_NSS + 21
 | 
			
		||||
	CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256      = CKM_NSS + 22
 | 
			
		||||
	CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256     = CKM_NSS + 23
 | 
			
		||||
	CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256   = CKM_NSS + 24
 | 
			
		||||
	CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE    = CKM_NSS + 25
 | 
			
		||||
	CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH = CKM_NSS + 26
 | 
			
		||||
	CKM_NSS_CHACHA20_KEY_GEN                  = CKM_NSS + 27
 | 
			
		||||
	CKM_NSS_CHACHA20_POLY1305                 = CKM_NSS + 28
 | 
			
		||||
	CKM_NSS_PKCS12_PBE_SHA224_HMAC_KEY_GEN    = CKM_NSS + 29
 | 
			
		||||
	CKM_NSS_PKCS12_PBE_SHA256_HMAC_KEY_GEN    = CKM_NSS + 30
 | 
			
		||||
	CKM_NSS_PKCS12_PBE_SHA384_HMAC_KEY_GEN    = CKM_NSS + 31
 | 
			
		||||
	CKM_NSS_PKCS12_PBE_SHA512_HMAC_KEY_GEN    = CKM_NSS + 32
 | 
			
		||||
	CKR_NSS_CERTDB_FAILED                     = CKR_NSS + 1
 | 
			
		||||
	CKR_NSS_KEYDB_FAILED                      = CKR_NSS + 2
 | 
			
		||||
	CKT_NSS_TRUSTED                           = CKT_NSS + 1
 | 
			
		||||
	CKT_NSS_TRUSTED_DELEGATOR                 = CKT_NSS + 2
 | 
			
		||||
	CKT_NSS_MUST_VERIFY_TRUST                 = CKT_NSS + 3
 | 
			
		||||
	CKT_NSS_NOT_TRUSTED                       = CKT_NSS + 10
 | 
			
		||||
	CKT_NSS_TRUST_UNKNOWN                     = CKT_NSS + 5
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										766
									
								
								vendor/github.com/miekg/pkcs11/zconst.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										766
									
								
								vendor/github.com/miekg/pkcs11/zconst.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,766 +0,0 @@
 | 
			
		||||
// Copyright 2013 Miek Gieben. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Code generated by "go run const_generate.go"; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package pkcs11
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CK_TRUE                              = 1
 | 
			
		||||
	CK_FALSE                             = 0
 | 
			
		||||
	CK_UNAVAILABLE_INFORMATION           = ^uint(0)
 | 
			
		||||
	CK_EFFECTIVELY_INFINITE              = 0
 | 
			
		||||
	CK_INVALID_HANDLE                    = 0
 | 
			
		||||
	CKN_SURRENDER                        = 0
 | 
			
		||||
	CKN_OTP_CHANGED                      = 1
 | 
			
		||||
	CKF_TOKEN_PRESENT                    = 0x00000001
 | 
			
		||||
	CKF_REMOVABLE_DEVICE                 = 0x00000002
 | 
			
		||||
	CKF_HW_SLOT                          = 0x00000004
 | 
			
		||||
	CKF_RNG                              = 0x00000001
 | 
			
		||||
	CKF_WRITE_PROTECTED                  = 0x00000002
 | 
			
		||||
	CKF_LOGIN_REQUIRED                   = 0x00000004
 | 
			
		||||
	CKF_USER_PIN_INITIALIZED             = 0x00000008
 | 
			
		||||
	CKF_RESTORE_KEY_NOT_NEEDED           = 0x00000020
 | 
			
		||||
	CKF_CLOCK_ON_TOKEN                   = 0x00000040
 | 
			
		||||
	CKF_PROTECTED_AUTHENTICATION_PATH    = 0x00000100
 | 
			
		||||
	CKF_DUAL_CRYPTO_OPERATIONS           = 0x00000200
 | 
			
		||||
	CKF_TOKEN_INITIALIZED                = 0x00000400
 | 
			
		||||
	CKF_SECONDARY_AUTHENTICATION         = 0x00000800
 | 
			
		||||
	CKF_USER_PIN_COUNT_LOW               = 0x00010000
 | 
			
		||||
	CKF_USER_PIN_FINAL_TRY               = 0x00020000
 | 
			
		||||
	CKF_USER_PIN_LOCKED                  = 0x00040000
 | 
			
		||||
	CKF_USER_PIN_TO_BE_CHANGED           = 0x00080000
 | 
			
		||||
	CKF_SO_PIN_COUNT_LOW                 = 0x00100000
 | 
			
		||||
	CKF_SO_PIN_FINAL_TRY                 = 0x00200000
 | 
			
		||||
	CKF_SO_PIN_LOCKED                    = 0x00400000
 | 
			
		||||
	CKF_SO_PIN_TO_BE_CHANGED             = 0x00800000
 | 
			
		||||
	CKF_ERROR_STATE                      = 0x01000000
 | 
			
		||||
	CKU_SO                               = 0
 | 
			
		||||
	CKU_USER                             = 1
 | 
			
		||||
	CKU_CONTEXT_SPECIFIC                 = 2
 | 
			
		||||
	CKS_RO_PUBLIC_SESSION                = 0
 | 
			
		||||
	CKS_RO_USER_FUNCTIONS                = 1
 | 
			
		||||
	CKS_RW_PUBLIC_SESSION                = 2
 | 
			
		||||
	CKS_RW_USER_FUNCTIONS                = 3
 | 
			
		||||
	CKS_RW_SO_FUNCTIONS                  = 4
 | 
			
		||||
	CKF_RW_SESSION                       = 0x00000002
 | 
			
		||||
	CKF_SERIAL_SESSION                   = 0x00000004
 | 
			
		||||
	CKO_DATA                             = 0x00000000
 | 
			
		||||
	CKO_CERTIFICATE                      = 0x00000001
 | 
			
		||||
	CKO_PUBLIC_KEY                       = 0x00000002
 | 
			
		||||
	CKO_PRIVATE_KEY                      = 0x00000003
 | 
			
		||||
	CKO_SECRET_KEY                       = 0x00000004
 | 
			
		||||
	CKO_HW_FEATURE                       = 0x00000005
 | 
			
		||||
	CKO_DOMAIN_PARAMETERS                = 0x00000006
 | 
			
		||||
	CKO_MECHANISM                        = 0x00000007
 | 
			
		||||
	CKO_OTP_KEY                          = 0x00000008
 | 
			
		||||
	CKO_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CKH_MONOTONIC_COUNTER                = 0x00000001
 | 
			
		||||
	CKH_CLOCK                            = 0x00000002
 | 
			
		||||
	CKH_USER_INTERFACE                   = 0x00000003
 | 
			
		||||
	CKH_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CKK_RSA                              = 0x00000000
 | 
			
		||||
	CKK_DSA                              = 0x00000001
 | 
			
		||||
	CKK_DH                               = 0x00000002
 | 
			
		||||
	CKK_ECDSA                            = 0x00000003 // Deprecated
 | 
			
		||||
	CKK_EC                               = 0x00000003
 | 
			
		||||
	CKK_X9_42_DH                         = 0x00000004
 | 
			
		||||
	CKK_KEA                              = 0x00000005
 | 
			
		||||
	CKK_GENERIC_SECRET                   = 0x00000010
 | 
			
		||||
	CKK_RC2                              = 0x00000011
 | 
			
		||||
	CKK_RC4                              = 0x00000012
 | 
			
		||||
	CKK_DES                              = 0x00000013
 | 
			
		||||
	CKK_DES2                             = 0x00000014
 | 
			
		||||
	CKK_DES3                             = 0x00000015
 | 
			
		||||
	CKK_CAST                             = 0x00000016
 | 
			
		||||
	CKK_CAST3                            = 0x00000017
 | 
			
		||||
	CKK_CAST5                            = 0x00000018 // Deprecated
 | 
			
		||||
	CKK_CAST128                          = 0x00000018
 | 
			
		||||
	CKK_RC5                              = 0x00000019
 | 
			
		||||
	CKK_IDEA                             = 0x0000001A
 | 
			
		||||
	CKK_SKIPJACK                         = 0x0000001B
 | 
			
		||||
	CKK_BATON                            = 0x0000001C
 | 
			
		||||
	CKK_JUNIPER                          = 0x0000001D
 | 
			
		||||
	CKK_CDMF                             = 0x0000001E
 | 
			
		||||
	CKK_AES                              = 0x0000001F
 | 
			
		||||
	CKK_BLOWFISH                         = 0x00000020
 | 
			
		||||
	CKK_TWOFISH                          = 0x00000021
 | 
			
		||||
	CKK_SECURID                          = 0x00000022
 | 
			
		||||
	CKK_HOTP                             = 0x00000023
 | 
			
		||||
	CKK_ACTI                             = 0x00000024
 | 
			
		||||
	CKK_CAMELLIA                         = 0x00000025
 | 
			
		||||
	CKK_ARIA                             = 0x00000026
 | 
			
		||||
	CKK_MD5_HMAC                         = 0x00000027
 | 
			
		||||
	CKK_SHA_1_HMAC                       = 0x00000028
 | 
			
		||||
	CKK_RIPEMD128_HMAC                   = 0x00000029
 | 
			
		||||
	CKK_RIPEMD160_HMAC                   = 0x0000002A
 | 
			
		||||
	CKK_SHA256_HMAC                      = 0x0000002B
 | 
			
		||||
	CKK_SHA384_HMAC                      = 0x0000002C
 | 
			
		||||
	CKK_SHA512_HMAC                      = 0x0000002D
 | 
			
		||||
	CKK_SHA224_HMAC                      = 0x0000002E
 | 
			
		||||
	CKK_SEED                             = 0x0000002F
 | 
			
		||||
	CKK_GOSTR3410                        = 0x00000030
 | 
			
		||||
	CKK_GOSTR3411                        = 0x00000031
 | 
			
		||||
	CKK_GOST28147                        = 0x00000032
 | 
			
		||||
	CKK_SHA3_224_HMAC                    = 0x00000033
 | 
			
		||||
	CKK_SHA3_256_HMAC                    = 0x00000034
 | 
			
		||||
	CKK_SHA3_384_HMAC                    = 0x00000035
 | 
			
		||||
	CKK_SHA3_512_HMAC                    = 0x00000036
 | 
			
		||||
	CKK_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CK_CERTIFICATE_CATEGORY_UNSPECIFIED  = 0
 | 
			
		||||
	CK_CERTIFICATE_CATEGORY_TOKEN_USER   = 1
 | 
			
		||||
	CK_CERTIFICATE_CATEGORY_AUTHORITY    = 2
 | 
			
		||||
	CK_CERTIFICATE_CATEGORY_OTHER_ENTITY = 3
 | 
			
		||||
	CK_SECURITY_DOMAIN_UNSPECIFIED       = 0
 | 
			
		||||
	CK_SECURITY_DOMAIN_MANUFACTURER      = 1
 | 
			
		||||
	CK_SECURITY_DOMAIN_OPERATOR          = 2
 | 
			
		||||
	CK_SECURITY_DOMAIN_THIRD_PARTY       = 3
 | 
			
		||||
	CKC_X_509                            = 0x00000000
 | 
			
		||||
	CKC_X_509_ATTR_CERT                  = 0x00000001
 | 
			
		||||
	CKC_WTLS                             = 0x00000002
 | 
			
		||||
	CKC_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CKF_ARRAY_ATTRIBUTE                  = 0x40000000
 | 
			
		||||
	CK_OTP_FORMAT_DECIMAL                = 0
 | 
			
		||||
	CK_OTP_FORMAT_HEXADECIMAL            = 1
 | 
			
		||||
	CK_OTP_FORMAT_ALPHANUMERIC           = 2
 | 
			
		||||
	CK_OTP_FORMAT_BINARY                 = 3
 | 
			
		||||
	CK_OTP_PARAM_IGNORED                 = 0
 | 
			
		||||
	CK_OTP_PARAM_OPTIONAL                = 1
 | 
			
		||||
	CK_OTP_PARAM_MANDATORY               = 2
 | 
			
		||||
	CKA_CLASS                            = 0x00000000
 | 
			
		||||
	CKA_TOKEN                            = 0x00000001
 | 
			
		||||
	CKA_PRIVATE                          = 0x00000002
 | 
			
		||||
	CKA_LABEL                            = 0x00000003
 | 
			
		||||
	CKA_APPLICATION                      = 0x00000010
 | 
			
		||||
	CKA_VALUE                            = 0x00000011
 | 
			
		||||
	CKA_OBJECT_ID                        = 0x00000012
 | 
			
		||||
	CKA_CERTIFICATE_TYPE                 = 0x00000080
 | 
			
		||||
	CKA_ISSUER                           = 0x00000081
 | 
			
		||||
	CKA_SERIAL_NUMBER                    = 0x00000082
 | 
			
		||||
	CKA_AC_ISSUER                        = 0x00000083
 | 
			
		||||
	CKA_OWNER                            = 0x00000084
 | 
			
		||||
	CKA_ATTR_TYPES                       = 0x00000085
 | 
			
		||||
	CKA_TRUSTED                          = 0x00000086
 | 
			
		||||
	CKA_CERTIFICATE_CATEGORY             = 0x00000087
 | 
			
		||||
	CKA_JAVA_MIDP_SECURITY_DOMAIN        = 0x00000088
 | 
			
		||||
	CKA_URL                              = 0x00000089
 | 
			
		||||
	CKA_HASH_OF_SUBJECT_PUBLIC_KEY       = 0x0000008A
 | 
			
		||||
	CKA_HASH_OF_ISSUER_PUBLIC_KEY        = 0x0000008B
 | 
			
		||||
	CKA_NAME_HASH_ALGORITHM              = 0x0000008C
 | 
			
		||||
	CKA_CHECK_VALUE                      = 0x00000090
 | 
			
		||||
	CKA_KEY_TYPE                         = 0x00000100
 | 
			
		||||
	CKA_SUBJECT                          = 0x00000101
 | 
			
		||||
	CKA_ID                               = 0x00000102
 | 
			
		||||
	CKA_SENSITIVE                        = 0x00000103
 | 
			
		||||
	CKA_ENCRYPT                          = 0x00000104
 | 
			
		||||
	CKA_DECRYPT                          = 0x00000105
 | 
			
		||||
	CKA_WRAP                             = 0x00000106
 | 
			
		||||
	CKA_UNWRAP                           = 0x00000107
 | 
			
		||||
	CKA_SIGN                             = 0x00000108
 | 
			
		||||
	CKA_SIGN_RECOVER                     = 0x00000109
 | 
			
		||||
	CKA_VERIFY                           = 0x0000010A
 | 
			
		||||
	CKA_VERIFY_RECOVER                   = 0x0000010B
 | 
			
		||||
	CKA_DERIVE                           = 0x0000010C
 | 
			
		||||
	CKA_START_DATE                       = 0x00000110
 | 
			
		||||
	CKA_END_DATE                         = 0x00000111
 | 
			
		||||
	CKA_MODULUS                          = 0x00000120
 | 
			
		||||
	CKA_MODULUS_BITS                     = 0x00000121
 | 
			
		||||
	CKA_PUBLIC_EXPONENT                  = 0x00000122
 | 
			
		||||
	CKA_PRIVATE_EXPONENT                 = 0x00000123
 | 
			
		||||
	CKA_PRIME_1                          = 0x00000124
 | 
			
		||||
	CKA_PRIME_2                          = 0x00000125
 | 
			
		||||
	CKA_EXPONENT_1                       = 0x00000126
 | 
			
		||||
	CKA_EXPONENT_2                       = 0x00000127
 | 
			
		||||
	CKA_COEFFICIENT                      = 0x00000128
 | 
			
		||||
	CKA_PUBLIC_KEY_INFO                  = 0x00000129
 | 
			
		||||
	CKA_PRIME                            = 0x00000130
 | 
			
		||||
	CKA_SUBPRIME                         = 0x00000131
 | 
			
		||||
	CKA_BASE                             = 0x00000132
 | 
			
		||||
	CKA_PRIME_BITS                       = 0x00000133
 | 
			
		||||
	CKA_SUBPRIME_BITS                    = 0x00000134
 | 
			
		||||
	CKA_SUB_PRIME_BITS                   = CKA_SUBPRIME_BITS
 | 
			
		||||
	CKA_VALUE_BITS                       = 0x00000160
 | 
			
		||||
	CKA_VALUE_LEN                        = 0x00000161
 | 
			
		||||
	CKA_EXTRACTABLE                      = 0x00000162
 | 
			
		||||
	CKA_LOCAL                            = 0x00000163
 | 
			
		||||
	CKA_NEVER_EXTRACTABLE                = 0x00000164
 | 
			
		||||
	CKA_ALWAYS_SENSITIVE                 = 0x00000165
 | 
			
		||||
	CKA_KEY_GEN_MECHANISM                = 0x00000166
 | 
			
		||||
	CKA_MODIFIABLE                       = 0x00000170
 | 
			
		||||
	CKA_COPYABLE                         = 0x00000171
 | 
			
		||||
	CKA_DESTROYABLE                      = 0x00000172
 | 
			
		||||
	CKA_ECDSA_PARAMS                     = 0x00000180 // Deprecated
 | 
			
		||||
	CKA_EC_PARAMS                        = 0x00000180
 | 
			
		||||
	CKA_EC_POINT                         = 0x00000181
 | 
			
		||||
	CKA_SECONDARY_AUTH                   = 0x00000200 // Deprecated
 | 
			
		||||
	CKA_AUTH_PIN_FLAGS                   = 0x00000201 // Deprecated
 | 
			
		||||
	CKA_ALWAYS_AUTHENTICATE              = 0x00000202
 | 
			
		||||
	CKA_WRAP_WITH_TRUSTED                = 0x00000210
 | 
			
		||||
	CKA_WRAP_TEMPLATE                    = (CKF_ARRAY_ATTRIBUTE | 0x00000211)
 | 
			
		||||
	CKA_UNWRAP_TEMPLATE                  = (CKF_ARRAY_ATTRIBUTE | 0x00000212)
 | 
			
		||||
	CKA_DERIVE_TEMPLATE                  = (CKF_ARRAY_ATTRIBUTE | 0x00000213)
 | 
			
		||||
	CKA_OTP_FORMAT                       = 0x00000220
 | 
			
		||||
	CKA_OTP_LENGTH                       = 0x00000221
 | 
			
		||||
	CKA_OTP_TIME_INTERVAL                = 0x00000222
 | 
			
		||||
	CKA_OTP_USER_FRIENDLY_MODE           = 0x00000223
 | 
			
		||||
	CKA_OTP_CHALLENGE_REQUIREMENT        = 0x00000224
 | 
			
		||||
	CKA_OTP_TIME_REQUIREMENT             = 0x00000225
 | 
			
		||||
	CKA_OTP_COUNTER_REQUIREMENT          = 0x00000226
 | 
			
		||||
	CKA_OTP_PIN_REQUIREMENT              = 0x00000227
 | 
			
		||||
	CKA_OTP_COUNTER                      = 0x0000022E
 | 
			
		||||
	CKA_OTP_TIME                         = 0x0000022F
 | 
			
		||||
	CKA_OTP_USER_IDENTIFIER              = 0x0000022A
 | 
			
		||||
	CKA_OTP_SERVICE_IDENTIFIER           = 0x0000022B
 | 
			
		||||
	CKA_OTP_SERVICE_LOGO                 = 0x0000022C
 | 
			
		||||
	CKA_OTP_SERVICE_LOGO_TYPE            = 0x0000022D
 | 
			
		||||
	CKA_GOSTR3410_PARAMS                 = 0x00000250
 | 
			
		||||
	CKA_GOSTR3411_PARAMS                 = 0x00000251
 | 
			
		||||
	CKA_GOST28147_PARAMS                 = 0x00000252
 | 
			
		||||
	CKA_HW_FEATURE_TYPE                  = 0x00000300
 | 
			
		||||
	CKA_RESET_ON_INIT                    = 0x00000301
 | 
			
		||||
	CKA_HAS_RESET                        = 0x00000302
 | 
			
		||||
	CKA_PIXEL_X                          = 0x00000400
 | 
			
		||||
	CKA_PIXEL_Y                          = 0x00000401
 | 
			
		||||
	CKA_RESOLUTION                       = 0x00000402
 | 
			
		||||
	CKA_CHAR_ROWS                        = 0x00000403
 | 
			
		||||
	CKA_CHAR_COLUMNS                     = 0x00000404
 | 
			
		||||
	CKA_COLOR                            = 0x00000405
 | 
			
		||||
	CKA_BITS_PER_PIXEL                   = 0x00000406
 | 
			
		||||
	CKA_CHAR_SETS                        = 0x00000480
 | 
			
		||||
	CKA_ENCODING_METHODS                 = 0x00000481
 | 
			
		||||
	CKA_MIME_TYPES                       = 0x00000482
 | 
			
		||||
	CKA_MECHANISM_TYPE                   = 0x00000500
 | 
			
		||||
	CKA_REQUIRED_CMS_ATTRIBUTES          = 0x00000501
 | 
			
		||||
	CKA_DEFAULT_CMS_ATTRIBUTES           = 0x00000502
 | 
			
		||||
	CKA_SUPPORTED_CMS_ATTRIBUTES         = 0x00000503
 | 
			
		||||
	CKA_ALLOWED_MECHANISMS               = (CKF_ARRAY_ATTRIBUTE | 0x00000600)
 | 
			
		||||
	CKA_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CKM_RSA_PKCS_KEY_PAIR_GEN            = 0x00000000
 | 
			
		||||
	CKM_RSA_PKCS                         = 0x00000001
 | 
			
		||||
	CKM_RSA_9796                         = 0x00000002
 | 
			
		||||
	CKM_RSA_X_509                        = 0x00000003
 | 
			
		||||
	CKM_MD2_RSA_PKCS                     = 0x00000004
 | 
			
		||||
	CKM_MD5_RSA_PKCS                     = 0x00000005
 | 
			
		||||
	CKM_SHA1_RSA_PKCS                    = 0x00000006
 | 
			
		||||
	CKM_RIPEMD128_RSA_PKCS               = 0x00000007
 | 
			
		||||
	CKM_RIPEMD160_RSA_PKCS               = 0x00000008
 | 
			
		||||
	CKM_RSA_PKCS_OAEP                    = 0x00000009
 | 
			
		||||
	CKM_RSA_X9_31_KEY_PAIR_GEN           = 0x0000000A
 | 
			
		||||
	CKM_RSA_X9_31                        = 0x0000000B
 | 
			
		||||
	CKM_SHA1_RSA_X9_31                   = 0x0000000C
 | 
			
		||||
	CKM_RSA_PKCS_PSS                     = 0x0000000D
 | 
			
		||||
	CKM_SHA1_RSA_PKCS_PSS                = 0x0000000E
 | 
			
		||||
	CKM_DSA_KEY_PAIR_GEN                 = 0x00000010
 | 
			
		||||
	CKM_DSA                              = 0x00000011
 | 
			
		||||
	CKM_DSA_SHA1                         = 0x00000012
 | 
			
		||||
	CKM_DSA_SHA224                       = 0x00000013
 | 
			
		||||
	CKM_DSA_SHA256                       = 0x00000014
 | 
			
		||||
	CKM_DSA_SHA384                       = 0x00000015
 | 
			
		||||
	CKM_DSA_SHA512                       = 0x00000016
 | 
			
		||||
	CKM_DSA_SHA3_224                     = 0x00000018
 | 
			
		||||
	CKM_DSA_SHA3_256                     = 0x00000019
 | 
			
		||||
	CKM_DSA_SHA3_384                     = 0x0000001A
 | 
			
		||||
	CKM_DSA_SHA3_512                     = 0x0000001B
 | 
			
		||||
	CKM_DH_PKCS_KEY_PAIR_GEN             = 0x00000020
 | 
			
		||||
	CKM_DH_PKCS_DERIVE                   = 0x00000021
 | 
			
		||||
	CKM_X9_42_DH_KEY_PAIR_GEN            = 0x00000030
 | 
			
		||||
	CKM_X9_42_DH_DERIVE                  = 0x00000031
 | 
			
		||||
	CKM_X9_42_DH_HYBRID_DERIVE           = 0x00000032
 | 
			
		||||
	CKM_X9_42_MQV_DERIVE                 = 0x00000033
 | 
			
		||||
	CKM_SHA256_RSA_PKCS                  = 0x00000040
 | 
			
		||||
	CKM_SHA384_RSA_PKCS                  = 0x00000041
 | 
			
		||||
	CKM_SHA512_RSA_PKCS                  = 0x00000042
 | 
			
		||||
	CKM_SHA256_RSA_PKCS_PSS              = 0x00000043
 | 
			
		||||
	CKM_SHA384_RSA_PKCS_PSS              = 0x00000044
 | 
			
		||||
	CKM_SHA512_RSA_PKCS_PSS              = 0x00000045
 | 
			
		||||
	CKM_SHA224_RSA_PKCS                  = 0x00000046
 | 
			
		||||
	CKM_SHA224_RSA_PKCS_PSS              = 0x00000047
 | 
			
		||||
	CKM_SHA512_224                       = 0x00000048
 | 
			
		||||
	CKM_SHA512_224_HMAC                  = 0x00000049
 | 
			
		||||
	CKM_SHA512_224_HMAC_GENERAL          = 0x0000004A
 | 
			
		||||
	CKM_SHA512_224_KEY_DERIVATION        = 0x0000004B
 | 
			
		||||
	CKM_SHA512_256                       = 0x0000004C
 | 
			
		||||
	CKM_SHA512_256_HMAC                  = 0x0000004D
 | 
			
		||||
	CKM_SHA512_256_HMAC_GENERAL          = 0x0000004E
 | 
			
		||||
	CKM_SHA512_256_KEY_DERIVATION        = 0x0000004F
 | 
			
		||||
	CKM_SHA512_T                         = 0x00000050
 | 
			
		||||
	CKM_SHA512_T_HMAC                    = 0x00000051
 | 
			
		||||
	CKM_SHA512_T_HMAC_GENERAL            = 0x00000052
 | 
			
		||||
	CKM_SHA512_T_KEY_DERIVATION          = 0x00000053
 | 
			
		||||
	CKM_SHA3_256_RSA_PKCS                = 0x00000060
 | 
			
		||||
	CKM_SHA3_384_RSA_PKCS                = 0x00000061
 | 
			
		||||
	CKM_SHA3_512_RSA_PKCS                = 0x00000062
 | 
			
		||||
	CKM_SHA3_256_RSA_PKCS_PSS            = 0x00000063
 | 
			
		||||
	CKM_SHA3_384_RSA_PKCS_PSS            = 0x00000064
 | 
			
		||||
	CKM_SHA3_512_RSA_PKCS_PSS            = 0x00000065
 | 
			
		||||
	CKM_SHA3_224_RSA_PKCS                = 0x00000066
 | 
			
		||||
	CKM_SHA3_224_RSA_PKCS_PSS            = 0x00000067
 | 
			
		||||
	CKM_RC2_KEY_GEN                      = 0x00000100
 | 
			
		||||
	CKM_RC2_ECB                          = 0x00000101
 | 
			
		||||
	CKM_RC2_CBC                          = 0x00000102
 | 
			
		||||
	CKM_RC2_MAC                          = 0x00000103
 | 
			
		||||
	CKM_RC2_MAC_GENERAL                  = 0x00000104
 | 
			
		||||
	CKM_RC2_CBC_PAD                      = 0x00000105
 | 
			
		||||
	CKM_RC4_KEY_GEN                      = 0x00000110
 | 
			
		||||
	CKM_RC4                              = 0x00000111
 | 
			
		||||
	CKM_DES_KEY_GEN                      = 0x00000120
 | 
			
		||||
	CKM_DES_ECB                          = 0x00000121
 | 
			
		||||
	CKM_DES_CBC                          = 0x00000122
 | 
			
		||||
	CKM_DES_MAC                          = 0x00000123
 | 
			
		||||
	CKM_DES_MAC_GENERAL                  = 0x00000124
 | 
			
		||||
	CKM_DES_CBC_PAD                      = 0x00000125
 | 
			
		||||
	CKM_DES2_KEY_GEN                     = 0x00000130
 | 
			
		||||
	CKM_DES3_KEY_GEN                     = 0x00000131
 | 
			
		||||
	CKM_DES3_ECB                         = 0x00000132
 | 
			
		||||
	CKM_DES3_CBC                         = 0x00000133
 | 
			
		||||
	CKM_DES3_MAC                         = 0x00000134
 | 
			
		||||
	CKM_DES3_MAC_GENERAL                 = 0x00000135
 | 
			
		||||
	CKM_DES3_CBC_PAD                     = 0x00000136
 | 
			
		||||
	CKM_DES3_CMAC_GENERAL                = 0x00000137
 | 
			
		||||
	CKM_DES3_CMAC                        = 0x00000138
 | 
			
		||||
	CKM_CDMF_KEY_GEN                     = 0x00000140
 | 
			
		||||
	CKM_CDMF_ECB                         = 0x00000141
 | 
			
		||||
	CKM_CDMF_CBC                         = 0x00000142
 | 
			
		||||
	CKM_CDMF_MAC                         = 0x00000143
 | 
			
		||||
	CKM_CDMF_MAC_GENERAL                 = 0x00000144
 | 
			
		||||
	CKM_CDMF_CBC_PAD                     = 0x00000145
 | 
			
		||||
	CKM_DES_OFB64                        = 0x00000150
 | 
			
		||||
	CKM_DES_OFB8                         = 0x00000151
 | 
			
		||||
	CKM_DES_CFB64                        = 0x00000152
 | 
			
		||||
	CKM_DES_CFB8                         = 0x00000153
 | 
			
		||||
	CKM_MD2                              = 0x00000200
 | 
			
		||||
	CKM_MD2_HMAC                         = 0x00000201
 | 
			
		||||
	CKM_MD2_HMAC_GENERAL                 = 0x00000202
 | 
			
		||||
	CKM_MD5                              = 0x00000210
 | 
			
		||||
	CKM_MD5_HMAC                         = 0x00000211
 | 
			
		||||
	CKM_MD5_HMAC_GENERAL                 = 0x00000212
 | 
			
		||||
	CKM_SHA_1                            = 0x00000220
 | 
			
		||||
	CKM_SHA_1_HMAC                       = 0x00000221
 | 
			
		||||
	CKM_SHA_1_HMAC_GENERAL               = 0x00000222
 | 
			
		||||
	CKM_RIPEMD128                        = 0x00000230
 | 
			
		||||
	CKM_RIPEMD128_HMAC                   = 0x00000231
 | 
			
		||||
	CKM_RIPEMD128_HMAC_GENERAL           = 0x00000232
 | 
			
		||||
	CKM_RIPEMD160                        = 0x00000240
 | 
			
		||||
	CKM_RIPEMD160_HMAC                   = 0x00000241
 | 
			
		||||
	CKM_RIPEMD160_HMAC_GENERAL           = 0x00000242
 | 
			
		||||
	CKM_SHA256                           = 0x00000250
 | 
			
		||||
	CKM_SHA256_HMAC                      = 0x00000251
 | 
			
		||||
	CKM_SHA256_HMAC_GENERAL              = 0x00000252
 | 
			
		||||
	CKM_SHA224                           = 0x00000255
 | 
			
		||||
	CKM_SHA224_HMAC                      = 0x00000256
 | 
			
		||||
	CKM_SHA224_HMAC_GENERAL              = 0x00000257
 | 
			
		||||
	CKM_SHA384                           = 0x00000260
 | 
			
		||||
	CKM_SHA384_HMAC                      = 0x00000261
 | 
			
		||||
	CKM_SHA384_HMAC_GENERAL              = 0x00000262
 | 
			
		||||
	CKM_SHA512                           = 0x00000270
 | 
			
		||||
	CKM_SHA512_HMAC                      = 0x00000271
 | 
			
		||||
	CKM_SHA512_HMAC_GENERAL              = 0x00000272
 | 
			
		||||
	CKM_SECURID_KEY_GEN                  = 0x00000280
 | 
			
		||||
	CKM_SECURID                          = 0x00000282
 | 
			
		||||
	CKM_HOTP_KEY_GEN                     = 0x00000290
 | 
			
		||||
	CKM_HOTP                             = 0x00000291
 | 
			
		||||
	CKM_ACTI                             = 0x000002A0
 | 
			
		||||
	CKM_ACTI_KEY_GEN                     = 0x000002A1
 | 
			
		||||
	CKM_SHA3_256                         = 0x000002B0
 | 
			
		||||
	CKM_SHA3_256_HMAC                    = 0x000002B1
 | 
			
		||||
	CKM_SHA3_256_HMAC_GENERAL            = 0x000002B2
 | 
			
		||||
	CKM_SHA3_256_KEY_GEN                 = 0x000002B3
 | 
			
		||||
	CKM_SHA3_224                         = 0x000002B5
 | 
			
		||||
	CKM_SHA3_224_HMAC                    = 0x000002B6
 | 
			
		||||
	CKM_SHA3_224_HMAC_GENERAL            = 0x000002B7
 | 
			
		||||
	CKM_SHA3_224_KEY_GEN                 = 0x000002B8
 | 
			
		||||
	CKM_SHA3_384                         = 0x000002C0
 | 
			
		||||
	CKM_SHA3_384_HMAC                    = 0x000002C1
 | 
			
		||||
	CKM_SHA3_384_HMAC_GENERAL            = 0x000002C2
 | 
			
		||||
	CKM_SHA3_384_KEY_GEN                 = 0x000002C3
 | 
			
		||||
	CKM_SHA3_512                         = 0x000002D0
 | 
			
		||||
	CKM_SHA3_512_HMAC                    = 0x000002D1
 | 
			
		||||
	CKM_SHA3_512_HMAC_GENERAL            = 0x000002D2
 | 
			
		||||
	CKM_SHA3_512_KEY_GEN                 = 0x000002D3
 | 
			
		||||
	CKM_CAST_KEY_GEN                     = 0x00000300
 | 
			
		||||
	CKM_CAST_ECB                         = 0x00000301
 | 
			
		||||
	CKM_CAST_CBC                         = 0x00000302
 | 
			
		||||
	CKM_CAST_MAC                         = 0x00000303
 | 
			
		||||
	CKM_CAST_MAC_GENERAL                 = 0x00000304
 | 
			
		||||
	CKM_CAST_CBC_PAD                     = 0x00000305
 | 
			
		||||
	CKM_CAST3_KEY_GEN                    = 0x00000310
 | 
			
		||||
	CKM_CAST3_ECB                        = 0x00000311
 | 
			
		||||
	CKM_CAST3_CBC                        = 0x00000312
 | 
			
		||||
	CKM_CAST3_MAC                        = 0x00000313
 | 
			
		||||
	CKM_CAST3_MAC_GENERAL                = 0x00000314
 | 
			
		||||
	CKM_CAST3_CBC_PAD                    = 0x00000315
 | 
			
		||||
	CKM_CAST5_KEY_GEN                    = 0x00000320
 | 
			
		||||
	CKM_CAST128_KEY_GEN                  = 0x00000320
 | 
			
		||||
	CKM_CAST5_ECB                        = 0x00000321
 | 
			
		||||
	CKM_CAST128_ECB                      = 0x00000321
 | 
			
		||||
	CKM_CAST5_CBC                        = 0x00000322 // Deprecated
 | 
			
		||||
	CKM_CAST128_CBC                      = 0x00000322
 | 
			
		||||
	CKM_CAST5_MAC                        = 0x00000323 // Deprecated
 | 
			
		||||
	CKM_CAST128_MAC                      = 0x00000323
 | 
			
		||||
	CKM_CAST5_MAC_GENERAL                = 0x00000324 // Deprecated
 | 
			
		||||
	CKM_CAST128_MAC_GENERAL              = 0x00000324
 | 
			
		||||
	CKM_CAST5_CBC_PAD                    = 0x00000325 // Deprecated
 | 
			
		||||
	CKM_CAST128_CBC_PAD                  = 0x00000325
 | 
			
		||||
	CKM_RC5_KEY_GEN                      = 0x00000330
 | 
			
		||||
	CKM_RC5_ECB                          = 0x00000331
 | 
			
		||||
	CKM_RC5_CBC                          = 0x00000332
 | 
			
		||||
	CKM_RC5_MAC                          = 0x00000333
 | 
			
		||||
	CKM_RC5_MAC_GENERAL                  = 0x00000334
 | 
			
		||||
	CKM_RC5_CBC_PAD                      = 0x00000335
 | 
			
		||||
	CKM_IDEA_KEY_GEN                     = 0x00000340
 | 
			
		||||
	CKM_IDEA_ECB                         = 0x00000341
 | 
			
		||||
	CKM_IDEA_CBC                         = 0x00000342
 | 
			
		||||
	CKM_IDEA_MAC                         = 0x00000343
 | 
			
		||||
	CKM_IDEA_MAC_GENERAL                 = 0x00000344
 | 
			
		||||
	CKM_IDEA_CBC_PAD                     = 0x00000345
 | 
			
		||||
	CKM_GENERIC_SECRET_KEY_GEN           = 0x00000350
 | 
			
		||||
	CKM_CONCATENATE_BASE_AND_KEY         = 0x00000360
 | 
			
		||||
	CKM_CONCATENATE_BASE_AND_DATA        = 0x00000362
 | 
			
		||||
	CKM_CONCATENATE_DATA_AND_BASE        = 0x00000363
 | 
			
		||||
	CKM_XOR_BASE_AND_DATA                = 0x00000364
 | 
			
		||||
	CKM_EXTRACT_KEY_FROM_KEY             = 0x00000365
 | 
			
		||||
	CKM_SSL3_PRE_MASTER_KEY_GEN          = 0x00000370
 | 
			
		||||
	CKM_SSL3_MASTER_KEY_DERIVE           = 0x00000371
 | 
			
		||||
	CKM_SSL3_KEY_AND_MAC_DERIVE          = 0x00000372
 | 
			
		||||
	CKM_SSL3_MASTER_KEY_DERIVE_DH        = 0x00000373
 | 
			
		||||
	CKM_TLS_PRE_MASTER_KEY_GEN           = 0x00000374
 | 
			
		||||
	CKM_TLS_MASTER_KEY_DERIVE            = 0x00000375
 | 
			
		||||
	CKM_TLS_KEY_AND_MAC_DERIVE           = 0x00000376
 | 
			
		||||
	CKM_TLS_MASTER_KEY_DERIVE_DH         = 0x00000377
 | 
			
		||||
	CKM_TLS_PRF                          = 0x00000378
 | 
			
		||||
	CKM_SSL3_MD5_MAC                     = 0x00000380
 | 
			
		||||
	CKM_SSL3_SHA1_MAC                    = 0x00000381
 | 
			
		||||
	CKM_MD5_KEY_DERIVATION               = 0x00000390
 | 
			
		||||
	CKM_MD2_KEY_DERIVATION               = 0x00000391
 | 
			
		||||
	CKM_SHA1_KEY_DERIVATION              = 0x00000392
 | 
			
		||||
	CKM_SHA256_KEY_DERIVATION            = 0x00000393
 | 
			
		||||
	CKM_SHA384_KEY_DERIVATION            = 0x00000394
 | 
			
		||||
	CKM_SHA512_KEY_DERIVATION            = 0x00000395
 | 
			
		||||
	CKM_SHA224_KEY_DERIVATION            = 0x00000396
 | 
			
		||||
	CKM_SHA3_256_KEY_DERIVE              = 0x00000397
 | 
			
		||||
	CKM_SHA3_224_KEY_DERIVE              = 0x00000398
 | 
			
		||||
	CKM_SHA3_384_KEY_DERIVE              = 0x00000399
 | 
			
		||||
	CKM_SHA3_512_KEY_DERIVE              = 0x0000039A
 | 
			
		||||
	CKM_SHAKE_128_KEY_DERIVE             = 0x0000039B
 | 
			
		||||
	CKM_SHAKE_256_KEY_DERIVE             = 0x0000039C
 | 
			
		||||
	CKM_PBE_MD2_DES_CBC                  = 0x000003A0
 | 
			
		||||
	CKM_PBE_MD5_DES_CBC                  = 0x000003A1
 | 
			
		||||
	CKM_PBE_MD5_CAST_CBC                 = 0x000003A2
 | 
			
		||||
	CKM_PBE_MD5_CAST3_CBC                = 0x000003A3
 | 
			
		||||
	CKM_PBE_MD5_CAST5_CBC                = 0x000003A4 // Deprecated
 | 
			
		||||
	CKM_PBE_MD5_CAST128_CBC              = 0x000003A4
 | 
			
		||||
	CKM_PBE_SHA1_CAST5_CBC               = 0x000003A5 // Deprecated
 | 
			
		||||
	CKM_PBE_SHA1_CAST128_CBC             = 0x000003A5
 | 
			
		||||
	CKM_PBE_SHA1_RC4_128                 = 0x000003A6
 | 
			
		||||
	CKM_PBE_SHA1_RC4_40                  = 0x000003A7
 | 
			
		||||
	CKM_PBE_SHA1_DES3_EDE_CBC            = 0x000003A8
 | 
			
		||||
	CKM_PBE_SHA1_DES2_EDE_CBC            = 0x000003A9
 | 
			
		||||
	CKM_PBE_SHA1_RC2_128_CBC             = 0x000003AA
 | 
			
		||||
	CKM_PBE_SHA1_RC2_40_CBC              = 0x000003AB
 | 
			
		||||
	CKM_PKCS5_PBKD2                      = 0x000003B0
 | 
			
		||||
	CKM_PBA_SHA1_WITH_SHA1_HMAC          = 0x000003C0
 | 
			
		||||
	CKM_WTLS_PRE_MASTER_KEY_GEN          = 0x000003D0
 | 
			
		||||
	CKM_WTLS_MASTER_KEY_DERIVE           = 0x000003D1
 | 
			
		||||
	CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC    = 0x000003D2
 | 
			
		||||
	CKM_WTLS_PRF                         = 0x000003D3
 | 
			
		||||
	CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE   = 0x000003D4
 | 
			
		||||
	CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE   = 0x000003D5
 | 
			
		||||
	CKM_TLS10_MAC_SERVER                 = 0x000003D6
 | 
			
		||||
	CKM_TLS10_MAC_CLIENT                 = 0x000003D7
 | 
			
		||||
	CKM_TLS12_MAC                        = 0x000003D8
 | 
			
		||||
	CKM_TLS12_KDF                        = 0x000003D9
 | 
			
		||||
	CKM_TLS12_MASTER_KEY_DERIVE          = 0x000003E0
 | 
			
		||||
	CKM_TLS12_KEY_AND_MAC_DERIVE         = 0x000003E1
 | 
			
		||||
	CKM_TLS12_MASTER_KEY_DERIVE_DH       = 0x000003E2
 | 
			
		||||
	CKM_TLS12_KEY_SAFE_DERIVE            = 0x000003E3
 | 
			
		||||
	CKM_TLS_MAC                          = 0x000003E4
 | 
			
		||||
	CKM_TLS_KDF                          = 0x000003E5
 | 
			
		||||
	CKM_KEY_WRAP_LYNKS                   = 0x00000400
 | 
			
		||||
	CKM_KEY_WRAP_SET_OAEP                = 0x00000401
 | 
			
		||||
	CKM_CMS_SIG                          = 0x00000500
 | 
			
		||||
	CKM_KIP_DERIVE                       = 0x00000510
 | 
			
		||||
	CKM_KIP_WRAP                         = 0x00000511
 | 
			
		||||
	CKM_KIP_MAC                          = 0x00000512
 | 
			
		||||
	CKM_CAMELLIA_KEY_GEN                 = 0x00000550
 | 
			
		||||
	CKM_CAMELLIA_ECB                     = 0x00000551
 | 
			
		||||
	CKM_CAMELLIA_CBC                     = 0x00000552
 | 
			
		||||
	CKM_CAMELLIA_MAC                     = 0x00000553
 | 
			
		||||
	CKM_CAMELLIA_MAC_GENERAL             = 0x00000554
 | 
			
		||||
	CKM_CAMELLIA_CBC_PAD                 = 0x00000555
 | 
			
		||||
	CKM_CAMELLIA_ECB_ENCRYPT_DATA        = 0x00000556
 | 
			
		||||
	CKM_CAMELLIA_CBC_ENCRYPT_DATA        = 0x00000557
 | 
			
		||||
	CKM_CAMELLIA_CTR                     = 0x00000558
 | 
			
		||||
	CKM_ARIA_KEY_GEN                     = 0x00000560
 | 
			
		||||
	CKM_ARIA_ECB                         = 0x00000561
 | 
			
		||||
	CKM_ARIA_CBC                         = 0x00000562
 | 
			
		||||
	CKM_ARIA_MAC                         = 0x00000563
 | 
			
		||||
	CKM_ARIA_MAC_GENERAL                 = 0x00000564
 | 
			
		||||
	CKM_ARIA_CBC_PAD                     = 0x00000565
 | 
			
		||||
	CKM_ARIA_ECB_ENCRYPT_DATA            = 0x00000566
 | 
			
		||||
	CKM_ARIA_CBC_ENCRYPT_DATA            = 0x00000567
 | 
			
		||||
	CKM_SEED_KEY_GEN                     = 0x00000650
 | 
			
		||||
	CKM_SEED_ECB                         = 0x00000651
 | 
			
		||||
	CKM_SEED_CBC                         = 0x00000652
 | 
			
		||||
	CKM_SEED_MAC                         = 0x00000653
 | 
			
		||||
	CKM_SEED_MAC_GENERAL                 = 0x00000654
 | 
			
		||||
	CKM_SEED_CBC_PAD                     = 0x00000655
 | 
			
		||||
	CKM_SEED_ECB_ENCRYPT_DATA            = 0x00000656
 | 
			
		||||
	CKM_SEED_CBC_ENCRYPT_DATA            = 0x00000657
 | 
			
		||||
	CKM_SKIPJACK_KEY_GEN                 = 0x00001000
 | 
			
		||||
	CKM_SKIPJACK_ECB64                   = 0x00001001
 | 
			
		||||
	CKM_SKIPJACK_CBC64                   = 0x00001002
 | 
			
		||||
	CKM_SKIPJACK_OFB64                   = 0x00001003
 | 
			
		||||
	CKM_SKIPJACK_CFB64                   = 0x00001004
 | 
			
		||||
	CKM_SKIPJACK_CFB32                   = 0x00001005
 | 
			
		||||
	CKM_SKIPJACK_CFB16                   = 0x00001006
 | 
			
		||||
	CKM_SKIPJACK_CFB8                    = 0x00001007
 | 
			
		||||
	CKM_SKIPJACK_WRAP                    = 0x00001008
 | 
			
		||||
	CKM_SKIPJACK_PRIVATE_WRAP            = 0x00001009
 | 
			
		||||
	CKM_SKIPJACK_RELAYX                  = 0x0000100a
 | 
			
		||||
	CKM_KEA_KEY_PAIR_GEN                 = 0x00001010
 | 
			
		||||
	CKM_KEA_KEY_DERIVE                   = 0x00001011
 | 
			
		||||
	CKM_KEA_DERIVE                       = 0x00001012
 | 
			
		||||
	CKM_FORTEZZA_TIMESTAMP               = 0x00001020
 | 
			
		||||
	CKM_BATON_KEY_GEN                    = 0x00001030
 | 
			
		||||
	CKM_BATON_ECB128                     = 0x00001031
 | 
			
		||||
	CKM_BATON_ECB96                      = 0x00001032
 | 
			
		||||
	CKM_BATON_CBC128                     = 0x00001033
 | 
			
		||||
	CKM_BATON_COUNTER                    = 0x00001034
 | 
			
		||||
	CKM_BATON_SHUFFLE                    = 0x00001035
 | 
			
		||||
	CKM_BATON_WRAP                       = 0x00001036
 | 
			
		||||
	CKM_ECDSA_KEY_PAIR_GEN               = 0x00001040 // Deprecated
 | 
			
		||||
	CKM_EC_KEY_PAIR_GEN                  = 0x00001040
 | 
			
		||||
	CKM_ECDSA                            = 0x00001041
 | 
			
		||||
	CKM_ECDSA_SHA1                       = 0x00001042
 | 
			
		||||
	CKM_ECDSA_SHA224                     = 0x00001043
 | 
			
		||||
	CKM_ECDSA_SHA256                     = 0x00001044
 | 
			
		||||
	CKM_ECDSA_SHA384                     = 0x00001045
 | 
			
		||||
	CKM_ECDSA_SHA512                     = 0x00001046
 | 
			
		||||
	CKM_ECDH1_DERIVE                     = 0x00001050
 | 
			
		||||
	CKM_ECDH1_COFACTOR_DERIVE            = 0x00001051
 | 
			
		||||
	CKM_ECMQV_DERIVE                     = 0x00001052
 | 
			
		||||
	CKM_ECDH_AES_KEY_WRAP                = 0x00001053
 | 
			
		||||
	CKM_RSA_AES_KEY_WRAP                 = 0x00001054
 | 
			
		||||
	CKM_JUNIPER_KEY_GEN                  = 0x00001060
 | 
			
		||||
	CKM_JUNIPER_ECB128                   = 0x00001061
 | 
			
		||||
	CKM_JUNIPER_CBC128                   = 0x00001062
 | 
			
		||||
	CKM_JUNIPER_COUNTER                  = 0x00001063
 | 
			
		||||
	CKM_JUNIPER_SHUFFLE                  = 0x00001064
 | 
			
		||||
	CKM_JUNIPER_WRAP                     = 0x00001065
 | 
			
		||||
	CKM_FASTHASH                         = 0x00001070
 | 
			
		||||
	CKM_AES_KEY_GEN                      = 0x00001080
 | 
			
		||||
	CKM_AES_ECB                          = 0x00001081
 | 
			
		||||
	CKM_AES_CBC                          = 0x00001082
 | 
			
		||||
	CKM_AES_MAC                          = 0x00001083
 | 
			
		||||
	CKM_AES_MAC_GENERAL                  = 0x00001084
 | 
			
		||||
	CKM_AES_CBC_PAD                      = 0x00001085
 | 
			
		||||
	CKM_AES_CTR                          = 0x00001086
 | 
			
		||||
	CKM_AES_GCM                          = 0x00001087
 | 
			
		||||
	CKM_AES_CCM                          = 0x00001088
 | 
			
		||||
	CKM_AES_CTS                          = 0x00001089
 | 
			
		||||
	CKM_AES_CMAC                         = 0x0000108A
 | 
			
		||||
	CKM_AES_CMAC_GENERAL                 = 0x0000108B
 | 
			
		||||
	CKM_AES_XCBC_MAC                     = 0x0000108C
 | 
			
		||||
	CKM_AES_XCBC_MAC_96                  = 0x0000108D
 | 
			
		||||
	CKM_AES_GMAC                         = 0x0000108E
 | 
			
		||||
	CKM_BLOWFISH_KEY_GEN                 = 0x00001090
 | 
			
		||||
	CKM_BLOWFISH_CBC                     = 0x00001091
 | 
			
		||||
	CKM_TWOFISH_KEY_GEN                  = 0x00001092
 | 
			
		||||
	CKM_TWOFISH_CBC                      = 0x00001093
 | 
			
		||||
	CKM_BLOWFISH_CBC_PAD                 = 0x00001094
 | 
			
		||||
	CKM_TWOFISH_CBC_PAD                  = 0x00001095
 | 
			
		||||
	CKM_DES_ECB_ENCRYPT_DATA             = 0x00001100
 | 
			
		||||
	CKM_DES_CBC_ENCRYPT_DATA             = 0x00001101
 | 
			
		||||
	CKM_DES3_ECB_ENCRYPT_DATA            = 0x00001102
 | 
			
		||||
	CKM_DES3_CBC_ENCRYPT_DATA            = 0x00001103
 | 
			
		||||
	CKM_AES_ECB_ENCRYPT_DATA             = 0x00001104
 | 
			
		||||
	CKM_AES_CBC_ENCRYPT_DATA             = 0x00001105
 | 
			
		||||
	CKM_GOSTR3410_KEY_PAIR_GEN           = 0x00001200
 | 
			
		||||
	CKM_GOSTR3410                        = 0x00001201
 | 
			
		||||
	CKM_GOSTR3410_WITH_GOSTR3411         = 0x00001202
 | 
			
		||||
	CKM_GOSTR3410_KEY_WRAP               = 0x00001203
 | 
			
		||||
	CKM_GOSTR3410_DERIVE                 = 0x00001204
 | 
			
		||||
	CKM_GOSTR3411                        = 0x00001210
 | 
			
		||||
	CKM_GOSTR3411_HMAC                   = 0x00001211
 | 
			
		||||
	CKM_GOST28147_KEY_GEN                = 0x00001220
 | 
			
		||||
	CKM_GOST28147_ECB                    = 0x00001221
 | 
			
		||||
	CKM_GOST28147                        = 0x00001222
 | 
			
		||||
	CKM_GOST28147_MAC                    = 0x00001223
 | 
			
		||||
	CKM_GOST28147_KEY_WRAP               = 0x00001224
 | 
			
		||||
	CKM_DSA_PARAMETER_GEN                = 0x00002000
 | 
			
		||||
	CKM_DH_PKCS_PARAMETER_GEN            = 0x00002001
 | 
			
		||||
	CKM_X9_42_DH_PARAMETER_GEN           = 0x00002002
 | 
			
		||||
	CKM_DSA_PROBABLISTIC_PARAMETER_GEN   = 0x00002003
 | 
			
		||||
	CKM_DSA_SHAWE_TAYLOR_PARAMETER_GEN   = 0x00002004
 | 
			
		||||
	CKM_AES_OFB                          = 0x00002104
 | 
			
		||||
	CKM_AES_CFB64                        = 0x00002105
 | 
			
		||||
	CKM_AES_CFB8                         = 0x00002106
 | 
			
		||||
	CKM_AES_CFB128                       = 0x00002107
 | 
			
		||||
	CKM_AES_CFB1                         = 0x00002108
 | 
			
		||||
	CKM_AES_KEY_WRAP                     = 0x00002109
 | 
			
		||||
	CKM_AES_KEY_WRAP_PAD                 = 0x0000210A
 | 
			
		||||
	CKM_RSA_PKCS_TPM_1_1                 = 0x00004001
 | 
			
		||||
	CKM_RSA_PKCS_OAEP_TPM_1_1            = 0x00004002
 | 
			
		||||
	CKM_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CKF_HW                               = 0x00000001
 | 
			
		||||
	CKF_ENCRYPT                          = 0x00000100
 | 
			
		||||
	CKF_DECRYPT                          = 0x00000200
 | 
			
		||||
	CKF_DIGEST                           = 0x00000400
 | 
			
		||||
	CKF_SIGN                             = 0x00000800
 | 
			
		||||
	CKF_SIGN_RECOVER                     = 0x00001000
 | 
			
		||||
	CKF_VERIFY                           = 0x00002000
 | 
			
		||||
	CKF_VERIFY_RECOVER                   = 0x00004000
 | 
			
		||||
	CKF_GENERATE                         = 0x00008000
 | 
			
		||||
	CKF_GENERATE_KEY_PAIR                = 0x00010000
 | 
			
		||||
	CKF_WRAP                             = 0x00020000
 | 
			
		||||
	CKF_UNWRAP                           = 0x00040000
 | 
			
		||||
	CKF_DERIVE                           = 0x00080000
 | 
			
		||||
	CKF_EC_F_P                           = 0x00100000
 | 
			
		||||
	CKF_EC_F_2M                          = 0x00200000
 | 
			
		||||
	CKF_EC_ECPARAMETERS                  = 0x00400000
 | 
			
		||||
	CKF_EC_NAMEDCURVE                    = 0x00800000
 | 
			
		||||
	CKF_EC_UNCOMPRESS                    = 0x01000000
 | 
			
		||||
	CKF_EC_COMPRESS                      = 0x02000000
 | 
			
		||||
	CKF_EXTENSION                        = 0x80000000
 | 
			
		||||
	CKR_OK                               = 0x00000000
 | 
			
		||||
	CKR_CANCEL                           = 0x00000001
 | 
			
		||||
	CKR_HOST_MEMORY                      = 0x00000002
 | 
			
		||||
	CKR_SLOT_ID_INVALID                  = 0x00000003
 | 
			
		||||
	CKR_GENERAL_ERROR                    = 0x00000005
 | 
			
		||||
	CKR_FUNCTION_FAILED                  = 0x00000006
 | 
			
		||||
	CKR_ARGUMENTS_BAD                    = 0x00000007
 | 
			
		||||
	CKR_NO_EVENT                         = 0x00000008
 | 
			
		||||
	CKR_NEED_TO_CREATE_THREADS           = 0x00000009
 | 
			
		||||
	CKR_CANT_LOCK                        = 0x0000000A
 | 
			
		||||
	CKR_ATTRIBUTE_READ_ONLY              = 0x00000010
 | 
			
		||||
	CKR_ATTRIBUTE_SENSITIVE              = 0x00000011
 | 
			
		||||
	CKR_ATTRIBUTE_TYPE_INVALID           = 0x00000012
 | 
			
		||||
	CKR_ATTRIBUTE_VALUE_INVALID          = 0x00000013
 | 
			
		||||
	CKR_ACTION_PROHIBITED                = 0x0000001B
 | 
			
		||||
	CKR_DATA_INVALID                     = 0x00000020
 | 
			
		||||
	CKR_DATA_LEN_RANGE                   = 0x00000021
 | 
			
		||||
	CKR_DEVICE_ERROR                     = 0x00000030
 | 
			
		||||
	CKR_DEVICE_MEMORY                    = 0x00000031
 | 
			
		||||
	CKR_DEVICE_REMOVED                   = 0x00000032
 | 
			
		||||
	CKR_ENCRYPTED_DATA_INVALID           = 0x00000040
 | 
			
		||||
	CKR_ENCRYPTED_DATA_LEN_RANGE         = 0x00000041
 | 
			
		||||
	CKR_FUNCTION_CANCELED                = 0x00000050
 | 
			
		||||
	CKR_FUNCTION_NOT_PARALLEL            = 0x00000051
 | 
			
		||||
	CKR_FUNCTION_NOT_SUPPORTED           = 0x00000054
 | 
			
		||||
	CKR_KEY_HANDLE_INVALID               = 0x00000060
 | 
			
		||||
	CKR_KEY_SIZE_RANGE                   = 0x00000062
 | 
			
		||||
	CKR_KEY_TYPE_INCONSISTENT            = 0x00000063
 | 
			
		||||
	CKR_KEY_NOT_NEEDED                   = 0x00000064
 | 
			
		||||
	CKR_KEY_CHANGED                      = 0x00000065
 | 
			
		||||
	CKR_KEY_NEEDED                       = 0x00000066
 | 
			
		||||
	CKR_KEY_INDIGESTIBLE                 = 0x00000067
 | 
			
		||||
	CKR_KEY_FUNCTION_NOT_PERMITTED       = 0x00000068
 | 
			
		||||
	CKR_KEY_NOT_WRAPPABLE                = 0x00000069
 | 
			
		||||
	CKR_KEY_UNEXTRACTABLE                = 0x0000006A
 | 
			
		||||
	CKR_MECHANISM_INVALID                = 0x00000070
 | 
			
		||||
	CKR_MECHANISM_PARAM_INVALID          = 0x00000071
 | 
			
		||||
	CKR_OBJECT_HANDLE_INVALID            = 0x00000082
 | 
			
		||||
	CKR_OPERATION_ACTIVE                 = 0x00000090
 | 
			
		||||
	CKR_OPERATION_NOT_INITIALIZED        = 0x00000091
 | 
			
		||||
	CKR_PIN_INCORRECT                    = 0x000000A0
 | 
			
		||||
	CKR_PIN_INVALID                      = 0x000000A1
 | 
			
		||||
	CKR_PIN_LEN_RANGE                    = 0x000000A2
 | 
			
		||||
	CKR_PIN_EXPIRED                      = 0x000000A3
 | 
			
		||||
	CKR_PIN_LOCKED                       = 0x000000A4
 | 
			
		||||
	CKR_SESSION_CLOSED                   = 0x000000B0
 | 
			
		||||
	CKR_SESSION_COUNT                    = 0x000000B1
 | 
			
		||||
	CKR_SESSION_HANDLE_INVALID           = 0x000000B3
 | 
			
		||||
	CKR_SESSION_PARALLEL_NOT_SUPPORTED   = 0x000000B4
 | 
			
		||||
	CKR_SESSION_READ_ONLY                = 0x000000B5
 | 
			
		||||
	CKR_SESSION_EXISTS                   = 0x000000B6
 | 
			
		||||
	CKR_SESSION_READ_ONLY_EXISTS         = 0x000000B7
 | 
			
		||||
	CKR_SESSION_READ_WRITE_SO_EXISTS     = 0x000000B8
 | 
			
		||||
	CKR_SIGNATURE_INVALID                = 0x000000C0
 | 
			
		||||
	CKR_SIGNATURE_LEN_RANGE              = 0x000000C1
 | 
			
		||||
	CKR_TEMPLATE_INCOMPLETE              = 0x000000D0
 | 
			
		||||
	CKR_TEMPLATE_INCONSISTENT            = 0x000000D1
 | 
			
		||||
	CKR_TOKEN_NOT_PRESENT                = 0x000000E0
 | 
			
		||||
	CKR_TOKEN_NOT_RECOGNIZED             = 0x000000E1
 | 
			
		||||
	CKR_TOKEN_WRITE_PROTECTED            = 0x000000E2
 | 
			
		||||
	CKR_UNWRAPPING_KEY_HANDLE_INVALID    = 0x000000F0
 | 
			
		||||
	CKR_UNWRAPPING_KEY_SIZE_RANGE        = 0x000000F1
 | 
			
		||||
	CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT = 0x000000F2
 | 
			
		||||
	CKR_USER_ALREADY_LOGGED_IN           = 0x00000100
 | 
			
		||||
	CKR_USER_NOT_LOGGED_IN               = 0x00000101
 | 
			
		||||
	CKR_USER_PIN_NOT_INITIALIZED         = 0x00000102
 | 
			
		||||
	CKR_USER_TYPE_INVALID                = 0x00000103
 | 
			
		||||
	CKR_USER_ANOTHER_ALREADY_LOGGED_IN   = 0x00000104
 | 
			
		||||
	CKR_USER_TOO_MANY_TYPES              = 0x00000105
 | 
			
		||||
	CKR_WRAPPED_KEY_INVALID              = 0x00000110
 | 
			
		||||
	CKR_WRAPPED_KEY_LEN_RANGE            = 0x00000112
 | 
			
		||||
	CKR_WRAPPING_KEY_HANDLE_INVALID      = 0x00000113
 | 
			
		||||
	CKR_WRAPPING_KEY_SIZE_RANGE          = 0x00000114
 | 
			
		||||
	CKR_WRAPPING_KEY_TYPE_INCONSISTENT   = 0x00000115
 | 
			
		||||
	CKR_RANDOM_SEED_NOT_SUPPORTED        = 0x00000120
 | 
			
		||||
	CKR_RANDOM_NO_RNG                    = 0x00000121
 | 
			
		||||
	CKR_DOMAIN_PARAMS_INVALID            = 0x00000130
 | 
			
		||||
	CKR_CURVE_NOT_SUPPORTED              = 0x00000140
 | 
			
		||||
	CKR_BUFFER_TOO_SMALL                 = 0x00000150
 | 
			
		||||
	CKR_SAVED_STATE_INVALID              = 0x00000160
 | 
			
		||||
	CKR_INFORMATION_SENSITIVE            = 0x00000170
 | 
			
		||||
	CKR_STATE_UNSAVEABLE                 = 0x00000180
 | 
			
		||||
	CKR_CRYPTOKI_NOT_INITIALIZED         = 0x00000190
 | 
			
		||||
	CKR_CRYPTOKI_ALREADY_INITIALIZED     = 0x00000191
 | 
			
		||||
	CKR_MUTEX_BAD                        = 0x000001A0
 | 
			
		||||
	CKR_MUTEX_NOT_LOCKED                 = 0x000001A1
 | 
			
		||||
	CKR_NEW_PIN_MODE                     = 0x000001B0
 | 
			
		||||
	CKR_NEXT_OTP                         = 0x000001B1
 | 
			
		||||
	CKR_EXCEEDED_MAX_ITERATIONS          = 0x000001B5
 | 
			
		||||
	CKR_FIPS_SELF_TEST_FAILED            = 0x000001B6
 | 
			
		||||
	CKR_LIBRARY_LOAD_FAILED              = 0x000001B7
 | 
			
		||||
	CKR_PIN_TOO_WEAK                     = 0x000001B8
 | 
			
		||||
	CKR_PUBLIC_KEY_INVALID               = 0x000001B9
 | 
			
		||||
	CKR_FUNCTION_REJECTED                = 0x00000200
 | 
			
		||||
	CKR_VENDOR_DEFINED                   = 0x80000000
 | 
			
		||||
	CKF_LIBRARY_CANT_CREATE_OS_THREADS   = 0x00000001
 | 
			
		||||
	CKF_OS_LOCKING_OK                    = 0x00000002
 | 
			
		||||
	CKF_DONT_BLOCK                       = 1
 | 
			
		||||
	CKG_MGF1_SHA1                        = 0x00000001
 | 
			
		||||
	CKG_MGF1_SHA256                      = 0x00000002
 | 
			
		||||
	CKG_MGF1_SHA384                      = 0x00000003
 | 
			
		||||
	CKG_MGF1_SHA512                      = 0x00000004
 | 
			
		||||
	CKG_MGF1_SHA224                      = 0x00000005
 | 
			
		||||
	CKZ_DATA_SPECIFIED                   = 0x00000001
 | 
			
		||||
	CKD_NULL                             = 0x00000001
 | 
			
		||||
	CKD_SHA1_KDF                         = 0x00000002
 | 
			
		||||
	CKD_SHA1_KDF_ASN1                    = 0x00000003
 | 
			
		||||
	CKD_SHA1_KDF_CONCATENATE             = 0x00000004
 | 
			
		||||
	CKD_SHA224_KDF                       = 0x00000005
 | 
			
		||||
	CKD_SHA256_KDF                       = 0x00000006
 | 
			
		||||
	CKD_SHA384_KDF                       = 0x00000007
 | 
			
		||||
	CKD_SHA512_KDF                       = 0x00000008
 | 
			
		||||
	CKD_CPDIVERSIFY_KDF                  = 0x00000009
 | 
			
		||||
	CKD_SHA3_224_KDF                     = 0x0000000A
 | 
			
		||||
	CKD_SHA3_256_KDF                     = 0x0000000B
 | 
			
		||||
	CKD_SHA3_384_KDF                     = 0x0000000C
 | 
			
		||||
	CKD_SHA3_512_KDF                     = 0x0000000D
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA1            = 0x00000001
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_GOSTR3411       = 0x00000002
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA224          = 0x00000003
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA256          = 0x00000004
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA384          = 0x00000005
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA512          = 0x00000006
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA512_224      = 0x00000007
 | 
			
		||||
	CKP_PKCS5_PBKD2_HMAC_SHA512_256      = 0x00000008
 | 
			
		||||
	CKZ_SALT_SPECIFIED                   = 0x00000001
 | 
			
		||||
	CK_OTP_VALUE                         = 0
 | 
			
		||||
	CK_OTP_PIN                           = 1
 | 
			
		||||
	CK_OTP_CHALLENGE                     = 2
 | 
			
		||||
	CK_OTP_TIME                          = 3
 | 
			
		||||
	CK_OTP_COUNTER                       = 4
 | 
			
		||||
	CK_OTP_FLAGS                         = 5
 | 
			
		||||
	CK_OTP_OUTPUT_LENGTH                 = 6
 | 
			
		||||
	CK_OTP_OUTPUT_FORMAT                 = 7
 | 
			
		||||
	CKF_NEXT_OTP                         = 0x00000001
 | 
			
		||||
	CKF_EXCLUDE_TIME                     = 0x00000002
 | 
			
		||||
	CKF_EXCLUDE_COUNTER                  = 0x00000004
 | 
			
		||||
	CKF_EXCLUDE_CHALLENGE                = 0x00000008
 | 
			
		||||
	CKF_EXCLUDE_PIN                      = 0x00000010
 | 
			
		||||
	CKF_USER_FRIENDLY_OTP                = 0x00000020
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,2 +0,0 @@
 | 
			
		||||
*~
 | 
			
		||||
pkcs11uri
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
			
		||||
dist: bionic
 | 
			
		||||
language: go
 | 
			
		||||
 | 
			
		||||
os:
 | 
			
		||||
- linux
 | 
			
		||||
 | 
			
		||||
go:
 | 
			
		||||
  - "1.13.x"
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
  include:
 | 
			
		||||
    - os: linux
 | 
			
		||||
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    packages:
 | 
			
		||||
      - softhsm2
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - make
 | 
			
		||||
  - make check
 | 
			
		||||
  - make test
 | 
			
		||||
							
								
								
									
										177
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										177
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,177 +0,0 @@
 | 
			
		||||
 | 
			
		||||
                                 Apache License
 | 
			
		||||
                           Version 2.0, January 2004
 | 
			
		||||
                        https://www.apache.org/licenses/
 | 
			
		||||
 | 
			
		||||
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
			
		||||
 | 
			
		||||
   1. Definitions.
 | 
			
		||||
 | 
			
		||||
      "License" shall mean the terms and conditions for use, reproduction,
 | 
			
		||||
      and distribution as defined by Sections 1 through 9 of this document.
 | 
			
		||||
 | 
			
		||||
      "Licensor" shall mean the copyright owner or entity authorized by
 | 
			
		||||
      the copyright owner that is granting the License.
 | 
			
		||||
 | 
			
		||||
      "Legal Entity" shall mean the union of the acting entity and all
 | 
			
		||||
      other entities that control, are controlled by, or are under common
 | 
			
		||||
      control with that entity. For the purposes of this definition,
 | 
			
		||||
      "control" means (i) the power, direct or indirect, to cause the
 | 
			
		||||
      direction or management of such entity, whether by contract or
 | 
			
		||||
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
			
		||||
      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
			
		||||
 | 
			
		||||
      "You" (or "Your") shall mean an individual or Legal Entity
 | 
			
		||||
      exercising permissions granted by this License.
 | 
			
		||||
 | 
			
		||||
      "Source" form shall mean the preferred form for making modifications,
 | 
			
		||||
      including but not limited to software source code, documentation
 | 
			
		||||
      source, and configuration files.
 | 
			
		||||
 | 
			
		||||
      "Object" form shall mean any form resulting from mechanical
 | 
			
		||||
      transformation or translation of a Source form, including but
 | 
			
		||||
      not limited to compiled object code, generated documentation,
 | 
			
		||||
      and conversions to other media types.
 | 
			
		||||
 | 
			
		||||
      "Work" shall mean the work of authorship, whether in Source or
 | 
			
		||||
      Object form, made available under the License, as indicated by a
 | 
			
		||||
      copyright notice that is included in or attached to the work
 | 
			
		||||
      (an example is provided in the Appendix below).
 | 
			
		||||
 | 
			
		||||
      "Derivative Works" shall mean any work, whether in Source or Object
 | 
			
		||||
      form, that is based on (or derived from) the Work and for which the
 | 
			
		||||
      editorial revisions, annotations, elaborations, or other modifications
 | 
			
		||||
      represent, as a whole, an original work of authorship. For the purposes
 | 
			
		||||
      of this License, Derivative Works shall not include works that remain
 | 
			
		||||
      separable from, or merely link (or bind by name) to the interfaces of,
 | 
			
		||||
      the Work and Derivative Works thereof.
 | 
			
		||||
 | 
			
		||||
      "Contribution" shall mean any work of authorship, including
 | 
			
		||||
      the original version of the Work and any modifications or additions
 | 
			
		||||
      to that Work or Derivative Works thereof, that is intentionally
 | 
			
		||||
      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
			
		||||
      or by an individual or Legal Entity authorized to submit on behalf of
 | 
			
		||||
      the copyright owner. For the purposes of this definition, "submitted"
 | 
			
		||||
      means any form of electronic, verbal, or written communication sent
 | 
			
		||||
      to the Licensor or its representatives, including but not limited to
 | 
			
		||||
      communication on electronic mailing lists, source code control systems,
 | 
			
		||||
      and issue tracking systems that are managed by, or on behalf of, the
 | 
			
		||||
      Licensor for the purpose of discussing and improving the Work, but
 | 
			
		||||
      excluding communication that is conspicuously marked or otherwise
 | 
			
		||||
      designated in writing by the copyright owner as "Not a Contribution."
 | 
			
		||||
 | 
			
		||||
      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
			
		||||
      on behalf of whom a Contribution has been received by Licensor and
 | 
			
		||||
      subsequently incorporated within the Work.
 | 
			
		||||
 | 
			
		||||
   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      copyright license to reproduce, prepare Derivative Works of,
 | 
			
		||||
      publicly display, publicly perform, sublicense, and distribute the
 | 
			
		||||
      Work and such Derivative Works in Source or Object form.
 | 
			
		||||
 | 
			
		||||
   3. Grant of Patent License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      (except as stated in this section) patent license to make, have made,
 | 
			
		||||
      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
			
		||||
      where such license applies only to those patent claims licensable
 | 
			
		||||
      by such Contributor that are necessarily infringed by their
 | 
			
		||||
      Contribution(s) alone or by combination of their Contribution(s)
 | 
			
		||||
      with the Work to which such Contribution(s) was submitted. If You
 | 
			
		||||
      institute patent litigation against any entity (including a
 | 
			
		||||
      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
			
		||||
      or a Contribution incorporated within the Work constitutes direct
 | 
			
		||||
      or contributory patent infringement, then any patent licenses
 | 
			
		||||
      granted to You under this License for that Work shall terminate
 | 
			
		||||
      as of the date such litigation is filed.
 | 
			
		||||
 | 
			
		||||
   4. Redistribution. You may reproduce and distribute copies of the
 | 
			
		||||
      Work or Derivative Works thereof in any medium, with or without
 | 
			
		||||
      modifications, and in Source or Object form, provided that You
 | 
			
		||||
      meet the following conditions:
 | 
			
		||||
 | 
			
		||||
      (a) You must give any other recipients of the Work or
 | 
			
		||||
          Derivative Works a copy of this License; and
 | 
			
		||||
 | 
			
		||||
      (b) You must cause any modified files to carry prominent notices
 | 
			
		||||
          stating that You changed the files; and
 | 
			
		||||
 | 
			
		||||
      (c) You must retain, in the Source form of any Derivative Works
 | 
			
		||||
          that You distribute, all copyright, patent, trademark, and
 | 
			
		||||
          attribution notices from the Source form of the Work,
 | 
			
		||||
          excluding those notices that do not pertain to any part of
 | 
			
		||||
          the Derivative Works; and
 | 
			
		||||
 | 
			
		||||
      (d) If the Work includes a "NOTICE" text file as part of its
 | 
			
		||||
          distribution, then any Derivative Works that You distribute must
 | 
			
		||||
          include a readable copy of the attribution notices contained
 | 
			
		||||
          within such NOTICE file, excluding those notices that do not
 | 
			
		||||
          pertain to any part of the Derivative Works, in at least one
 | 
			
		||||
          of the following places: within a NOTICE text file distributed
 | 
			
		||||
          as part of the Derivative Works; within the Source form or
 | 
			
		||||
          documentation, if provided along with the Derivative Works; or,
 | 
			
		||||
          within a display generated by the Derivative Works, if and
 | 
			
		||||
          wherever such third-party notices normally appear. The contents
 | 
			
		||||
          of the NOTICE file are for informational purposes only and
 | 
			
		||||
          do not modify the License. You may add Your own attribution
 | 
			
		||||
          notices within Derivative Works that You distribute, alongside
 | 
			
		||||
          or as an addendum to the NOTICE text from the Work, provided
 | 
			
		||||
          that such additional attribution notices cannot be construed
 | 
			
		||||
          as modifying the License.
 | 
			
		||||
 | 
			
		||||
      You may add Your own copyright statement to Your modifications and
 | 
			
		||||
      may provide additional or different license terms and conditions
 | 
			
		||||
      for use, reproduction, or distribution of Your modifications, or
 | 
			
		||||
      for any such Derivative Works as a whole, provided Your use,
 | 
			
		||||
      reproduction, and distribution of the Work otherwise complies with
 | 
			
		||||
      the conditions stated in this License.
 | 
			
		||||
 | 
			
		||||
   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
			
		||||
      any Contribution intentionally submitted for inclusion in the Work
 | 
			
		||||
      by You to the Licensor shall be under the terms and conditions of
 | 
			
		||||
      this License, without any additional terms or conditions.
 | 
			
		||||
      Notwithstanding the above, nothing herein shall supersede or modify
 | 
			
		||||
      the terms of any separate license agreement you may have executed
 | 
			
		||||
      with Licensor regarding such Contributions.
 | 
			
		||||
 | 
			
		||||
   6. Trademarks. This License does not grant permission to use the trade
 | 
			
		||||
      names, trademarks, service marks, or product names of the Licensor,
 | 
			
		||||
      except as required for reasonable and customary use in describing the
 | 
			
		||||
      origin of the Work and reproducing the content of the NOTICE file.
 | 
			
		||||
 | 
			
		||||
   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
			
		||||
      agreed to in writing, Licensor provides the Work (and each
 | 
			
		||||
      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
			
		||||
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
			
		||||
      implied, including, without limitation, any warranties or conditions
 | 
			
		||||
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
			
		||||
      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
			
		||||
      appropriateness of using or redistributing the Work and assume any
 | 
			
		||||
      risks associated with Your exercise of permissions under this License.
 | 
			
		||||
 | 
			
		||||
   8. Limitation of Liability. In no event and under no legal theory,
 | 
			
		||||
      whether in tort (including negligence), contract, or otherwise,
 | 
			
		||||
      unless required by applicable law (such as deliberate and grossly
 | 
			
		||||
      negligent acts) or agreed to in writing, shall any Contributor be
 | 
			
		||||
      liable to You for damages, including any direct, indirect, special,
 | 
			
		||||
      incidental, or consequential damages of any character arising as a
 | 
			
		||||
      result of this License or out of the use or inability to use the
 | 
			
		||||
      Work (including but not limited to damages for loss of goodwill,
 | 
			
		||||
      work stoppage, computer failure or malfunction, or any and all
 | 
			
		||||
      other commercial damages or losses), even if such Contributor
 | 
			
		||||
      has been advised of the possibility of such damages.
 | 
			
		||||
 | 
			
		||||
   9. Accepting Warranty or Additional Liability. While redistributing
 | 
			
		||||
      the Work or Derivative Works thereof, You may choose to offer,
 | 
			
		||||
      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
			
		||||
      or other liability obligations and/or rights consistent with this
 | 
			
		||||
      License. However, in accepting such obligations, You may act only
 | 
			
		||||
      on Your own behalf and on Your sole responsibility, not on behalf
 | 
			
		||||
      of any other Contributor, and only if You agree to indemnify,
 | 
			
		||||
      defend, and hold each Contributor harmless for any liability
 | 
			
		||||
      incurred by, or claims asserted against, such Contributor by reason
 | 
			
		||||
      of your accepting any such warranty or additional liability.
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
							
								
								
									
										28
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,28 +0,0 @@
 | 
			
		||||
#   Copyright IBM Corporation, 2020
 | 
			
		||||
 | 
			
		||||
#   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
#   you may not use this file except in compliance with the License.
 | 
			
		||||
#   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
#       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
#   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
#   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
#   See the License for the specific language governing permissions and
 | 
			
		||||
#   limitations under the License.
 | 
			
		||||
 | 
			
		||||
.PHONY: check build test
 | 
			
		||||
 | 
			
		||||
all: build
 | 
			
		||||
 | 
			
		||||
FORCE:
 | 
			
		||||
 | 
			
		||||
check:
 | 
			
		||||
	golangci-lint run
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	go build ./...
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
	go test ./... -test.v
 | 
			
		||||
							
								
								
									
										102
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										102
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,102 +0,0 @@
 | 
			
		||||
# go-pkcs11uri
 | 
			
		||||
 | 
			
		||||
Welcome to the go-pkcs11uri library. The implementation follows [RFC 7512](https://tools.ietf.org/html/rfc7512) and this [errata](https://www.rfc-editor.org/errata/rfc7512).
 | 
			
		||||
 | 
			
		||||
# Exampe usage:
 | 
			
		||||
 | 
			
		||||
The following example builds on this library [here](https://github.com/miekg/pkcs11) and are using softhsm2 on Fedora.
 | 
			
		||||
 | 
			
		||||
## Example
 | 
			
		||||
 | 
			
		||||
This example program extending the one found [here](https://github.com/miekg/pkcs11/blob/master/README.md#examples):
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"github.com/miekg/pkcs11"
 | 
			
		||||
	pkcs11uri "github.com/stefanberger/go-pkcs11uri"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	if len(os.Args) < 2 {
 | 
			
		||||
		panic("Missing pkcs11 URI argument")
 | 
			
		||||
	}
 | 
			
		||||
	uristr := os.Args[1]
 | 
			
		||||
 | 
			
		||||
	uri, err := pkcs11uri.New()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	err = uri.Parse(uristr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	module, err := uri.GetModule()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	slot, ok := uri.GetPathAttribute("slot-id", false)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		panic("No slot-id in pkcs11 URI")
 | 
			
		||||
	}
 | 
			
		||||
	slotid, err := strconv.Atoi(slot)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pin, err := uri.GetPIN()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p := pkcs11.New(module)
 | 
			
		||||
	err = p.Initialize()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer p.Destroy()
 | 
			
		||||
	defer p.Finalize()
 | 
			
		||||
 | 
			
		||||
	session, err := p.OpenSession(uint(slotid), pkcs11.CKF_SERIAL_SESSION|pkcs11.CKF_RW_SESSION)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer p.CloseSession(session)
 | 
			
		||||
 | 
			
		||||
	err = p.Login(session, pkcs11.CKU_USER, pin)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	defer p.Logout(session)
 | 
			
		||||
 | 
			
		||||
	p.DigestInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_SHA_1, nil)})
 | 
			
		||||
	hash, err := p.Digest(session, []byte("this is a string"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, d := range hash {
 | 
			
		||||
		fmt.Printf("%x", d)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println()
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Exampe Usage
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ sudo softhsm2-util --init-token --slot 1 --label test --pin 1234 --so-pin 1234
 | 
			
		||||
The token has been initialized and is reassigned to slot 2053753261
 | 
			
		||||
$ go build ./...
 | 
			
		||||
$ sudo ./pkcs11-example 'pkcs11:slot-id=2053753261?module-path=/usr/lib64/pkcs11/libsofthsm2.so&pin-value=1234'
 | 
			
		||||
517592df8fec3ad146a79a9af153db2a4d784ec5
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										453
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/pkcs11uri.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										453
									
								
								vendor/github.com/stefanberger/go-pkcs11uri/pkcs11uri.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,453 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
   (c) Copyright IBM Corporation, 2020
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
package pkcs11uri
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Pkcs11URI holds a pkcs11 URI object
 | 
			
		||||
type Pkcs11URI struct {
 | 
			
		||||
	// path and query attributes may have custom attributes that either
 | 
			
		||||
	// have to be in the query or in the path part, so we use two maps
 | 
			
		||||
	pathAttributes  map[string]string
 | 
			
		||||
	queryAttributes map[string]string
 | 
			
		||||
	// directories to search for pkcs11 modules
 | 
			
		||||
	moduleDirectories []string
 | 
			
		||||
	// file paths of allowed pkcs11 modules
 | 
			
		||||
	allowedModulePaths []string
 | 
			
		||||
	// whether any module is allowed to be loaded
 | 
			
		||||
	allowAnyModule bool
 | 
			
		||||
	// A map of environment variables needed by the pkcs11 module using this URI.
 | 
			
		||||
	// This map is not needed by this implementation but is there for convenience.
 | 
			
		||||
	env map[string]string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// upper character hex digits needed for pct-encoding
 | 
			
		||||
const hex = "0123456789ABCDEF"
 | 
			
		||||
 | 
			
		||||
// escapeAll pct-escapes all characters in the string
 | 
			
		||||
func escapeAll(s string) string {
 | 
			
		||||
	res := make([]byte, len(s)*3)
 | 
			
		||||
	j := 0
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		c := s[i]
 | 
			
		||||
		res[j] = '%'
 | 
			
		||||
		res[j+1] = hex[c>>4]
 | 
			
		||||
		res[j+2] = hex[c&0xf]
 | 
			
		||||
		j += 3
 | 
			
		||||
	}
 | 
			
		||||
	return string(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// escape pct-escapes the path and query part of the pkcs11 URI following the different rules of the
 | 
			
		||||
// path and query part as decribed in RFC 7512 sec. 2.3
 | 
			
		||||
func escape(s string, isPath bool) string {
 | 
			
		||||
	res := make([]byte, len(s)*3)
 | 
			
		||||
	j := 0
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		c := s[i]
 | 
			
		||||
		// unreserved per RFC 3986 sec. 2.3
 | 
			
		||||
		if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') {
 | 
			
		||||
			res[j] = c
 | 
			
		||||
		} else if isPath && c == '&' {
 | 
			
		||||
			res[j] = c
 | 
			
		||||
		} else if !isPath && (c == '/' || c == '?' || c == '|') {
 | 
			
		||||
			res[j] = c
 | 
			
		||||
		} else {
 | 
			
		||||
			switch c {
 | 
			
		||||
			case '-', '.', '_', '~': // unreserved per RFC 3986 sec. 2.3
 | 
			
		||||
				res[j] = c
 | 
			
		||||
			case ':', '[', ']', '@', '!', '$', '\'', '(', ')', '*', '+', ',', '=':
 | 
			
		||||
				res[j] = c
 | 
			
		||||
			default:
 | 
			
		||||
				res[j] = '%'
 | 
			
		||||
				res[j+1] = hex[c>>4]
 | 
			
		||||
				res[j+2] = hex[c&0xf]
 | 
			
		||||
				j += 2
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		j++
 | 
			
		||||
	}
 | 
			
		||||
	return string(res[:j])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// New creates a new Pkcs11URI object
 | 
			
		||||
func New() *Pkcs11URI {
 | 
			
		||||
	return &Pkcs11URI{
 | 
			
		||||
		pathAttributes:  make(map[string]string),
 | 
			
		||||
		queryAttributes: make(map[string]string),
 | 
			
		||||
		env:             make(map[string]string),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (uri *Pkcs11URI) setAttribute(attrMap map[string]string, name, value string) error {
 | 
			
		||||
	v, err := url.PathUnescape(value)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	attrMap[name] = v
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetPathAttribute returns the value of a path attribute in unescaped form or
 | 
			
		||||
// pct-encoded form
 | 
			
		||||
func (uri *Pkcs11URI) GetPathAttribute(name string, pctencode bool) (string, bool) {
 | 
			
		||||
	v, ok := uri.pathAttributes[name]
 | 
			
		||||
	if ok && pctencode {
 | 
			
		||||
		v = escape(v, true)
 | 
			
		||||
	}
 | 
			
		||||
	return v, ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetPathAttribute sets the value for a path attribute; this function may return an error
 | 
			
		||||
// if the given value cannot be pct-unescaped
 | 
			
		||||
func (uri *Pkcs11URI) SetPathAttribute(name, value string) error {
 | 
			
		||||
	return uri.setAttribute(uri.pathAttributes, name, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddPathAttribute adds a path attribute; it returns an error if an attribute with the same
 | 
			
		||||
// name already existed or if the given value cannot be pct-unescaped
 | 
			
		||||
func (uri *Pkcs11URI) AddPathAttribute(name, value string) error {
 | 
			
		||||
	if _, ok := uri.pathAttributes[name]; ok {
 | 
			
		||||
		return errors.New("duplicate path attribute")
 | 
			
		||||
	}
 | 
			
		||||
	return uri.SetPathAttribute(name, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemovePathAttribute removes a path attribute
 | 
			
		||||
func (uri *Pkcs11URI) RemovePathAttribute(name string) {
 | 
			
		||||
	delete(uri.pathAttributes, name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddEnv adds an environment variable for the pkcs11 module
 | 
			
		||||
func (uri *Pkcs11URI) AddEnv(name, value string) {
 | 
			
		||||
	uri.env[name] = value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetEnvMap sets the environment variables for the pkcs11 module
 | 
			
		||||
func (uri *Pkcs11URI) SetEnvMap(env map[string]string) {
 | 
			
		||||
	uri.env = env
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetEnvMap returns the map of environment variables
 | 
			
		||||
func (uri *Pkcs11URI) GetEnvMap() map[string]string {
 | 
			
		||||
	return uri.env
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetQueryAttribute returns the value of a query attribute in unescaped or
 | 
			
		||||
// pct-encoded form
 | 
			
		||||
func (uri *Pkcs11URI) GetQueryAttribute(name string, pctencode bool) (string, bool) {
 | 
			
		||||
	v, ok := uri.queryAttributes[name]
 | 
			
		||||
	if ok && pctencode {
 | 
			
		||||
		v = escape(v, false)
 | 
			
		||||
	}
 | 
			
		||||
	return v, ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetQueryAttribute sets the value for a query attribute; this function may return an error
 | 
			
		||||
// if the given value cannot pct-unescaped
 | 
			
		||||
func (uri *Pkcs11URI) SetQueryAttribute(name, value string) error {
 | 
			
		||||
	return uri.setAttribute(uri.queryAttributes, name, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddQueryAttribute adds a query attribute; it returns an error if an attribute with the same
 | 
			
		||||
// name already existed or if the given value cannot be pct-unescaped
 | 
			
		||||
func (uri *Pkcs11URI) AddQueryAttribute(name, value string) error {
 | 
			
		||||
	if _, ok := uri.queryAttributes[name]; ok {
 | 
			
		||||
		return errors.New("duplicate query attribute")
 | 
			
		||||
	}
 | 
			
		||||
	return uri.SetQueryAttribute(name, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RemoveQueryAttribute removes a path attribute
 | 
			
		||||
func (uri *Pkcs11URI) RemoveQueryAttribute(name string) {
 | 
			
		||||
	delete(uri.queryAttributes, name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Validate validates a Pkcs11URI object's attributes following RFC 7512 rules and proper formatting of
 | 
			
		||||
// their values
 | 
			
		||||
func (uri *Pkcs11URI) Validate() error {
 | 
			
		||||
	/* RFC 7512: 2.3 */
 | 
			
		||||
	/* slot-id should be DIGIT, but we go for number */
 | 
			
		||||
	if v, ok := uri.pathAttributes["slot-id"]; ok {
 | 
			
		||||
		if _, err := strconv.Atoi(v); err != nil {
 | 
			
		||||
			return fmt.Errorf("slot-id must be a number: %s", v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* library-version should 1*DIGIT [ "." 1 *DIGIT ]; allow NUMBERS for DIGIT */
 | 
			
		||||
	if v, ok := uri.pathAttributes["library-version"]; ok {
 | 
			
		||||
		m, err := regexp.Match("^[0-9]+(\\.[0-9]+)?$", []byte(v))
 | 
			
		||||
		if err != nil || !m {
 | 
			
		||||
			return fmt.Errorf("Invalid format for library-version '%s'", v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v, ok := uri.pathAttributes["type"]; ok {
 | 
			
		||||
		m, err := regexp.Match("^(public|private|cert|secret-key}data)?$", []byte(v))
 | 
			
		||||
		if err != nil || !m {
 | 
			
		||||
			return fmt.Errorf("Invalid type '%s'", v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* RFC 7512: 2.4 */
 | 
			
		||||
	_, ok1 := uri.queryAttributes["pin-source"]
 | 
			
		||||
	_, ok2 := uri.queryAttributes["pin-value"]
 | 
			
		||||
	if ok1 && ok2 {
 | 
			
		||||
		return errors.New("URI must not contain pin-source and pin-value")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v, ok := uri.queryAttributes["module-path"]; ok {
 | 
			
		||||
		if !filepath.IsAbs(v) {
 | 
			
		||||
			return fmt.Errorf("path %s of module-name attribute must be absolute", v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasPIN allows the user to check whether a PIN has been provided either by the pin-value or the pin-source
 | 
			
		||||
// attributes. It should be called before GetPIN(), which may still fail getting the PIN from a file for example.
 | 
			
		||||
func (uri *Pkcs11URI) HasPIN() bool {
 | 
			
		||||
	_, ok := uri.queryAttributes["pin-value"]
 | 
			
		||||
	if ok {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	_, ok = uri.queryAttributes["pin-source"]
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetPIN gets the PIN from either the pin-value or pin-source attribute; a user may want to call HasPIN()
 | 
			
		||||
// before calling this function to determine whether a PIN has been provided at all so that an error code
 | 
			
		||||
// returned by this function indicates that the PIN value could not be retrieved.
 | 
			
		||||
func (uri *Pkcs11URI) GetPIN() (string, error) {
 | 
			
		||||
	if v, ok := uri.queryAttributes["pin-value"]; ok {
 | 
			
		||||
		return v, nil
 | 
			
		||||
	}
 | 
			
		||||
	if v, ok := uri.queryAttributes["pin-source"]; ok {
 | 
			
		||||
		pinuri, err := url.ParseRequestURI(v)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", fmt.Errorf("Could not parse pin-source: %s ", err)
 | 
			
		||||
		}
 | 
			
		||||
		switch pinuri.Scheme {
 | 
			
		||||
		case "", "file":
 | 
			
		||||
			if !filepath.IsAbs(pinuri.Path) {
 | 
			
		||||
				return "", fmt.Errorf("PIN URI path '%s' is not absolute", pinuri.Path)
 | 
			
		||||
			}
 | 
			
		||||
			pin, err := ioutil.ReadFile(pinuri.Path)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return "", fmt.Errorf("Could not open PIN file: %s", err)
 | 
			
		||||
			}
 | 
			
		||||
			return string(pin), nil
 | 
			
		||||
		default:
 | 
			
		||||
			return "", fmt.Errorf("PIN URI scheme %s is not supported", pinuri.Scheme)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "", fmt.Errorf("Neither pin-source nor pin-value are available")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parse parses a pkcs11: URI string
 | 
			
		||||
func (uri *Pkcs11URI) Parse(uristring string) error {
 | 
			
		||||
	if !strings.HasPrefix(uristring, "pkcs11:") {
 | 
			
		||||
		return errors.New("Malformed pkcs11 URI: missing pcks11: prefix")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parts := strings.SplitN(uristring[7:], "?", 2)
 | 
			
		||||
 | 
			
		||||
	uri.pathAttributes = make(map[string]string)
 | 
			
		||||
	uri.queryAttributes = make(map[string]string)
 | 
			
		||||
 | 
			
		||||
	if len(parts[0]) > 0 {
 | 
			
		||||
		/* parse path part */
 | 
			
		||||
		for _, part := range strings.Split(parts[0], ";") {
 | 
			
		||||
			p := strings.SplitN(part, "=", 2)
 | 
			
		||||
			if len(p) != 2 {
 | 
			
		||||
				return errors.New("Malformed pkcs11 URI: malformed path attribute")
 | 
			
		||||
			}
 | 
			
		||||
			if err := uri.AddPathAttribute(p[0], p[1]); err != nil {
 | 
			
		||||
				return fmt.Errorf("Malformed pkcs11 URI: %s", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(parts) == 2 {
 | 
			
		||||
		/* parse query part */
 | 
			
		||||
		for _, part := range strings.Split(parts[1], "&") {
 | 
			
		||||
			p := strings.SplitN(part, "=", 2)
 | 
			
		||||
			if len(p) != 2 {
 | 
			
		||||
				return errors.New("Malformed pkcs11 URI: malformed query attribute")
 | 
			
		||||
			}
 | 
			
		||||
			if err := uri.AddQueryAttribute(p[0], p[1]); err != nil {
 | 
			
		||||
				return fmt.Errorf("Malformed pkcs11 URI: %s", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return uri.Validate()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// formatAttribute formats attributes and escapes their values as needed
 | 
			
		||||
func formatAttributes(attrMap map[string]string, ispath bool) string {
 | 
			
		||||
	res := ""
 | 
			
		||||
	for key, value := range attrMap {
 | 
			
		||||
		switch key {
 | 
			
		||||
		case "id":
 | 
			
		||||
			/* id is always pct-encoded */
 | 
			
		||||
			value = escapeAll(value)
 | 
			
		||||
		default:
 | 
			
		||||
			if ispath {
 | 
			
		||||
				value = escape(value, true)
 | 
			
		||||
			} else {
 | 
			
		||||
				value = escape(value, false)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if len(res) > 0 {
 | 
			
		||||
			if ispath {
 | 
			
		||||
				res += ";"
 | 
			
		||||
			} else {
 | 
			
		||||
				res += "&"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		res += key + "=" + value
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Format formats a Pkcs11URI to it string representaion
 | 
			
		||||
func (uri *Pkcs11URI) Format() (string, error) {
 | 
			
		||||
	if err := uri.Validate(); err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	result := "pkcs11:" + formatAttributes(uri.pathAttributes, true)
 | 
			
		||||
	if len(uri.queryAttributes) > 0 {
 | 
			
		||||
		result += "?" + formatAttributes(uri.queryAttributes, false)
 | 
			
		||||
	}
 | 
			
		||||
	return result, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetModuleDirectories sets the search directories for pkcs11 modules
 | 
			
		||||
func (uri *Pkcs11URI) SetModuleDirectories(moduleDirectories []string) {
 | 
			
		||||
	uri.moduleDirectories = moduleDirectories
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetModuleDirectories gets the search directories for pkcs11 modules
 | 
			
		||||
func (uri *Pkcs11URI) GetModuleDirectories() []string {
 | 
			
		||||
	return uri.moduleDirectories
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetAllowedModulePaths sets allowed module paths to restrict access to modules.
 | 
			
		||||
// Directory entries must end with a '/', all other ones are assumed to be file entries.
 | 
			
		||||
// Allowed modules are filtered by string matching.
 | 
			
		||||
func (uri *Pkcs11URI) SetAllowedModulePaths(allowedModulePaths []string) {
 | 
			
		||||
	uri.allowedModulePaths = allowedModulePaths
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetAllowAnyModule allows any module to be loaded; by default this is not allowed
 | 
			
		||||
func (uri *Pkcs11URI) SetAllowAnyModule(allowAnyModule bool) {
 | 
			
		||||
	uri.allowAnyModule = allowAnyModule
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (uri *Pkcs11URI) isAllowedPath(path string, allowedPaths []string) bool {
 | 
			
		||||
	if uri.allowAnyModule {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	for _, allowedPath := range allowedPaths {
 | 
			
		||||
		if allowedPath == path {
 | 
			
		||||
			// exact filename match
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		if allowedPath[len(allowedPath)-1] == '/' && strings.HasPrefix(path, allowedPath) {
 | 
			
		||||
			// allowedPath no subdirectory is allowed
 | 
			
		||||
			idx := strings.IndexRune(path[len(allowedPath):], os.PathSeparator)
 | 
			
		||||
			if idx < 0 {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetModule returns the module to use or an error in case no module could be found.
 | 
			
		||||
// First the module-path is checked for whether it holds an absolute that can be read
 | 
			
		||||
// by the current user. If this is the case the module is returned. Otherwise either the module-path
 | 
			
		||||
// is used or the user-provided module path is used to match a module containing what is set in the
 | 
			
		||||
// attribute module-name.
 | 
			
		||||
func (uri *Pkcs11URI) GetModule() (string, error) {
 | 
			
		||||
	var searchdirs []string
 | 
			
		||||
	v, ok := uri.queryAttributes["module-path"]
 | 
			
		||||
 | 
			
		||||
	if ok {
 | 
			
		||||
		info, err := os.Stat(v)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", fmt.Errorf("module-path '%s' is not accessible", v)
 | 
			
		||||
		}
 | 
			
		||||
		if err == nil && info.Mode().IsRegular() {
 | 
			
		||||
			// it's a file
 | 
			
		||||
			if uri.isAllowedPath(v, uri.allowedModulePaths) {
 | 
			
		||||
				return v, nil
 | 
			
		||||
			}
 | 
			
		||||
			return "", fmt.Errorf("module-path '%s' is not allowed by policy", v)
 | 
			
		||||
		}
 | 
			
		||||
		if !info.IsDir() {
 | 
			
		||||
			return "", fmt.Errorf("module-path '%s' points to an invalid file type", v)
 | 
			
		||||
		}
 | 
			
		||||
		// v is a directory
 | 
			
		||||
		searchdirs = []string{v}
 | 
			
		||||
	} else {
 | 
			
		||||
		searchdirs = uri.GetModuleDirectories()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	moduleName, ok := uri.queryAttributes["module-name"]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return "", fmt.Errorf("module-name attribute is not set")
 | 
			
		||||
	}
 | 
			
		||||
	moduleName = strings.ToLower(moduleName)
 | 
			
		||||
 | 
			
		||||
	for _, dir := range searchdirs {
 | 
			
		||||
		files, err := ioutil.ReadDir(dir)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		for _, file := range files {
 | 
			
		||||
			fileLower := strings.ToLower(file.Name())
 | 
			
		||||
 | 
			
		||||
			i := strings.Index(fileLower, moduleName)
 | 
			
		||||
			if i < 0 {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			// we require that the fileLower ends with moduleName or that
 | 
			
		||||
			// a suffix follows so that softhsm will not match libsofthsm2.so but only
 | 
			
		||||
			// libsofthsm.so
 | 
			
		||||
			if len(fileLower) == i+len(moduleName) || fileLower[i+len(moduleName)] == '.' {
 | 
			
		||||
				f := filepath.Join(dir, file.Name())
 | 
			
		||||
				if uri.isAllowedPath(f, uri.allowedModulePaths) {
 | 
			
		||||
					return f, nil
 | 
			
		||||
				}
 | 
			
		||||
				return "", fmt.Errorf("module '%s' is not allowed by policy", f)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "", fmt.Errorf("No module could be found")
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user