242 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			242 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| 
								 | 
							
								#compdef openssl
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# OpenSSL zsh completion
							 | 
						||
| 
								 | 
							
								# Bruno Bonfils <asyd@asyd.net>
							 | 
						||
| 
								 | 
							
								# 2005-11-13
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local prev="$words[CURRENT-1]"     # previous word
							 | 
						||
| 
								 | 
							
								local cmd="$words[2]"              # Current openssl sub command (i.e. x509, req, etc..)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local -a openssl_commands
							 | 
						||
| 
								 | 
							
								local -a options
							 | 
						||
| 
								 | 
							
								local -A explanations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Associative arrays to add description based on the option
							 | 
						||
| 
								 | 
							
								explanations=(
							 | 
						||
| 
								 | 
							
									'-in' 'Input file' 
							 | 
						||
| 
								 | 
							
									'-out' 'Output file'
							 | 
						||
| 
								 | 
							
									'-CA' 'CA file'
							 | 
						||
| 
								 | 
							
									'-rand' 'Seed data file'
							 | 
						||
| 
								 | 
							
									'-key' 'Key file'
							 | 
						||
| 
								 | 
							
									'-CAfile' 'CA file'
							 | 
						||
| 
								 | 
							
									'-cacert' 'CA certificate file'
							 | 
						||
| 
								 | 
							
									'-CApath' 'CA directory'
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# List of openssl's sub commands
							 | 
						||
| 
								 | 
							
								openssl_commands=("asn1parse" "s_client" "x509" "req" "ca"
							 | 
						||
| 
								 | 
							
										"dsa" "crl" "ocsp" "pkcs12" "verify"
							 | 
						||
| 
								 | 
							
										"crl" "pkcs7" "genrsa" "gendsa")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local -a textoptions					  # suboptions of X509's certopt command
							 | 
						||
| 
								 | 
							
								textoptions=("compatible" "no_header" "no_version" "no_serial" 
							 | 
						||
| 
								 | 
							
												"no_signame" "no_validity" "no_subject" "no_issuer" 
							 | 
						||
| 
								 | 
							
												"no_pubkey" "no_sigdump"  "no_aux" "no_extensions" 
							 | 
						||
| 
								 | 
							
												"ext_default" "ext_error" "ext_parse" "ext_dump" "ca_default")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Is first word an OpenSSL subcommand ?
							 | 
						||
| 
								 | 
							
								if [[ -n ${(M)openssl_commands:#$cmd} ]] ; then
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# These options are used by lot of sub openssl_commands
							 | 
						||
| 
								 | 
							
									# The continue prevent complete others options
							 | 
						||
| 
								 | 
							
									case "$prev" in
							 | 
						||
| 
								 | 
							
										"-CA"|"-rand"|"-cacert"|"-cert"|"-in"|"-out"|"-key"|"-CAfile")
							 | 
						||
| 
								 | 
							
											 _wanted filename expl $explanations[$prev] _files
							 | 
						||
| 
								 | 
							
											 continue
							 | 
						||
| 
								 | 
							
											 ;;
							 | 
						||
| 
								 | 
							
										"-passin"|"-passout")
							 | 
						||
| 
								 | 
							
											_wanted passphrase expl "pass phrase format" 
							 | 
						||
| 
								 | 
							
											continue
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										"-inform"|"-outform"|"-certform")
							 | 
						||
| 
								 | 
							
											 _wanted format expl "Format" compadd "pem" "der"
							 | 
						||
| 
								 | 
							
											 continue
							 | 
						||
| 
								 | 
							
											 ;;
							 | 
						||
| 
								 | 
							
										"-CApath")
							 | 
						||
| 
								 | 
							
											 _wanted directory expl $explanations[$prev] _directories
							 | 
						||
| 
								 | 
							
											 continue
							 | 
						||
| 
								 | 
							
											 ;;
							 | 
						||
| 
								 | 
							
								    esac
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
									# Complete for specific options
							 | 
						||
| 
								 | 
							
									case "$cmd" in
							 | 
						||
