mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 07:12:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			59 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2016 The Mellium Contributors.
							 | 
						||
| 
								 | 
							
								// Use of this source code is governed by the BSD 2-clause license that can be
							 | 
						||
| 
								 | 
							
								// found in the LICENSE file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package sasl
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"crypto/sha1"
							 | 
						||
| 
								 | 
							
									"crypto/sha256"
							 | 
						||
| 
								 | 
							
									"errors"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Define common errors used by SASL mechanisms and negotiators.
							 | 
						||
| 
								 | 
							
								var (
							 | 
						||
| 
								 | 
							
									ErrInvalidState     = errors.New("Invalid state")
							 | 
						||
| 
								 | 
							
									ErrInvalidChallenge = errors.New("Invalid or missing challenge")
							 | 
						||
| 
								 | 
							
									ErrAuthn            = errors.New("Authentication error")
							 | 
						||
| 
								 | 
							
									ErrTooManySteps     = errors.New("Step called too many times")
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var (
							 | 
						||
| 
								 | 
							
									// Plain is a Mechanism that implements the PLAIN authentication mechanism
							 | 
						||
| 
								 | 
							
									// as defined by RFC 4616.
							 | 
						||
| 
								 | 
							
									Plain Mechanism = plain
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// ScramSha256Plus is a Mechanism that implements the SCRAM-SHA-256-PLUS
							 | 
						||
| 
								 | 
							
									// authentication mechanism defined in RFC 7677. The only supported channel
							 | 
						||
| 
								 | 
							
									// binding type is tls-unique as defined in RFC 5929.
							 | 
						||
| 
								 | 
							
									ScramSha256Plus Mechanism = scram("SCRAM-SHA-256-PLUS", sha256.New)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// ScramSha256 is a Mechanism that implements the SCRAM-SHA-256
							 | 
						||
| 
								 | 
							
									// authentication mechanism defined in RFC 7677.
							 | 
						||
| 
								 | 
							
									ScramSha256 Mechanism = scram("SCRAM-SHA-256", sha256.New)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// ScramSha1Plus is a Mechanism that implements the SCRAM-SHA-1-PLUS
							 | 
						||
| 
								 | 
							
									// authentication mechanism defined in RFC 5802. The only supported channel
							 | 
						||
| 
								 | 
							
									// binding type is tls-unique as defined in RFC 5929.
							 | 
						||
| 
								 | 
							
									ScramSha1Plus Mechanism = scram("SCRAM-SHA-1-PLUS", sha1.New)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// ScramSha1 is a Mechanism that implements the SCRAM-SHA-1 authentication
							 | 
						||
| 
								 | 
							
									// mechanism defined in RFC 5802.
							 | 
						||
| 
								 | 
							
									ScramSha1 Mechanism = scram("SCRAM-SHA-1", sha1.New)
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Mechanism represents a SASL mechanism that can be used by a Client or Server
							 | 
						||
| 
								 | 
							
								// to perform the actual negotiation. Base64 encoding the final challenges and
							 | 
						||
| 
								 | 
							
								// responses should not be performed by the mechanism.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Mechanisms must be stateless and may be shared between goroutines. When a
							 | 
						||
| 
								 | 
							
								// mechanism needs to store state between the different steps it can return
							 | 
						||
| 
								 | 
							
								// anything that it needs to store and the value will be cached by the
							 | 
						||
| 
								 | 
							
								// negotiator and passed in as the data parameter when the next challenge is
							 | 
						||
| 
								 | 
							
								// received.
							 | 
						||
| 
								 | 
							
								type Mechanism struct {
							 | 
						||
| 
								 | 
							
									Name  string
							 | 
						||
| 
								 | 
							
									Start func(n *Negotiator) (more bool, resp []byte, cache interface{}, err error)
							 | 
						||
| 
								 | 
							
									Next  func(n *Negotiator, challenge []byte, data interface{}) (more bool, resp []byte, cache interface{}, err error)
							 | 
						||
| 
								 | 
							
								}
							 |