| // Copyright 2014 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 x509_test | 
 |  | 
 | import ( | 
 | 	"crypto/dsa" | 
 | 	"crypto/ecdsa" | 
 | 	"crypto/ed25519" | 
 | 	"crypto/rsa" | 
 | 	"crypto/x509" | 
 | 	"encoding/pem" | 
 | 	"fmt" | 
 | ) | 
 |  | 
 | func ExampleCertificate_Verify() { | 
 | 	// Verifying with a custom list of root certificates. | 
 |  | 
 | 	const rootPEM = ` | 
 | -----BEGIN CERTIFICATE----- | 
 | MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT | 
 | MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i | 
 | YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG | 
 | EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy | 
 | bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB | 
 | AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP | 
 | VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv | 
 | h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE | 
 | ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ | 
 | EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC | 
 | DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB+zCB+DAfBgNVHSMEGDAWgBTAephojYn7 | 
 | qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD | 
 | VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g | 
 | K4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI | 
 | KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n | 
 | ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB | 
 | BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY | 
 | /iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf/a/ | 
 | zG+FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU++0ED8Vf4GXjza | 
 | HFa9llF7b1cq26KqltyMdMKVvvBulRP/F/A8rLIQjcxz++iPAsbw+zOzlTvjwsto | 
 | WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z/qHQF1hwFGPa4NrzQU6 | 
 | yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx | 
 | -----END CERTIFICATE-----` | 
 |  | 
 | 	const certPEM = ` | 
 | -----BEGIN CERTIFICATE----- | 
 | MIIDujCCAqKgAwIBAgIIE31FZVaPXTUwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE | 
 | BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl | 
 | cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMTI5MTMyNzQzWhcNMTQwNTI5MDAwMDAw | 
 | WjBpMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN | 
 | TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEYMBYGA1UEAwwPbWFp | 
 | bC5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfRrObuSW5T7q | 
 | 5CnSEqefEmtH4CCv6+5EckuriNr1CjfVvqzwfAhopXkLrq45EQm8vkmf7W96XJhC | 
 | 7ZM0dYi1/qOCAU8wggFLMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAa | 
 | BgNVHREEEzARgg9tYWlsLmdvb2dsZS5jb20wCwYDVR0PBAQDAgeAMGgGCCsGAQUF | 
 | BwEBBFwwWjArBggrBgEFBQcwAoYfaHR0cDovL3BraS5nb29nbGUuY29tL0dJQUcy | 
 | LmNydDArBggrBgEFBQcwAYYfaHR0cDovL2NsaWVudHMxLmdvb2dsZS5jb20vb2Nz | 
 | cDAdBgNVHQ4EFgQUiJxtimAuTfwb+aUtBn5UYKreKvMwDAYDVR0TAQH/BAIwADAf | 
 | BgNVHSMEGDAWgBRK3QYWG7z2aLV29YG2u2IaulqBLzAXBgNVHSAEEDAOMAwGCisG | 
 | AQQB1nkCBQEwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUuY29t | 
 | L0dJQUcyLmNybDANBgkqhkiG9w0BAQUFAAOCAQEAH6RYHxHdcGpMpFE3oxDoFnP+ | 
 | gtuBCHan2yE2GRbJ2Cw8Lw0MmuKqHlf9RSeYfd3BXeKkj1qO6TVKwCh+0HdZk283 | 
 | TZZyzmEOyclm3UGFYe82P/iDFt+CeQ3NpmBg+GoaVCuWAARJN/KfglbLyyYygcQq | 
 | 0SgeDh8dRKUiaW3HQSoYvTvdTuqzwK4CXsr3b5/dAOY8uMuG/IAR3FgwTbZ1dtoW | 
 | RvOTa8hYiU6A475WuZKyEHcwnGYe57u2I2KbMgcKjPniocj4QzgYsVAVKW3IwaOh | 
 | yE+vPxsiUkvQHdO2fojCkY8jg70jxM+gu59tPDNbw3Uh/2Ij310FgTHsnGQMyA== | 
 | -----END CERTIFICATE-----` | 
 |  | 
 | 	// First, create the set of root certificates. For this example we only | 
 | 	// have one. It's also possible to omit this in order to use the | 
 | 	// default root set of the current operating system. | 
 | 	roots := x509.NewCertPool() | 
 | 	ok := roots.AppendCertsFromPEM([]byte(rootPEM)) | 
 | 	if !ok { | 
 | 		panic("failed to parse root certificate") | 
 | 	} | 
 |  | 
 | 	block, _ := pem.Decode([]byte(certPEM)) | 
 | 	if block == nil { | 
 | 		panic("failed to parse certificate PEM") | 
 | 	} | 
 | 	cert, err := x509.ParseCertificate(block.Bytes) | 
 | 	if err != nil { | 
 | 		panic("failed to parse certificate: " + err.Error()) | 
 | 	} | 
 |  | 
 | 	opts := x509.VerifyOptions{ | 
 | 		DNSName: "mail.google.com", | 
 | 		Roots:   roots, | 
 | 	} | 
 |  | 
 | 	if _, err := cert.Verify(opts); err != nil { | 
 | 		panic("failed to verify certificate: " + err.Error()) | 
 | 	} | 
 | } | 
 |  | 
 | func ExampleParsePKIXPublicKey() { | 
 | 	const pubPEM = ` | 
 | -----BEGIN PUBLIC KEY----- | 
 | MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlRuRnThUjU8/prwYxbty | 
 | WPT9pURI3lbsKMiB6Fn/VHOKE13p4D8xgOCADpdRagdT6n4etr9atzDKUSvpMtR3 | 
 | CP5noNc97WiNCggBjVWhs7szEe8ugyqF23XwpHQ6uV1LKH50m92MbOWfCtjU9p/x | 
 | qhNpQQ1AZhqNy5Gevap5k8XzRmjSldNAFZMY7Yv3Gi+nyCwGwpVtBUwhuLzgNFK/ | 
 | yDtw2WcWmUU7NuC8Q6MWvPebxVtCfVp/iQU6q60yyt6aGOBkhAX0LpKAEhKidixY | 
 | nP9PNVBvxgu3XZ4P36gZV6+ummKdBVnc3NqwBLu5+CcdRdusmHPHd5pHf4/38Z3/ | 
 | 6qU2a/fPvWzceVTEgZ47QjFMTCTmCwNt29cvi7zZeQzjtwQgn4ipN9NibRH/Ax/q | 
 | TbIzHfrJ1xa2RteWSdFjwtxi9C20HUkjXSeI4YlzQMH0fPX6KCE7aVePTOnB69I/ | 
 | a9/q96DiXZajwlpq3wFctrs1oXqBp5DVrCIj8hU2wNgB7LtQ1mCtsYz//heai0K9 | 
 | PhE4X6hiE0YmeAZjR0uHl8M/5aW9xCoJ72+12kKpWAa0SFRWLy6FejNYCYpkupVJ | 
 | yecLk/4L1W0l6jQQZnWErXZYe0PNFcmwGXy1Rep83kfBRNKRy5tvocalLlwXLdUk | 
 | AIU+2GKjyT3iMuzZxxFxPFMCAwEAAQ== | 
 | -----END PUBLIC KEY-----` | 
 |  | 
 | 	block, _ := pem.Decode([]byte(pubPEM)) | 
 | 	if block == nil { | 
 | 		panic("failed to parse PEM block containing the public key") | 
 | 	} | 
 |  | 
 | 	pub, err := x509.ParsePKIXPublicKey(block.Bytes) | 
 | 	if err != nil { | 
 | 		panic("failed to parse DER encoded public key: " + err.Error()) | 
 | 	} | 
 |  | 
 | 	switch pub := pub.(type) { | 
 | 	case *rsa.PublicKey: | 
 | 		fmt.Println("pub is of type RSA:", pub) | 
 | 	case *dsa.PublicKey: | 
 | 		fmt.Println("pub is of type DSA:", pub) | 
 | 	case *ecdsa.PublicKey: | 
 | 		fmt.Println("pub is of type ECDSA:", pub) | 
 | 	case ed25519.PublicKey: | 
 | 		fmt.Println("pub is of type Ed25519:", pub) | 
 | 	default: | 
 | 		panic("unknown type of public key") | 
 | 	} | 
 | } |