| 
								 | 
							
										# s_client
							 | 
						||
| 
								 | 
							
										"s_client")
							 | 
						||
| 
								 | 
							
											 case "$prev" in
							 | 
						||
| 
								 | 
							
											"-connect")
							 | 
						||
| 
								 | 
							
												 _wanted host expl "host:port" _hosts
							 | 
						||
| 
								 | 
							
												 ;;
							 | 
						||
| 
								 | 
							
											"-starttls")
							 | 
						||
| 
								 | 
							
												 _wanted protocol expl "protocol" compadd "pop3" "smtp"
							 | 
						||
| 
								 | 
							
												 ;;
							 | 
						||
| 
								 | 
							
											*)
							 | 
						||
| 
								 | 
							
												 options=("-connect" "-cert" "-certform" "-key" "-keyform" "-pass" 
							 | 
						||
| 
								 | 
							
															"-verify" "-CApath" "-CAfile" "-reconnect" "-pause" "-showcerts" 
							 | 
						||
| 
								 | 
							
															"-prexit" "-state" "-debug" "-msg" "-nbio_test" "-crlf" 
							 | 
						||
| 
								 | 
							
															"-ign_eof" "-quiet" "-bugs" "-cipher" "-starttls" "-engine" "-rand")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												 _wanted options expl "s_client options" compadd - $options
							 | 
						||
| 
								 | 
							
												 ;;
							 | 
						||
| 
								 | 
							
											 esac
							 | 
						||
| 
								 | 
							
										 ;;
							 | 
						||
| 
								 | 
							
										# X509 subcommand
							 | 
						||
| 
								 | 
							
										"x509")
							 | 
						||
| 
								 | 
							
											 case "$prev" in
							 | 
						||
| 
								 | 
							
												"-certopt")
							 | 
						||
| 
								 | 
							
													 _wanted certopt expl "Certificate options" compadd -q -S, $textoptions
							 | 
						||
| 
								 | 
							
													 ;;
							 | 
						||
| 
								 | 
							
												# Complete for x509 options
							 | 
						||
| 
								 | 
							
												*)
							 | 
						||
| 
								 | 
							
													 options=("-inform" "-outform" "-in" "-out" "-engine" "-text" "-certopt" "-noout" "-modulus" "-serial" "-subject_hash" "-fingerprint")
							 | 
						||
| 
								 | 
							
													 # Only complete for digest only if none found
							 | 
						||
| 
								 | 
							
													 if [[ ! -n $words[(r)(-md2|-md5|-sha1|-mdc2)] ]] ; then
							 | 
						||
| 
								 | 
							
													options=($options "-md2" "-md5" "-sha1" "-mdc2")
							 | 
						||
| 
								 | 
							
													 fi
							 | 
						||
| 
								 | 
							
													 _wanted options expl "x509 options" compadd - $options
							 | 
						||
| 
								 | 
							
													 ;;
							 | 
						||
| 
								 | 
							
											 esac
							 | 
						||
| 
								 | 
							
										 ;;
							 | 
						||
| 
								 | 
							
										# verify subcommand
							 | 
						||
| 
								 | 
							
										"verify")
							 | 
						||
| 
								 | 
							
											options=("-CAfile" "-CApath" "-purpose" "-untrusted" "-issuer_checks" "-verbose")
							 | 
						||
| 
								 | 
							
												_wanted options expl "verify options" compadd - $options
							 | 
						||
| 
								 | 
							
												_wanted certificates expl "X509 certificates" _files
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										# req subcommand
							 | 
						||
| 
								 | 
							
										"req")
							 | 
						||
| 
								 | 
							
											 options=("-inform" "-outform" "-in" "-passin" "-out" "-passout" 
							 | 
						||
| 
								 | 
							
														 "-text" "-pubkey" "-noout" "-verify" "-new" "-rand" "-newkey" 
							 | 
						||
| 
								 | 
							
														 "-key" "-keyform" "-keyout" "-nodes" "-config" "-multivalue-rdn" 
							 | 
						||
| 
								 | 
							
														 "-x509" "-days" "-set_serial" "-extensions" "-reqexts" 
							 | 
						||
| 
								 | 
							
														 "-utf8" "-nameopt" "-asn1-kludge" "-newhdr" "-batch" "-verbose" "-engine")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											 # Complete for digest only if none found
							 | 
						||
