mirror of
				https://github.com/yv1ing/ShotRDP.git
				synced 2025-09-16 15:10:57 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package nla
 | |
| 
 | |
| import (
 | |
| 	"encoding/asn1"
 | |
| 
 | |
| 	"ShotRDP/grdp/glog"
 | |
| )
 | |
| 
 | |
| type NegoToken struct {
 | |
| 	Data []byte `asn1:"explicit,tag:0"`
 | |
| }
 | |
| 
 | |
| type TSRequest struct {
 | |
| 	Version    int         `asn1:"explicit,tag:0"`
 | |
| 	NegoTokens []NegoToken `asn1:"optional,explicit,tag:1"`
 | |
| 	AuthInfo   []byte      `asn1:"optional,explicit,tag:2"`
 | |
| 	PubKeyAuth []byte      `asn1:"optional,explicit,tag:3"`
 | |
| 	//ErrorCode  int         `asn1:"optional,explicit,tag:4"`
 | |
| }
 | |
| 
 | |
| type TSCredentials struct {
 | |
| 	CredType    int    `asn1:"explicit,tag:0"`
 | |
| 	Credentials []byte `asn1:"explicit,tag:1"`
 | |
| }
 | |
| 
 | |
| type TSPasswordCreds struct {
 | |
| 	DomainName []byte `asn1:"explicit,tag:0"`
 | |
| 	UserName   []byte `asn1:"explicit,tag:1"`
 | |
| 	Password   []byte `asn1:"explicit,tag:2"`
 | |
| }
 | |
| 
 | |
| type TSCspDataDetail struct {
 | |
| 	KeySpec       int    `asn1:"explicit,tag:0"`
 | |
| 	CardName      string `asn1:"explicit,tag:1"`
 | |
| 	ReaderName    string `asn1:"explicit,tag:2"`
 | |
| 	ContainerName string `asn1:"explicit,tag:3"`
 | |
| 	CspName       string `asn1:"explicit,tag:4"`
 | |
| }
 | |
| 
 | |
| type TSSmartCardCreds struct {
 | |
| 	Pin        string            `asn1:"explicit,tag:0"`
 | |
| 	CspData    []TSCspDataDetail `asn1:"explicit,tag:1"`
 | |
| 	UserHint   string            `asn1:"explicit,tag:2"`
 | |
| 	DomainHint string            `asn1:"explicit,tag:3"`
 | |
| }
 | |
| 
 | |
| func EncodeDERTRequest(msgs []Message, authInfo []byte, pubKeyAuth []byte) []byte {
 | |
| 	req := TSRequest{
 | |
| 		Version: 2,
 | |
| 	}
 | |
| 
 | |
| 	if len(msgs) > 0 {
 | |
| 		req.NegoTokens = make([]NegoToken, 0, len(msgs))
 | |
| 	}
 | |
| 
 | |
| 	for _, msg := range msgs {
 | |
| 		token := NegoToken{msg.Serialize()}
 | |
| 		req.NegoTokens = append(req.NegoTokens, token)
 | |
| 	}
 | |
| 
 | |
| 	if len(authInfo) > 0 {
 | |
| 		req.AuthInfo = authInfo
 | |
| 	}
 | |
| 
 | |
| 	if len(pubKeyAuth) > 0 {
 | |
| 		req.PubKeyAuth = pubKeyAuth
 | |
| 	}
 | |
| 
 | |
| 	result, err := asn1.Marshal(req)
 | |
| 	if err != nil {
 | |
| 		glog.Error(err)
 | |
| 	}
 | |
| 	return result
 | |
| }
 | |
| 
 | |
| func DecodeDERTRequest(s []byte) (*TSRequest, error) {
 | |
| 	treq := &TSRequest{}
 | |
| 	_, err := asn1.Unmarshal(s, treq)
 | |
| 	return treq, err
 | |
| }
 | |
| func EncodeDERTCredentials(domain, username, password []byte) []byte {
 | |
| 	tpas := TSPasswordCreds{domain, username, password}
 | |
| 	result, err := asn1.Marshal(tpas)
 | |
| 	if err != nil {
 | |
| 		glog.Error(err)
 | |
| 	}
 | |
| 	tcre := TSCredentials{1, result}
 | |
| 	result, err = asn1.Marshal(tcre)
 | |
| 	if err != nil {
 | |
| 		glog.Error(err)
 | |
| 	}
 | |
| 	return result
 | |
| }
 | |
| 
 | |
| func DecodeDERTCredentials(s []byte) (*TSCredentials, error) {
 | |
| 	tcre := &TSCredentials{}
 | |
| 	_, err := asn1.Unmarshal(s, tcre)
 | |
| 	return tcre, err
 | |
| }
 |