forked from toolshed/abra
chore: vendor
This commit is contained in:
.gitignoremodules.txt
vendor
coopcloud.tech
dario.cat
mergo
git.coopcloud.tech
coop-cloud
github.com
AlecAivazis
survey
v2
CONTRIBUTING.mdLICENSEREADME.mdconfirm.go
core
editor.gofilter.goinput.gomultiline.gomultiselect.gopassword.gorenderer.goselect.gosurvey.goterminal
LICENSE.txtREADME.mdbuffered_reader.gocursor.gocursor_windows.godisplay.godisplay_posix.godisplay_windows.goerror.gooutput.gooutput_windows.gorunereader.gorunereader_bsd.gorunereader_linux.gorunereader_posix.gorunereader_ppc64le.gorunereader_windows.gosequences.gostdio.gosyscall_windows.goterminal.go
transform.govalidate.goAzure
go-ansiterm
BurntSushi
toml
Microsoft
go-winio
ProtonMail
go-crypto
AUTHORSCONTRIBUTORSLICENSEPATENTSkey_generation.gokeys.gokeys_test_data.go
bitcurves
brainpool
eax
internal
byteutil
ocb
openpgp
aes
keywrap
armor
canonical_text.goecdh
ecdsa
eddsa
elgamal
errors
hash.gointernal
algorithm
ecc
encoding
packet
aead_config.goaead_crypter.goaead_encrypted.gocompressed.goconfig.goencrypted_key.goliteral.gonotation.goocfb.goone_pass_signature.goopaque.gopacket.goprivate_key.goprivate_key_test_data.gopublic_key.gopublic_key_test_data.goreader.gosignature.gosymmetric_key_encrypted.gosymmetrically_encrypted.gosymmetrically_encrypted_aead.gosymmetrically_encrypted_mdc.gouserattribute.gouserid.go
read.goread_write_test_data.gos2k
write.goaymanbagabas
beorn7
perks
cenkalti
backoff
cespare
xxhash
charmbracelet
lipgloss
.gitignore.golangci-soft.yml.golangci.ymlLICENSEREADME.mdalign.goansi_unix.goansi_windows.goborders.gocolor.goget.gojoin.goposition.gorenderer.gorunes.goset.gosize.gostyle.go
table
unset.gowhitespace.golog
.gitignore.golangci.yml.goreleaser.ymlLICENSEREADME.mdcontext.goformatter.gojson.golevel.golevel_121.golevel_no121.gologfmt.gologger.gologger_121.gologger_no121.gooptions.gopkg.gostdlog.gostyles.gotext.go
x
cloudflare
containerd
containerd
log
containers
image
LICENSE
docker
cache.godocker_client.godocker_image.godocker_image_dest.godocker_image_src.godocker_transport.golookaside.go
policyconfiguration
reference
wwwauthenticate.goimage
manifest
pkg
blobinfocache
none
docker
keyctl
strslice
sysregistriesv2
tlsclientconfig
transports
types
cpuguy83
go-md2man
v2
cyphar
davecgh
decentral1se
distribution
reference
docker
cli
AUTHORSLICENSENOTICE
cli-plugins
hooks
manager
cli
cobra.go
command
cli.gocli_options.gocontext.godefaultcontextstore.gotelemetry.gotelemetry_docker.gotelemetry_options.gotelemetry_utils.gotrust.goutils.go
formatter
buildcache.gocontainer.gocontext.gocustom.godisk_usage.godisplayutils.goformatter.goimage.goreflect.go
registry.gotabwriter
volume.goservice
progress
stack
formatter
compose
interpolation
loader
schema
data
config_schema_v3.0.jsonconfig_schema_v3.1.jsonconfig_schema_v3.10.jsonconfig_schema_v3.11.jsonconfig_schema_v3.12.jsonconfig_schema_v3.13.jsonconfig_schema_v3.2.jsonconfig_schema_v3.3.jsonconfig_schema_v3.4.jsonconfig_schema_v3.5.jsonconfig_schema_v3.6.jsonconfig_schema_v3.7.jsonconfig_schema_v3.8.jsonconfig_schema_v3.9.json
schema.gotemplate
types
config
config.go
configfile
credentials
credentials.godefault_store.godefault_store_darwin.godefault_store_linux.godefault_store_unsupported.godefault_store_windows.gofile_store.gonative_store.go
types
connhelper
context
debug
error.goflags
hints
manifest
registry
required.gostreams
trust
version
opts
capabilities.goconfig.goduration.goenv.goenvfile.gofile.gogpus.gohosts.gohosts_unix.gohosts_windows.gomount.gonetwork.goopts.goparse.goport.goquotedstring.gosecret.gothrottledevice.goulimit.goweightdevice.go
templates
distribution
.dockerignore.gitignore.golangci.yml.mailmapBUILDING.mdCONTRIBUTING.mdDockerfileLICENSEMAINTAINERSMakefileREADME.mdROADMAP.mdblobs.godoc.godocker-bake.hclerrors.go
manifest
manifests.gometrics
registry.goregistry
tags.gouuid
vendor.confdocker-credential-helpers
docker
AUTHORSLICENSENOTICE
api
README.mdcommon.goswagger-gen.yamlswagger.yaml
types
blkiodev
checkpoint
client.gocontainer
change_type.gochange_types.goconfig.gocontainer.gocontainer_top.gocontainer_update.gocreate_request.gocreate_response.goerrors.goexec.gofilesystem_change.gohostconfig.gohostconfig_unix.gohostconfig_windows.gooptions.gostats.gowait_exit_error.gowait_response.gowaitcondition.go
error_response.goerror_response_ext.goevents
filters
graph_driver_data.goid_response.goimage
mount
network
plugin.goplugin_device.goplugin_env.goplugin_interface_type.goplugin_mount.goplugin_responses.goport.goregistry
strslice
swarm
common.goconfig.gocontainer.gonetwork.gonode.goruntime.go
runtime
secret.goservice.goservice_create_response.goservice_update_response.goswarm.gotask.gosystem
time
types.gotypes_deprecated.goversions
volume
client
README.mdbuild_cancel.gobuild_prune.gocheckpoint_create.gocheckpoint_delete.gocheckpoint_list.goclient.goclient_deprecated.goclient_unix.goclient_windows.goconfig_create.goconfig_inspect.goconfig_list.goconfig_remove.goconfig_update.gocontainer_attach.gocontainer_commit.gocontainer_copy.gocontainer_create.gocontainer_diff.gocontainer_exec.gocontainer_export.gocontainer_inspect.gocontainer_kill.gocontainer_list.gocontainer_logs.gocontainer_pause.gocontainer_prune.gocontainer_remove.gocontainer_rename.gocontainer_resize.gocontainer_restart.gocontainer_start.gocontainer_stats.gocontainer_stop.gocontainer_top.gocontainer_unpause.gocontainer_update.gocontainer_wait.godisk_usage.godistribution_inspect.goenvvars.goerrors.goevents.gohijack.goimage_build.goimage_create.goimage_history.goimage_import.goimage_inspect.goimage_list.goimage_load.goimage_prune.goimage_pull.goimage_push.goimage_remove.goimage_save.goimage_search.goimage_tag.goinfo.gointerface.gointerface_experimental.gointerface_stable.gologin.gonetwork_connect.gonetwork_create.gonetwork_disconnect.gonetwork_inspect.gonetwork_list.gonetwork_prune.gonetwork_remove.gonode_inspect.gonode_list.gonode_remove.gonode_update.gooptions.goping.goplugin_create.goplugin_disable.goplugin_enable.goplugin_inspect.goplugin_install.goplugin_list.goplugin_push.goplugin_remove.goplugin_set.goplugin_upgrade.gorequest.gosecret_create.gosecret_inspect.gosecret_list.gosecret_remove.gosecret_update.goservice_create.goservice_inspect.goservice_list.goservice_logs.goservice_remove.goservice_update.goswarm_get_unlock_key.goswarm_init.goswarm_inspect.goswarm_join.goswarm_leave.goswarm_unlock.goswarm_update.gotask_inspect.gotask_list.gotask_logs.goutils.goversion.govolume_create.govolume_inspect.govolume_list.govolume_prune.govolume_remove.govolume_update.go
errdefs
internal
multierror
pkg
archive
archive.goarchive_linux.goarchive_other.goarchive_unix.goarchive_windows.gochanges.gochanges_linux.gochanges_other.gochanges_unix.gochanges_windows.gocopy.gocopy_unix.gocopy_windows.godiff.godiff_unix.godiff_windows.gopath.gopath_unix.gopath_windows.gotime_linux.gotime_unsupported.gowhiteouts.gowrap.go
homedir
idtools
idtools.goidtools_unix.goidtools_windows.gousergroupadd_linux.gousergroupadd_unsupported.goutils_unix.go
ioutils
jsonmessage
pools
progress
stdcopy
streamformatter
stringid
system
args_windows.gochtimes.gochtimes_nowindows.gochtimes_windows.goerrors.gofilesys.gofilesys_unix.gofilesys_windows.goinit_windows.golstat_unix.golstat_windows.gomknod.gomknod_freebsd.gomknod_unix.gostat_bsd.gostat_darwin.gostat_illumos.gostat_linux.gostat_openbsd.gostat_unix.gostat_windows.goutimes_unix.goutimes_unsupported.goxattrs.goxattrs_linux.goxattrs_unsupported.go
registry
go-connections
LICENSE
nat
sockets
README.mdinmem_socket.goproxy.gosockets.gosockets_unix.gosockets_windows.gotcp_socket.gounix_socket.go
tlsconfig
go-metrics
CONTRIBUTING.mdLICENSELICENSE.docsNOTICEREADME.mdcounter.godocs.gogauge.gohandler.gohelpers.gonamespace.goregister.gotimer.gounit.go
go-units
go
libtrust
emirpasic
gods
felixge
httpsnoop
fvbommel
ghodss
go-git
gcfg
go-billy
v5
go-git
v5
.gitignoreCODE_OF_CONDUCT.mdCOMPATIBILITY.mdCONTRIBUTING.mdEXTENDING.mdLICENSEMakefileREADME.mdSECURITY.mdblame.gocommon.gohash.goreference.gorevision.goprune.goremote.gorepository.gosigner.gostatus.gosubmodule.goworktree.goworktree_bsd.goworktree_commit.goworktree_js.goworktree_linux.goworktree_plan9.goworktree_status.goworktree_unix_other.goworktree_windows.go
config
doc.gointernal
object_walker.gooptions.gooss-fuzz.shplumbing
cache
color
error.gofilemode
format
config
diff
gitignore
idxfile
index
objfile
packfile
common.godelta_index.godelta_selector.godiff_delta.godoc.goencoder.goerror.gofsobject.goobject_pack.gopackfile.goparser.gopatch_delta.goscanner.go
pktline
hash
memory.goobject.goobject
blob.gochange.gochange_adaptor.gocommit.gocommit_walker.gocommit_walker_bfs.gocommit_walker_bfs_filtered.gocommit_walker_ctime.gocommit_walker_limit.gocommit_walker_path.godifftree.gofile.gomerge_base.goobject.gopatch.gorename.gosignature.gotag.gotree.gotreenoder.go
protocol
packp
revlist
storer
transport
storage
filesystem
memory
storer.goutils
binary
diff
ioutil
merkletrie
sync
trace
go-logfmt
go-logr
logr
.golangci.yamlCHANGELOG.mdCONTRIBUTING.mdLICENSEREADME.mdSECURITY.mdcontext.gocontext_noslog.gocontext_slog.godiscard.go
funcr
logr.gosloghandler.goslogr.goslogsink.gostdr
go-viper
mapstructure
gogo
protobuf
AUTHORSCONTRIBUTORSLICENSE
proto
Makefileclone.gocustom_gogo.godecode.godeprecated.godiscard.goduration.goduration_gogo.goencode.goencode_gogo.goequal.goextensions.goextensions_gogo.golib.golib_gogo.gomessage_set.gopointer_reflect.gopointer_reflect_gogo.gopointer_unsafe.gopointer_unsafe_gogo.goproperties.goproperties_gogo.goskip_gogo.gotable_marshal.gotable_marshal_gogo.gotable_merge.gotable_unmarshal.gotable_unmarshal_gogo.gotext.gotext_gogo.gotext_parser.gotimestamp.gotimestamp_gogo.gowrappers.gowrappers_gogo.go
golang
google
gorilla
mux
grpc-ecosystem
grpc-gateway
hashicorp
go-cleanhttp
go-retryablehttp
inconshreveable
jbenet
kballard
go-shellquote
kevinburke
ssh_config
klauspost
compress
.gitattributes.gitignore.goreleaser.ymlLICENSEREADME.mdSECURITY.mdcompressible.gos2sx.mods2sx.sum
fse
gen.shhuff0
.gitignoreREADME.mdbitreader.gobitwriter.gocompress.godecompress.godecompress_amd64.godecompress_amd64.sdecompress_generic.gohuff0.go
internal
cpuinfo
snapref
zstd
README.mdbitreader.gobitwriter.goblockdec.goblockenc.goblocktype_string.gobytebuf.gobytereader.godecodeheader.godecoder.godecoder_options.godict.goenc_base.goenc_best.goenc_better.goenc_dfast.goenc_fast.goencoder.goencoder_options.goframedec.goframeenc.gofse_decoder.gofse_decoder_amd64.gofse_decoder_amd64.sfse_decoder_generic.gofse_encoder.gofse_predefined.gohash.gohistory.gomatchlen_amd64.gomatchlen_amd64.smatchlen_generic.goseqdec.goseqdec_amd64.goseqdec_amd64.sseqdec_generic.goseqenc.gosnappy.gozip.gozstd.go
internal
xxhash
lucasb-eyer
go-colorful
mattn
go-colorable
LICENSEREADME.mdcolorable_appengine.gocolorable_others.gocolorable_windows.gogo.test.shnoncolorable.go
go-isatty
LICENSEREADME.mddoc.gogo.test.shisatty_bsd.goisatty_others.goisatty_plan9.goisatty_solaris.goisatty_tcgets.goisatty_windows.go
go-runewidth
mgutz
miekg
pkcs11
mitchellh
colorstring
moby
docker-image-spec
patternmatcher
sys
sequential
signal
LICENSEsignal.gosignal_darwin.gosignal_freebsd.gosignal_linux.gosignal_linux_mipsx.gosignal_unix.gosignal_unsupported.gosignal_windows.go
user
term
morikuni
muesli
termenv
.gitignore.golangci-soft.yml.golangci.ymlLICENSEREADME.mdansi_compat.mdansicolors.gocolor.goconstants_linux.goconstants_solaris.goconstants_unix.gocopy.gohyperlink.gonotification.gooutput.goprofile.goscreen.gostyle.gotemplatehelper.gotermenv.gotermenv_other.gotermenv_posix.gotermenv_solaris.gotermenv_unix.gotermenv_windows.go
munnerz
goautoneg
opencontainers
go-digest
.mailmap.pullapprove.yml.travis.ymlCONTRIBUTING.mdLICENSELICENSE.docsMAINTAINERSREADME.mdalgorithm.godigest.godigester.godoc.goverifiers.go
image-spec
pjbgf
sha1cd
pkg
pmezard
go-difflib
prometheus
client_golang
LICENSENOTICE
prometheus
.gitignoreREADME.mdbuild_info_collector.gocollector.gocounter.godesc.godoc.goexpvar_collector.gofnv.gogauge.goget_pid.goget_pid_gopherjs.gogo_collector.gogo_collector_go116.gogo_collector_latest.gohistogram.go
internal
labels.gometric.gonum_threads.gonum_threads_gopherjs.goobserver.goprocess_collector.goprocess_collector_js.goprocess_collector_other.goprocess_collector_wasip1.goprocess_collector_windows.gopromhttp
registry.gosummary.gotimer.gountyped.govalue.govec.govnext.gowrap.goclient_model
common
procfs
.gitignore.golangci.ymlCODE_OF_CONDUCT.mdCONTRIBUTING.mdLICENSEMAINTAINERS.mdMakefileMakefile.commonNOTICEREADME.mdSECURITY.mdarp.gobuddyinfo.gocmdline.gocpuinfo.gocpuinfo_armx.gocpuinfo_loong64.gocpuinfo_mipsx.gocpuinfo_others.gocpuinfo_ppcx.gocpuinfo_riscvx.gocpuinfo_s390x.gocpuinfo_x86.gocrypto.godoc.gofs.gofs_statfs_notype.gofs_statfs_type.gofscache.go
internal
ipvs.gokernel_random.goloadavg.gomdstat.gomeminfo.gomountinfo.gomountstats.gonet_conntrackstat.gonet_dev.gonet_ip_socket.gonet_protocols.gonet_route.gonet_sockstat.gonet_softnet.gonet_tcp.gonet_tls_stat.gonet_udp.gonet_unix.gonet_wireless.gonet_xfrm.gonetstat.goproc.goproc_cgroup.goproc_cgroups.goproc_environ.goproc_fdinfo.goproc_interrupts.goproc_io.goproc_limits.goproc_maps.goproc_netstat.goproc_ns.goproc_psi.goproc_smaps.goproc_snmp.goproc_snmp6.goproc_stat.goproc_status.goproc_sys.goschedstat.goslab.gosoftirqs.gostat.goswaps.gothread.gottarvm.gozoneinfo.gorivo
uniseg
russross
blackfriday
schollz
sergi
go-diff
sirupsen
logrus
.gitignore.golangci.yml.travis.ymlCHANGELOG.mdLICENSEREADME.mdalt_exit.goappveyor.ymlbuffer_pool.godoc.goentry.goexported.goformatter.gohooks.gojson_formatter.gologger.gologrus.goterminal_check_appengine.goterminal_check_bsd.goterminal_check_js.goterminal_check_no_terminal.goterminal_check_notappengine.goterminal_check_solaris.goterminal_check_unix.goterminal_check_windows.gotext_formatter.gowriter.go
skeema
knownhosts
spf13
cobra
.gitignore.golangci.yml.mailmapCONDUCT.mdCONTRIBUTING.mdLICENSE.txtMAINTAINERSMakefileREADME.mdactive_help.goargs.gobash_completions.gobash_completionsV2.gocobra.gocommand.gocommand_notwin.gocommand_win.gocompletions.gofish_completions.goflag_groups.gopowershell_completions.goshell_completions.gozsh_completions.go
pflag
.gitignore.travis.ymlLICENSEREADME.mdbool.gobool_slice.gobytes.gocount.goduration.goduration_slice.goflag.gofloat32.gofloat32_slice.gofloat64.gofloat64_slice.gogolangflag.goint.goint16.goint32.goint32_slice.goint64.goint64_slice.goint8.goint_slice.goip.goip_slice.goipmask.goipnet.gostring.gostring_array.gostring_slice.gostring_to_int.gostring_to_int64.gostring_to_string.gouint.gouint16.gouint32.gouint64.gouint8.gouint_slice.go
stretchr
testify
theupdateframework
notary
.gitignoreCHANGELOG.mdCODE_OF_CONDUCT.mdCONTRIBUTING.mdCONTRIBUTORSDockerfileJenkinsfileLICENSEMAINTAINERSMAINTAINERS.ALUMNIMAINTAINERS_RULES.mdMakefileNOTARY_VERSIONREADME.mdcodecov.ymlconst.goconst_nowindows.goconst_windows.gocross.Dockerfile
client
changelist
client.godelegations.goerrors.gohelpers.gointerface.goreader.gorepo.gorepo_pkcs11.gotufclient.gowitness.gocryptoservice
development.mysql.ymldevelopment.postgresql.ymldevelopment.rethink.ymldocker-compose.postgresql.ymldocker-compose.rethink.ymldocker-compose.ymlescrow.Dockerfilefips.gonotary.gopassphrase
server.Dockerfileserver.minimal.Dockerfilesigner.Dockerfilesigner.minimal.Dockerfilestorage
trustmanager
trustpinning
tuf
urfave
cli
.flake8.gitignoreCODE_OF_CONDUCT.mdLICENSEREADME.mdapp.gocategory.gocli.gocommand.gocontext.godocs.goerrors.gofish.goflag.goflag_bool.goflag_bool_t.goflag_duration.goflag_float64.goflag_generic.goflag_int.goflag_int64.goflag_int64_slice.goflag_int_slice.goflag_string.goflag_string_slice.goflag_uint.goflag_uint64.gofuncs.gohelp.goparse.gosort.gotemplate.go
xanzy
xeipuuv
gojsonpointer
gojsonreference
gojsonschema
go.opentelemetry.io
contrib
instrumentation
net
http
otel
.codespellignore.codespellrc.gitattributes.gitignore.golangci.yml.lycheeignore.markdownlint.yamlCHANGELOG.mdCODEOWNERSCONTRIBUTING.mdLICENSEMakefileREADME.mdRELEASING.mdVERSIONING.mdget_main_pkgs.shhandler.gotrace.go
attribute
baggage
codes
doc.goerror_handler.goexporters
otlp
otlpmetric
otlpmetricgrpc
otlptrace
LICENSEREADME.mdclients.godoc.goexporter.go
internal
tracetransform
otlptracegrpc
LICENSEREADME.mdclient.godoc.goexporter.go
version.gointernal
options.gointernal
internal_logging.gometric.gometric
LICENSEREADME.mdasyncfloat64.goasyncint64.goconfig.godoc.go
propagation.goembedded
instrument.gometer.gonoop
syncfloat64.gosyncint64.gopropagation
renovate.jsonrequirements.txtsdk
LICENSEREADME.md
instrumentation
internal
metric
LICENSEREADME.mdaggregation.gocache.goconfig.godoc.goenv.goexemplar.goexporter.goinstrument.goinstrumentkind_string.go
internal
manual_reader.gometer.gometricdata
periodic_reader.gopipeline.goprovider.goreader.goversion.goview.goresource
README.mdauto.gobuiltin.goconfig.gocontainer.godoc.goenv.gohost_id.gohost_id_bsd.gohost_id_darwin.gohost_id_exec.gohost_id_linux.gohost_id_readfile.gohost_id_unsupported.gohost_id_windows.goos.goos_release_darwin.goos_release_unix.goos_unix.goos_unsupported.goos_windows.goprocess.goresource.go
trace
README.mdbatch_span_processor.godoc.goevent.goevictedqueue.goid_generator.golink.goprovider.gosampler_env.gosampling.gosimple_span_processor.gosnapshot.gospan.gospan_exporter.gospan_limits.gospan_processor.gotracer.goversion.go
version.gosemconv
v1.20.0
v1.21.0
v1.24.0
v1.26.0
trace
verify_examples.shverify_readmes.shversion.goversions.yamlproto
otlp
golang.org
x
crypto
LICENSEPATENTS
argon2
blake2b
blake2b.goblake2bAVX2_amd64.goblake2bAVX2_amd64.sblake2b_amd64.sblake2b_generic.goblake2b_ref.goblake2x.goregister.go
blowfish
cast5
chacha20
chacha_arm64.gochacha_arm64.schacha_generic.gochacha_noasm.gochacha_ppc64le.gochacha_ppc64le.schacha_s390x.gochacha_s390x.sxor.go
curve25519
ed25519
hkdf
internal
alias
poly1305
pbkdf2
sha3
doc.gohashes.gohashes_noasm.gokeccakf.gokeccakf_amd64.gokeccakf_amd64.ssha3.gosha3_s390x.gosha3_s390x.sshake.goshake_noasm.goxor.go
ssh
exp
net
LICENSEPATENTS
context
http
httpguts
http2
.gitignoreascii.gociphers.goclient_conn_pool.godatabuffer.goerrors.goflow.goframe.gogotrack.goheadermap.go
hpack
http2.gopipe.goserver.gotimer.gotransport.gowrite.gowritesched.gowritesched_priority.gowritesched_random.gowritesched_roundrobin.goidna
go118.goidna10.0.0.goidna9.0.0.gopre_go118.gopunycode.gotables10.0.0.gotables11.0.0.gotables12.0.0.gotables13.0.0.gotables15.0.0.gotables9.0.0.gotrie.gotrie12.0.0.gotrie13.0.0.gotrieval.go
internal
proxy
trace
sync
sys
LICENSEPATENTS
cpu
asm_aix_ppc64.sbyteorder.gocpu.gocpu_aix.gocpu_arm.gocpu_arm64.gocpu_arm64.scpu_gc_arm64.gocpu_gc_s390x.gocpu_gc_x86.gocpu_gccgo_arm64.gocpu_gccgo_s390x.gocpu_gccgo_x86.ccpu_gccgo_x86.gocpu_linux.gocpu_linux_arm.gocpu_linux_arm64.gocpu_linux_mips64x.gocpu_linux_noinit.gocpu_linux_ppc64x.gocpu_linux_s390x.gocpu_loong64.gocpu_mips64x.gocpu_mipsx.gocpu_netbsd_arm64.gocpu_openbsd_arm64.gocpu_openbsd_arm64.scpu_other_arm.gocpu_other_arm64.gocpu_other_mips64x.gocpu_other_ppc64x.gocpu_other_riscv64.gocpu_ppc64x.gocpu_riscv64.gocpu_s390x.gocpu_s390x.scpu_wasm.gocpu_x86.gocpu_x86.scpu_zos.gocpu_zos_s390x.goendian_big.goendian_little.gohwcap_linux.goparse.goproc_cpuinfo_linux.goruntime_auxv.goruntime_auxv_go121.gosyscall_aix_gccgo.gosyscall_aix_ppc64_gc.go
execabs
plan9
asm.sasm_plan9_386.sasm_plan9_amd64.sasm_plan9_arm.sconst_plan9.godir_plan9.goenv_plan9.goerrors_plan9.gomkall.shmkerrors.shmksysnum_plan9.shpwd_go15_plan9.gopwd_plan9.gorace.gorace0.gostr.gosyscall.gosyscall_plan9.gozsyscall_plan9_386.gozsyscall_plan9_amd64.gozsyscall_plan9_arm.gozsysnum_plan9.go
unix
.gitignoreREADME.mdaffinity_linux.goaliases.goasm_aix_ppc64.sasm_bsd_386.sasm_bsd_amd64.sasm_bsd_arm.sasm_bsd_arm64.sasm_bsd_ppc64.sasm_bsd_riscv64.sasm_linux_386.sasm_linux_amd64.sasm_linux_arm.sasm_linux_arm64.sasm_linux_loong64.sasm_linux_mips64x.sasm_linux_mipsx.sasm_linux_ppc64x.sasm_linux_riscv64.sasm_linux_s390x.sasm_openbsd_mips64.sasm_solaris_amd64.sasm_zos_s390x.sbluetooth_linux.gobpxsvc_zos.gobpxsvc_zos.scap_freebsd.goconstants.godev_aix_ppc.godev_aix_ppc64.godev_darwin.godev_dragonfly.godev_freebsd.godev_linux.godev_netbsd.godev_openbsd.godev_zos.godirent.goendian_big.goendian_little.goenv_unix.gofcntl.gofcntl_darwin.gofcntl_linux_32bit.gofdset.gogccgo.gogccgo_c.cgccgo_linux_amd64.goifreq_linux.goioctl_linux.goioctl_signed.goioctl_unsigned.goioctl_zos.gomkall.shmkerrors.shmmap_nomremap.gomremap.gopagesize_unix.gopledge_openbsd.goptrace_darwin.goptrace_ios.gorace.gorace0.goreaddirent_getdents.goreaddirent_getdirentries.gosockcmsg_dragonfly.gosockcmsg_linux.gosockcmsg_unix.gosockcmsg_unix_other.gosockcmsg_zos.gosymaddr_zos_s390x.ssyscall.gosyscall_aix.gosyscall_aix_ppc.gosyscall_aix_ppc64.gosyscall_bsd.gosyscall_darwin.gosyscall_darwin_amd64.gosyscall_darwin_arm64.gosyscall_darwin_libSystem.gosyscall_dragonfly.gosyscall_dragonfly_amd64.gosyscall_freebsd.gosyscall_freebsd_386.gosyscall_freebsd_amd64.gosyscall_freebsd_arm.gosyscall_freebsd_arm64.gosyscall_freebsd_riscv64.gosyscall_hurd.gosyscall_hurd_386.gosyscall_illumos.gosyscall_linux.gosyscall_linux_386.gosyscall_linux_alarm.gosyscall_linux_amd64.gosyscall_linux_amd64_gc.gosyscall_linux_arm.gosyscall_linux_arm64.gosyscall_linux_gc.gosyscall_linux_gc_386.gosyscall_linux_gc_arm.gosyscall_linux_gccgo_386.gosyscall_linux_gccgo_arm.gosyscall_linux_loong64.gosyscall_linux_mips64x.gosyscall_linux_mipsx.gosyscall_linux_ppc.gosyscall_linux_ppc64x.gosyscall_linux_riscv64.gosyscall_linux_s390x.gosyscall_linux_sparc64.gosyscall_netbsd.gosyscall_netbsd_386.gosyscall_netbsd_amd64.gosyscall_netbsd_arm.gosyscall_netbsd_arm64.gosyscall_openbsd.gosyscall_openbsd_386.gosyscall_openbsd_amd64.gosyscall_openbsd_arm.gosyscall_openbsd_arm64.gosyscall_openbsd_libc.gosyscall_openbsd_mips64.gosyscall_openbsd_ppc64.gosyscall_openbsd_riscv64.gosyscall_solaris.gosyscall_solaris_amd64.gosyscall_unix.gosyscall_unix_gc.gosyscall_unix_gc_ppc64x.gosyscall_zos_s390x.gosysvshm_linux.gosysvshm_unix.gosysvshm_unix_other.gotimestruct.gounveil_openbsd.goxattr_bsd.gozerrors_aix_ppc.gozerrors_aix_ppc64.gozerrors_darwin_amd64.gozerrors_darwin_arm64.gozerrors_dragonfly_amd64.gozerrors_freebsd_386.gozerrors_freebsd_amd64.gozerrors_freebsd_arm.gozerrors_freebsd_arm64.gozerrors_freebsd_riscv64.gozerrors_linux.gozerrors_linux_386.gozerrors_linux_amd64.gozerrors_linux_arm.gozerrors_linux_arm64.gozerrors_linux_loong64.gozerrors_linux_mips.gozerrors_linux_mips64.gozerrors_linux_mips64le.gozerrors_linux_mipsle.gozerrors_linux_ppc.gozerrors_linux_ppc64.gozerrors_linux_ppc64le.gozerrors_linux_riscv64.gozerrors_linux_s390x.gozerrors_linux_sparc64.gozerrors_netbsd_386.gozerrors_netbsd_amd64.gozerrors_netbsd_arm.gozerrors_netbsd_arm64.gozerrors_openbsd_386.gozerrors_openbsd_amd64.gozerrors_openbsd_arm.gozerrors_openbsd_arm64.gozerrors_openbsd_mips64.gozerrors_openbsd_ppc64.gozerrors_openbsd_riscv64.gozerrors_solaris_amd64.gozerrors_zos_s390x.gozptrace_armnn_linux.gozptrace_linux_arm64.gozptrace_mipsnn_linux.gozptrace_mipsnnle_linux.gozptrace_x86_linux.gozsymaddr_zos_s390x.szsyscall_aix_ppc.gozsyscall_aix_ppc64.gozsyscall_aix_ppc64_gc.gozsyscall_aix_ppc64_gccgo.gozsyscall_darwin_amd64.gozsyscall_darwin_amd64.szsyscall_darwin_arm64.gozsyscall_darwin_arm64.szsyscall_dragonfly_amd64.gozsyscall_freebsd_386.gozsyscall_freebsd_amd64.gozsyscall_freebsd_arm.gozsyscall_freebsd_arm64.gozsyscall_freebsd_riscv64.gozsyscall_illumos_amd64.gozsyscall_linux.gozsyscall_linux_386.gozsyscall_linux_amd64.gozsyscall_linux_arm.gozsyscall_linux_arm64.gozsyscall_linux_loong64.gozsyscall_linux_mips.gozsyscall_linux_mips64.gozsyscall_linux_mips64le.gozsyscall_linux_mipsle.gozsyscall_linux_ppc.gozsyscall_linux_ppc64.gozsyscall_linux_ppc64le.gozsyscall_linux_riscv64.gozsyscall_linux_s390x.gozsyscall_linux_sparc64.gozsyscall_netbsd_386.gozsyscall_netbsd_amd64.gozsyscall_netbsd_arm.gozsyscall_netbsd_arm64.gozsyscall_openbsd_386.gozsyscall_openbsd_386.szsyscall_openbsd_amd64.gozsyscall_openbsd_amd64.szsyscall_openbsd_arm.gozsyscall_openbsd_arm.szsyscall_openbsd_arm64.gozsyscall_openbsd_arm64.szsyscall_openbsd_mips64.gozsyscall_openbsd_mips64.szsyscall_openbsd_ppc64.gozsyscall_openbsd_ppc64.szsyscall_openbsd_riscv64.gozsyscall_openbsd_riscv64.szsyscall_solaris_amd64.gozsyscall_zos_s390x.gozsysctl_openbsd_386.gozsysctl_openbsd_amd64.gozsysctl_openbsd_arm.gozsysctl_openbsd_arm64.gozsysctl_openbsd_mips64.gozsysctl_openbsd_ppc64.gozsysctl_openbsd_riscv64.gozsysnum_darwin_amd64.gozsysnum_darwin_arm64.gozsysnum_dragonfly_amd64.gozsysnum_freebsd_386.gozsysnum_freebsd_amd64.gozsysnum_freebsd_arm.gozsysnum_freebsd_arm64.gozsysnum_freebsd_riscv64.gozsysnum_linux_386.gozsysnum_linux_amd64.gozsysnum_linux_arm.gozsysnum_linux_arm64.gozsysnum_linux_loong64.gozsysnum_linux_mips.gozsysnum_linux_mips64.gozsysnum_linux_mips64le.gozsysnum_linux_mipsle.gozsysnum_linux_ppc.gozsysnum_linux_ppc64.gozsysnum_linux_ppc64le.gozsysnum_linux_riscv64.gozsysnum_linux_s390x.gozsysnum_linux_sparc64.gozsysnum_netbsd_386.gozsysnum_netbsd_amd64.gozsysnum_netbsd_arm.gozsysnum_netbsd_arm64.gozsysnum_openbsd_386.gozsysnum_openbsd_amd64.gozsysnum_openbsd_arm.gozsysnum_openbsd_arm64.gozsysnum_openbsd_mips64.gozsysnum_openbsd_ppc64.gozsysnum_openbsd_riscv64.gozsysnum_zos_s390x.goztypes_aix_ppc.goztypes_aix_ppc64.goztypes_darwin_amd64.goztypes_darwin_arm64.goztypes_dragonfly_amd64.goztypes_freebsd_386.goztypes_freebsd_amd64.goztypes_freebsd_arm.goztypes_freebsd_arm64.goztypes_freebsd_riscv64.goztypes_linux.goztypes_linux_386.goztypes_linux_amd64.goztypes_linux_arm.goztypes_linux_arm64.goztypes_linux_loong64.goztypes_linux_mips.goztypes_linux_mips64.goztypes_linux_mips64le.goztypes_linux_mipsle.goztypes_linux_ppc.goztypes_linux_ppc64.goztypes_linux_ppc64le.goztypes_linux_riscv64.goztypes_linux_s390x.goztypes_linux_sparc64.goztypes_netbsd_386.goztypes_netbsd_amd64.goztypes_netbsd_arm.goztypes_netbsd_arm64.goztypes_openbsd_386.goztypes_openbsd_amd64.goztypes_openbsd_arm.goztypes_openbsd_arm64.goztypes_openbsd_mips64.goztypes_openbsd_ppc64.goztypes_openbsd_riscv64.goztypes_solaris_amd64.goztypes_zos_s390x.go
windows
aliases.godll_windows.goenv_windows.goeventlog.goexec_windows.gomemory_windows.gomkerrors.bashmkknownfolderids.bashmksyscall.gorace.gorace0.go
registry
security_windows.goservice.gosetupapi_windows.gostr.gosyscall.gosyscall_windows.gotypes_windows.gotypes_windows_386.gotypes_windows_amd64.gotypes_windows_arm.gotypes_windows_arm64.gozerrors_windows.gozknownfolderids_windows.gozsyscall_windows.goterm
CONTRIBUTING.mdLICENSEPATENTSREADME.mdcodereview.cfgterm.goterm_plan9.goterm_unix.goterm_unix_bsd.goterm_unix_other.goterm_unsupported.goterm_windows.goterminal.go
text
LICENSEPATENTS
cases
cases.gocontext.gofold.goicu.goinfo.gomap.gotables10.0.0.gotables11.0.0.gotables12.0.0.gotables13.0.0.gotables15.0.0.gotables9.0.0.gotrieval.go
internal
internal.go
language
match.gotag
language
secure
transform
unicode
bidi
bidi.gobracket.gocore.goprop.gotables10.0.0.gotables11.0.0.gotables12.0.0.gotables13.0.0.gotables15.0.0.gotables9.0.0.gotrieval.go
norm
width
time
google.golang.org
genproto
googleapis
grpc
AUTHORSCODE-OF-CONDUCT.mdCONTRIBUTING.mdGOVERNANCE.mdLICENSEMAINTAINERS.mdMakefileNOTICE.txtREADME.mdSECURITY.mdcall.gointerceptor.go
attributes
backoff.gobackoff
balancer
balancer_wrapper.gobinarylog
grpc_binarylog_v1
channelz
clientconn.gocodec.gocodes
connectivity
credentials
dialoptions.godoc.goencoding
grpclog
health
grpc_health_v1
internal
backoff
balancer
gracefulswitch
balancerload
binarylog
buffer
channelz
channel.gochannelmap.gofuncs.gologging.goserver.gosocket.gosubchannel.gosyscall_linux.gosyscall_nonlinux.gotrace.go
credentials
envconfig
experimental.gogrpclog
grpcsync
grpcutil
idle
internal.gometadata
pretty
resolver
serviceconfig
status
syscall
tcp_keepalive_others.gotcp_keepalive_unix.gotcp_keepalive_windows.gotransport
keepalive
metadata
peer
picker_wrapper.gopreloader.goregenerate.shresolver
resolver_wrapper.gorpc_util.goserver.goservice_config.goserviceconfig
shared_buffer_pool.gostats
status
stream.gostream_interfaces.gotap
trace.gotrace_notrace.gotrace_withtrace.goversion.goprotobuf
LICENSEPATENTS
encoding
protodelim
protojson
prototext
protowire
internal
descfmt
descopts
detrand
editiondefaults
encoding
defval
json
messageset
tag
text
errors
filedesc
filetype
flags
genid
any_gen.goapi_gen.godescriptor_gen.godoc.goduration_gen.goempty_gen.gofield_mask_gen.gogo_features_gen.gogoname.gomap_entry.gosource_context_gen.gostruct_gen.gotimestamp_gen.gotype_gen.gowrappers.gowrappers_gen.go
impl
api_export.gocheckinit.gocodec_extension.gocodec_field.gocodec_gen.gocodec_map.gocodec_map_go111.gocodec_map_go112.gocodec_message.gocodec_messageset.gocodec_reflect.gocodec_tables.gocodec_unsafe.goconvert.goconvert_list.goconvert_map.godecode.goencode.goenum.goextension.golegacy_enum.golegacy_export.golegacy_extension.golegacy_file.golegacy_message.gomerge.gomerge_gen.gomessage.gomessage_reflect.gomessage_reflect_field.gomessage_reflect_gen.gopointer_reflect.gopointer_unsafe.govalidate.goweak.go
order
pragma
set
strs
version
proto
checkinit.godecode.godecode_gen.godoc.goencode.goencode_gen.goequal.goextension.gomerge.gomessageset.goproto.goproto_methods.goproto_reflect.goreset.gosize.gosize_gen.gowrappers.go
protoadapt
reflect
protoreflect
methods.goproto.gosource.gosource_gen.gotype.govalue.govalue_equal.govalue_pure.govalue_union.govalue_unsafe_go120.govalue_unsafe_go121.go
protoregistry
runtime
types
known
anypb
durationpb
fieldmaskpb
structpb
timestamppb
wrapperspb
gopkg.in
warnings.v0
yaml.v2
.travis.ymlLICENSELICENSE.libyamlNOTICEREADME.mdapic.godecode.goemitterc.goencode.goparserc.goreaderc.goresolve.goscannerc.gosorter.gowriterc.goyaml.goyamlh.goyamlprivateh.go
yaml.v3
gotest.tools
v3
837
vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go
generated
vendored
Normal file
837
vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go
generated
vendored
Normal file
@ -0,0 +1,837 @@
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package packet
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto"
|
||||
"crypto/cipher"
|
||||
"crypto/dsa"
|
||||
"crypto/rand"
|
||||
"crypto/rsa"
|
||||
"crypto/sha1"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"math/big"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/ProtonMail/go-crypto/openpgp/ecdh"
|
||||
"github.com/ProtonMail/go-crypto/openpgp/ecdsa"
|
||||
"github.com/ProtonMail/go-crypto/openpgp/eddsa"
|
||||
"github.com/ProtonMail/go-crypto/openpgp/elgamal"
|
||||
"github.com/ProtonMail/go-crypto/openpgp/errors"
|
||||
"github.com/ProtonMail/go-crypto/openpgp/internal/encoding"
|
||||
"github.com/ProtonMail/go-crypto/openpgp/s2k"
|
||||
)
|
||||
|
||||
// PrivateKey represents a possibly encrypted private key. See RFC 4880,
|
||||
// section 5.5.3.
|
||||
type PrivateKey struct {
|
||||
PublicKey
|
||||
Encrypted bool // if true then the private key is unavailable until Decrypt has been called.
|
||||
encryptedData []byte
|
||||
cipher CipherFunction
|
||||
s2k func(out, in []byte)
|
||||
// An *{rsa|dsa|elgamal|ecdh|ecdsa|ed25519}.PrivateKey or
|
||||
// crypto.Signer/crypto.Decrypter (Decryptor RSA only).
|
||||
PrivateKey interface{}
|
||||
sha1Checksum bool
|
||||
iv []byte
|
||||
|
||||
// Type of encryption of the S2K packet
|
||||
// Allowed values are 0 (Not encrypted), 254 (SHA1), or
|
||||
// 255 (2-byte checksum)
|
||||
s2kType S2KType
|
||||
// Full parameters of the S2K packet
|
||||
s2kParams *s2k.Params
|
||||
}
|
||||
|
||||
// S2KType s2k packet type
|
||||
type S2KType uint8
|
||||
|
||||
const (
|
||||
// S2KNON unencrypt
|
||||
S2KNON S2KType = 0
|
||||
// S2KSHA1 sha1 sum check
|
||||
S2KSHA1 S2KType = 254
|
||||
// S2KCHECKSUM sum check
|
||||
S2KCHECKSUM S2KType = 255
|
||||
)
|
||||
|
||||
func NewRSAPrivateKey(creationTime time.Time, priv *rsa.PrivateKey) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey)
|
||||
pk.PrivateKey = priv
|
||||
return pk
|
||||
}
|
||||
|
||||
func NewDSAPrivateKey(creationTime time.Time, priv *dsa.PrivateKey) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
pk.PublicKey = *NewDSAPublicKey(creationTime, &priv.PublicKey)
|
||||
pk.PrivateKey = priv
|
||||
return pk
|
||||
}
|
||||
|
||||
func NewElGamalPrivateKey(creationTime time.Time, priv *elgamal.PrivateKey) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey)
|
||||
pk.PrivateKey = priv
|
||||
return pk
|
||||
}
|
||||
|
||||
func NewECDSAPrivateKey(creationTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
pk.PublicKey = *NewECDSAPublicKey(creationTime, &priv.PublicKey)
|
||||
pk.PrivateKey = priv
|
||||
return pk
|
||||
}
|
||||
|
||||
func NewEdDSAPrivateKey(creationTime time.Time, priv *eddsa.PrivateKey) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
pk.PublicKey = *NewEdDSAPublicKey(creationTime, &priv.PublicKey)
|
||||
pk.PrivateKey = priv
|
||||
return pk
|
||||
}
|
||||
|
||||
func NewECDHPrivateKey(creationTime time.Time, priv *ecdh.PrivateKey) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
pk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey)
|
||||
pk.PrivateKey = priv
|
||||
return pk
|
||||
}
|
||||
|
||||
// NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that
|
||||
// implements RSA, ECDSA or EdDSA.
|
||||
func NewSignerPrivateKey(creationTime time.Time, signer interface{}) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
// In general, the public Keys should be used as pointers. We still
|
||||
// type-switch on the values, for backwards-compatibility.
|
||||
switch pubkey := signer.(type) {
|
||||
case *rsa.PrivateKey:
|
||||
pk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey.PublicKey)
|
||||
case rsa.PrivateKey:
|
||||
pk.PublicKey = *NewRSAPublicKey(creationTime, &pubkey.PublicKey)
|
||||
case *ecdsa.PrivateKey:
|
||||
pk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey.PublicKey)
|
||||
case ecdsa.PrivateKey:
|
||||
pk.PublicKey = *NewECDSAPublicKey(creationTime, &pubkey.PublicKey)
|
||||
case *eddsa.PrivateKey:
|
||||
pk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey.PublicKey)
|
||||
case eddsa.PrivateKey:
|
||||
pk.PublicKey = *NewEdDSAPublicKey(creationTime, &pubkey.PublicKey)
|
||||
default:
|
||||
panic("openpgp: unknown signer type in NewSignerPrivateKey")
|
||||
}
|
||||
pk.PrivateKey = signer
|
||||
return pk
|
||||
}
|
||||
|
||||
// NewDecrypterPrivateKey creates a PrivateKey from a *{rsa|elgamal|ecdh}.PrivateKey.
|
||||
func NewDecrypterPrivateKey(creationTime time.Time, decrypter interface{}) *PrivateKey {
|
||||
pk := new(PrivateKey)
|
||||
switch priv := decrypter.(type) {
|
||||
case *rsa.PrivateKey:
|
||||
pk.PublicKey = *NewRSAPublicKey(creationTime, &priv.PublicKey)
|
||||
case *elgamal.PrivateKey:
|
||||
pk.PublicKey = *NewElGamalPublicKey(creationTime, &priv.PublicKey)
|
||||
case *ecdh.PrivateKey:
|
||||
pk.PublicKey = *NewECDHPublicKey(creationTime, &priv.PublicKey)
|
||||
default:
|
||||
panic("openpgp: unknown decrypter type in NewDecrypterPrivateKey")
|
||||
}
|
||||
pk.PrivateKey = decrypter
|
||||
return pk
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parse(r io.Reader) (err error) {
|
||||
err = (&pk.PublicKey).parse(r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
v5 := pk.PublicKey.Version == 5
|
||||
|
||||
var buf [1]byte
|
||||
_, err = readFull(r, buf[:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
pk.s2kType = S2KType(buf[0])
|
||||
var optCount [1]byte
|
||||
if v5 {
|
||||
if _, err = readFull(r, optCount[:]); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
switch pk.s2kType {
|
||||
case S2KNON:
|
||||
pk.s2k = nil
|
||||
pk.Encrypted = false
|
||||
case S2KSHA1, S2KCHECKSUM:
|
||||
if v5 && pk.s2kType == S2KCHECKSUM {
|
||||
return errors.StructuralError("wrong s2k identifier for version 5")
|
||||
}
|
||||
_, err = readFull(r, buf[:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
pk.cipher = CipherFunction(buf[0])
|
||||
if pk.cipher != 0 && !pk.cipher.IsSupported() {
|
||||
return errors.UnsupportedError("unsupported cipher function in private key")
|
||||
}
|
||||
pk.s2kParams, err = s2k.ParseIntoParams(r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if pk.s2kParams.Dummy() {
|
||||
return
|
||||
}
|
||||
pk.s2k, err = pk.s2kParams.Function()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
pk.Encrypted = true
|
||||
if pk.s2kType == S2KSHA1 {
|
||||
pk.sha1Checksum = true
|
||||
}
|
||||
default:
|
||||
return errors.UnsupportedError("deprecated s2k function in private key")
|
||||
}
|
||||
|
||||
if pk.Encrypted {
|
||||
blockSize := pk.cipher.blockSize()
|
||||
if blockSize == 0 {
|
||||
return errors.UnsupportedError("unsupported cipher in private key: " + strconv.Itoa(int(pk.cipher)))
|
||||
}
|
||||
pk.iv = make([]byte, blockSize)
|
||||
_, err = readFull(r, pk.iv)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
var privateKeyData []byte
|
||||
if v5 {
|
||||
var n [4]byte /* secret material four octet count */
|
||||
_, err = readFull(r, n[:])
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
count := uint32(uint32(n[0])<<24 | uint32(n[1])<<16 | uint32(n[2])<<8 | uint32(n[3]))
|
||||
if !pk.Encrypted {
|
||||
count = count + 2 /* two octet checksum */
|
||||
}
|
||||
privateKeyData = make([]byte, count)
|
||||
_, err = readFull(r, privateKeyData)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
privateKeyData, err = ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if !pk.Encrypted {
|
||||
if len(privateKeyData) < 2 {
|
||||
return errors.StructuralError("truncated private key data")
|
||||
}
|
||||
var sum uint16
|
||||
for i := 0; i < len(privateKeyData)-2; i++ {
|
||||
sum += uint16(privateKeyData[i])
|
||||
}
|
||||
if privateKeyData[len(privateKeyData)-2] != uint8(sum>>8) ||
|
||||
privateKeyData[len(privateKeyData)-1] != uint8(sum) {
|
||||
return errors.StructuralError("private key checksum failure")
|
||||
}
|
||||
privateKeyData = privateKeyData[:len(privateKeyData)-2]
|
||||
return pk.parsePrivateKey(privateKeyData)
|
||||
}
|
||||
|
||||
pk.encryptedData = privateKeyData
|
||||
return
|
||||
}
|
||||
|
||||
// Dummy returns true if the private key is a dummy key. This is a GNU extension.
|
||||
func (pk *PrivateKey) Dummy() bool {
|
||||
return pk.s2kParams.Dummy()
|
||||
}
|
||||
|
||||
func mod64kHash(d []byte) uint16 {
|
||||
var h uint16
|
||||
for _, b := range d {
|
||||
h += uint16(b)
|
||||
}
|
||||
return h
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) Serialize(w io.Writer) (err error) {
|
||||
contents := bytes.NewBuffer(nil)
|
||||
err = pk.PublicKey.serializeWithoutHeaders(contents)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = contents.Write([]byte{uint8(pk.s2kType)}); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
optional := bytes.NewBuffer(nil)
|
||||
if pk.Encrypted || pk.Dummy() {
|
||||
optional.Write([]byte{uint8(pk.cipher)})
|
||||
if err := pk.s2kParams.Serialize(optional); err != nil {
|
||||
return err
|
||||
}
|
||||
if pk.Encrypted {
|
||||
optional.Write(pk.iv)
|
||||
}
|
||||
}
|
||||
if pk.Version == 5 {
|
||||
contents.Write([]byte{uint8(optional.Len())})
|
||||
}
|
||||
io.Copy(contents, optional)
|
||||
|
||||
if !pk.Dummy() {
|
||||
l := 0
|
||||
var priv []byte
|
||||
if !pk.Encrypted {
|
||||
buf := bytes.NewBuffer(nil)
|
||||
err = pk.serializePrivateKey(buf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
l = buf.Len()
|
||||
checksum := mod64kHash(buf.Bytes())
|
||||
buf.Write([]byte{byte(checksum >> 8), byte(checksum)})
|
||||
priv = buf.Bytes()
|
||||
} else {
|
||||
priv, l = pk.encryptedData, len(pk.encryptedData)
|
||||
}
|
||||
|
||||
if pk.Version == 5 {
|
||||
contents.Write([]byte{byte(l >> 24), byte(l >> 16), byte(l >> 8), byte(l)})
|
||||
}
|
||||
contents.Write(priv)
|
||||
}
|
||||
|
||||
ptype := packetTypePrivateKey
|
||||
if pk.IsSubkey {
|
||||
ptype = packetTypePrivateSubkey
|
||||
}
|
||||
err = serializeHeader(w, ptype, contents.Len())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = io.Copy(w, contents)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error {
|
||||
if _, err := w.Write(new(encoding.MPI).SetBig(priv.D).EncodedBytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[1]).EncodedBytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := w.Write(new(encoding.MPI).SetBig(priv.Primes[0]).EncodedBytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
_, err := w.Write(new(encoding.MPI).SetBig(priv.Precomputed.Qinv).EncodedBytes())
|
||||
return err
|
||||
}
|
||||
|
||||
func serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error {
|
||||
_, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes())
|
||||
return err
|
||||
}
|
||||
|
||||
func serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error {
|
||||
_, err := w.Write(new(encoding.MPI).SetBig(priv.X).EncodedBytes())
|
||||
return err
|
||||
}
|
||||
|
||||
func serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error {
|
||||
_, err := w.Write(encoding.NewMPI(priv.MarshalIntegerSecret()).EncodedBytes())
|
||||
return err
|
||||
}
|
||||
|
||||
func serializeEdDSAPrivateKey(w io.Writer, priv *eddsa.PrivateKey) error {
|
||||
_, err := w.Write(encoding.NewMPI(priv.MarshalByteSecret()).EncodedBytes())
|
||||
return err
|
||||
}
|
||||
|
||||
func serializeECDHPrivateKey(w io.Writer, priv *ecdh.PrivateKey) error {
|
||||
_, err := w.Write(encoding.NewMPI(priv.MarshalByteSecret()).EncodedBytes())
|
||||
return err
|
||||
}
|
||||
|
||||
// decrypt decrypts an encrypted private key using a decryption key.
|
||||
func (pk *PrivateKey) decrypt(decryptionKey []byte) error {
|
||||
if pk.Dummy() {
|
||||
return errors.ErrDummyPrivateKey("dummy key found")
|
||||
}
|
||||
if !pk.Encrypted {
|
||||
return nil
|
||||
}
|
||||
|
||||
block := pk.cipher.new(decryptionKey)
|
||||
cfb := cipher.NewCFBDecrypter(block, pk.iv)
|
||||
|
||||
data := make([]byte, len(pk.encryptedData))
|
||||
cfb.XORKeyStream(data, pk.encryptedData)
|
||||
|
||||
if pk.sha1Checksum {
|
||||
if len(data) < sha1.Size {
|
||||
return errors.StructuralError("truncated private key data")
|
||||
}
|
||||
h := sha1.New()
|
||||
h.Write(data[:len(data)-sha1.Size])
|
||||
sum := h.Sum(nil)
|
||||
if !bytes.Equal(sum, data[len(data)-sha1.Size:]) {
|
||||
return errors.StructuralError("private key checksum failure")
|
||||
}
|
||||
data = data[:len(data)-sha1.Size]
|
||||
} else {
|
||||
if len(data) < 2 {
|
||||
return errors.StructuralError("truncated private key data")
|
||||
}
|
||||
var sum uint16
|
||||
for i := 0; i < len(data)-2; i++ {
|
||||
sum += uint16(data[i])
|
||||
}
|
||||
if data[len(data)-2] != uint8(sum>>8) ||
|
||||
data[len(data)-1] != uint8(sum) {
|
||||
return errors.StructuralError("private key checksum failure")
|
||||
}
|
||||
data = data[:len(data)-2]
|
||||
}
|
||||
|
||||
err := pk.parsePrivateKey(data)
|
||||
if _, ok := err.(errors.KeyInvalidError); ok {
|
||||
return errors.KeyInvalidError("invalid key parameters")
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Mark key as unencrypted
|
||||
pk.s2kType = S2KNON
|
||||
pk.s2k = nil
|
||||
pk.Encrypted = false
|
||||
pk.encryptedData = nil
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) decryptWithCache(passphrase []byte, keyCache *s2k.Cache) error {
|
||||
if pk.Dummy() {
|
||||
return errors.ErrDummyPrivateKey("dummy key found")
|
||||
}
|
||||
if !pk.Encrypted {
|
||||
return nil
|
||||
}
|
||||
|
||||
key, err := keyCache.GetOrComputeDerivedKey(passphrase, pk.s2kParams, pk.cipher.KeySize())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return pk.decrypt(key)
|
||||
}
|
||||
|
||||
// Decrypt decrypts an encrypted private key using a passphrase.
|
||||
func (pk *PrivateKey) Decrypt(passphrase []byte) error {
|
||||
if pk.Dummy() {
|
||||
return errors.ErrDummyPrivateKey("dummy key found")
|
||||
}
|
||||
if !pk.Encrypted {
|
||||
return nil
|
||||
}
|
||||
|
||||
key := make([]byte, pk.cipher.KeySize())
|
||||
pk.s2k(key, passphrase)
|
||||
return pk.decrypt(key)
|
||||
}
|
||||
|
||||
// DecryptPrivateKeys decrypts all encrypted keys with the given config and passphrase.
|
||||
// Avoids recomputation of similar s2k key derivations.
|
||||
func DecryptPrivateKeys(keys []*PrivateKey, passphrase []byte) error {
|
||||
// Create a cache to avoid recomputation of key derviations for the same passphrase.
|
||||
s2kCache := &s2k.Cache{}
|
||||
for _, key := range keys {
|
||||
if key != nil && !key.Dummy() && key.Encrypted {
|
||||
err := key.decryptWithCache(passphrase, s2kCache)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// encrypt encrypts an unencrypted private key.
|
||||
func (pk *PrivateKey) encrypt(key []byte, params *s2k.Params, cipherFunction CipherFunction) error {
|
||||
if pk.Dummy() {
|
||||
return errors.ErrDummyPrivateKey("dummy key found")
|
||||
}
|
||||
if pk.Encrypted {
|
||||
return nil
|
||||
}
|
||||
// check if encryptionKey has the correct size
|
||||
if len(key) != cipherFunction.KeySize() {
|
||||
return errors.InvalidArgumentError("supplied encryption key has the wrong size")
|
||||
}
|
||||
|
||||
priv := bytes.NewBuffer(nil)
|
||||
err := pk.serializePrivateKey(priv)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pk.cipher = cipherFunction
|
||||
pk.s2kParams = params
|
||||
pk.s2k, err = pk.s2kParams.Function()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
privateKeyBytes := priv.Bytes()
|
||||
pk.sha1Checksum = true
|
||||
block := pk.cipher.new(key)
|
||||
pk.iv = make([]byte, pk.cipher.blockSize())
|
||||
_, err = rand.Read(pk.iv)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cfb := cipher.NewCFBEncrypter(block, pk.iv)
|
||||
|
||||
if pk.sha1Checksum {
|
||||
pk.s2kType = S2KSHA1
|
||||
h := sha1.New()
|
||||
h.Write(privateKeyBytes)
|
||||
sum := h.Sum(nil)
|
||||
privateKeyBytes = append(privateKeyBytes, sum...)
|
||||
} else {
|
||||
pk.s2kType = S2KCHECKSUM
|
||||
var sum uint16
|
||||
for _, b := range privateKeyBytes {
|
||||
sum += uint16(b)
|
||||
}
|
||||
priv.Write([]byte{uint8(sum >> 8), uint8(sum)})
|
||||
}
|
||||
|
||||
pk.encryptedData = make([]byte, len(privateKeyBytes))
|
||||
cfb.XORKeyStream(pk.encryptedData, privateKeyBytes)
|
||||
pk.Encrypted = true
|
||||
pk.PrivateKey = nil
|
||||
return err
|
||||
}
|
||||
|
||||
// EncryptWithConfig encrypts an unencrypted private key using the passphrase and the config.
|
||||
func (pk *PrivateKey) EncryptWithConfig(passphrase []byte, config *Config) error {
|
||||
params, err := s2k.Generate(config.Random(), config.S2K())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Derive an encryption key with the configured s2k function.
|
||||
key := make([]byte, config.Cipher().KeySize())
|
||||
s2k, err := params.Function()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s2k(key, passphrase)
|
||||
// Encrypt the private key with the derived encryption key.
|
||||
return pk.encrypt(key, params, config.Cipher())
|
||||
}
|
||||
|
||||
// EncryptPrivateKeys encrypts all unencrypted keys with the given config and passphrase.
|
||||
// Only derives one key from the passphrase, which is then used to encrypt each key.
|
||||
func EncryptPrivateKeys(keys []*PrivateKey, passphrase []byte, config *Config) error {
|
||||
params, err := s2k.Generate(config.Random(), config.S2K())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// Derive an encryption key with the configured s2k function.
|
||||
encryptionKey := make([]byte, config.Cipher().KeySize())
|
||||
s2k, err := params.Function()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s2k(encryptionKey, passphrase)
|
||||
for _, key := range keys {
|
||||
if key != nil && !key.Dummy() && !key.Encrypted {
|
||||
err = key.encrypt(encryptionKey, params, config.Cipher())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Encrypt encrypts an unencrypted private key using a passphrase.
|
||||
func (pk *PrivateKey) Encrypt(passphrase []byte) error {
|
||||
// Default config of private key encryption
|
||||
config := &Config{
|
||||
S2KConfig: &s2k.Config{
|
||||
S2KMode: s2k.IteratedSaltedS2K,
|
||||
S2KCount: 65536,
|
||||
Hash: crypto.SHA256,
|
||||
},
|
||||
DefaultCipher: CipherAES256,
|
||||
}
|
||||
return pk.EncryptWithConfig(passphrase, config)
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) serializePrivateKey(w io.Writer) (err error) {
|
||||
switch priv := pk.PrivateKey.(type) {
|
||||
case *rsa.PrivateKey:
|
||||
err = serializeRSAPrivateKey(w, priv)
|
||||
case *dsa.PrivateKey:
|
||||
err = serializeDSAPrivateKey(w, priv)
|
||||
case *elgamal.PrivateKey:
|
||||
err = serializeElGamalPrivateKey(w, priv)
|
||||
case *ecdsa.PrivateKey:
|
||||
err = serializeECDSAPrivateKey(w, priv)
|
||||
case *eddsa.PrivateKey:
|
||||
err = serializeEdDSAPrivateKey(w, priv)
|
||||
case *ecdh.PrivateKey:
|
||||
err = serializeECDHPrivateKey(w, priv)
|
||||
default:
|
||||
err = errors.InvalidArgumentError("unknown private key type")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parsePrivateKey(data []byte) (err error) {
|
||||
switch pk.PublicKey.PubKeyAlgo {
|
||||
case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly:
|
||||
return pk.parseRSAPrivateKey(data)
|
||||
case PubKeyAlgoDSA:
|
||||
return pk.parseDSAPrivateKey(data)
|
||||
case PubKeyAlgoElGamal:
|
||||
return pk.parseElGamalPrivateKey(data)
|
||||
case PubKeyAlgoECDSA:
|
||||
return pk.parseECDSAPrivateKey(data)
|
||||
case PubKeyAlgoECDH:
|
||||
return pk.parseECDHPrivateKey(data)
|
||||
case PubKeyAlgoEdDSA:
|
||||
return pk.parseEdDSAPrivateKey(data)
|
||||
}
|
||||
panic("impossible")
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) {
|
||||
rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey)
|
||||
rsaPriv := new(rsa.PrivateKey)
|
||||
rsaPriv.PublicKey = *rsaPub
|
||||
|
||||
buf := bytes.NewBuffer(data)
|
||||
d := new(encoding.MPI)
|
||||
if _, err := d.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
p := new(encoding.MPI)
|
||||
if _, err := p.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
q := new(encoding.MPI)
|
||||
if _, err := q.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rsaPriv.D = new(big.Int).SetBytes(d.Bytes())
|
||||
rsaPriv.Primes = make([]*big.Int, 2)
|
||||
rsaPriv.Primes[0] = new(big.Int).SetBytes(p.Bytes())
|
||||
rsaPriv.Primes[1] = new(big.Int).SetBytes(q.Bytes())
|
||||
if err := rsaPriv.Validate(); err != nil {
|
||||
return errors.KeyInvalidError(err.Error())
|
||||
}
|
||||
rsaPriv.Precompute()
|
||||
pk.PrivateKey = rsaPriv
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) {
|
||||
dsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey)
|
||||
dsaPriv := new(dsa.PrivateKey)
|
||||
dsaPriv.PublicKey = *dsaPub
|
||||
|
||||
buf := bytes.NewBuffer(data)
|
||||
x := new(encoding.MPI)
|
||||
if _, err := x.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dsaPriv.X = new(big.Int).SetBytes(x.Bytes())
|
||||
if err := validateDSAParameters(dsaPriv); err != nil {
|
||||
return err
|
||||
}
|
||||
pk.PrivateKey = dsaPriv
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) {
|
||||
pub := pk.PublicKey.PublicKey.(*elgamal.PublicKey)
|
||||
priv := new(elgamal.PrivateKey)
|
||||
priv.PublicKey = *pub
|
||||
|
||||
buf := bytes.NewBuffer(data)
|
||||
x := new(encoding.MPI)
|
||||
if _, err := x.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
priv.X = new(big.Int).SetBytes(x.Bytes())
|
||||
if err := validateElGamalParameters(priv); err != nil {
|
||||
return err
|
||||
}
|
||||
pk.PrivateKey = priv
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) {
|
||||
ecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey)
|
||||
ecdsaPriv := ecdsa.NewPrivateKey(*ecdsaPub)
|
||||
|
||||
buf := bytes.NewBuffer(data)
|
||||
d := new(encoding.MPI)
|
||||
if _, err := d.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := ecdsaPriv.UnmarshalIntegerSecret(d.Bytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := ecdsa.Validate(ecdsaPriv); err != nil {
|
||||
return err
|
||||
}
|
||||
pk.PrivateKey = ecdsaPriv
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parseECDHPrivateKey(data []byte) (err error) {
|
||||
ecdhPub := pk.PublicKey.PublicKey.(*ecdh.PublicKey)
|
||||
ecdhPriv := ecdh.NewPrivateKey(*ecdhPub)
|
||||
|
||||
buf := bytes.NewBuffer(data)
|
||||
d := new(encoding.MPI)
|
||||
if _, err := d.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := ecdhPriv.UnmarshalByteSecret(d.Bytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := ecdh.Validate(ecdhPriv); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pk.PrivateKey = ecdhPriv
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (pk *PrivateKey) parseEdDSAPrivateKey(data []byte) (err error) {
|
||||
eddsaPub := pk.PublicKey.PublicKey.(*eddsa.PublicKey)
|
||||
eddsaPriv := eddsa.NewPrivateKey(*eddsaPub)
|
||||
eddsaPriv.PublicKey = *eddsaPub
|
||||
|
||||
buf := bytes.NewBuffer(data)
|
||||
d := new(encoding.MPI)
|
||||
if _, err := d.ReadFrom(buf); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err = eddsaPriv.UnmarshalByteSecret(d.Bytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := eddsa.Validate(eddsaPriv); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pk.PrivateKey = eddsaPriv
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateDSAParameters(priv *dsa.PrivateKey) error {
|
||||
p := priv.P // group prime
|
||||
q := priv.Q // subgroup order
|
||||
g := priv.G // g has order q mod p
|
||||
x := priv.X // secret
|
||||
y := priv.Y // y == g**x mod p
|
||||
one := big.NewInt(1)
|
||||
// expect g, y >= 2 and g < p
|
||||
if g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 {
|
||||
return errors.KeyInvalidError("dsa: invalid group")
|
||||
}
|
||||
// expect p > q
|
||||
if p.Cmp(q) <= 0 {
|
||||
return errors.KeyInvalidError("dsa: invalid group prime")
|
||||
}
|
||||
// q should be large enough and divide p-1
|
||||
pSub1 := new(big.Int).Sub(p, one)
|
||||
if q.BitLen() < 150 || new(big.Int).Mod(pSub1, q).Cmp(big.NewInt(0)) != 0 {
|
||||
return errors.KeyInvalidError("dsa: invalid order")
|
||||
}
|
||||
// confirm that g has order q mod p
|
||||
if !q.ProbablyPrime(32) || new(big.Int).Exp(g, q, p).Cmp(one) != 0 {
|
||||
return errors.KeyInvalidError("dsa: invalid order")
|
||||
}
|
||||
// check y
|
||||
if new(big.Int).Exp(g, x, p).Cmp(y) != 0 {
|
||||
return errors.KeyInvalidError("dsa: mismatching values")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateElGamalParameters(priv *elgamal.PrivateKey) error {
|
||||
p := priv.P // group prime
|
||||
g := priv.G // g has order p-1 mod p
|
||||
x := priv.X // secret
|
||||
y := priv.Y // y == g**x mod p
|
||||
one := big.NewInt(1)
|
||||
// Expect g, y >= 2 and g < p
|
||||
if g.Cmp(one) <= 0 || y.Cmp(one) <= 0 || g.Cmp(p) > 0 {
|
||||
return errors.KeyInvalidError("elgamal: invalid group")
|
||||
}
|
||||
if p.BitLen() < 1024 {
|
||||
return errors.KeyInvalidError("elgamal: group order too small")
|
||||
}
|
||||
pSub1 := new(big.Int).Sub(p, one)
|
||||
if new(big.Int).Exp(g, pSub1, p).Cmp(one) != 0 {
|
||||
return errors.KeyInvalidError("elgamal: invalid group")
|
||||
}
|
||||
// Since p-1 is not prime, g might have a smaller order that divides p-1.
|
||||
// We cannot confirm the exact order of g, but we make sure it is not too small.
|
||||
gExpI := new(big.Int).Set(g)
|
||||
i := 1
|
||||
threshold := 2 << 17 // we want order > threshold
|
||||
for i < threshold {
|
||||
i++ // we check every order to make sure key validation is not easily bypassed by guessing y'
|
||||
gExpI.Mod(new(big.Int).Mul(gExpI, g), p)
|
||||
if gExpI.Cmp(one) == 0 {
|
||||
return errors.KeyInvalidError("elgamal: order too small")
|
||||
}
|
||||
}
|
||||
// Check y
|
||||
if new(big.Int).Exp(g, x, p).Cmp(y) != 0 {
|
||||
return errors.KeyInvalidError("elgamal: mismatching values")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user