| 
								 | 
							
											 if [[ ! -n $words[(r)(-md2|-md5|-sha1|-mdc2)] ]] ; then
							 | 
						||
| 
								 | 
							
												options=($options "-md2" "-md5" "-sha1" "-mdc2")
							 | 
						||
| 
								 | 
							
											 fi
							 | 
						||
| 
								 | 
							
											 _wanted options expl "req options" compadd - $options
							 | 
						||
| 
								 | 
							
										 ;;
							 | 
						||
| 
								 | 
							
										# OCSP
							 | 
						||
| 
								 | 
							
										"ocsp")
							 | 
						||
| 
								 | 
							
											case "$prev" in
							 | 
						||
| 
								 | 
							
												"-issuer"|"-index"|"-reqout"|"-respout"|"-VAfile")
							 | 
						||
| 
								 | 
							
													_wanted filename expl "${prev//-/} file" _files
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-port")
							 | 
						||
| 
								 | 
							
													# TODO FIXME, support hosts:port
							 | 
						||
| 
								 | 
							
													_wanted port expl "port" _ports
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-url")
							 | 
						||
| 
								 | 
							
													_wanted url expl "URL" _urls
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												*)
							 | 
						||
| 
								 | 
							
													options=("-out" "-issuer" "-cert" "-serial" "-signer" "-signkey" "-sign_other" "-req_text" 
							 | 
						||
| 
								 | 
							
														"-url" "-CAfile" "-port" "-index" "-CApath" "-VAfile" "-nonce" "-no_nonce"
							 | 
						||
| 
								 | 
							
														"-req_text" "-resp_text" "-text" "-reqout" "-respout"	"-host")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													_wanted options expl 'ocsp options' compadd - $options
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
											esac
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										# pkcs12
							 | 
						||
| 
								 | 
							
										"pkcs12")
							 | 
						||
| 
								 | 
							
												options=('-in' '-out' '-pass' '-passout' '-noout' '-clcerts' '-cacerts' '-nocerts' 
							 | 
						||
| 
								 | 
							
															'-nokeys' '-info' '-des' '-des3' '-idea' '-nodes' '-nomacver' '-twopass' '-export'
							 | 
						||
| 
								 | 
							
															'-out' '-inkey' '-name' '-certfile' '-caname' '-passin' '-chain' '-descert')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												_wanted options expl 'pkcs12 options' compadd - $options
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										# crl
							 | 
						||
| 
								 | 
							
										"crl")
							 | 
						||
| 
								 | 
							
												options=('-inform' '-outform' '-text' '-in' '-out' '-noout' '-hash' '-issuer' 
							 | 
						||
| 
								 | 
							
													'-lastupdate' '-nextupdate' '-CAfile' '-CApath')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												_wanted options expl 'CRL options' compadd - $options
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										"pkcs7")
							 | 
						||
| 
								 | 
							
												options=('-inform' '-outform' '-in' '-text' '-out' '-print_certs' '-noout' '-engine')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												_wanted options expl 'PKCS#7 options' compadd - $options
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										"asn1parse")
							 | 
						||
| 
								 | 
							
											case "$prev" in
							 | 
						||
| 
								 | 
							
												"-offset"|"-strparse")
							 | 
						||
| 
								 | 
							
											 		_wanted format expl "Offset" compadd - "number"
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-length")
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												*)
							 | 
						||
| 
								 | 
							
													options=('-inform' '-in' '-out' '-noout' '-offset' '-length' '-i' '-oid' '-strpase')
							 | 
						||
| 
								 | 
							
													_wanted options expl 'ASN1Parse options' compadd - $options
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
											esac
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										"ca")
							 | 
						||
| 
								 | 
							
											case "$prev" in
							 | 
						||
