mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 08:22:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			38 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			38 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// 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
							 | 
						||
| 
								 | 
							
								// to an *rsa.PrivateKey. It detects whether the private key is in a
							 | 
						||
| 
								 | 
							
								// PEM container or not. If so, it extracts the the private key
							 | 
						||
| 
								 | 
							
								// 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
							 | 
						||
| 
								 | 
							
								}
							 |