| 
									
										
										
										
											2021-08-12 21:03:24 +02:00
										 |  |  | // 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 internal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"crypto/rsa" | 
					
						
							|  |  |  | 	"crypto/x509" | 
					
						
							|  |  |  | 	"encoding/pem" | 
					
						
							|  |  |  | 	"errors" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ParseKey converts the binary contents of a private key file | 
					
						
							| 
									
										
										
										
											2025-05-10 14:27:25 +00:00
										 |  |  | // to an [*rsa.PrivateKey]. It detects whether the private key is in a | 
					
						
							| 
									
										
										
										
											2023-05-15 12:23:08 +02:00
										 |  |  | // PEM container or not. If so, it extracts the private key | 
					
						
							| 
									
										
										
										
											2021-08-12 21:03:24 +02:00
										 |  |  | // from PEM container before conversion. It only supports PEM | 
					
						
							|  |  |  | // containers with no passphrase. | 
					
						
							|  |  |  | func ParseKey(key []byte) (*rsa.PrivateKey, error) { | 
					
						
							|  |  |  | 	block, _ := pem.Decode(key) | 
					
						
							|  |  |  | 	if block != nil { | 
					
						
							|  |  |  | 		key = block.Bytes | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	parsedKey, err := x509.ParsePKCS8PrivateKey(key) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		parsedKey, err = x509.ParsePKCS1PrivateKey(key) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, fmt.Errorf("private key should be a PEM or plain PKCS1 or PKCS8; parse error: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	parsed, ok := parsedKey.(*rsa.PrivateKey) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return nil, errors.New("private key is invalid") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return parsed, nil | 
					
						
							|  |  |  | } |