| 
								 | 
							
												"-config"|"-ss_cert"|"-spkack"|"-extfile")
							 | 
						||
| 
								 | 
							
											 		_wanted filename expl "${prev/-/} file" _files
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-outdir")
							 | 
						||
| 
								 | 
							
													_wanted directory expl 'Directory output' _directories
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-startdate"|"-enddate"|"-crl_compromise"|"-crl_CA_compromise")
							 | 
						||
| 
								 | 
							
													_message 'Date (YYMMDDHHMMSSZ)'
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-days"|"-crldays")
							 | 
						||
| 
								 | 
							
													_message 'Number of days'
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-crlhours")
							 | 
						||
| 
								 | 
							
													_message 'Number of hours'
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-crl_reason")
							 | 
						||
| 
								 | 
							
													reasons=("unspecified" 
							 | 
						||
| 
								 | 
							
														"keyCompromise" 
							 | 
						||
| 
								 | 
							
														"CACompromise"
							 | 
						||
| 
								 | 
							
														"affiliationChanged" 
							 | 
						||
| 
								 | 
							
														"superseded" 
							 | 
						||
| 
								 | 
							
														"cessationOfOperation" 
							 | 
						||
| 
								 | 
							
														"certificateHold" 
							 | 
						||
| 
								 | 
							
														"removeFromCRL")
							 | 
						||
| 
								 | 
							
													_wanted reason expl 'Revocation reason' compadd - $reasons
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-md")
							 | 
						||
| 
								 | 
							
													mds=("md5" "sha1" "mdc2")
							 | 
						||
| 
								 | 
							
													_wanted msgdst expl 'Message digest' compadd - $mds
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												"-name"|"-policy"|"-extensions"|"-crlexts")
							 | 
						||
| 
								 | 
							
													_message 'Section'
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
												*)
							 | 
						||
| 
								 | 
							
													options=('-config' '-name' '-in' '-ss_cert' '-spkack' '-infiles' '-out'
							 | 
						||
| 
								 | 
							
													 '-outdir' '-cert' '-keyfile' '-key' '-passin' '-verbose'
							 | 
						||
| 
								 | 
							
													'-notext' '-startdate' '-enddate' '-days' '-md' '-policy'
							 | 
						||
| 
								 | 
							
													'-msie_hack' '-preverseDN' '-noemailDN' '-batch' '-extensions'
							 | 
						||
| 
								 | 
							
													'-extfile' '-engine' '-gencrl' '-crldays' '-crlhours' '-revoke'
							 | 
						||
| 
								 | 
							
													'-crl_reason' '-crl_hold' '-crl_compromise' '-crl_CA_compromise'
							 | 
						||
| 
								 | 
							
													'-subj' '-crlexts')
							 | 
						||
| 
								 | 
							
													_wanted options expl 'CA options' compadd - $options
							 | 
						||
| 
								 | 
							
												;;
							 | 
						||
| 
								 | 
							
											esac
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										"genrsa")
							 | 
						||
| 
								 | 
							
											digests=('-des' '-des3' '-idea')
							 | 
						||
| 
								 | 
							
											options=('-out' '-passout')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											# FIXME TODO
							 | 
						||
| 
								 | 
							
											if [[ ! -n $words[(r)($digests)] ]] ; then
							 | 
						||
| 
								 | 
							
												options=($options $digests)
							 | 
						||
| 
								 | 
							
											fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											_wanted options expl 'genrsa Options' compadd - $options
							 | 
						||
| 
								 | 
							
										;;
							 | 
						||
| 
								 | 
							
										*)
							 | 
						||
| 
								 | 
							
											_message "invalid command"
							 | 
						||
| 
								 | 
							
										;;
							 | 
						||
| 
								 | 
							
										esac
							 | 
						||
| 
								 | 
							
								else # Nop, complete for subcommands
							 | 
						||
| 
								 | 
							
									if [[ ${#words} < 3 ]] ; then
							 | 
						||
| 
								 | 
							
									    _wanted subcommand expl "Subcommand" compadd $openssl_commands
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										_message "invalid command"
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								fi
							 |