Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
G
gost
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
gost
Commits
d19d5ada
Commit
d19d5ada
authored
Feb 25, 2017
by
rui.zheng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#92 support ssh tunnel for local/remote port forwarding
parent
f31949d1
Changes
35
Hide whitespace changes
Inline
Side-by-side
Showing
35 changed files
with
12439 additions
and
27 deletions
+12439
-27
cmd/gost/vendor/github.com/ginuerzh/gost/forward.go
cmd/gost/vendor/github.com/ginuerzh/gost/forward.go
+144
-10
cmd/gost/vendor/github.com/ginuerzh/gost/gost.go
cmd/gost/vendor/github.com/ginuerzh/gost/gost.go
+16
-0
cmd/gost/vendor/github.com/ginuerzh/gost/http.go
cmd/gost/vendor/github.com/ginuerzh/gost/http.go
+0
-1
cmd/gost/vendor/github.com/ginuerzh/gost/node.go
cmd/gost/vendor/github.com/ginuerzh/gost/node.go
+1
-1
cmd/gost/vendor/github.com/ginuerzh/gost/server.go
cmd/gost/vendor/github.com/ginuerzh/gost/server.go
+27
-0
cmd/gost/vendor/github.com/ginuerzh/gost/ssh.go
cmd/gost/vendor/github.com/ginuerzh/gost/ssh.go
+235
-0
cmd/gost/vendor/golang.org/x/crypto/ed25519/ed25519.go
cmd/gost/vendor/golang.org/x/crypto/ed25519/ed25519.go
+181
-0
cmd/gost/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go
...olang.org/x/crypto/ed25519/internal/edwards25519/const.go
+1422
-0
cmd/gost/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
...rg/x/crypto/ed25519/internal/edwards25519/edwards25519.go
+1771
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/buffer.go
cmd/gost/vendor/golang.org/x/crypto/ssh/buffer.go
+98
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/certs.go
cmd/gost/vendor/golang.org/x/crypto/ssh/certs.go
+503
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/channel.go
cmd/gost/vendor/golang.org/x/crypto/ssh/channel.go
+633
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/cipher.go
cmd/gost/vendor/golang.org/x/crypto/ssh/cipher.go
+627
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/client.go
cmd/gost/vendor/golang.org/x/crypto/ssh/client.go
+211
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/client_auth.go
cmd/gost/vendor/golang.org/x/crypto/ssh/client_auth.go
+475
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/common.go
cmd/gost/vendor/golang.org/x/crypto/ssh/common.go
+371
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/connection.go
cmd/gost/vendor/golang.org/x/crypto/ssh/connection.go
+143
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/doc.go
cmd/gost/vendor/golang.org/x/crypto/ssh/doc.go
+18
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/handshake.go
cmd/gost/vendor/golang.org/x/crypto/ssh/handshake.go
+625
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/kex.go
cmd/gost/vendor/golang.org/x/crypto/ssh/kex.go
+540
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/keys.go
cmd/gost/vendor/golang.org/x/crypto/ssh/keys.go
+905
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/mac.go
cmd/gost/vendor/golang.org/x/crypto/ssh/mac.go
+61
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/messages.go
cmd/gost/vendor/golang.org/x/crypto/ssh/messages.go
+758
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/mux.go
cmd/gost/vendor/golang.org/x/crypto/ssh/mux.go
+330
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/server.go
cmd/gost/vendor/golang.org/x/crypto/ssh/server.go
+491
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/session.go
cmd/gost/vendor/golang.org/x/crypto/ssh/session.go
+627
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/tcpip.go
cmd/gost/vendor/golang.org/x/crypto/ssh/tcpip.go
+407
-0
cmd/gost/vendor/golang.org/x/crypto/ssh/transport.go
cmd/gost/vendor/golang.org/x/crypto/ssh/transport.go
+375
-0
cmd/gost/vendor/vendor.json
cmd/gost/vendor/vendor.json
+21
-3
forward.go
forward.go
+144
-10
gost.go
gost.go
+16
-0
http.go
http.go
+0
-1
node.go
node.go
+1
-1
server.go
server.go
+27
-0
ssh.go
ssh.go
+235
-0
No files found.
cmd/gost/vendor/github.com/ginuerzh/gost/forward.go
View file @
d19d5ada
...
...
@@ -5,13 +5,15 @@ import (
"fmt"
"github.com/ginuerzh/gosocks5"
"github.com/golang/glog"
"golang.org/x/crypto/ssh"
"net"
"time"
)
type
TcpForwardServer
struct
{
Base
*
ProxyServer
Handler
func
(
conn
net
.
Conn
,
raddr
net
.
Addr
)
Base
*
ProxyServer
sshClient
*
ssh
.
Client
Handler
func
(
conn
net
.
Conn
,
raddr
*
net
.
TCPAddr
)
}
func
NewTcpForwardServer
(
base
*
ProxyServer
)
*
TcpForwardServer
{
...
...
@@ -34,19 +36,75 @@ func (s *TcpForwardServer) ListenAndServe() error {
s
.
Handler
=
s
.
handleTcpForward
}
quit
:=
make
(
chan
interface
{})
close
(
quit
)
for
{
start
:
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infoln
(
err
)
glog
.
V
(
LWARNING
)
.
Infoln
(
"[tcp]"
,
err
)
continue
}
setKeepAlive
(
conn
,
KeepAliveTime
)
select
{
case
<-
quit
:
if
s
.
Base
.
Chain
.
lastNode
.
Transport
!=
"ssh"
{
break
}
if
err
:=
s
.
initSSHClient
();
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infoln
(
"[tcp]"
,
err
)
conn
.
Close
()
goto
start
}
quit
=
make
(
chan
interface
{})
go
func
(
ch
chan
interface
{})
{
s
.
sshClient
.
Wait
()
glog
.
V
(
LINFO
)
.
Infoln
(
"[tcp] connection closed"
)
close
(
ch
)
}(
quit
)
default
:
}
go
s
.
Handler
(
conn
,
raddr
)
}
}
func
(
s
*
TcpForwardServer
)
handleTcpForward
(
conn
net
.
Conn
,
raddr
net
.
Addr
)
{
func
(
s
*
TcpForwardServer
)
initSSHClient
()
error
{
if
s
.
sshClient
!=
nil
{
s
.
sshClient
.
Close
()
s
.
sshClient
=
nil
}
sshNode
:=
s
.
Base
.
Chain
.
lastNode
c
,
err
:=
s
.
Base
.
Chain
.
GetConn
()
if
err
!=
nil
{
return
err
}
var
user
,
password
string
if
len
(
sshNode
.
Users
)
>
0
{
user
=
sshNode
.
Users
[
0
]
.
Username
()
password
,
_
=
sshNode
.
Users
[
0
]
.
Password
()
}
config
:=
ssh
.
ClientConfig
{
User
:
user
,
Auth
:
[]
ssh
.
AuthMethod
{
ssh
.
Password
(
password
),
},
}
sshConn
,
chans
,
reqs
,
err
:=
ssh
.
NewClientConn
(
c
,
sshNode
.
Addr
,
&
config
)
if
err
!=
nil
{
return
err
}
s
.
sshClient
=
ssh
.
NewClient
(
sshConn
,
chans
,
reqs
)
s
.
Handler
=
s
.
handleTcpForwardSSH
return
nil
}
func
(
s
*
TcpForwardServer
)
handleTcpForward
(
conn
net
.
Conn
,
raddr
*
net
.
TCPAddr
)
{
defer
conn
.
Close
()
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s - %s"
,
conn
.
RemoteAddr
(),
raddr
)
...
...
@@ -62,6 +120,25 @@ func (s *TcpForwardServer) handleTcpForward(conn net.Conn, raddr net.Addr) {
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s >-< %s"
,
conn
.
RemoteAddr
(),
raddr
)
}
func
(
s
*
TcpForwardServer
)
handleTcpForwardSSH
(
conn
net
.
Conn
,
raddr
*
net
.
TCPAddr
)
{
defer
conn
.
Close
()
if
s
.
sshClient
==
nil
{
return
}
rc
,
err
:=
s
.
sshClient
.
DialTCP
(
"tcp"
,
nil
,
raddr
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[tcp] %s -> %s : %s"
,
conn
.
RemoteAddr
(),
raddr
,
err
)
return
}
defer
rc
.
Close
()
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s <-> %s"
,
conn
.
RemoteAddr
(),
raddr
)
Transport
(
conn
,
rc
)
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s >-< %s"
,
conn
.
RemoteAddr
(),
raddr
)
}
type
packet
struct
{
srcAddr
string
// src address
dstAddr
string
// dest address
...
...
@@ -348,16 +425,73 @@ func (s *RTcpForwardServer) Serve() error {
}
retry
=
0
if
err
:=
s
.
connectRTcpForward
(
conn
,
laddr
,
raddr
);
err
!=
nil
{
conn
.
Close
()
time
.
Sleep
(
6
*
time
.
Second
)
glog
.
V
(
LINFO
)
.
Infof
(
"[rtcp] %s - %s"
,
laddr
,
raddr
)
lastNode
:=
s
.
Base
.
Chain
.
lastNode
if
lastNode
.
Transport
==
"ssh"
{
s
.
connectRTcpForwardSSH
(
conn
,
lastNode
,
laddr
,
raddr
)
}
else
{
if
err
:=
s
.
connectRTcpForward
(
conn
,
laddr
,
raddr
);
err
!=
nil
{
conn
.
Close
()
}
}
time
.
Sleep
(
3
*
time
.
Second
)
}
}
func
(
s
*
RTcpForwardServer
)
connectRTcpForward
(
conn
net
.
Conn
,
laddr
,
raddr
net
.
Addr
)
error
{
glog
.
V
(
LINFO
)
.
Infof
(
"[rtcp] %s - %s"
,
laddr
,
raddr
)
func
(
s
*
RTcpForwardServer
)
connectRTcpForward
SSH
(
conn
net
.
Conn
,
sshNode
*
ProxyNode
,
laddr
,
raddr
net
.
Addr
)
error
{
defer
conn
.
Close
(
)
var
user
,
password
string
if
len
(
sshNode
.
Users
)
>
0
{
user
=
sshNode
.
Users
[
0
]
.
Username
()
password
,
_
=
sshNode
.
Users
[
0
]
.
Password
()
}
config
:=
ssh
.
ClientConfig
{
User
:
user
,
Auth
:
[]
ssh
.
AuthMethod
{
ssh
.
Password
(
password
),
},
}
c
,
chans
,
reqs
,
err
:=
ssh
.
NewClientConn
(
conn
,
sshNode
.
Addr
,
&
config
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
return
err
}
client
:=
ssh
.
NewClient
(
c
,
chans
,
reqs
)
defer
client
.
Close
()
ln
,
err
:=
client
.
Listen
(
"tcp"
,
laddr
.
String
())
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
return
err
}
defer
ln
.
Close
()
for
{
rc
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
return
err
}
go
func
(
c
net
.
Conn
)
{
defer
c
.
Close
()
tc
,
err
:=
net
.
DialTimeout
(
"tcp"
,
raddr
.
String
(),
time
.
Second
*
30
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
return
}
defer
tc
.
Close
()
glog
.
V
(
3
)
.
Infof
(
"[rtcp] %s <-> %s"
,
c
.
RemoteAddr
(),
c
.
LocalAddr
())
Transport
(
c
,
tc
)
glog
.
V
(
3
)
.
Infof
(
"[rtcp] %s >-< %s"
,
c
.
RemoteAddr
(),
c
.
LocalAddr
())
}(
rc
)
}
}
func
(
s
*
RTcpForwardServer
)
connectRTcpForward
(
conn
net
.
Conn
,
laddr
,
raddr
net
.
Addr
)
error
{
req
:=
gosocks5
.
NewRequest
(
gosocks5
.
CmdBind
,
ToSocksAddr
(
laddr
))
if
err
:=
req
.
Write
(
conn
);
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
...
...
@@ -394,7 +528,7 @@ func (s *RTcpForwardServer) connectRTcpForward(conn net.Conn, laddr, raddr net.A
go
func
()
{
defer
conn
.
Close
()
lconn
,
err
:=
net
.
DialTimeout
(
"tcp"
,
raddr
.
String
(),
time
.
Second
*
18
0
)
lconn
,
err
:=
net
.
DialTimeout
(
"tcp"
,
raddr
.
String
(),
time
.
Second
*
3
0
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
rep
.
Addr
,
raddr
,
err
)
return
...
...
cmd/gost/vendor/github.com/ginuerzh/gost/gost.go
View file @
d19d5ada
...
...
@@ -5,6 +5,7 @@ import (
"encoding/base64"
"errors"
"github.com/golang/glog"
"io"
"net"
"strings"
"time"
...
...
@@ -144,3 +145,18 @@ func basicProxyAuth(proxyAuth string) (username, password string, ok bool) {
return
cs
[
:
s
],
cs
[
s
+
1
:
],
true
}
func
Transport
(
rw1
,
rw2
io
.
ReadWriter
)
error
{
errc
:=
make
(
chan
error
,
1
)
go
func
()
{
_
,
err
:=
io
.
Copy
(
rw1
,
rw2
)
errc
<-
err
}()
go
func
()
{
_
,
err
:=
io
.
Copy
(
rw2
,
rw1
)
errc
<-
err
}()
return
<-
errc
}
cmd/gost/vendor/github.com/ginuerzh/gost/http.go
View file @
d19d5ada
...
...
@@ -46,7 +46,6 @@ func (s *HttpServer) HandleRequest(req *http.Request) {
valid
:=
false
u
,
p
,
_
:=
basicProxyAuth
(
req
.
Header
.
Get
(
"Proxy-Authorization"
))
glog
.
V
(
LINFO
)
.
Infoln
(
u
,
p
)
for
_
,
user
:=
range
s
.
Base
.
Node
.
Users
{
username
:=
user
.
Username
()
password
,
_
:=
user
.
Password
()
...
...
cmd/gost/vendor/github.com/ginuerzh/gost/node.go
View file @
d19d5ada
...
...
@@ -71,7 +71,7 @@ func ParseProxyNode(s string) (node ProxyNode, err error) {
}
switch
node
.
Transport
{
case
"ws"
,
"wss"
,
"tls"
,
"http2"
,
"quic"
,
"kcp"
,
"redirect"
,
"ssu"
,
"pht"
:
case
"ws"
,
"wss"
,
"tls"
,
"http2"
,
"quic"
,
"kcp"
,
"redirect"
,
"ssu"
,
"pht"
,
"ssh"
:
case
"https"
:
node
.
Protocol
=
"http"
node
.
Transport
=
"tls"
...
...
cmd/gost/vendor/github.com/ginuerzh/gost/server.go
View file @
d19d5ada
...
...
@@ -7,7 +7,9 @@ import (
"github.com/ginuerzh/gosocks5"
"github.com/golang/glog"
ss
"github.com/shadowsocks/shadowsocks-go/shadowsocks"
"golang.org/x/crypto/ssh"
"io"
"io/ioutil"
"net"
"net/http"
"strconv"
...
...
@@ -125,6 +127,31 @@ func (s *ProxyServer) Serve() error {
return
NewShadowUdpServer
(
s
,
ttl
)
.
ListenAndServe
()
case
"pht"
:
// pure http tunnel
return
NewPureHttpServer
(
s
)
.
ListenAndServe
()
case
"ssh"
:
// SSH tunnel
key
:=
s
.
Node
.
Get
(
"key"
)
privateBytes
,
err
:=
ioutil
.
ReadFile
(
key
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infoln
(
"[ssh]"
,
err
)
privateBytes
=
defaultRawKey
}
private
,
err
:=
ssh
.
ParsePrivateKey
(
privateBytes
)
if
err
!=
nil
{
return
err
}
config
:=
ssh
.
ServerConfig
{
PasswordCallback
:
DefaultPasswordCallback
(
s
.
Node
.
Users
),
}
if
len
(
s
.
Node
.
Users
)
==
0
{
config
.
NoClientAuth
=
true
}
config
.
AddHostKey
(
private
)
s
:=
&
SSHServer
{
Addr
:
node
.
Addr
,
Base
:
s
,
Config
:
&
config
,
}
return
s
.
ListenAndServe
()
default
:
ln
,
err
=
net
.
Listen
(
"tcp"
,
node
.
Addr
)
}
...
...
cmd/gost/vendor/github.com/ginuerzh/gost/ssh.go
0 → 100644
View file @
d19d5ada
// The ssh tunnel is inspired by easyssh(https://dev.justinjudd.org/justin/easyssh)
package
gost
import
(
"encoding/binary"
"fmt"
"github.com/golang/glog"
"golang.org/x/crypto/ssh"
"net"
"net/url"
"strconv"
)
// Applicaple SSH Request types for Port Forwarding - RFC 4254 7.X
const
(
DirectForwardRequest
=
"direct-tcpip"
// RFC 4254 7.2
RemoteForwardRequest
=
"tcpip-forward"
// RFC 4254 7.1
ForwardedTCPReturnRequest
=
"forwarded-tcpip"
// RFC 4254 7.2
CancelRemoteForwardRequest
=
"cancel-tcpip-forward"
// RFC 4254 7.1
)
type
SSHServer
struct
{
Addr
string
Base
*
ProxyServer
Config
*
ssh
.
ServerConfig
Handler
func
(
ssh
.
Conn
,
<-
chan
ssh
.
NewChannel
,
<-
chan
*
ssh
.
Request
)
}
func
(
s
*
SSHServer
)
ListenAndServe
()
error
{
ln
,
err
:=
net
.
Listen
(
"tcp"
,
s
.
Addr
)
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh] Listen:"
,
err
)
return
err
}
defer
ln
.
Close
()
for
{
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh] Accept:"
,
err
)
return
err
}
go
func
(
conn
net
.
Conn
)
{
sshConn
,
chans
,
reqs
,
err
:=
ssh
.
NewServerConn
(
conn
,
s
.
Config
)
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infof
(
"[ssh] %s -> %s : %s"
,
conn
.
RemoteAddr
(),
s
.
Addr
,
err
)
return
}
defer
sshConn
.
Close
()
if
s
.
Handler
==
nil
{
s
.
Handler
=
s
.
handleSSHConn
}
glog
.
V
(
3
)
.
Infof
(
"[ssh] %s <-> %s"
,
conn
.
RemoteAddr
(),
s
.
Addr
)
s
.
Handler
(
sshConn
,
chans
,
reqs
)
glog
.
V
(
3
)
.
Infof
(
"[ssh] %s >-< %s"
,
conn
.
RemoteAddr
(),
s
.
Addr
)
}(
conn
)
}
}
func
(
s
*
SSHServer
)
handleSSHConn
(
conn
ssh
.
Conn
,
chans
<-
chan
ssh
.
NewChannel
,
reqs
<-
chan
*
ssh
.
Request
)
{
quit
:=
make
(
chan
interface
{})
go
func
()
{
for
req
:=
range
reqs
{
switch
req
.
Type
{
case
RemoteForwardRequest
:
go
s
.
tcpipForwardRequest
(
conn
,
req
,
quit
)
default
:
if
req
.
WantReply
{
req
.
Reply
(
false
,
nil
)
}
}
}
}()
go
func
()
{
for
newChannel
:=
range
chans
{
// Check the type of channel
t
:=
newChannel
.
ChannelType
()
switch
t
{
case
DirectForwardRequest
:
channel
,
requests
,
err
:=
newChannel
.
Accept
()
if
err
!=
nil
{
glog
.
V
(
3
)
.
Infoln
(
"[ssh] Could not accept channel:"
,
err
)
continue
}
p
:=
directForward
{}
ssh
.
Unmarshal
(
newChannel
.
ExtraData
(),
&
p
)
go
ssh
.
DiscardRequests
(
requests
)
go
s
.
directPortForwardChannel
(
channel
,
fmt
.
Sprintf
(
"%s:%d"
,
p
.
Host1
,
p
.
Port1
))
default
:
glog
.
V
(
3
)
.
Infoln
(
"[ssh] Unknown channel type:"
,
t
)
newChannel
.
Reject
(
ssh
.
UnknownChannelType
,
fmt
.
Sprintf
(
"unknown channel type: %s"
,
t
))
}
}
}()
conn
.
Wait
()
close
(
quit
)
}
// directForward is structure for RFC 4254 7.2 - can be used for "forwarded-tcpip" and "direct-tcpip"
type
directForward
struct
{
Host1
string
Port1
uint32
Host2
string
Port2
uint32
}
func
(
p
directForward
)
String
()
string
{
return
fmt
.
Sprintf
(
"%s:%d -> %s:%d"
,
p
.
Host2
,
p
.
Port2
,
p
.
Host1
,
p
.
Port1
)
}
func
(
s
*
SSHServer
)
directPortForwardChannel
(
channel
ssh
.
Channel
,
raddr
string
)
{
defer
channel
.
Close
()
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s - %s"
,
s
.
Addr
,
raddr
)
conn
,
err
:=
s
.
Base
.
Chain
.
Dial
(
raddr
)
if
err
!=
nil
{
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s - %s : %s"
,
s
.
Addr
,
raddr
,
err
)
return
}
defer
conn
.
Close
()
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s <-> %s"
,
s
.
Addr
,
raddr
)
Transport
(
conn
,
channel
)
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s >-< %s"
,
s
.
Addr
,
raddr
)
}
// tcpipForward is structure for RFC 4254 7.1 "tcpip-forward" request
type
tcpipForward
struct
{
Host
string
Port
uint32
}
func
(
s
*
SSHServer
)
tcpipForwardRequest
(
sshConn
ssh
.
Conn
,
req
*
ssh
.
Request
,
quit
<-
chan
interface
{})
{
t
:=
tcpipForward
{}
ssh
.
Unmarshal
(
req
.
Payload
,
&
t
)
addr
:=
fmt
.
Sprintf
(
"%s:%d"
,
t
.
Host
,
t
.
Port
)
glog
.
V
(
3
)
.
Infoln
(
"[ssh-rtcp] listening tcp"
,
addr
)
ln
,
err
:=
net
.
Listen
(
"tcp"
,
addr
)
//tie to the client connection
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh-rtcp]"
,
err
)
req
.
Reply
(
false
,
nil
)
return
}
defer
ln
.
Close
()
replyFunc
:=
func
()
error
{
if
t
.
Port
==
0
&&
req
.
WantReply
{
// Client sent port 0. let them know which port is actually being used
_
,
port
,
err
:=
getHostPortFromAddr
(
ln
.
Addr
())
if
err
!=
nil
{
return
err
}
var
b
[
4
]
byte
binary
.
BigEndian
.
PutUint32
(
b
[
:
],
uint32
(
port
))
t
.
Port
=
uint32
(
port
)
return
req
.
Reply
(
true
,
b
[
:
])
}
return
req
.
Reply
(
true
,
nil
)
}
if
err
:=
replyFunc
();
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh-rtcp]"
,
err
)
return
}
go
func
()
{
for
{
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
// Unable to accept new connection - listener likely closed
return
}
go
func
(
conn
net
.
Conn
)
{
defer
conn
.
Close
()
p
:=
directForward
{}
var
err
error
var
portnum
int
p
.
Host1
=
t
.
Host
p
.
Port1
=
t
.
Port
p
.
Host2
,
portnum
,
err
=
getHostPortFromAddr
(
conn
.
RemoteAddr
())
if
err
!=
nil
{
return
}
p
.
Port2
=
uint32
(
portnum
)
ch
,
reqs
,
err
:=
sshConn
.
OpenChannel
(
ForwardedTCPReturnRequest
,
ssh
.
Marshal
(
p
))
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh-rtcp] open forwarded channel:"
,
err
)
return
}
defer
ch
.
Close
()
go
ssh
.
DiscardRequests
(
reqs
)
glog
.
V
(
3
)
.
Infof
(
"[ssh-rtcp] %s <-> %s"
,
conn
.
RemoteAddr
(),
conn
.
LocalAddr
())
Transport
(
ch
,
conn
)
glog
.
V
(
3
)
.
Infof
(
"[ssh-rtcp] %s >-< %s"
,
conn
.
RemoteAddr
(),
conn
.
LocalAddr
())
}(
conn
)
}
}()
<-
quit
}
func
getHostPortFromAddr
(
addr
net
.
Addr
)
(
host
string
,
port
int
,
err
error
)
{
host
,
portString
,
err
:=
net
.
SplitHostPort
(
addr
.
String
())
if
err
!=
nil
{
return
}
port
,
err
=
strconv
.
Atoi
(
portString
)
return
}
type
PasswordCallbackFunc
func
(
conn
ssh
.
ConnMetadata
,
password
[]
byte
)
(
*
ssh
.
Permissions
,
error
)
func
DefaultPasswordCallback
(
users
[]
*
url
.
Userinfo
)
PasswordCallbackFunc
{
return
func
(
conn
ssh
.
ConnMetadata
,
password
[]
byte
)
(
*
ssh
.
Permissions
,
error
)
{
for
_
,
user
:=
range
users
{
u
:=
user
.
Username
()
p
,
_
:=
user
.
Password
()
if
u
==
conn
.
User
()
&&
p
==
string
(
password
)
{
return
nil
,
nil
}
}
glog
.
V
(
3
)
.
Infof
(
"[ssh] %s -> %s : password rejected for %s"
,
conn
.
RemoteAddr
(),
conn
.
LocalAddr
(),
conn
.
User
())
return
nil
,
fmt
.
Errorf
(
"password rejected for %s"
,
conn
.
User
())
}
}
cmd/gost/vendor/golang.org/x/crypto/ed25519/ed25519.go
0 → 100644
View file @
d19d5ada
// Copyright 2016 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 ed25519 implements the Ed25519 signature algorithm. See
// http://ed25519.cr.yp.to/.
//
// These functions are also compatible with the “Ed25519” function defined in
// https://tools.ietf.org/html/draft-irtf-cfrg-eddsa-05.
package
ed25519
// This code is a port of the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
import
(
"crypto"
cryptorand
"crypto/rand"
"crypto/sha512"
"crypto/subtle"
"errors"
"io"
"strconv"
"golang.org/x/crypto/ed25519/internal/edwards25519"
)
const
(
// PublicKeySize is the size, in bytes, of public keys as used in this package.
PublicKeySize
=
32
// PrivateKeySize is the size, in bytes, of private keys as used in this package.
PrivateKeySize
=
64
// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
SignatureSize
=
64
)
// PublicKey is the type of Ed25519 public keys.
type
PublicKey
[]
byte
// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer.
type
PrivateKey
[]
byte
// Public returns the PublicKey corresponding to priv.
func
(
priv
PrivateKey
)
Public
()
crypto
.
PublicKey
{
publicKey
:=
make
([]
byte
,
PublicKeySize
)
copy
(
publicKey
,
priv
[
32
:
])
return
PublicKey
(
publicKey
)
}
// Sign signs the given message with priv.
// Ed25519 performs two passes over messages to be signed and therefore cannot
// handle pre-hashed messages. Thus opts.HashFunc() must return zero to
// indicate the message hasn't been hashed. This can be achieved by passing
// crypto.Hash(0) as the value for opts.
func
(
priv
PrivateKey
)
Sign
(
rand
io
.
Reader
,
message
[]
byte
,
opts
crypto
.
SignerOpts
)
(
signature
[]
byte
,
err
error
)
{
if
opts
.
HashFunc
()
!=
crypto
.
Hash
(
0
)
{
return
nil
,
errors
.
New
(
"ed25519: cannot sign hashed message"
)
}
return
Sign
(
priv
,
message
),
nil
}
// GenerateKey generates a public/private key pair using entropy from rand.
// If rand is nil, crypto/rand.Reader will be used.
func
GenerateKey
(
rand
io
.
Reader
)
(
publicKey
PublicKey
,
privateKey
PrivateKey
,
err
error
)
{
if
rand
==
nil
{
rand
=
cryptorand
.
Reader
}
privateKey
=
make
([]
byte
,
PrivateKeySize
)
publicKey
=
make
([]
byte
,
PublicKeySize
)
_
,
err
=
io
.
ReadFull
(
rand
,
privateKey
[
:
32
])
if
err
!=
nil
{
return
nil
,
nil
,
err
}
digest
:=
sha512
.
Sum512
(
privateKey
[
:
32
])
digest
[
0
]
&=
248
digest
[
31
]
&=
127
digest
[
31
]
|=
64
var
A
edwards25519
.
ExtendedGroupElement
var
hBytes
[
32
]
byte
copy
(
hBytes
[
:
],
digest
[
:
])
edwards25519
.
GeScalarMultBase
(
&
A
,
&
hBytes
)
var
publicKeyBytes
[
32
]
byte
A
.
ToBytes
(
&
publicKeyBytes
)
copy
(
privateKey
[
32
:
],
publicKeyBytes
[
:
])
copy
(
publicKey
,
publicKeyBytes
[
:
])
return
publicKey
,
privateKey
,
nil
}
// Sign signs the message with privateKey and returns a signature. It will
// panic if len(privateKey) is not PrivateKeySize.
func
Sign
(
privateKey
PrivateKey
,
message
[]
byte
)
[]
byte
{
if
l
:=
len
(
privateKey
);
l
!=
PrivateKeySize
{
panic
(
"ed25519: bad private key length: "
+
strconv
.
Itoa
(
l
))
}
h
:=
sha512
.
New
()
h
.
Write
(
privateKey
[
:
32
])
var
digest1
,
messageDigest
,
hramDigest
[
64
]
byte
var
expandedSecretKey
[
32
]
byte
h
.
Sum
(
digest1
[
:
0
])
copy
(
expandedSecretKey
[
:
],
digest1
[
:
])
expandedSecretKey
[
0
]
&=
248
expandedSecretKey
[
31
]
&=
63
expandedSecretKey
[
31
]
|=
64
h
.
Reset
()
h
.
Write
(
digest1
[
32
:
])
h
.
Write
(
message
)
h
.
Sum
(
messageDigest
[
:
0
])
var
messageDigestReduced
[
32
]
byte
edwards25519
.
ScReduce
(
&
messageDigestReduced
,
&
messageDigest
)
var
R
edwards25519
.
ExtendedGroupElement
edwards25519
.
GeScalarMultBase
(
&
R
,
&
messageDigestReduced
)
var
encodedR
[
32
]
byte
R
.
ToBytes
(
&
encodedR
)
h
.
Reset
()
h
.
Write
(
encodedR
[
:
])
h
.
Write
(
privateKey
[
32
:
])
h
.
Write
(
message
)
h
.
Sum
(
hramDigest
[
:
0
])
var
hramDigestReduced
[
32
]
byte
edwards25519
.
ScReduce
(
&
hramDigestReduced
,
&
hramDigest
)
var
s
[
32
]
byte
edwards25519
.
ScMulAdd
(
&
s
,
&
hramDigestReduced
,
&
expandedSecretKey
,
&
messageDigestReduced
)
signature
:=
make
([]
byte
,
SignatureSize
)
copy
(
signature
[
:
],
encodedR
[
:
])
copy
(
signature
[
32
:
],
s
[
:
])
return
signature
}
// Verify reports whether sig is a valid signature of message by publicKey. It
// will panic if len(publicKey) is not PublicKeySize.
func
Verify
(
publicKey
PublicKey
,
message
,
sig
[]
byte
)
bool
{
if
l
:=
len
(
publicKey
);
l
!=
PublicKeySize
{
panic
(
"ed25519: bad public key length: "
+
strconv
.
Itoa
(
l
))
}
if
len
(
sig
)
!=
SignatureSize
||
sig
[
63
]
&
224
!=
0
{
return
false
}
var
A
edwards25519
.
ExtendedGroupElement
var
publicKeyBytes
[
32
]
byte
copy
(
publicKeyBytes
[
:
],
publicKey
)
if
!
A
.
FromBytes
(
&
publicKeyBytes
)
{
return
false
}
edwards25519
.
FeNeg
(
&
A
.
X
,
&
A
.
X
)
edwards25519
.
FeNeg
(
&
A
.
T
,
&
A
.
T
)
h
:=
sha512
.
New
()
h
.
Write
(
sig
[
:
32
])
h
.
Write
(
publicKey
[
:
])
h
.
Write
(
message
)
var
digest
[
64
]
byte
h
.
Sum
(
digest
[
:
0
])
var
hReduced
[
32
]
byte
edwards25519
.
ScReduce
(
&
hReduced
,
&
digest
)
var
R
edwards25519
.
ProjectiveGroupElement
var
b
[
32
]
byte
copy
(
b
[
:
],
sig
[
32
:
])
edwards25519
.
GeDoubleScalarMultVartime
(
&
R
,
&
hReduced
,
&
A
,
&
b
)
var
checkR
[
32
]
byte
R
.
ToBytes
(
&
checkR
)
return
subtle
.
ConstantTimeCompare
(
sig
[
:
32
],
checkR
[
:
])
==
1
}
cmd/gost/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go
0 → 100644
View file @
d19d5ada
// Copyright 2016 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
edwards25519
// These values are from the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
// d is a constant in the Edwards curve equation.
var
d
=
FieldElement
{
-
10913610
,
13857413
,
-
15372611
,
6949391
,
114729
,
-
8787816
,
-
6275908
,
-
3247719
,
-
18696448
,
-
12055116
,
}
// d2 is 2*d.
var
d2
=
FieldElement
{
-
21827239
,
-
5839606
,
-
30745221
,
13898782
,
229458
,
15978800
,
-
12551817
,
-
6495438
,
29715968
,
9444199
,
}
// SqrtM1 is the square-root of -1 in the field.
var
SqrtM1
=
FieldElement
{
-
32595792
,
-
7943725
,
9377950
,
3500415
,
12389472
,
-
272473
,
-
25146209
,
-
2005654
,
326686
,
11406482
,
}
// A is a constant in the Montgomery-form of curve25519.
var
A
=
FieldElement
{
486662
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
}
// bi contains precomputed multiples of the base-point. See the Ed25519 paper
// for a discussion about how these values are used.
var
bi
=
[
8
]
PreComputedGroupElement
{
{
FieldElement
{
25967493
,
-
14356035
,
29566456
,
3660896
,
-
12694345
,
4014787
,
27544626
,
-
11754271
,
-
6079156
,
2047605
},
FieldElement
{
-
12545711
,
934262
,
-
2722910
,
3049990
,
-
727428
,
9406986
,
12720692
,
5043384
,
19500929
,
-
15469378
},
FieldElement
{
-
8738181
,
4489570
,
9688441
,
-
14785194
,
10184609
,
-
12363380
,
29287919
,
11864899
,
-
24514362
,
-
4438546
},
},
{
FieldElement
{
15636291
,
-
9688557
,
24204773
,
-
7912398
,
616977
,
-
16685262
,
27787600
,
-
14772189
,
28944400
,
-
1550024
},
FieldElement
{
16568933
,
4717097
,
-
11556148
,
-
1102322
,
15682896
,
-
11807043
,
16354577
,
-
11775962
,
7689662
,
11199574
},
FieldElement
{
30464156
,
-
5976125
,
-
11779434
,
-
15670865
,
23220365
,
15915852
,
7512774
,
10017326
,
-
17749093
,
-
9920357
},
},
{
FieldElement
{
10861363
,
11473154
,
27284546
,
1981175
,
-
30064349
,
12577861
,
32867885
,
14515107
,
-
15438304
,
10819380
},
FieldElement
{
4708026
,
6336745
,
20377586
,
9066809
,
-
11272109
,
6594696
,
-
25653668
,
12483688
,
-
12668491
,
5581306
},
FieldElement
{
19563160
,
16186464
,
-
29386857
,
4097519
,
10237984
,
-
4348115
,
28542350
,
13850243
,
-
23678021
,
-
15815942
},
},
{
FieldElement
{
5153746
,
9909285
,
1723747
,
-
2777874
,
30523605
,
5516873
,
19480852
,
5230134
,
-
23952439
,
-
15175766
},
FieldElement
{
-
30269007
,
-
3463509
,
7665486
,
10083793
,
28475525
,
1649722
,
20654025
,
16520125
,
30598449
,
7715701
},
FieldElement
{
28881845
,
14381568
,
9657904
,
3680757
,
-
20181635
,
7843316
,
-
31400660
,
1370708
,
29794553
,
-
1409300
},
},
{
FieldElement
{
-
22518993
,
-
6692182
,
14201702
,
-
8745502
,
-
23510406
,
8844726
,
18474211
,
-
1361450
,
-
13062696
,
13821877
},
FieldElement
{
-
6455177
,
-
7839871
,
3374702
,
-
4740862
,
-
27098617
,
-
10571707
,
31655028
,
-
7212327
,
18853322
,
-
14220951
},
FieldElement
{
4566830
,
-
12963868
,
-
28974889
,
-
12240689
,
-
7602672
,
-
2830569
,
-
8514358
,
-
10431137
,
2207753
,
-
3209784
},
},
{
FieldElement
{
-
25154831
,
-
4185821
,
29681144
,
7868801
,
-
6854661
,
-
9423865
,
-
12437364
,
-
663000
,
-
31111463
,
-
16132436
},
FieldElement
{
25576264
,
-
2703214
,
7349804
,
-
11814844
,
16472782
,
9300885
,
3844789
,
15725684
,
171356
,
6466918
},
FieldElement
{
23103977
,
13316479
,
9739013
,
-
16149481
,
817875
,
-
15038942
,
8965339
,
-
14088058
,
-
30714912
,
16193877
},
},
{
FieldElement
{
-
33521811
,
3180713
,
-
2394130
,
14003687
,
-
16903474
,
-
16270840
,
17238398
,
4729455
,
-
18074513
,
9256800
},
FieldElement
{
-
25182317
,
-
4174131
,
32336398
,
5036987
,
-
21236817
,
11360617
,
22616405
,
9761698
,
-
19827198
,
630305
},
FieldElement
{
-
13720693
,
2639453
,
-
24237460
,
-
7406481
,
9494427
,
-
5774029
,
-
6554551
,
-
15960994
,
-
2449256
,
-
14291300
},
},
{
FieldElement
{
-
3151181
,
-
5046075
,
9282714
,
6866145
,
-
31907062
,
-
863023
,
-
18940575
,
15033784
,
25105118
,
-
7894876
},
FieldElement
{
-
24326370
,
15950226
,
-
31801215
,
-
14592823
,
-
11662737
,
-
5090925
,
1573892
,
-
2625887
,
2198790
,
-
15804619
},
FieldElement
{
-
3099351
,
10324967
,
-
2241613
,
7453183
,
-
5446979
,
-
2735503
,
-
13812022
,
-
16236442
,
-
32461234
,
-
12290683
},
},
}
// base contains precomputed multiples of the base-point. See the Ed25519 paper
// for a discussion about how these values are used.
var
base
=
[
32
][
8
]
PreComputedGroupElement
{
{
{
FieldElement
{
25967493
,
-
14356035
,
29566456
,
3660896
,
-
12694345
,
4014787
,
27544626
,
-
11754271
,
-
6079156
,
2047605
},
FieldElement
{
-
12545711
,
934262
,
-
2722910
,
3049990
,
-
727428
,
9406986
,
12720692
,
5043384
,
19500929
,
-
15469378
},
FieldElement
{
-
8738181
,
4489570
,
9688441
,
-
14785194
,
10184609
,
-
12363380
,
29287919
,
11864899
,
-
24514362
,
-
4438546
},
},
{
FieldElement
{
-
12815894
,
-
12976347
,
-
21581243
,
11784320
,
-
25355658
,
-
2750717
,
-
11717903
,
-
3814571
,
-
358445
,
-
10211303
},
FieldElement
{
-
21703237
,
6903825
,
27185491
,
6451973
,
-
29577724
,
-
9554005
,
-
15616551
,
11189268
,
-
26829678
,
-
5319081
},
FieldElement
{
26966642
,
11152617
,
32442495
,
15396054
,
14353839
,
-
12752335
,
-
3128826
,
-
9541118
,
-
15472047
,
-
4166697
},
},
{
FieldElement
{
15636291
,
-
9688557
,
24204773
,
-
7912398
,
616977
,
-
16685262
,
27787600
,
-
14772189
,
28944400
,
-
1550024
},
FieldElement
{
16568933
,
4717097
,
-
11556148
,
-
1102322
,
15682896
,
-
11807043
,
16354577
,
-
11775962
,
7689662
,
11199574
},
FieldElement
{
30464156
,
-
5976125
,
-
11779434
,
-
15670865
,
23220365
,
15915852
,
7512774
,
10017326
,
-
17749093
,
-
9920357
},
},
{
FieldElement
{
-
17036878
,
13921892
,
10945806
,
-
6033431
,
27105052
,
-
16084379
,
-
28926210
,
15006023
,
3284568
,
-
6276540
},
FieldElement
{
23599295
,
-
8306047
,
-
11193664
,
-
7687416
,
13236774
,
10506355
,
7464579
,
9656445
,
13059162
,
10374397
},
FieldElement
{
7798556
,
16710257
,
3033922
,
2874086
,
28997861
,
2835604
,
32406664
,
-
3839045
,
-
641708
,
-
101325
},
},
{
FieldElement
{
10861363
,
11473154
,
27284546
,
1981175
,
-
30064349
,
12577861
,
32867885
,
14515107
,
-
15438304
,
10819380
},
FieldElement
{
4708026
,
6336745
,
20377586
,
9066809
,
-
11272109
,
6594696
,
-
25653668
,
12483688
,
-
12668491
,
5581306
},
FieldElement
{
19563160
,
16186464
,
-
29386857
,
4097519
,
10237984
,
-
4348115
,
28542350
,
13850243
,
-
23678021
,
-
15815942
},
},
{
FieldElement
{
-
15371964
,
-
12862754
,
32573250
,
4720197
,
-
26436522
,
5875511
,
-
19188627
,
-
15224819
,
-
9818940
,
-
12085777
},
FieldElement
{
-
8549212
,
109983
,
15149363
,
2178705
,
22900618
,
4543417
,
3044240
,
-
15689887
,
1762328
,
14866737
},
FieldElement
{
-
18199695
,
-
15951423
,
-
10473290
,
1707278
,
-
17185920
,
3916101
,
-
28236412
,
3959421
,
27914454
,
4383652
},
},
{
FieldElement
{
5153746
,
9909285
,
1723747
,
-
2777874
,
30523605
,
5516873
,
19480852
,
5230134
,
-
23952439
,
-
15175766
},
FieldElement
{
-
30269007
,
-
3463509
,
7665486
,
10083793
,
28475525
,
1649722
,
20654025
,
16520125
,
30598449
,
7715701
},
FieldElement
{
28881845
,
14381568
,
9657904
,
3680757
,
-
20181635
,
7843316
,
-
31400660
,
1370708
,
29794553
,
-
1409300
},
},
{
FieldElement
{
14499471
,
-
2729599
,
-
33191113
,
-
4254652
,
28494862
,
14271267
,
30290735
,
10876454
,
-
33154098
,
2381726
},
FieldElement
{
-
7195431
,
-
2655363
,
-
14730155
,
462251
,
-
27724326
,
3941372
,
-
6236617
,
3696005
,
-
32300832
,
15351955
},
FieldElement
{
27431194
,
8222322
,
16448760
,
-
3907995
,
-
18707002
,
11938355
,
-
32961401
,
-
2970515
,
29551813
,
10109425
},
},
},
{
{
FieldElement
{
-
13657040
,
-
13155431
,
-
31283750
,
11777098
,
21447386
,
6519384
,
-
2378284
,
-
1627556
,
10092783
,
-
4764171
},
FieldElement
{
27939166
,
14210322
,
4677035
,
16277044
,
-
22964462
,
-
12398139
,
-
32508754
,
12005538
,
-
17810127
,
12803510
},
FieldElement
{
17228999
,
-
15661624
,
-
1233527
,
300140
,
-
1224870
,
-
11714777
,
30364213
,
-
9038194
,
18016357
,
4397660
},
},
{
FieldElement
{
-
10958843
,
-
7690207
,
4776341
,
-
14954238
,
27850028
,
-
15602212
,
-
26619106
,
14544525
,
-
17477504
,
982639
},
FieldElement
{
29253598
,
15796703
,
-
2863982
,
-
9908884
,
10057023
,
3163536
,
7332899
,
-
4120128
,
-
21047696
,
9934963
},
FieldElement
{
5793303
,
16271923
,
-
24131614
,
-
10116404
,
29188560
,
1206517
,
-
14747930
,
4559895
,
-
30123922
,
-
10897950
},
},
{
FieldElement
{
-
27643952
,
-
11493006
,
16282657
,
-
11036493
,
28414021
,
-
15012264
,
24191034
,
4541697
,
-
13338309
,
5500568
},
FieldElement
{
12650548
,
-
1497113
,
9052871
,
11355358
,
-
17680037
,
-
8400164
,
-
17430592
,
12264343
,
10874051
,
13524335
},
FieldElement
{
25556948
,
-
3045990
,
714651
,
2510400
,
23394682
,
-
10415330
,
33119038
,
5080568
,
-
22528059
,
5376628
},
},
{
FieldElement
{
-
26088264
,
-
4011052
,
-
17013699
,
-
3537628
,
-
6726793
,
1920897
,
-
22321305
,
-
9447443
,
4535768
,
1569007
},
FieldElement
{
-
2255422
,
14606630
,
-
21692440
,
-
8039818
,
28430649
,
8775819
,
-
30494562
,
3044290
,
31848280
,
12543772
},
FieldElement
{
-
22028579
,
2943893
,
-
31857513
,
6777306
,
13784462
,
-
4292203
,
-
27377195
,
-
2062731
,
7718482
,
14474653
},
},
{
FieldElement
{
2385315
,
2454213
,
-
22631320
,
46603
,
-
4437935
,
-
15680415
,
656965
,
-
7236665
,
24316168
,
-
5253567
},
FieldElement
{
13741529
,
10911568
,
-
33233417
,
-
8603737
,
-
20177830
,
-
1033297
,
33040651
,
-
13424532
,
-
20729456
,
8321686
},
FieldElement
{
21060490
,
-
2212744
,
15712757
,
-
4336099
,
1639040
,
10656336
,
23845965
,
-
11874838
,
-
9984458
,
608372
},
},
{
FieldElement
{
-
13672732
,
-
15087586
,
-
10889693
,
-
7557059
,
-
6036909
,
11305547
,
1123968
,
-
6780577
,
27229399
,
23887
},
FieldElement
{
-
23244140
,
-
294205
,
-
11744728
,
14712571
,
-
29465699
,
-
2029617
,
12797024
,
-
6440308
,
-
1633405
,
16678954
},
FieldElement
{
-
29500620
,
4770662
,
-
16054387
,
14001338
,
7830047
,
9564805
,
-
1508144
,
-
4795045
,
-
17169265
,
4904953
},
},
{
FieldElement
{
24059557
,
14617003
,
19037157
,
-
15039908
,
19766093
,
-
14906429
,
5169211
,
16191880
,
2128236
,
-
4326833
},
FieldElement
{
-
16981152
,
4124966
,
-
8540610
,
-
10653797
,
30336522
,
-
14105247
,
-
29806336
,
916033
,
-
6882542
,
-
2986532
},
FieldElement
{
-
22630907
,
12419372
,
-
7134229
,
-
7473371
,
-
16478904
,
16739175
,
285431
,
2763829
,
15736322
,
4143876
},
},
{
FieldElement
{
2379352
,
11839345
,
-
4110402
,
-
5988665
,
11274298
,
794957
,
212801
,
-
14594663
,
23527084
,
-
16458268
},
FieldElement
{
33431127
,
-
11130478
,
-
17838966
,
-
15626900
,
8909499
,
8376530
,
-
32625340
,
4087881
,
-
15188911
,
-
14416214
},
FieldElement
{
1767683
,
7197987
,
-
13205226
,
-
2022635
,
-
13091350
,
448826
,
5799055
,
4357868
,
-
4774191
,
-
16323038
},
},
},
{
{
FieldElement
{
6721966
,
13833823
,
-
23523388
,
-
1551314
,
26354293
,
-
11863321
,
23365147
,
-
3949732
,
7390890
,
2759800
},
FieldElement
{
4409041
,
2052381
,
23373853
,
10530217
,
7676779
,
-
12885954
,
21302353
,
-
4264057
,
1244380
,
-
12919645
},
FieldElement
{
-
4421239
,
7169619
,
4982368
,
-
2957590
,
30256825
,
-
2777540
,
14086413
,
9208236
,
15886429
,
16489664
},
},
{
FieldElement
{
1996075
,
10375649
,
14346367
,
13311202
,
-
6874135
,
-
16438411
,
-
13693198
,
398369
,
-
30606455
,
-
712933
},
FieldElement
{
-
25307465
,
9795880
,
-
2777414
,
14878809
,
-
33531835
,
14780363
,
13348553
,
12076947
,
-
30836462
,
5113182
},
FieldElement
{
-
17770784
,
11797796
,
31950843
,
13929123
,
-
25888302
,
12288344
,
-
30341101
,
-
7336386
,
13847711
,
5387222
},
},
{
FieldElement
{
-
18582163
,
-
3416217
,
17824843
,
-
2340966
,
22744343
,
-
10442611
,
8763061
,
3617786
,
-
19600662
,
10370991
},
FieldElement
{
20246567
,
-
14369378
,
22358229
,
-
543712
,
18507283
,
-
10413996
,
14554437
,
-
8746092
,
32232924
,
16763880
},
FieldElement
{
9648505
,
10094563
,
26416693
,
14745928
,
-
30374318
,
-
6472621
,
11094161
,
15689506
,
3140038
,
-
16510092
},
},
{
FieldElement
{
-
16160072
,
5472695
,
31895588
,
4744994
,
8823515
,
10365685
,
-
27224800
,
9448613
,
-
28774454
,
366295
},
FieldElement
{
19153450
,
11523972
,
-
11096490
,
-
6503142
,
-
24647631
,
5420647
,
28344573
,
8041113
,
719605
,
11671788
},
FieldElement
{
8678025
,
2694440
,
-
6808014
,
2517372
,
4964326
,
11152271
,
-
15432916
,
-
15266516
,
27000813
,
-
10195553
},
},
{
FieldElement
{
-
15157904
,
7134312
,
8639287
,
-
2814877
,
-
7235688
,
10421742
,
564065
,
5336097
,
6750977
,
-
14521026
},
FieldElement
{
11836410
,
-
3979488
,
26297894
,
16080799
,
23455045
,
15735944
,
1695823
,
-
8819122
,
8169720
,
16220347
},
FieldElement
{
-
18115838
,
8653647
,
17578566
,
-
6092619
,
-
8025777
,
-
16012763
,
-
11144307
,
-
2627664
,
-
5990708
,
-
14166033
},
},
{
FieldElement
{
-
23308498
,
-
10968312
,
15213228
,
-
10081214
,
-
30853605
,
-
11050004
,
27884329
,
2847284
,
2655861
,
1738395
},
FieldElement
{
-
27537433
,
-
14253021
,
-
25336301
,
-
8002780
,
-
9370762
,
8129821
,
21651608
,
-
3239336
,
-
19087449
,
-
11005278
},
FieldElement
{
1533110
,
3437855
,
23735889
,
459276
,
29970501
,
11335377
,
26030092
,
5821408
,
10478196
,
8544890
},
},
{
FieldElement
{
32173121
,
-
16129311
,
24896207
,
3921497
,
22579056
,
-
3410854
,
19270449
,
12217473
,
17789017
,
-
3395995
},
FieldElement
{
-
30552961
,
-
2228401
,
-
15578829
,
-
10147201
,
13243889
,
517024
,
15479401
,
-
3853233
,
30460520
,
1052596
},
FieldElement
{
-
11614875
,
13323618
,
32618793
,
8175907
,
-
15230173
,
12596687
,
27491595
,
-
4612359
,
3179268
,
-
9478891
},
},
{
FieldElement
{
31947069
,
-
14366651
,
-
4640583
,
-
15339921
,
-
15125977
,
-
6039709
,
-
14756777
,
-
16411740
,
19072640
,
-
9511060
},
FieldElement
{
11685058
,
11822410
,
3158003
,
-
13952594
,
33402194
,
-
4165066
,
5977896
,
-
5215017
,
473099
,
5040608
},
FieldElement
{
-
20290863
,
8198642
,
-
27410132
,
11602123
,
1290375
,
-
2799760
,
28326862
,
1721092
,
-
19558642
,
-
3131606
},
},
},
{
{
FieldElement
{
7881532
,
10687937
,
7578723
,
7738378
,
-
18951012
,
-
2553952
,
21820786
,
8076149
,
-
27868496
,
11538389
},
FieldElement
{
-
19935666
,
3899861
,
18283497
,
-
6801568
,
-
15728660
,
-
11249211
,
8754525
,
7446702
,
-
5676054
,
5797016
},
FieldElement
{
-
11295600
,
-
3793569
,
-
15782110
,
-
7964573
,
12708869
,
-
8456199
,
2014099
,
-
9050574
,
-
2369172
,
-
5877341
},
},
{
FieldElement
{
-
22472376
,
-
11568741
,
-
27682020
,
1146375
,
18956691
,
16640559
,
1192730
,
-
3714199
,
15123619
,
10811505
},
FieldElement
{
14352098
,
-
3419715
,
-
18942044
,
10822655
,
32750596
,
4699007
,
-
70363
,
15776356
,
-
28886779
,
-
11974553
},
FieldElement
{
-
28241164
,
-
8072475
,
-
4978962
,
-
5315317
,
29416931
,
1847569
,
-
20654173
,
-
16484855
,
4714547
,
-
9600655
},
},
{
FieldElement
{
15200332
,
8368572
,
19679101
,
15970074
,
-
31872674
,
1959451
,
24611599
,
-
4543832
,
-
11745876
,
12340220
},
FieldElement
{
12876937
,
-
10480056
,
33134381
,
6590940
,
-
6307776
,
14872440
,
9613953
,
8241152
,
15370987
,
9608631
},
FieldElement
{
-
4143277
,
-
12014408
,
8446281
,
-
391603
,
4407738
,
13629032
,
-
7724868
,
15866074
,
-
28210621
,
-
8814099
},
},
{
FieldElement
{
26660628
,
-
15677655
,
8393734
,
358047
,
-
7401291
,
992988
,
-
23904233
,
858697
,
20571223
,
8420556
},
FieldElement
{
14620715
,
13067227
,
-
15447274
,
8264467
,
14106269
,
15080814
,
33531827
,
12516406
,
-
21574435
,
-
12476749
},
FieldElement
{
236881
,
10476226
,
57258
,
-
14677024
,
6472998
,
2466984
,
17258519
,
7256740
,
8791136
,
15069930
},
},
{
FieldElement
{
1276410
,
-
9371918
,
22949635
,
-
16322807
,
-
23493039
,
-
5702186
,
14711875
,
4874229
,
-
30663140
,
-
2331391
},
FieldElement
{
5855666
,
4990204
,
-
13711848
,
7294284
,
-
7804282
,
1924647
,
-
1423175
,
-
7912378
,
-
33069337
,
9234253
},
FieldElement
{
20590503
,
-
9018988
,
31529744
,
-
7352666
,
-
2706834
,
10650548
,
31559055
,
-
11609587
,
18979186
,
13396066
},
},
{
FieldElement
{
24474287
,
4968103
,
22267082
,
4407354
,
24063882
,
-
8325180
,
-
18816887
,
13594782
,
33514650
,
7021958
},
FieldElement
{
-
11566906
,
-
6565505
,
-
21365085
,
15928892
,
-
26158305
,
4315421
,
-
25948728
,
-
3916677
,
-
21480480
,
12868082
},
FieldElement
{
-
28635013
,
13504661
,
19988037
,
-
2132761
,
21078225
,
6443208
,
-
21446107
,
2244500
,
-
12455797
,
-
8089383
},
},
{
FieldElement
{
-
30595528
,
13793479
,
-
5852820
,
319136
,
-
25723172
,
-
6263899
,
33086546
,
8957937
,
-
15233648
,
5540521
},
FieldElement
{
-
11630176
,
-
11503902
,
-
8119500
,
-
7643073
,
2620056
,
1022908
,
-
23710744
,
-
1568984
,
-
16128528
,
-
14962807
},
FieldElement
{
23152971
,
775386
,
27395463
,
14006635
,
-
9701118
,
4649512
,
1689819
,
892185
,
-
11513277
,
-
15205948
},
},
{
FieldElement
{
9770129
,
9586738
,
26496094
,
4324120
,
1556511
,
-
3550024
,
27453819
,
4763127
,
-
19179614
,
5867134
},
FieldElement
{
-
32765025
,
1927590
,
31726409
,
-
4753295
,
23962434
,
-
16019500
,
27846559
,
5931263
,
-
29749703
,
-
16108455
},
FieldElement
{
27461885
,
-
2977536
,
22380810
,
1815854
,
-
23033753
,
-
3031938
,
7283490
,
-
15148073
,
-
19526700
,
7734629
},
},
},
{
{
FieldElement
{
-
8010264
,
-
9590817
,
-
11120403
,
6196038
,
29344158
,
-
13430885
,
7585295
,
-
3176626
,
18549497
,
15302069
},
FieldElement
{
-
32658337
,
-
6171222
,
-
7672793
,
-
11051681
,
6258878
,
13504381
,
10458790
,
-
6418461
,
-
8872242
,
8424746
},
FieldElement
{
24687205
,
8613276
,
-
30667046
,
-
3233545
,
1863892
,
-
1830544
,
19206234
,
7134917
,
-
11284482
,
-
828919
},
},
{
FieldElement
{
11334899
,
-
9218022
,
8025293
,
12707519
,
17523892
,
-
10476071
,
10243738
,
-
14685461
,
-
5066034
,
16498837
},
FieldElement
{
8911542
,
6887158
,
-
9584260
,
-
6958590
,
11145641
,
-
9543680
,
17303925
,
-
14124238
,
6536641
,
10543906
},
FieldElement
{
-
28946384
,
15479763
,
-
17466835
,
568876
,
-
1497683
,
11223454
,
-
2669190
,
-
16625574
,
-
27235709
,
8876771
},
},
{
FieldElement
{
-
25742899
,
-
12566864
,
-
15649966
,
-
846607
,
-
33026686
,
-
796288
,
-
33481822
,
15824474
,
-
604426
,
-
9039817
},
FieldElement
{
10330056
,
70051
,
7957388
,
-
9002667
,
9764902
,
15609756
,
27698697
,
-
4890037
,
1657394
,
3084098
},
FieldElement
{
10477963
,
-
7470260
,
12119566
,
-
13250805
,
29016247
,
-
5365589
,
31280319
,
14396151
,
-
30233575
,
15272409
},
},
{
FieldElement
{
-
12288309
,
3169463
,
28813183
,
16658753
,
25116432
,
-
5630466
,
-
25173957
,
-
12636138
,
-
25014757
,
1950504
},
FieldElement
{
-
26180358
,
9489187
,
11053416
,
-
14746161
,
-
31053720
,
5825630
,
-
8384306
,
-
8767532
,
15341279
,
8373727
},
FieldElement
{
28685821
,
7759505
,
-
14378516
,
-
12002860
,
-
31971820
,
4079242
,
298136
,
-
10232602
,
-
2878207
,
15190420
},
},
{
FieldElement
{
-
32932876
,
13806336
,
-
14337485
,
-
15794431
,
-
24004620
,
10940928
,
8669718
,
2742393
,
-
26033313
,
-
6875003
},
FieldElement
{
-
1580388
,
-
11729417
,
-
25979658
,
-
11445023
,
-
17411874
,
-
10912854
,
9291594
,
-
16247779
,
-
12154742
,
6048605
},
FieldElement
{
-
30305315
,
14843444
,
1539301
,
11864366
,
20201677
,
1900163
,
13934231
,
5128323
,
11213262
,
9168384
},
},
{
FieldElement
{
-
26280513
,
11007847
,
19408960
,
-
940758
,
-
18592965
,
-
4328580
,
-
5088060
,
-
11105150
,
20470157
,
-
16398701
},
FieldElement
{
-
23136053
,
9282192
,
14855179
,
-
15390078
,
-
7362815
,
-
14408560
,
-
22783952
,
14461608
,
14042978
,
5230683
},
FieldElement
{
29969567
,
-
2741594
,
-
16711867
,
-
8552442
,
9175486
,
-
2468974
,
21556951
,
3506042
,
-
5933891
,
-
12449708
},
},
{
FieldElement
{
-
3144746
,
8744661
,
19704003
,
4581278
,
-
20430686
,
6830683
,
-
21284170
,
8971513
,
-
28539189
,
15326563
},
FieldElement
{
-
19464629
,
10110288
,
-
17262528
,
-
3503892
,
-
23500387
,
1355669
,
-
15523050
,
15300988
,
-
20514118
,
9168260
},
FieldElement
{
-
5353335
,
4488613
,
-
23803248
,
16314347
,
7780487
,
-
15638939
,
-
28948358
,
9601605
,
33087103
,
-
9011387
},
},
{
FieldElement
{
-
19443170
,
-
15512900
,
-
20797467
,
-
12445323
,
-
29824447
,
10229461
,
-
27444329
,
-
15000531
,
-
5996870
,
15664672
},
FieldElement
{
23294591
,
-
16632613
,
-
22650781
,
-
8470978
,
27844204
,
11461195
,
13099750
,
-
2460356
,
18151676
,
13417686
},
FieldElement
{
-
24722913
,
-
4176517
,
-
31150679
,
5988919
,
-
26858785
,
6685065
,
1661597
,
-
12551441
,
15271676
,
-
15452665
},
},
},
{
{
FieldElement
{
11433042
,
-
13228665
,
8239631
,
-
5279517
,
-
1985436
,
-
725718
,
-
18698764
,
2167544
,
-
6921301
,
-
13440182
},
FieldElement
{
-
31436171
,
15575146
,
30436815
,
12192228
,
-
22463353
,
9395379
,
-
9917708
,
-
8638997
,
12215110
,
12028277
},
FieldElement
{
14098400
,
6555944
,
23007258
,
5757252
,
-
15427832
,
-
12950502
,
30123440
,
4617780
,
-
16900089
,
-
655628
},
},
{
FieldElement
{
-
4026201
,
-
15240835
,
11893168
,
13718664
,
-
14809462
,
1847385
,
-
15819999
,
10154009
,
23973261
,
-
12684474
},
FieldElement
{
-
26531820
,
-
3695990
,
-
1908898
,
2534301
,
-
31870557
,
-
16550355
,
18341390
,
-
11419951
,
32013174
,
-
10103539
},
FieldElement
{
-
25479301
,
10876443
,
-
11771086
,
-
14625140
,
-
12369567
,
1838104
,
21911214
,
6354752
,
4425632
,
-
837822
},
},
{
FieldElement
{
-
10433389
,
-
14612966
,
22229858
,
-
3091047
,
-
13191166
,
776729
,
-
17415375
,
-
12020462
,
4725005
,
14044970
},
FieldElement
{
19268650
,
-
7304421
,
1555349
,
8692754
,
-
21474059
,
-
9910664
,
6347390
,
-
1411784
,
-
19522291
,
-
16109756
},
FieldElement
{
-
24864089
,
12986008
,
-
10898878
,
-
5558584
,
-
11312371
,
-
148526
,
19541418
,
8180106
,
9282262
,
10282508
},
},
{
FieldElement
{
-
26205082
,
4428547
,
-
8661196
,
-
13194263
,
4098402
,
-
14165257
,
15522535
,
8372215
,
5542595
,
-
10702683
},
FieldElement
{
-
10562541
,
14895633
,
26814552
,
-
16673850
,
-
17480754
,
-
2489360
,
-
2781891
,
6993761
,
-
18093885
,
10114655
},
FieldElement
{
-
20107055
,
-
929418
,
31422704
,
10427861
,
-
7110749
,
6150669
,
-
29091755
,
-
11529146
,
25953725
,
-
106158
},
},
{
FieldElement
{
-
4234397
,
-
8039292
,
-
9119125
,
3046000
,
2101609
,
-
12607294
,
19390020
,
6094296
,
-
3315279
,
12831125
},
FieldElement
{
-
15998678
,
7578152
,
5310217
,
14408357
,
-
33548620
,
-
224739
,
31575954
,
6326196
,
7381791
,
-
2421839
},
FieldElement
{
-
20902779
,
3296811
,
24736065
,
-
16328389
,
18374254
,
7318640
,
6295303
,
8082724
,
-
15362489
,
12339664
},
},
{
FieldElement
{
27724736
,
2291157
,
6088201
,
-
14184798
,
1792727
,
5857634
,
13848414
,
15768922
,
25091167
,
14856294
},
FieldElement
{
-
18866652
,
8331043
,
24373479
,
8541013
,
-
701998
,
-
9269457
,
12927300
,
-
12695493
,
-
22182473
,
-
9012899
},
FieldElement
{
-
11423429
,
-
5421590
,
11632845
,
3405020
,
30536730
,
-
11674039
,
-
27260765
,
13866390
,
30146206
,
9142070
},
},
{
FieldElement
{
3924129
,
-
15307516
,
-
13817122
,
-
10054960
,
12291820
,
-
668366
,
-
27702774
,
9326384
,
-
8237858
,
4171294
},
FieldElement
{
-
15921940
,
16037937
,
6713787
,
16606682
,
-
21612135
,
2790944
,
26396185
,
3731949
,
345228
,
-
5462949
},
FieldElement
{
-
21327538
,
13448259
,
25284571
,
1143661
,
20614966
,
-
8849387
,
2031539
,
-
12391231
,
-
16253183
,
-
13582083
},
},
{
FieldElement
{
31016211
,
-
16722429
,
26371392
,
-
14451233
,
-
5027349
,
14854137
,
17477601
,
3842657
,
28012650
,
-
16405420
},
FieldElement
{
-
5075835
,
9368966
,
-
8562079
,
-
4600902
,
-
15249953
,
6970560
,
-
9189873
,
16292057
,
-
8867157
,
3507940
},
FieldElement
{
29439664
,
3537914
,
23333589
,
6997794
,
-
17555561
,
-
11018068
,
-
15209202
,
-
15051267
,
-
9164929
,
6580396
},
},
},
{
{
FieldElement
{
-
12185861
,
-
7679788
,
16438269
,
10826160
,
-
8696817
,
-
6235611
,
17860444
,
-
9273846
,
-
2095802
,
9304567
},
FieldElement
{
20714564
,
-
4336911
,
29088195
,
7406487
,
11426967
,
-
5095705
,
14792667
,
-
14608617
,
5289421
,
-
477127
},
FieldElement
{
-
16665533
,
-
10650790
,
-
6160345
,
-
13305760
,
9192020
,
-
1802462
,
17271490
,
12349094
,
26939669
,
-
3752294
},
},
{
FieldElement
{
-
12889898
,
9373458
,
31595848
,
16374215
,
21471720
,
13221525
,
-
27283495
,
-
12348559
,
-
3698806
,
117887
},
FieldElement
{
22263325
,
-
6560050
,
3984570
,
-
11174646
,
-
15114008
,
-
566785
,
28311253
,
5358056
,
-
23319780
,
541964
},
FieldElement
{
16259219
,
3261970
,
2309254
,
-
15534474
,
-
16885711
,
-
4581916
,
24134070
,
-
16705829
,
-
13337066
,
-
13552195
},
},
{
FieldElement
{
9378160
,
-
13140186
,
-
22845982
,
-
12745264
,
28198281
,
-
7244098
,
-
2399684
,
-
717351
,
690426
,
14876244
},
FieldElement
{
24977353
,
-
314384
,
-
8223969
,
-
13465086
,
28432343
,
-
1176353
,
-
13068804
,
-
12297348
,
-
22380984
,
6618999
},
FieldElement
{
-
1538174
,
11685646
,
12944378
,
13682314
,
-
24389511
,
-
14413193
,
8044829
,
-
13817328
,
32239829
,
-
5652762
},
},
{
FieldElement
{
-
18603066
,
4762990
,
-
926250
,
8885304
,
-
28412480
,
-
3187315
,
9781647
,
-
10350059
,
32779359
,
5095274
},
FieldElement
{
-
33008130
,
-
5214506
,
-
32264887
,
-
3685216
,
9460461
,
-
9327423
,
-
24601656
,
14506724
,
21639561
,
-
2630236
},
FieldElement
{
-
16400943
,
-
13112215
,
25239338
,
15531969
,
3987758
,
-
4499318
,
-
1289502
,
-
6863535
,
17874574
,
558605
},
},
{
FieldElement
{
-
13600129
,
10240081
,
9171883
,
16131053
,
-
20869254
,
9599700
,
33499487
,
5080151
,
2085892
,
5119761
},
FieldElement
{
-
22205145
,
-
2519528
,
-
16381601
,
414691
,
-
25019550
,
2170430
,
30634760
,
-
8363614
,
-
31999993
,
-
5759884
},
FieldElement
{
-
6845704
,
15791202
,
8550074
,
-
1312654
,
29928809
,
-
12092256
,
27534430
,
-
7192145
,
-
22351378
,
12961482
},
},
{
FieldElement
{
-
24492060
,
-
9570771
,
10368194
,
11582341
,
-
23397293
,
-
2245287
,
16533930
,
8206996
,
-
30194652
,
-
5159638
},
FieldElement
{
-
11121496
,
-
3382234
,
2307366
,
6362031
,
-
135455
,
8868177
,
-
16835630
,
7031275
,
7589640
,
8945490
},
FieldElement
{
-
32152748
,
8917967
,
6661220
,
-
11677616
,
-
1192060
,
-
15793393
,
7251489
,
-
11182180
,
24099109
,
-
14456170
},
},
{
FieldElement
{
5019558
,
-
7907470
,
4244127
,
-
14714356
,
-
26933272
,
6453165
,
-
19118182
,
-
13289025
,
-
6231896
,
-
10280736
},
FieldElement
{
10853594
,
10721687
,
26480089
,
5861829
,
-
22995819
,
1972175
,
-
1866647
,
-
10557898
,
-
3363451
,
-
6441124
},
FieldElement
{
-
17002408
,
5906790
,
221599
,
-
6563147
,
7828208
,
-
13248918
,
24362661
,
-
2008168
,
-
13866408
,
7421392
},
},
{
FieldElement
{
8139927
,
-
6546497
,
32257646
,
-
5890546
,
30375719
,
1886181
,
-
21175108
,
15441252
,
28826358
,
-
4123029
},
FieldElement
{
6267086
,
9695052
,
7709135
,
-
16603597
,
-
32869068
,
-
1886135
,
14795160
,
-
7840124
,
13746021
,
-
1742048
},
FieldElement
{
28584902
,
7787108
,
-
6732942
,
-
15050729
,
22846041
,
-
7571236
,
-
3181936
,
-
363524
,
4771362
,
-
8419958
},
},
},
{
{
FieldElement
{
24949256
,
6376279
,
-
27466481
,
-
8174608
,
-
18646154
,
-
9930606
,
33543569
,
-
12141695
,
3569627
,
11342593
},
FieldElement
{
26514989
,
4740088
,
27912651
,
3697550
,
19331575
,
-
11472339
,
6809886
,
4608608
,
7325975
,
-
14801071
},
FieldElement
{
-
11618399
,
-
14554430
,
-
24321212
,
7655128
,
-
1369274
,
5214312
,
-
27400540
,
10258390
,
-
17646694
,
-
8186692
},
},
{
FieldElement
{
11431204
,
15823007
,
26570245
,
14329124
,
18029990
,
4796082
,
-
31446179
,
15580664
,
9280358
,
-
3973687
},
FieldElement
{
-
160783
,
-
10326257
,
-
22855316
,
-
4304997
,
-
20861367
,
-
13621002
,
-
32810901
,
-
11181622
,
-
15545091
,
4387441
},
FieldElement
{
-
20799378
,
12194512
,
3937617
,
-
5805892
,
-
27154820
,
9340370
,
-
24513992
,
8548137
,
20617071
,
-
7482001
},
},
{
FieldElement
{
-
938825
,
-
3930586
,
-
8714311
,
16124718
,
24603125
,
-
6225393
,
-
13775352
,
-
11875822
,
24345683
,
10325460
},
FieldElement
{
-
19855277
,
-
1568885
,
-
22202708
,
8714034
,
14007766
,
6928528
,
16318175
,
-
1010689
,
4766743
,
3552007
},
FieldElement
{
-
21751364
,
-
16730916
,
1351763
,
-
803421
,
-
4009670
,
3950935
,
3217514
,
14481909
,
10988822
,
-
3994762
},
},
{
FieldElement
{
15564307
,
-
14311570
,
3101243
,
5684148
,
30446780
,
-
8051356
,
12677127
,
-
6505343
,
-
8295852
,
13296005
},
FieldElement
{
-
9442290
,
6624296
,
-
30298964
,
-
11913677
,
-
4670981
,
-
2057379
,
31521204
,
9614054
,
-
30000824
,
12074674
},
FieldElement
{
4771191
,
-
135239
,
14290749
,
-
13089852
,
27992298
,
14998318
,
-
1413936
,
-
1556716
,
29832613
,
-
16391035
},
},
{
FieldElement
{
7064884
,
-
7541174
,
-
19161962
,
-
5067537
,
-
18891269
,
-
2912736
,
25825242
,
5293297
,
-
27122660
,
13101590
},
FieldElement
{
-
2298563
,
2439670
,
-
7466610
,
1719965
,
-
27267541
,
-
16328445
,
32512469
,
-
5317593
,
-
30356070
,
-
4190957
},
FieldElement
{
-
30006540
,
10162316
,
-
33180176
,
3981723
,
-
16482138
,
-
13070044
,
14413974
,
9515896
,
19568978
,
9628812
},
},
{
FieldElement
{
33053803
,
199357
,
15894591
,
1583059
,
27380243
,
-
4580435
,
-
17838894
,
-
6106839
,
-
6291786
,
3437740
},
FieldElement
{
-
18978877
,
3884493
,
19469877
,
12726490
,
15913552
,
13614290
,
-
22961733
,
70104
,
7463304
,
4176122
},
FieldElement
{
-
27124001
,
10659917
,
11482427
,
-
16070381
,
12771467
,
-
6635117
,
-
32719404
,
-
5322751
,
24216882
,
5944158
},
},
{
FieldElement
{
8894125
,
7450974
,
-
2664149
,
-
9765752
,
-
28080517
,
-
12389115
,
19345746
,
14680796
,
11632993
,
5847885
},
FieldElement
{
26942781
,
-
2315317
,
9129564
,
-
4906607
,
26024105
,
11769399
,
-
11518837
,
6367194
,
-
9727230
,
4782140
},
FieldElement
{
19916461
,
-
4828410
,
-
22910704
,
-
11414391
,
25606324
,
-
5972441
,
33253853
,
8220911
,
6358847
,
-
1873857
},
},
{
FieldElement
{
801428
,
-
2081702
,
16569428
,
11065167
,
29875704
,
96627
,
7908388
,
-
4480480
,
-
13538503
,
1387155
},
FieldElement
{
19646058
,
5720633
,
-
11416706
,
12814209
,
11607948
,
12749789
,
14147075
,
15156355
,
-
21866831
,
11835260
},
FieldElement
{
19299512
,
1155910
,
28703737
,
14890794
,
2925026
,
7269399
,
26121523
,
15467869
,
-
26560550
,
5052483
},
},
},
{
{
FieldElement
{
-
3017432
,
10058206
,
1980837
,
3964243
,
22160966
,
12322533
,
-
6431123
,
-
12618185
,
12228557
,
-
7003677
},
FieldElement
{
32944382
,
14922211
,
-
22844894
,
5188528
,
21913450
,
-
8719943
,
4001465
,
13238564
,
-
6114803
,
8653815
},
FieldElement
{
22865569
,
-
4652735
,
27603668
,
-
12545395
,
14348958
,
8234005
,
24808405
,
5719875
,
28483275
,
2841751
},
},
{
FieldElement
{
-
16420968
,
-
1113305
,
-
327719
,
-
12107856
,
21886282
,
-
15552774
,
-
1887966
,
-
315658
,
19932058
,
-
12739203
},
FieldElement
{
-
11656086
,
10087521
,
-
8864888
,
-
5536143
,
-
19278573
,
-
3055912
,
3999228
,
13239134
,
-
4777469
,
-
13910208
},
FieldElement
{
1382174
,
-
11694719
,
17266790
,
9194690
,
-
13324356
,
9720081
,
20403944
,
11284705
,
-
14013818
,
3093230
},
},
{
FieldElement
{
16650921
,
-
11037932
,
-
1064178
,
1570629
,
-
8329746
,
7352753
,
-
302424
,
16271225
,
-
24049421
,
-
6691850
},
FieldElement
{
-
21911077
,
-
5927941
,
-
4611316
,
-
5560156
,
-
31744103
,
-
10785293
,
24123614
,
15193618
,
-
21652117
,
-
16739389
},
FieldElement
{
-
9935934
,
-
4289447
,
-
25279823
,
4372842
,
2087473
,
10399484
,
31870908
,
14690798
,
17361620
,
11864968
},
},
{
FieldElement
{
-
11307610
,
6210372
,
13206574
,
5806320
,
-
29017692
,
-
13967200
,
-
12331205
,
-
7486601
,
-
25578460
,
-
16240689
},
FieldElement
{
14668462
,
-
12270235
,
26039039
,
15305210
,
25515617
,
4542480
,
10453892
,
6577524
,
9145645
,
-
6443880
},
FieldElement
{
5974874
,
3053895
,
-
9433049
,
-
10385191
,
-
31865124
,
3225009
,
-
7972642
,
3936128
,
-
5652273
,
-
3050304
},
},
{
FieldElement
{
30625386
,
-
4729400
,
-
25555961
,
-
12792866
,
-
20484575
,
7695099
,
17097188
,
-
16303496
,
-
27999779
,
1803632
},
FieldElement
{
-
3553091
,
9865099
,
-
5228566
,
4272701
,
-
5673832
,
-
16689700
,
14911344
,
12196514
,
-
21405489
,
7047412
},
FieldElement
{
20093277
,
9920966
,
-
11138194
,
-
5343857
,
13161587
,
12044805
,
-
32856851
,
4124601
,
-
32343828
,
-
10257566
},
},
{
FieldElement
{
-
20788824
,
14084654
,
-
13531713
,
7842147
,
19119038
,
-
13822605
,
4752377
,
-
8714640
,
-
21679658
,
2288038
},
FieldElement
{
-
26819236
,
-
3283715
,
29965059
,
3039786
,
-
14473765
,
2540457
,
29457502
,
14625692
,
-
24819617
,
12570232
},
FieldElement
{
-
1063558
,
-
11551823
,
16920318
,
12494842
,
1278292
,
-
5869109
,
-
21159943
,
-
3498680
,
-
11974704
,
4724943
},
},
{
FieldElement
{
17960970
,
-
11775534
,
-
4140968
,
-
9702530
,
-
8876562
,
-
1410617
,
-
12907383
,
-
8659932
,
-
29576300
,
1903856
},
FieldElement
{
23134274
,
-
14279132
,
-
10681997
,
-
1611936
,
20684485
,
15770816
,
-
12989750
,
3190296
,
26955097
,
14109738
},
FieldElement
{
15308788
,
5320727
,
-
30113809
,
-
14318877
,
22902008
,
7767164
,
29425325
,
-
11277562
,
31960942
,
11934971
},
},
{
FieldElement
{
-
27395711
,
8435796
,
4109644
,
12222639
,
-
24627868
,
14818669
,
20638173
,
4875028
,
10491392
,
1379718
},
FieldElement
{
-
13159415
,
9197841
,
3875503
,
-
8936108
,
-
1383712
,
-
5879801
,
33518459
,
16176658
,
21432314
,
12180697
},
FieldElement
{
-
11787308
,
11500838
,
13787581
,
-
13832590
,
-
22430679
,
10140205
,
1465425
,
12689540
,
-
10301319
,
-
13872883
},
},
},
{
{
FieldElement
{
5414091
,
-
15386041
,
-
21007664
,
9643570
,
12834970
,
1186149
,
-
2622916
,
-
1342231
,
26128231
,
6032912
},
FieldElement
{
-
26337395
,
-
13766162
,
32496025
,
-
13653919
,
17847801
,
-
12669156
,
3604025
,
8316894
,
-
25875034
,
-
10437358
},
FieldElement
{
3296484
,
6223048
,
24680646
,
-
12246460
,
-
23052020
,
5903205
,
-
8862297
,
-
4639164
,
12376617
,
3188849
},
},
{
FieldElement
{
29190488
,
-
14659046
,
27549113
,
-
1183516
,
3520066
,
-
10697301
,
32049515
,
-
7309113
,
-
16109234
,
-
9852307
},
FieldElement
{
-
14744486
,
-
9309156
,
735818
,
-
598978
,
-
20407687
,
-
5057904
,
25246078
,
-
15795669
,
18640741
,
-
960977
},
FieldElement
{
-
6928835
,
-
16430795
,
10361374
,
5642961
,
4910474
,
12345252
,
-
31638386
,
-
494430
,
10530747
,
1053335
},
},
{
FieldElement
{
-
29265967
,
-
14186805
,
-
13538216
,
-
12117373
,
-
19457059
,
-
10655384
,
-
31462369
,
-
2948985
,
24018831
,
15026644
},
FieldElement
{
-
22592535
,
-
3145277
,
-
2289276
,
5953843
,
-
13440189
,
9425631
,
25310643
,
13003497
,
-
2314791
,
-
15145616
},
FieldElement
{
-
27419985
,
-
603321
,
-
8043984
,
-
1669117
,
-
26092265
,
13987819
,
-
27297622
,
187899
,
-
23166419
,
-
2531735
},
},
{
FieldElement
{
-
21744398
,
-
13810475
,
1844840
,
5021428
,
-
10434399
,
-
15911473
,
9716667
,
16266922
,
-
5070217
,
726099
},
FieldElement
{
29370922
,
-
6053998
,
7334071
,
-
15342259
,
9385287
,
2247707
,
-
13661962
,
-
4839461
,
30007388
,
-
15823341
},
FieldElement
{
-
936379
,
16086691
,
23751945
,
-
543318
,
-
1167538
,
-
5189036
,
9137109
,
730663
,
9835848
,
4555336
},
},
{
FieldElement
{
-
23376435
,
1410446
,
-
22253753
,
-
12899614
,
30867635
,
15826977
,
17693930
,
544696
,
-
11985298
,
12422646
},
FieldElement
{
31117226
,
-
12215734
,
-
13502838
,
6561947
,
-
9876867
,
-
12757670
,
-
5118685
,
-
4096706
,
29120153
,
13924425
},
FieldElement
{
-
17400879
,
-
14233209
,
19675799
,
-
2734756
,
-
11006962
,
-
5858820
,
-
9383939
,
-
11317700
,
7240931
,
-
237388
},
},
{
FieldElement
{
-
31361739
,
-
11346780
,
-
15007447
,
-
5856218
,
-
22453340
,
-
12152771
,
1222336
,
4389483
,
3293637
,
-
15551743
},
FieldElement
{
-
16684801
,
-
14444245
,
11038544
,
11054958
,
-
13801175
,
-
3338533
,
-
24319580
,
7733547
,
12796905
,
-
6335822
},
FieldElement
{
-
8759414
,
-
10817836
,
-
25418864
,
10783769
,
-
30615557
,
-
9746811
,
-
28253339
,
3647836
,
3222231
,
-
11160462
},
},
{
FieldElement
{
18606113
,
1693100
,
-
25448386
,
-
15170272
,
4112353
,
10045021
,
23603893
,
-
2048234
,
-
7550776
,
2484985
},
FieldElement
{
9255317
,
-
3131197
,
-
12156162
,
-
1004256
,
13098013
,
-
9214866
,
16377220
,
-
2102812
,
-
19802075
,
-
3034702
},
FieldElement
{
-
22729289
,
7496160
,
-
5742199
,
11329249
,
19991973
,
-
3347502
,
-
31718148
,
9936966
,
-
30097688
,
-
10618797
},
},
{
FieldElement
{
21878590
,
-
5001297
,
4338336
,
13643897
,
-
3036865
,
13160960
,
19708896
,
5415497
,
-
7360503
,
-
4109293
},
FieldElement
{
27736861
,
10103576
,
12500508
,
8502413
,
-
3413016
,
-
9633558
,
10436918
,
-
1550276
,
-
23659143
,
-
8132100
},
FieldElement
{
19492550
,
-
12104365
,
-
29681976
,
-
852630
,
-
3208171
,
12403437
,
30066266
,
8367329
,
13243957
,
8709688
},
},
},
{
{
FieldElement
{
12015105
,
2801261
,
28198131
,
10151021
,
24818120
,
-
4743133
,
-
11194191
,
-
5645734
,
5150968
,
7274186
},
FieldElement
{
2831366
,
-
12492146
,
1478975
,
6122054
,
23825128
,
-
12733586
,
31097299
,
6083058
,
31021603
,
-
9793610
},
FieldElement
{
-
2529932
,
-
2229646
,
445613
,
10720828
,
-
13849527
,
-
11505937
,
-
23507731
,
16354465
,
15067285
,
-
14147707
},
},
{
FieldElement
{
7840942
,
14037873
,
-
33364863
,
15934016
,
-
728213
,
-
3642706
,
21403988
,
1057586
,
-
19379462
,
-
12403220
},
FieldElement
{
915865
,
-
16469274
,
15608285
,
-
8789130
,
-
24357026
,
6060030
,
-
17371319
,
8410997
,
-
7220461
,
16527025
},
FieldElement
{
32922597
,
-
556987
,
20336074
,
-
16184568
,
10903705
,
-
5384487
,
16957574
,
52992
,
23834301
,
6588044
},
},
{
FieldElement
{
32752030
,
11232950
,
3381995
,
-
8714866
,
22652988
,
-
10744103
,
17159699
,
16689107
,
-
20314580
,
-
1305992
},
FieldElement
{
-
4689649
,
9166776
,
-
25710296
,
-
10847306
,
11576752
,
12733943
,
7924251
,
-
2752281
,
1976123
,
-
7249027
},
FieldElement
{
21251222
,
16309901
,
-
2983015
,
-
6783122
,
30810597
,
12967303
,
156041
,
-
3371252
,
12331345
,
-
8237197
},
},
{
FieldElement
{
8651614
,
-
4477032
,
-
16085636
,
-
4996994
,
13002507
,
2950805
,
29054427
,
-
5106970
,
10008136
,
-
4667901
},
FieldElement
{
31486080
,
15114593
,
-
14261250
,
12951354
,
14369431
,
-
7387845
,
16347321
,
-
13662089
,
8684155
,
-
10532952
},
FieldElement
{
19443825
,
11385320
,
24468943
,
-
9659068
,
-
23919258
,
2187569
,
-
26263207
,
-
6086921
,
31316348
,
14219878
},
},
{
FieldElement
{
-
28594490
,
1193785
,
32245219
,
11392485
,
31092169
,
15722801
,
27146014
,
6992409
,
29126555
,
9207390
},
FieldElement
{
32382935
,
1110093
,
18477781
,
11028262
,
-
27411763
,
-
7548111
,
-
4980517
,
10843782
,
-
7957600
,
-
14435730
},
FieldElement
{
2814918
,
7836403
,
27519878
,
-
7868156
,
-
20894015
,
-
11553689
,
-
21494559
,
8550130
,
28346258
,
1994730
},
},
{
FieldElement
{
-
19578299
,
8085545
,
-
14000519
,
-
3948622
,
2785838
,
-
16231307
,
-
19516951
,
7174894
,
22628102
,
8115180
},
FieldElement
{
-
30405132
,
955511
,
-
11133838
,
-
15078069
,
-
32447087
,
-
13278079
,
-
25651578
,
3317160
,
-
9943017
,
930272
},
FieldElement
{
-
15303681
,
-
6833769
,
28856490
,
1357446
,
23421993
,
1057177
,
24091212
,
-
1388970
,
-
22765376
,
-
10650715
},
},
{
FieldElement
{
-
22751231
,
-
5303997
,
-
12907607
,
-
12768866
,
-
15811511
,
-
7797053
,
-
14839018
,
-
16554220
,
-
1867018
,
8398970
},
FieldElement
{
-
31969310
,
2106403
,
-
4736360
,
1362501
,
12813763
,
16200670
,
22981545
,
-
6291273
,
18009408
,
-
15772772
},
FieldElement
{
-
17220923
,
-
9545221
,
-
27784654
,
14166835
,
29815394
,
7444469
,
29551787
,
-
3727419
,
19288549
,
1325865
},
},
{
FieldElement
{
15100157
,
-
15835752
,
-
23923978
,
-
1005098
,
-
26450192
,
15509408
,
12376730
,
-
3479146
,
33166107
,
-
8042750
},
FieldElement
{
20909231
,
13023121
,
-
9209752
,
16251778
,
-
5778415
,
-
8094914
,
12412151
,
10018715
,
2213263
,
-
13878373
},
FieldElement
{
32529814
,
-
11074689
,
30361439
,
-
16689753
,
-
9135940
,
1513226
,
22922121
,
6382134
,
-
5766928
,
8371348
},
},
},
{
{
FieldElement
{
9923462
,
11271500
,
12616794
,
3544722
,
-
29998368
,
-
1721626
,
12891687
,
-
8193132
,
-
26442943
,
10486144
},
FieldElement
{
-
22597207
,
-
7012665
,
8587003
,
-
8257861
,
4084309
,
-
12970062
,
361726
,
2610596
,
-
23921530
,
-
11455195
},
FieldElement
{
5408411
,
-
1136691
,
-
4969122
,
10561668
,
24145918
,
14240566
,
31319731
,
-
4235541
,
19985175
,
-
3436086
},
},
{
FieldElement
{
-
13994457
,
16616821
,
14549246
,
3341099
,
32155958
,
13648976
,
-
17577068
,
8849297
,
65030
,
8370684
},
FieldElement
{
-
8320926
,
-
12049626
,
31204563
,
5839400
,
-
20627288
,
-
1057277
,
-
19442942
,
6922164
,
12743482
,
-
9800518
},
FieldElement
{
-
2361371
,
12678785
,
28815050
,
4759974
,
-
23893047
,
4884717
,
23783145
,
11038569
,
18800704
,
255233
},
},
{
FieldElement
{
-
5269658
,
-
1773886
,
13957886
,
7990715
,
23132995
,
728773
,
13393847
,
9066957
,
19258688
,
-
14753793
},
FieldElement
{
-
2936654
,
-
10827535
,
-
10432089
,
14516793
,
-
3640786
,
4372541
,
-
31934921
,
2209390
,
-
1524053
,
2055794
},
FieldElement
{
580882
,
16705327
,
5468415
,
-
2683018
,
-
30926419
,
-
14696000
,
-
7203346
,
-
8994389
,
-
30021019
,
7394435
},
},
{
FieldElement
{
23838809
,
1822728
,
-
15738443
,
15242727
,
8318092
,
-
3733104
,
-
21672180
,
-
3492205
,
-
4821741
,
14799921
},
FieldElement
{
13345610
,
9759151
,
3371034
,
-
16137791
,
16353039
,
8577942
,
31129804
,
13496856
,
-
9056018
,
7402518
},
FieldElement
{
2286874
,
-
4435931
,
-
20042458
,
-
2008336
,
-
13696227
,
5038122
,
11006906
,
-
15760352
,
8205061
,
1607563
},
},
{
FieldElement
{
14414086
,
-
8002132
,
3331830
,
-
3208217
,
22249151
,
-
5594188
,
18364661
,
-
2906958
,
30019587
,
-
9029278
},
FieldElement
{
-
27688051
,
1585953
,
-
10775053
,
931069
,
-
29120221
,
-
11002319
,
-
14410829
,
12029093
,
9944378
,
8024
},
FieldElement
{
4368715
,
-
3709630
,
29874200
,
-
15022983
,
-
20230386
,
-
11410704
,
-
16114594
,
-
999085
,
-
8142388
,
5640030
},
},
{
FieldElement
{
10299610
,
13746483
,
11661824
,
16234854
,
7630238
,
5998374
,
9809887
,
-
16694564
,
15219798
,
-
14327783
},
FieldElement
{
27425505
,
-
5719081
,
3055006
,
10660664
,
23458024
,
595578
,
-
15398605
,
-
1173195
,
-
18342183
,
9742717
},
FieldElement
{
6744077
,
2427284
,
26042789
,
2720740
,
-
847906
,
1118974
,
32324614
,
7406442
,
12420155
,
1994844
},
},
{
FieldElement
{
14012521
,
-
5024720
,
-
18384453
,
-
9578469
,
-
26485342
,
-
3936439
,
-
13033478
,
-
10909803
,
24319929
,
-
6446333
},
FieldElement
{
16412690
,
-
4507367
,
10772641
,
15929391
,
-
17068788
,
-
4658621
,
10555945
,
-
10484049
,
-
30102368
,
-
4739048
},
FieldElement
{
22397382
,
-
7767684
,
-
9293161
,
-
12792868
,
17166287
,
-
9755136
,
-
27333065
,
6199366
,
21880021
,
-
12250760
},
},
{
FieldElement
{
-
4283307
,
5368523
,
-
31117018
,
8163389
,
-
30323063
,
3209128
,
16557151
,
8890729
,
8840445
,
4957760
},
FieldElement
{
-
15447727
,
709327
,
-
6919446
,
-
10870178
,
-
29777922
,
6522332
,
-
21720181
,
12130072
,
-
14796503
,
5005757
},
FieldElement
{
-
2114751
,
-
14308128
,
23019042
,
15765735
,
-
25269683
,
6002752
,
10183197
,
-
13239326
,
-
16395286
,
-
2176112
},
},
},
{
{
FieldElement
{
-
19025756
,
1632005
,
13466291
,
-
7995100
,
-
23640451
,
16573537
,
-
32013908
,
-
3057104
,
22208662
,
2000468
},
FieldElement
{
3065073
,
-
1412761
,
-
25598674
,
-
361432
,
-
17683065
,
-
5703415
,
-
8164212
,
11248527
,
-
3691214
,
-
7414184
},
FieldElement
{
10379208
,
-
6045554
,
8877319
,
1473647
,
-
29291284
,
-
12507580
,
16690915
,
2553332
,
-
3132688
,
16400289
},
},
{
FieldElement
{
15716668
,
1254266
,
-
18472690
,
7446274
,
-
8448918
,
6344164
,
-
22097271
,
-
7285580
,
26894937
,
9132066
},
FieldElement
{
24158887
,
12938817
,
11085297
,
-
8177598
,
-
28063478
,
-
4457083
,
-
30576463
,
64452
,
-
6817084
,
-
2692882
},
FieldElement
{
13488534
,
7794716
,
22236231
,
5989356
,
25426474
,
-
12578208
,
2350710
,
-
3418511
,
-
4688006
,
2364226
},
},
{
FieldElement
{
16335052
,
9132434
,
25640582
,
6678888
,
1725628
,
8517937
,
-
11807024
,
-
11697457
,
15445875
,
-
7798101
},
FieldElement
{
29004207
,
-
7867081
,
28661402
,
-
640412
,
-
12794003
,
-
7943086
,
31863255
,
-
4135540
,
-
278050
,
-
15759279
},
FieldElement
{
-
6122061
,
-
14866665
,
-
28614905
,
14569919
,
-
10857999
,
-
3591829
,
10343412
,
-
6976290
,
-
29828287
,
-
10815811
},
},
{
FieldElement
{
27081650
,
3463984
,
14099042
,
-
4517604
,
1616303
,
-
6205604
,
29542636
,
15372179
,
17293797
,
960709
},
FieldElement
{
20263915
,
11434237
,
-
5765435
,
11236810
,
13505955
,
-
10857102
,
-
16111345
,
6493122
,
-
19384511
,
7639714
},
FieldElement
{
-
2830798
,
-
14839232
,
25403038
,
-
8215196
,
-
8317012
,
-
16173699
,
18006287
,
-
16043750
,
29994677
,
-
15808121
},
},
{
FieldElement
{
9769828
,
5202651
,
-
24157398
,
-
13631392
,
-
28051003
,
-
11561624
,
-
24613141
,
-
13860782
,
-
31184575
,
709464
},
FieldElement
{
12286395
,
13076066
,
-
21775189
,
-
1176622
,
-
25003198
,
4057652
,
-
32018128
,
-
8890874
,
16102007
,
13205847
},
FieldElement
{
13733362
,
5599946
,
10557076
,
3195751
,
-
5557991
,
8536970
,
-
25540170
,
8525972
,
10151379
,
10394400
},
},
{
FieldElement
{
4024660
,
-
16137551
,
22436262
,
12276534
,
-
9099015
,
-
2686099
,
19698229
,
11743039
,
-
33302334
,
8934414
},
FieldElement
{
-
15879800
,
-
4525240
,
-
8580747
,
-
2934061
,
14634845
,
-
698278
,
-
9449077
,
3137094
,
-
11536886
,
11721158
},
FieldElement
{
17555939
,
-
5013938
,
8268606
,
2331751
,
-
22738815
,
9761013
,
9319229
,
8835153
,
-
9205489
,
-
1280045
},
},
{
FieldElement
{
-
461409
,
-
7830014
,
20614118
,
16688288
,
-
7514766
,
-
4807119
,
22300304
,
505429
,
6108462
,
-
6183415
},
FieldElement
{
-
5070281
,
12367917
,
-
30663534
,
3234473
,
32617080
,
-
8422642
,
29880583
,
-
13483331
,
-
26898490
,
-
7867459
},
FieldElement
{
-
31975283
,
5726539
,
26934134
,
10237677
,
-
3173717
,
-
605053
,
24199304
,
3795095
,
7592688
,
-
14992079
},
},
{
FieldElement
{
21594432
,
-
14964228
,
17466408
,
-
4077222
,
32537084
,
2739898
,
6407723
,
12018833
,
-
28256052
,
4298412
},
FieldElement
{
-
20650503
,
-
11961496
,
-
27236275
,
570498
,
3767144
,
-
1717540
,
13891942
,
-
1569194
,
13717174
,
10805743
},
FieldElement
{
-
14676630
,
-
15644296
,
15287174
,
11927123
,
24177847
,
-
8175568
,
-
796431
,
14860609
,
-
26938930
,
-
5863836
},
},
},
{
{
FieldElement
{
12962541
,
5311799
,
-
10060768
,
11658280
,
18855286
,
-
7954201
,
13286263
,
-
12808704
,
-
4381056
,
9882022
},
FieldElement
{
18512079
,
11319350
,
-
20123124
,
15090309
,
18818594
,
5271736
,
-
22727904
,
3666879
,
-
23967430
,
-
3299429
},
FieldElement
{
-
6789020
,
-
3146043
,
16192429
,
13241070
,
15898607
,
-
14206114
,
-
10084880
,
-
6661110
,
-
2403099
,
5276065
},
},
{
FieldElement
{
30169808
,
-
5317648
,
26306206
,
-
11750859
,
27814964
,
7069267
,
7152851
,
3684982
,
1449224
,
13082861
},
FieldElement
{
10342826
,
3098505
,
2119311
,
193222
,
25702612
,
12233820
,
23697382
,
15056736
,
-
21016438
,
-
8202000
},
FieldElement
{
-
33150110
,
3261608
,
22745853
,
7948688
,
19370557
,
-
15177665
,
-
26171976
,
6482814
,
-
10300080
,
-
11060101
},
},
{
FieldElement
{
32869458
,
-
5408545
,
25609743
,
15678670
,
-
10687769
,
-
15471071
,
26112421
,
2521008
,
-
22664288
,
6904815
},
FieldElement
{
29506923
,
4457497
,
3377935
,
-
9796444
,
-
30510046
,
12935080
,
1561737
,
3841096
,
-
29003639
,
-
6657642
},
FieldElement
{
10340844
,
-
6630377
,
-
18656632
,
-
2278430
,
12621151
,
-
13339055
,
30878497
,
-
11824370
,
-
25584551
,
5181966
},
},
{
FieldElement
{
25940115
,
-
12658025
,
17324188
,
-
10307374
,
-
8671468
,
15029094
,
24396252
,
-
16450922
,
-
2322852
,
-
12388574
},
FieldElement
{
-
21765684
,
9916823
,
-
1300409
,
4079498
,
-
1028346
,
11909559
,
1782390
,
12641087
,
20603771
,
-
6561742
},
FieldElement
{
-
18882287
,
-
11673380
,
24849422
,
11501709
,
13161720
,
-
4768874
,
1925523
,
11914390
,
4662781
,
7820689
},
},
{
FieldElement
{
12241050
,
-
425982
,
8132691
,
9393934
,
32846760
,
-
1599620
,
29749456
,
12172924
,
16136752
,
15264020
},
FieldElement
{
-
10349955
,
-
14680563
,
-
8211979
,
2330220
,
-
17662549
,
-
14545780
,
10658213
,
6671822
,
19012087
,
3772772
},
FieldElement
{
3753511
,
-
3421066
,
10617074
,
2028709
,
14841030
,
-
6721664
,
28718732
,
-
15762884
,
20527771
,
12988982
},
},
{
FieldElement
{
-
14822485
,
-
5797269
,
-
3707987
,
12689773
,
-
898983
,
-
10914866
,
-
24183046
,
-
10564943
,
3299665
,
-
12424953
},
FieldElement
{
-
16777703
,
-
15253301
,
-
9642417
,
4978983
,
3308785
,
8755439
,
6943197
,
6461331
,
-
25583147
,
8991218
},
FieldElement
{
-
17226263
,
1816362
,
-
1673288
,
-
6086439
,
31783888
,
-
8175991
,
-
32948145
,
7417950
,
-
30242287
,
1507265
},
},
{
FieldElement
{
29692663
,
6829891
,
-
10498800
,
4334896
,
20945975
,
-
11906496
,
-
28887608
,
8209391
,
14606362
,
-
10647073
},
FieldElement
{
-
3481570
,
8707081
,
32188102
,
5672294
,
22096700
,
1711240
,
-
33020695
,
9761487
,
4170404
,
-
2085325
},
FieldElement
{
-
11587470
,
14855945
,
-
4127778
,
-
1531857
,
-
26649089
,
15084046
,
22186522
,
16002000
,
-
14276837
,
-
8400798
},
},
{
FieldElement
{
-
4811456
,
13761029
,
-
31703877
,
-
2483919
,
-
3312471
,
7869047
,
-
7113572
,
-
9620092
,
13240845
,
10965870
},
FieldElement
{
-
7742563
,
-
8256762
,
-
14768334
,
-
13656260
,
-
23232383
,
12387166
,
4498947
,
14147411
,
29514390
,
4302863
},
FieldElement
{
-
13413405
,
-
12407859
,
20757302
,
-
13801832
,
14785143
,
8976368
,
-
5061276
,
-
2144373
,
17846988
,
-
13971927
},
},
},
{
{
FieldElement
{
-
2244452
,
-
754728
,
-
4597030
,
-
1066309
,
-
6247172
,
1455299
,
-
21647728
,
-
9214789
,
-
5222701
,
12650267
},
FieldElement
{
-
9906797
,
-
16070310
,
21134160
,
12198166
,
-
27064575
,
708126
,
387813
,
13770293
,
-
19134326
,
10958663
},
FieldElement
{
22470984
,
12369526
,
23446014
,
-
5441109
,
-
21520802
,
-
9698723
,
-
11772496
,
-
11574455
,
-
25083830
,
4271862
},
},
{
FieldElement
{
-
25169565
,
-
10053642
,
-
19909332
,
15361595
,
-
5984358
,
2159192
,
75375
,
-
4278529
,
-
32526221
,
8469673
},
FieldElement
{
15854970
,
4148314
,
-
8893890
,
7259002
,
11666551
,
13824734
,
-
30531198
,
2697372
,
24154791
,
-
9460943
},
FieldElement
{
15446137
,
-
15806644
,
29759747
,
14019369
,
30811221
,
-
9610191
,
-
31582008
,
12840104
,
24913809
,
9815020
},
},
{
FieldElement
{
-
4709286
,
-
5614269
,
-
31841498
,
-
12288893
,
-
14443537
,
10799414
,
-
9103676
,
13438769
,
18735128
,
9466238
},
FieldElement
{
11933045
,
9281483
,
5081055
,
-
5183824
,
-
2628162
,
-
4905629
,
-
7727821
,
-
10896103
,
-
22728655
,
16199064
},
FieldElement
{
14576810
,
379472
,
-
26786533
,
-
8317236
,
-
29426508
,
-
10812974
,
-
102766
,
1876699
,
30801119
,
2164795
},
},
{
FieldElement
{
15995086
,
3199873
,
13672555
,
13712240
,
-
19378835
,
-
4647646
,
-
13081610
,
-
15496269
,
-
13492807
,
1268052
},
FieldElement
{
-
10290614
,
-
3659039
,
-
3286592
,
10948818
,
23037027
,
3794475
,
-
3470338
,
-
12600221
,
-
17055369
,
3565904
},
FieldElement
{
29210088
,
-
9419337
,
-
5919792
,
-
4952785
,
10834811
,
-
13327726
,
-
16512102
,
-
10820713
,
-
27162222
,
-
14030531
},
},
{
FieldElement
{
-
13161890
,
15508588
,
16663704
,
-
8156150
,
-
28349942
,
9019123
,
-
29183421
,
-
3769423
,
2244111
,
-
14001979
},
FieldElement
{
-
5152875
,
-
3800936
,
-
9306475
,
-
6071583
,
16243069
,
14684434
,
-
25673088
,
-
16180800
,
13491506
,
4641841
},
FieldElement
{
10813417
,
643330
,
-
19188515
,
-
728916
,
30292062
,
-
16600078
,
27548447
,
-
7721242
,
14476989
,
-
12767431
},
},
{
FieldElement
{
10292079
,
9984945
,
6481436
,
8279905
,
-
7251514
,
7032743
,
27282937
,
-
1644259
,
-
27912810
,
12651324
},
FieldElement
{
-
31185513
,
-
813383
,
22271204
,
11835308
,
10201545
,
15351028
,
17099662
,
3988035
,
21721536
,
-
3148940
},
FieldElement
{
10202177
,
-
6545839
,
-
31373232
,
-
9574638
,
-
32150642
,
-
8119683
,
-
12906320
,
3852694
,
13216206
,
14842320
},
},
{
FieldElement
{
-
15815640
,
-
10601066
,
-
6538952
,
-
7258995
,
-
6984659
,
-
6581778
,
-
31500847
,
13765824
,
-
27434397
,
9900184
},
FieldElement
{
14465505
,
-
13833331
,
-
32133984
,
-
14738873
,
-
27443187
,
12990492
,
33046193
,
15796406
,
-
7051866
,
-
8040114
},
FieldElement
{
30924417
,
-
8279620
,
6359016
,
-
12816335
,
16508377
,
9071735
,
-
25488601
,
15413635
,
9524356
,
-
7018878
},
},
{
FieldElement
{
12274201
,
-
13175547
,
32627641
,
-
1785326
,
6736625
,
13267305
,
5237659
,
-
5109483
,
15663516
,
4035784
},
FieldElement
{
-
2951309
,
8903985
,
17349946
,
601635
,
-
16432815
,
-
4612556
,
-
13732739
,
-
15889334
,
-
22258478
,
4659091
},
FieldElement
{
-
16916263
,
-
4952973
,
-
30393711
,
-
15158821
,
20774812
,
15897498
,
5736189
,
15026997
,
-
2178256
,
-
13455585
},
},
},
{
{
FieldElement
{
-
8858980
,
-
2219056
,
28571666
,
-
10155518
,
-
474467
,
-
10105698
,
-
3801496
,
278095
,
23440562
,
-
290208
},
FieldElement
{
10226241
,
-
5928702
,
15139956
,
120818
,
-
14867693
,
5218603
,
32937275
,
11551483
,
-
16571960
,
-
7442864
},
FieldElement
{
17932739
,
-
12437276
,
-
24039557
,
10749060
,
11316803
,
7535897
,
22503767
,
5561594
,
-
3646624
,
3898661
},
},
{
FieldElement
{
7749907
,
-
969567
,
-
16339731
,
-
16464
,
-
25018111
,
15122143
,
-
1573531
,
7152530
,
21831162
,
1245233
},
FieldElement
{
26958459
,
-
14658026
,
4314586
,
8346991
,
-
5677764
,
11960072
,
-
32589295
,
-
620035
,
-
30402091
,
-
16716212
},
FieldElement
{
-
12165896
,
9166947
,
33491384
,
13673479
,
29787085
,
13096535
,
6280834
,
14587357
,
-
22338025
,
13987525
},
},
{
FieldElement
{
-
24349909
,
7778775
,
21116000
,
15572597
,
-
4833266
,
-
5357778
,
-
4300898
,
-
5124639
,
-
7469781
,
-
2858068
},
FieldElement
{
9681908
,
-
6737123
,
-
31951644
,
13591838
,
-
6883821
,
386950
,
31622781
,
6439245
,
-
14581012
,
4091397
},
FieldElement
{
-
8426427
,
1470727
,
-
28109679
,
-
1596990
,
3978627
,
-
5123623
,
-
19622683
,
12092163
,
29077877
,
-
14741988
},
},
{
FieldElement
{
5269168
,
-
6859726
,
-
13230211
,
-
8020715
,
25932563
,
1763552
,
-
5606110
,
-
5505881
,
-
20017847
,
2357889
},
FieldElement
{
32264008
,
-
15407652
,
-
5387735
,
-
1160093
,
-
2091322
,
-
3946900
,
23104804
,
-
12869908
,
5727338
,
189038
},
FieldElement
{
14609123
,
-
8954470
,
-
6000566
,
-
16622781
,
-
14577387
,
-
7743898
,
-
26745169
,
10942115
,
-
25888931
,
-
14884697
},
},
{
FieldElement
{
20513500
,
5557931
,
-
15604613
,
7829531
,
26413943
,
-
2019404
,
-
21378968
,
7471781
,
13913677
,
-
5137875
},
FieldElement
{
-
25574376
,
11967826
,
29233242
,
12948236
,
-
6754465
,
4713227
,
-
8940970
,
14059180
,
12878652
,
8511905
},
FieldElement
{
-
25656801
,
3393631
,
-
2955415
,
-
7075526
,
-
2250709
,
9366908
,
-
30223418
,
6812974
,
5568676
,
-
3127656
},
},
{
FieldElement
{
11630004
,
12144454
,
2116339
,
13606037
,
27378885
,
15676917
,
-
17408753
,
-
13504373
,
-
14395196
,
8070818
},
FieldElement
{
27117696
,
-
10007378
,
-
31282771
,
-
5570088
,
1127282
,
12772488
,
-
29845906
,
10483306
,
-
11552749
,
-
1028714
},
FieldElement
{
10637467
,
-
5688064
,
5674781
,
1072708
,
-
26343588
,
-
6982302
,
-
1683975
,
9177853
,
-
27493162
,
15431203
},
},
{
FieldElement
{
20525145
,
10892566
,
-
12742472
,
12779443
,
-
29493034
,
16150075
,
-
28240519
,
14943142
,
-
15056790
,
-
7935931
},
FieldElement
{
-
30024462
,
5626926
,
-
551567
,
-
9981087
,
753598
,
11981191
,
25244767
,
-
3239766
,
-
3356550
,
9594024
},
FieldElement
{
-
23752644
,
2636870
,
-
5163910
,
-
10103818
,
585134
,
7877383
,
11345683
,
-
6492290
,
13352335
,
-
10977084
},
},
{
FieldElement
{
-
1931799
,
-
5407458
,
3304649
,
-
12884869
,
17015806
,
-
4877091
,
-
29783850
,
-
7752482
,
-
13215537
,
-
319204
},
FieldElement
{
20239939
,
6607058
,
6203985
,
3483793
,
-
18386976
,
-
779229
,
-
20723742
,
15077870
,
-
22750759
,
14523817
},
FieldElement
{
27406042
,
-
6041657
,
27423596
,
-
4497394
,
4996214
,
10002360
,
-
28842031
,
-
4545494
,
-
30172742
,
-
4805667
},
},
},
{
{
FieldElement
{
11374242
,
12660715
,
17861383
,
-
12540833
,
10935568
,
1099227
,
-
13886076
,
-
9091740
,
-
27727044
,
11358504
},
FieldElement
{
-
12730809
,
10311867
,
1510375
,
10778093
,
-
2119455
,
-
9145702
,
32676003
,
11149336
,
-
26123651
,
4985768
},
FieldElement
{
-
19096303
,
341147
,
-
6197485
,
-
239033
,
15756973
,
-
8796662
,
-
983043
,
13794114
,
-
19414307
,
-
15621255
},
},
{
FieldElement
{
6490081
,
11940286
,
25495923
,
-
7726360
,
8668373
,
-
8751316
,
3367603
,
6970005
,
-
1691065
,
-
9004790
},
FieldElement
{
1656497
,
13457317
,
15370807
,
6364910
,
13605745
,
8362338
,
-
19174622
,
-
5475723
,
-
16796596
,
-
5031438
},
FieldElement
{
-
22273315
,
-
13524424
,
-
64685
,
-
4334223
,
-
18605636
,
-
10921968
,
-
20571065
,
-
7007978
,
-
99853
,
-
10237333
},
},
{
FieldElement
{
17747465
,
10039260
,
19368299
,
-
4050591
,
-
20630635
,
-
16041286
,
31992683
,
-
15857976
,
-
29260363
,
-
5511971
},
FieldElement
{
31932027
,
-
4986141
,
-
19612382
,
16366580
,
22023614
,
88450
,
11371999
,
-
3744247
,
4882242
,
-
10626905
},
FieldElement
{
29796507
,
37186
,
19818052
,
10115756
,
-
11829032
,
3352736
,
18551198
,
3272828
,
-
5190932
,
-
4162409
},
},
{
FieldElement
{
12501286
,
4044383
,
-
8612957
,
-
13392385
,
-
32430052
,
5136599
,
-
19230378
,
-
3529697
,
330070
,
-
3659409
},
FieldElement
{
6384877
,
2899513
,
17807477
,
7663917
,
-
2358888
,
12363165
,
25366522
,
-
8573892
,
-
271295
,
12071499
},
FieldElement
{
-
8365515
,
-
4042521
,
25133448
,
-
4517355
,
-
6211027
,
2265927
,
-
32769618
,
1936675
,
-
5159697
,
3829363
},
},
{
FieldElement
{
28425966
,
-
5835433
,
-
577090
,
-
4697198
,
-
14217555
,
6870930
,
7921550
,
-
6567787
,
26333140
,
14267664
},
FieldElement
{
-
11067219
,
11871231
,
27385719
,
-
10559544
,
-
4585914
,
-
11189312
,
10004786
,
-
8709488
,
-
21761224
,
8930324
},
FieldElement
{
-
21197785
,
-
16396035
,
25654216
,
-
1725397
,
12282012
,
11008919
,
1541940
,
4757911
,
-
26491501
,
-
16408940
},
},
{
FieldElement
{
13537262
,
-
7759490
,
-
20604840
,
10961927
,
-
5922820
,
-
13218065
,
-
13156584
,
6217254
,
-
15943699
,
13814990
},
FieldElement
{
-
17422573
,
15157790
,
18705543
,
29619
,
24409717
,
-
260476
,
27361681
,
9257833
,
-
1956526
,
-
1776914
},
FieldElement
{
-
25045300
,
-
10191966
,
15366585
,
15166509
,
-
13105086
,
8423556
,
-
29171540
,
12361135
,
-
18685978
,
4578290
},
},
{
FieldElement
{
24579768
,
3711570
,
1342322
,
-
11180126
,
-
27005135
,
14124956
,
-
22544529
,
14074919
,
21964432
,
8235257
},
FieldElement
{
-
6528613
,
-
2411497
,
9442966
,
-
5925588
,
12025640
,
-
1487420
,
-
2981514
,
-
1669206
,
13006806
,
2355433
},
FieldElement
{
-
16304899
,
-
13605259
,
-
6632427
,
-
5142349
,
16974359
,
-
10911083
,
27202044
,
1719366
,
1141648
,
-
12796236
},
},
{
FieldElement
{
-
12863944
,
-
13219986
,
-
8318266
,
-
11018091
,
-
6810145
,
-
4843894
,
13475066
,
-
3133972
,
32674895
,
13715045
},
FieldElement
{
11423335
,
-
5468059
,
32344216
,
8962751
,
24989809
,
9241752
,
-
13265253
,
16086212
,
-
28740881
,
-
15642093
},
FieldElement
{
-
1409668
,
12530728
,
-
6368726
,
10847387
,
19531186
,
-
14132160
,
-
11709148
,
7791794
,
-
27245943
,
4383347
},
},
},
{
{
FieldElement
{
-
28970898
,
5271447
,
-
1266009
,
-
9736989
,
-
12455236
,
16732599
,
-
4862407
,
-
4906449
,
27193557
,
6245191
},
FieldElement
{
-
15193956
,
5362278
,
-
1783893
,
2695834
,
4960227
,
12840725
,
23061898
,
3260492
,
22510453
,
8577507
},
FieldElement
{
-
12632451
,
11257346
,
-
32692994
,
13548177
,
-
721004
,
10879011
,
31168030
,
13952092
,
-
29571492
,
-
3635906
},
},
{
FieldElement
{
3877321
,
-
9572739
,
32416692
,
5405324
,
-
11004407
,
-
13656635
,
3759769
,
11935320
,
5611860
,
8164018
},
FieldElement
{
-
16275802
,
14667797
,
15906460
,
12155291
,
-
22111149
,
-
9039718
,
32003002
,
-
8832289
,
5773085
,
-
8422109
},
FieldElement
{
-
23788118
,
-
8254300
,
1950875
,
8937633
,
18686727
,
16459170
,
-
905725
,
12376320
,
31632953
,
190926
},
},
{
FieldElement
{
-
24593607
,
-
16138885
,
-
8423991
,
13378746
,
14162407
,
6901328
,
-
8288749
,
4508564
,
-
25341555
,
-
3627528
},
FieldElement
{
8884438
,
-
5884009
,
6023974
,
10104341
,
-
6881569
,
-
4941533
,
18722941
,
-
14786005
,
-
1672488
,
827625
},
FieldElement
{
-
32720583
,
-
16289296
,
-
32503547
,
7101210
,
13354605
,
2659080
,
-
1800575
,
-
14108036
,
-
24878478
,
1541286
},
},
{
FieldElement
{
2901347
,
-
1117687
,
3880376
,
-
10059388
,
-
17620940
,
-
3612781
,
-
21802117
,
-
3567481
,
20456845
,
-
1885033
},
FieldElement
{
27019610
,
12299467
,
-
13658288
,
-
1603234
,
-
12861660
,
-
4861471
,
-
19540150
,
-
5016058
,
29439641
,
15138866
},
FieldElement
{
21536104
,
-
6626420
,
-
32447818
,
-
10690208
,
-
22408077
,
5175814
,
-
5420040
,
-
16361163
,
7779328
,
109896
},
},
{
FieldElement
{
30279744
,
14648750
,
-
8044871
,
6425558
,
13639621
,
-
743509
,
28698390
,
12180118
,
23177719
,
-
554075
},
FieldElement
{
26572847
,
3405927
,
-
31701700
,
12890905
,
-
19265668
,
5335866
,
-
6493768
,
2378492
,
4439158
,
-
13279347
},
FieldElement
{
-
22716706
,
3489070
,
-
9225266
,
-
332753
,
18875722
,
-
1140095
,
14819434
,
-
12731527
,
-
17717757
,
-
5461437
},
},
{
FieldElement
{
-
5056483
,
16566551
,
15953661
,
3767752
,
-
10436499
,
15627060
,
-
820954
,
2177225
,
8550082
,
-
15114165
},
FieldElement
{
-
18473302
,
16596775
,
-
381660
,
15663611
,
22860960
,
15585581
,
-
27844109
,
-
3582739
,
-
23260460
,
-
8428588
},
FieldElement
{
-
32480551
,
15707275
,
-
8205912
,
-
5652081
,
29464558
,
2713815
,
-
22725137
,
15860482
,
-
21902570
,
1494193
},
},
{
FieldElement
{
-
19562091
,
-
14087393
,
-
25583872
,
-
9299552
,
13127842
,
759709
,
21923482
,
16529112
,
8742704
,
12967017
},
FieldElement
{
-
28464899
,
1553205
,
32536856
,
-
10473729
,
-
24691605
,
-
406174
,
-
8914625
,
-
2933896
,
-
29903758
,
15553883
},
FieldElement
{
21877909
,
3230008
,
9881174
,
10539357
,
-
4797115
,
2841332
,
11543572
,
14513274
,
19375923
,
-
12647961
},
},
{
FieldElement
{
8832269
,
-
14495485
,
13253511
,
5137575
,
5037871
,
4078777
,
24880818
,
-
6222716
,
2862653
,
9455043
},
FieldElement
{
29306751
,
5123106
,
20245049
,
-
14149889
,
9592566
,
8447059
,
-
2077124
,
-
2990080
,
15511449
,
4789663
},
FieldElement
{
-
20679756
,
7004547
,
8824831
,
-
9434977
,
-
4045704
,
-
3750736
,
-
5754762
,
108893
,
23513200
,
16652362
},
},
},
{
{
FieldElement
{
-
33256173
,
4144782
,
-
4476029
,
-
6579123
,
10770039
,
-
7155542
,
-
6650416
,
-
12936300
,
-
18319198
,
10212860
},
FieldElement
{
2756081
,
8598110
,
7383731
,
-
6859892
,
22312759
,
-
1105012
,
21179801
,
2600940
,
-
9988298
,
-
12506466
},
FieldElement
{
-
24645692
,
13317462
,
-
30449259
,
-
15653928
,
21365574
,
-
10869657
,
11344424
,
864440
,
-
2499677
,
-
16710063
},
},
{
FieldElement
{
-
26432803
,
6148329
,
-
17184412
,
-
14474154
,
18782929
,
-
275997
,
-
22561534
,
211300
,
2719757
,
4940997
},
FieldElement
{
-
1323882
,
3911313
,
-
6948744
,
14759765
,
-
30027150
,
7851207
,
21690126
,
8518463
,
26699843
,
5276295
},
FieldElement
{
-
13149873
,
-
6429067
,
9396249
,
365013
,
24703301
,
-
10488939
,
1321586
,
149635
,
-
15452774
,
7159369
},
},
{
FieldElement
{
9987780
,
-
3404759
,
17507962
,
9505530
,
9731535
,
-
2165514
,
22356009
,
8312176
,
22477218
,
-
8403385
},
FieldElement
{
18155857
,
-
16504990
,
19744716
,
9006923
,
15154154
,
-
10538976
,
24256460
,
-
4864995
,
-
22548173
,
9334109
},
FieldElement
{
2986088
,
-
4911893
,
10776628
,
-
3473844
,
10620590
,
-
7083203
,
-
21413845
,
14253545
,
-
22587149
,
536906
},
},
{
FieldElement
{
4377756
,
8115836
,
24567078
,
15495314
,
11625074
,
13064599
,
7390551
,
10589625
,
10838060
,
-
15420424
},
FieldElement
{
-
19342404
,
867880
,
9277171
,
-
3218459
,
-
14431572
,
-
1986443
,
19295826
,
-
15796950
,
6378260
,
699185
},
FieldElement
{
7895026
,
4057113
,
-
7081772
,
-
13077756
,
-
17886831
,
-
323126
,
-
716039
,
15693155
,
-
5045064
,
-
13373962
},
},
{
FieldElement
{
-
7737563
,
-
5869402
,
-
14566319
,
-
7406919
,
11385654
,
13201616
,
31730678
,
-
10962840
,
-
3918636
,
-
9669325
},
FieldElement
{
10188286
,
-
15770834
,
-
7336361
,
13427543
,
22223443
,
14896287
,
30743455
,
7116568
,
-
21786507
,
5427593
},
FieldElement
{
696102
,
13206899
,
27047647
,
-
10632082
,
15285305
,
-
9853179
,
10798490
,
-
4578720
,
19236243
,
12477404
},
},
{
FieldElement
{
-
11229439
,
11243796
,
-
17054270
,
-
8040865
,
-
788228
,
-
8167967
,
-
3897669
,
11180504
,
-
23169516
,
7733644
},
FieldElement
{
17800790
,
-
14036179
,
-
27000429
,
-
11766671
,
23887827
,
3149671
,
23466177
,
-
10538171
,
10322027
,
15313801
},
FieldElement
{
26246234
,
11968874
,
32263343
,
-
5468728
,
6830755
,
-
13323031
,
-
15794704
,
-
101982
,
-
24449242
,
10890804
},
},
{
FieldElement
{
-
31365647
,
10271363
,
-
12660625
,
-
6267268
,
16690207
,
-
13062544
,
-
14982212
,
16484931
,
25180797
,
-
5334884
},
FieldElement
{
-
586574
,
10376444
,
-
32586414
,
-
11286356
,
19801893
,
10997610
,
2276632
,
9482883
,
316878
,
13820577
},
FieldElement
{
-
9882808
,
-
4510367
,
-
2115506
,
16457136
,
-
11100081
,
11674996
,
30756178
,
-
7515054
,
30696930
,
-
3712849
},
},
{
FieldElement
{
32988917
,
-
9603412
,
12499366
,
7910787
,
-
10617257
,
-
11931514
,
-
7342816
,
-
9985397
,
-
32349517
,
7392473
},
FieldElement
{
-
8855661
,
15927861
,
9866406
,
-
3649411
,
-
2396914
,
-
16655781
,
-
30409476
,
-
9134995
,
25112947
,
-
2926644
},
FieldElement
{
-
2504044
,
-
436966
,
25621774
,
-
5678772
,
15085042
,
-
5479877
,
-
24884878
,
-
13526194
,
5537438
,
-
13914319
},
},
},
{
{
FieldElement
{
-
11225584
,
2320285
,
-
9584280
,
10149187
,
-
33444663
,
5808648
,
-
14876251
,
-
1729667
,
31234590
,
6090599
},
FieldElement
{
-
9633316
,
116426
,
26083934
,
2897444
,
-
6364437
,
-
2688086
,
609721
,
15878753
,
-
6970405
,
-
9034768
},
FieldElement
{
-
27757857
,
247744
,
-
15194774
,
-
9002551
,
23288161
,
-
10011936
,
-
23869595
,
6503646
,
20650474
,
1804084
},
},
{
FieldElement
{
-
27589786
,
15456424
,
8972517
,
8469608
,
15640622
,
4439847
,
3121995
,
-
10329713
,
27842616
,
-
202328
},
FieldElement
{
-
15306973
,
2839644
,
22530074
,
10026331
,
4602058
,
5048462
,
28248656
,
5031932
,
-
11375082
,
12714369
},
FieldElement
{
20807691
,
-
7270825
,
29286141
,
11421711
,
-
27876523
,
-
13868230
,
-
21227475
,
1035546
,
-
19733229
,
12796920
},
},
{
FieldElement
{
12076899
,
-
14301286
,
-
8785001
,
-
11848922
,
-
25012791
,
16400684
,
-
17591495
,
-
12899438
,
3480665
,
-
15182815
},
FieldElement
{
-
32361549
,
5457597
,
28548107
,
7833186
,
7303070
,
-
11953545
,
-
24363064
,
-
15921875
,
-
33374054
,
2771025
},
FieldElement
{
-
21389266
,
421932
,
26597266
,
6860826
,
22486084
,
-
6737172
,
-
17137485
,
-
4210226
,
-
24552282
,
15673397
},
},
{
FieldElement
{
-
20184622
,
2338216
,
19788685
,
-
9620956
,
-
4001265
,
-
8740893
,
-
20271184
,
4733254
,
3727144
,
-
12934448
},
FieldElement
{
6120119
,
814863
,
-
11794402
,
-
622716
,
6812205
,
-
15747771
,
2019594
,
7975683
,
31123697
,
-
10958981
},
FieldElement
{
30069250
,
-
11435332
,
30434654
,
2958439
,
18399564
,
-
976289
,
12296869
,
9204260
,
-
16432438
,
9648165
},
},
{
FieldElement
{
32705432
,
-
1550977
,
30705658
,
7451065
,
-
11805606
,
9631813
,
3305266
,
5248604
,
-
26008332
,
-
11377501
},
FieldElement
{
17219865
,
2375039
,
-
31570947
,
-
5575615
,
-
19459679
,
9219903
,
294711
,
15298639
,
2662509
,
-
16297073
},
FieldElement
{
-
1172927
,
-
7558695
,
-
4366770
,
-
4287744
,
-
21346413
,
-
8434326
,
32087529
,
-
1222777
,
32247248
,
-
14389861
},
},
{
FieldElement
{
14312628
,
1221556
,
17395390
,
-
8700143
,
-
4945741
,
-
8684635
,
-
28197744
,
-
9637817
,
-
16027623
,
-
13378845
},
FieldElement
{
-
1428825
,
-
9678990
,
-
9235681
,
6549687
,
-
7383069
,
-
468664
,
23046502
,
9803137
,
17597934
,
2346211
},
FieldElement
{
18510800
,
15337574
,
26171504
,
981392
,
-
22241552
,
7827556
,
-
23491134
,
-
11323352
,
3059833
,
-
11782870
},
},
{
FieldElement
{
10141598
,
6082907
,
17829293
,
-
1947643
,
9830092
,
13613136
,
-
25556636
,
-
5544586
,
-
33502212
,
3592096
},
FieldElement
{
33114168
,
-
15889352
,
-
26525686
,
-
13343397
,
33076705
,
8716171
,
1151462
,
1521897
,
-
982665
,
-
6837803
},
FieldElement
{
-
32939165
,
-
4255815
,
23947181
,
-
324178
,
-
33072974
,
-
12305637
,
-
16637686
,
3891704
,
26353178
,
693168
},
},
{
FieldElement
{
30374239
,
1595580
,
-
16884039
,
13186931
,
4600344
,
406904
,
9585294
,
-
400668
,
31375464
,
14369965
},
FieldElement
{
-
14370654
,
-
7772529
,
1510301
,
6434173
,
-
18784789
,
-
6262728
,
32732230
,
-
13108839
,
17901441
,
16011505
},
FieldElement
{
18171223
,
-
11934626
,
-
12500402
,
15197122
,
-
11038147
,
-
15230035
,
-
19172240
,
-
16046376
,
8764035
,
12309598
},
},
},
{
{
FieldElement
{
5975908
,
-
5243188
,
-
19459362
,
-
9681747
,
-
11541277
,
14015782
,
-
23665757
,
1228319
,
17544096
,
-
10593782
},
FieldElement
{
5811932
,
-
1715293
,
3442887
,
-
2269310
,
-
18367348
,
-
8359541
,
-
18044043
,
-
15410127
,
-
5565381
,
12348900
},
FieldElement
{
-
31399660
,
11407555
,
25755363
,
6891399
,
-
3256938
,
14872274
,
-
24849353
,
8141295
,
-
10632534
,
-
585479
},
},
{
FieldElement
{
-
12675304
,
694026
,
-
5076145
,
13300344
,
14015258
,
-
14451394
,
-
9698672
,
-
11329050
,
30944593
,
1130208
},
FieldElement
{
8247766
,
-
6710942
,
-
26562381
,
-
7709309
,
-
14401939
,
-
14648910
,
4652152
,
2488540
,
23550156
,
-
271232
},
FieldElement
{
17294316
,
-
3788438
,
7026748
,
15626851
,
22990044
,
113481
,
2267737
,
-
5908146
,
-
408818
,
-
137719
},
},
{
FieldElement
{
16091085
,
-
16253926
,
18599252
,
7340678
,
2137637
,
-
1221657
,
-
3364161
,
14550936
,
3260525
,
-
7166271
},
FieldElement
{
-
4910104
,
-
13332887
,
18550887
,
10864893
,
-
16459325
,
-
7291596
,
-
23028869
,
-
13204905
,
-
12748722
,
2701326
},
FieldElement
{
-
8574695
,
16099415
,
4629974
,
-
16340524
,
-
20786213
,
-
6005432
,
-
10018363
,
9276971
,
11329923
,
1862132
},
},
{
FieldElement
{
14763076
,
-
15903608
,
-
30918270
,
3689867
,
3511892
,
10313526
,
-
21951088
,
12219231
,
-
9037963
,
-
940300
},
FieldElement
{
8894987
,
-
3446094
,
6150753
,
3013931
,
301220
,
15693451
,
-
31981216
,
-
2909717
,
-
15438168
,
11595570
},
FieldElement
{
15214962
,
3537601
,
-
26238722
,
-
14058872
,
4418657
,
-
15230761
,
13947276
,
10730794
,
-
13489462
,
-
4363670
},
},
{
FieldElement
{
-
2538306
,
7682793
,
32759013
,
263109
,
-
29984731
,
-
7955452
,
-
22332124
,
-
10188635
,
977108
,
699994
},
FieldElement
{
-
12466472
,
4195084
,
-
9211532
,
550904
,
-
15565337
,
12917920
,
19118110
,
-
439841
,
-
30534533
,
-
14337913
},
FieldElement
{
31788461
,
-
14507657
,
4799989
,
7372237
,
8808585
,
-
14747943
,
9408237
,
-
10051775
,
12493932
,
-
5409317
},
},
{
FieldElement
{
-
25680606
,
5260744
,
-
19235809
,
-
6284470
,
-
3695942
,
16566087
,
27218280
,
2607121
,
29375955
,
6024730
},
FieldElement
{
842132
,
-
2794693
,
-
4763381
,
-
8722815
,
26332018
,
-
12405641
,
11831880
,
6985184
,
-
9940361
,
2854096
},
FieldElement
{
-
4847262
,
-
7969331
,
2516242
,
-
5847713
,
9695691
,
-
7221186
,
16512645
,
960770
,
12121869
,
16648078
},
},
{
FieldElement
{
-
15218652
,
14667096
,
-
13336229
,
2013717
,
30598287
,
-
464137
,
-
31504922
,
-
7882064
,
20237806
,
2838411
},
FieldElement
{
-
19288047
,
4453152
,
15298546
,
-
16178388
,
22115043
,
-
15972604
,
12544294
,
-
13470457
,
1068881
,
-
12499905
},
FieldElement
{
-
9558883
,
-
16518835
,
33238498
,
13506958
,
30505848
,
-
1114596
,
-
8486907
,
-
2630053
,
12521378
,
4845654
},
},
{
FieldElement
{
-
28198521
,
10744108
,
-
2958380
,
10199664
,
7759311
,
-
13088600
,
3409348
,
-
873400
,
-
6482306
,
-
12885870
},
FieldElement
{
-
23561822
,
6230156
,
-
20382013
,
10655314
,
-
24040585
,
-
11621172
,
10477734
,
-
1240216
,
-
3113227
,
13974498
},
FieldElement
{
12966261
,
15550616
,
-
32038948
,
-
1615346
,
21025980
,
-
629444
,
5642325
,
7188737
,
18895762
,
12629579
},
},
},
{
{
FieldElement
{
14741879
,
-
14946887
,
22177208
,
-
11721237
,
1279741
,
8058600
,
11758140
,
789443
,
32195181
,
3895677
},
FieldElement
{
10758205
,
15755439
,
-
4509950
,
9243698
,
-
4879422
,
6879879
,
-
2204575
,
-
3566119
,
-
8982069
,
4429647
},
FieldElement
{
-
2453894
,
15725973
,
-
20436342
,
-
10410672
,
-
5803908
,
-
11040220
,
-
7135870
,
-
11642895
,
18047436
,
-
15281743
},
},
{
FieldElement
{
-
25173001
,
-
11307165
,
29759956
,
11776784
,
-
22262383
,
-
15820455
,
10993114
,
-
12850837
,
-
17620701
,
-
9408468
},
FieldElement
{
21987233
,
700364
,
-
24505048
,
14972008
,
-
7774265
,
-
5718395
,
32155026
,
2581431
,
-
29958985
,
8773375
},
FieldElement
{
-
25568350
,
454463
,
-
13211935
,
16126715
,
25240068
,
8594567
,
20656846
,
12017935
,
-
7874389
,
-
13920155
},
},
{
FieldElement
{
6028182
,
6263078
,
-
31011806
,
-
11301710
,
-
818919
,
2461772
,
-
31841174
,
-
5468042
,
-
1721788
,
-
2776725
},
FieldElement
{
-
12278994
,
16624277
,
987579
,
-
5922598
,
32908203
,
1248608
,
7719845
,
-
4166698
,
28408820
,
6816612
},
FieldElement
{
-
10358094
,
-
8237829
,
19549651
,
-
12169222
,
22082623
,
16147817
,
20613181
,
13982702
,
-
10339570
,
5067943
},
},
{
FieldElement
{
-
30505967
,
-
3821767
,
12074681
,
13582412
,
-
19877972
,
2443951
,
-
19719286
,
12746132
,
5331210
,
-
10105944
},
FieldElement
{
30528811
,
3601899
,
-
1957090
,
4619785
,
-
27361822
,
-
15436388
,
24180793
,
-
12570394
,
27679908
,
-
1648928
},
FieldElement
{
9402404
,
-
13957065
,
32834043
,
10838634
,
-
26580150
,
-
13237195
,
26653274
,
-
8685565
,
22611444
,
-
12715406
},
},
{
FieldElement
{
22190590
,
1118029
,
22736441
,
15130463
,
-
30460692
,
-
5991321
,
19189625
,
-
4648942
,
4854859
,
6622139
},
FieldElement
{
-
8310738
,
-
2953450
,
-
8262579
,
-
3388049
,
-
10401731
,
-
271929
,
13424426
,
-
3567227
,
26404409
,
13001963
},
FieldElement
{
-
31241838
,
-
15415700
,
-
2994250
,
8939346
,
11562230
,
-
12840670
,
-
26064365
,
-
11621720
,
-
15405155
,
11020693
},
},
{
FieldElement
{
1866042
,
-
7949489
,
-
7898649
,
-
10301010
,
12483315
,
13477547
,
3175636
,
-
12424163
,
28761762
,
1406734
},
FieldElement
{
-
448555
,
-
1777666
,
13018551
,
3194501
,
-
9580420
,
-
11161737
,
24760585
,
-
4347088
,
25577411
,
-
13378680
},
FieldElement
{
-
24290378
,
4759345
,
-
690653
,
-
1852816
,
2066747
,
10693769
,
-
29595790
,
9884936
,
-
9368926
,
4745410
},
},
{
FieldElement
{
-
9141284
,
6049714
,
-
19531061
,
-
4341411
,
-
31260798
,
9944276
,
-
15462008
,
-
11311852
,
10931924
,
-
11931931
},
FieldElement
{
-
16561513
,
14112680
,
-
8012645
,
4817318
,
-
8040464
,
-
11414606
,
-
22853429
,
10856641
,
-
20470770
,
13434654
},
FieldElement
{
22759489
,
-
10073434
,
-
16766264
,
-
1871422
,
13637442
,
-
10168091
,
1765144
,
-
12654326
,
28445307
,
-
5364710
},
},
{
FieldElement
{
29875063
,
12493613
,
2795536
,
-
3786330
,
1710620
,
15181182
,
-
10195717
,
-
8788675
,
9074234
,
1167180
},
FieldElement
{
-
26205683
,
11014233
,
-
9842651
,
-
2635485
,
-
26908120
,
7532294
,
-
18716888
,
-
9535498
,
3843903
,
9367684
},
FieldElement
{
-
10969595
,
-
6403711
,
9591134
,
9582310
,
11349256
,
108879
,
16235123
,
8601684
,
-
139197
,
4242895
},
},
},
{
{
FieldElement
{
22092954
,
-
13191123
,
-
2042793
,
-
11968512
,
32186753
,
-
11517388
,
-
6574341
,
2470660
,
-
27417366
,
16625501
},
FieldElement
{
-
11057722
,
3042016
,
13770083
,
-
9257922
,
584236
,
-
544855
,
-
7770857
,
2602725
,
-
27351616
,
14247413
},
FieldElement
{
6314175
,
-
10264892
,
-
32772502
,
15957557
,
-
10157730
,
168750
,
-
8618807
,
14290061
,
27108877
,
-
1180880
},
},
{
FieldElement
{
-
8586597
,
-
7170966
,
13241782
,
10960156
,
-
32991015
,
-
13794596
,
33547976
,
-
11058889
,
-
27148451
,
981874
},
FieldElement
{
22833440
,
9293594
,
-
32649448
,
-
13618667
,
-
9136966
,
14756819
,
-
22928859
,
-
13970780
,
-
10479804
,
-
16197962
},
FieldElement
{
-
7768587
,
3326786
,
-
28111797
,
10783824
,
19178761
,
14905060
,
22680049
,
13906969
,
-
15933690
,
3797899
},
},
{
FieldElement
{
21721356
,
-
4212746
,
-
12206123
,
9310182
,
-
3882239
,
-
13653110
,
23740224
,
-
2709232
,
20491983
,
-
8042152
},
FieldElement
{
9209270
,
-
15135055
,
-
13256557
,
-
6167798
,
-
731016
,
15289673
,
25947805
,
15286587
,
30997318
,
-
6703063
},
FieldElement
{
7392032
,
16618386
,
23946583
,
-
8039892
,
-
13265164
,
-
1533858
,
-
14197445
,
-
2321576
,
17649998
,
-
250080
},
},
{
FieldElement
{
-
9301088
,
-
14193827
,
30609526
,
-
3049543
,
-
25175069
,
-
1283752
,
-
15241566
,
-
9525724
,
-
2233253
,
7662146
},
FieldElement
{
-
17558673
,
1763594
,
-
33114336
,
15908610
,
-
30040870
,
-
12174295
,
7335080
,
-
8472199
,
-
3174674
,
3440183
},
FieldElement
{
-
19889700
,
-
5977008
,
-
24111293
,
-
9688870
,
10799743
,
-
16571957
,
40450
,
-
4431835
,
4862400
,
1133
},
},
{
FieldElement
{
-
32856209
,
-
7873957
,
-
5422389
,
14860950
,
-
16319031
,
7956142
,
7258061
,
311861
,
-
30594991
,
-
7379421
},
FieldElement
{
-
3773428
,
-
1565936
,
28985340
,
7499440
,
24445838
,
9325937
,
29727763
,
16527196
,
18278453
,
15405622
},
FieldElement
{
-
4381906
,
8508652
,
-
19898366
,
-
3674424
,
-
5984453
,
15149970
,
-
13313598
,
843523
,
-
21875062
,
13626197
},
},
{
FieldElement
{
2281448
,
-
13487055
,
-
10915418
,
-
2609910
,
1879358
,
16164207
,
-
10783882
,
3953792
,
13340839
,
15928663
},
FieldElement
{
31727126
,
-
7179855
,
-
18437503
,
-
8283652
,
2875793
,
-
16390330
,
-
25269894
,
-
7014826
,
-
23452306
,
5964753
},
FieldElement
{
4100420
,
-
5959452
,
-
17179337
,
6017714
,
-
18705837
,
12227141
,
-
26684835
,
11344144
,
2538215
,
-
7570755
},
},
{
FieldElement
{
-
9433605
,
6123113
,
11159803
,
-
2156608
,
30016280
,
14966241
,
-
20474983
,
1485421
,
-
629256
,
-
15958862
},
FieldElement
{
-
26804558
,
4260919
,
11851389
,
9658551
,
-
32017107
,
16367492
,
-
20205425
,
-
13191288
,
11659922
,
-
11115118
},
FieldElement
{
26180396
,
10015009
,
-
30844224
,
-
8581293
,
5418197
,
9480663
,
2231568
,
-
10170080
,
33100372
,
-
1306171
},
},
{
FieldElement
{
15121113
,
-
5201871
,
-
10389905
,
15427821
,
-
27509937
,
-
15992507
,
21670947
,
4486675
,
-
5931810
,
-
14466380
},
FieldElement
{
16166486
,
-
9483733
,
-
11104130
,
6023908
,
-
31926798
,
-
1364923
,
2340060
,
-
16254968
,
-
10735770
,
-
10039824
},
FieldElement
{
28042865
,
-
3557089
,
-
12126526
,
12259706
,
-
3717498
,
-
6945899
,
6766453
,
-
8689599
,
18036436
,
5803270
},
},
},
{
{
FieldElement
{
-
817581
,
6763912
,
11803561
,
1585585
,
10958447
,
-
2671165
,
23855391
,
4598332
,
-
6159431
,
-
14117438
},
FieldElement
{
-
31031306
,
-
14256194
,
17332029
,
-
2383520
,
31312682
,
-
5967183
,
696309
,
50292
,
-
20095739
,
11763584
},
FieldElement
{
-
594563
,
-
2514283
,
-
32234153
,
12643980
,
12650761
,
14811489
,
665117
,
-
12613632
,
-
19773211
,
-
10713562
},
},
{
FieldElement
{
30464590
,
-
11262872
,
-
4127476
,
-
12734478
,
19835327
,
-
7105613
,
-
24396175
,
2075773
,
-
17020157
,
992471
},
FieldElement
{
18357185
,
-
6994433
,
7766382
,
16342475
,
-
29324918
,
411174
,
14578841
,
8080033
,
-
11574335
,
-
10601610
},
FieldElement
{
19598397
,
10334610
,
12555054
,
2555664
,
18821899
,
-
10339780
,
21873263
,
16014234
,
26224780
,
16452269
},
},
{
FieldElement
{
-
30223925
,
5145196
,
5944548
,
16385966
,
3976735
,
2009897
,
-
11377804
,
-
7618186
,
-
20533829
,
3698650
},
FieldElement
{
14187449
,
3448569
,
-
10636236
,
-
10810935
,
-
22663880
,
-
3433596
,
7268410
,
-
10890444
,
27394301
,
12015369
},
FieldElement
{
19695761
,
16087646
,
28032085
,
12999827
,
6817792
,
11427614
,
20244189
,
-
1312777
,
-
13259127
,
-
3402461
},
},
{
FieldElement
{
30860103
,
12735208
,
-
1888245
,
-
4699734
,
-
16974906
,
2256940
,
-
8166013
,
12298312
,
-
8550524
,
-
10393462
},
FieldElement
{
-
5719826
,
-
11245325
,
-
1910649
,
15569035
,
26642876
,
-
7587760
,
-
5789354
,
-
15118654
,
-
4976164
,
12651793
},
FieldElement
{
-
2848395
,
9953421
,
11531313
,
-
5282879
,
26895123
,
-
12697089
,
-
13118820
,
-
16517902
,
9768698
,
-
2533218
},
},
{
FieldElement
{
-
24719459
,
1894651
,
-
287698
,
-
4704085
,
15348719
,
-
8156530
,
32767513
,
12765450
,
4940095
,
10678226
},
FieldElement
{
18860224
,
15980149
,
-
18987240
,
-
1562570
,
-
26233012
,
-
11071856
,
-
7843882
,
13944024
,
-
24372348
,
16582019
},
FieldElement
{
-
15504260
,
4970268
,
-
29893044
,
4175593
,
-
20993212
,
-
2199756
,
-
11704054
,
15444560
,
-
11003761
,
7989037
},
},
{
FieldElement
{
31490452
,
5568061
,
-
2412803
,
2182383
,
-
32336847
,
4531686
,
-
32078269
,
6200206
,
-
19686113
,
-
14800171
},
FieldElement
{
-
17308668
,
-
15879940
,
-
31522777
,
-
2831
,
-
32887382
,
16375549
,
8680158
,
-
16371713
,
28550068
,
-
6857132
},
FieldElement
{
-
28126887
,
-
5688091
,
16837845
,
-
1820458
,
-
6850681
,
12700016
,
-
30039981
,
4364038
,
1155602
,
5988841
},
},
{
FieldElement
{
21890435
,
-
13272907
,
-
12624011
,
12154349
,
-
7831873
,
15300496
,
23148983
,
-
4470481
,
24618407
,
8283181
},
FieldElement
{
-
33136107
,
-
10512751
,
9975416
,
6841041
,
-
31559793
,
16356536
,
3070187
,
-
7025928
,
1466169
,
10740210
},
FieldElement
{
-
1509399
,
-
15488185
,
-
13503385
,
-
10655916
,
32799044
,
909394
,
-
13938903
,
-
5779719
,
-
32164649
,
-
15327040
},
},
{
FieldElement
{
3960823
,
-
14267803
,
-
28026090
,
-
15918051
,
-
19404858
,
13146868
,
15567327
,
951507
,
-
3260321
,
-
573935
},
FieldElement
{
24740841
,
5052253
,
-
30094131
,
8961361
,
25877428
,
6165135
,
-
24368180
,
14397372
,
-
7380369
,
-
6144105
},
FieldElement
{
-
28888365
,
3510803
,
-
28103278
,
-
1158478
,
-
11238128
,
-
10631454
,
-
15441463
,
-
14453128
,
-
1625486
,
-
6494814
},
},
},
{
{
FieldElement
{
793299
,
-
9230478
,
8836302
,
-
6235707
,
-
27360908
,
-
2369593
,
33152843
,
-
4885251
,
-
9906200
,
-
621852
},
FieldElement
{
5666233
,
525582
,
20782575
,
-
8038419
,
-
24538499
,
14657740
,
16099374
,
1468826
,
-
6171428
,
-
15186581
},
FieldElement
{
-
4859255
,
-
3779343
,
-
2917758
,
-
6748019
,
7778750
,
11688288
,
-
30404353
,
-
9871238
,
-
1558923
,
-
9863646
},
},
{
FieldElement
{
10896332
,
-
7719704
,
824275
,
472601
,
-
19460308
,
3009587
,
25248958
,
14783338
,
-
30581476
,
-
15757844
},
FieldElement
{
10566929
,
12612572
,
-
31944212
,
11118703
,
-
12633376
,
12362879
,
21752402
,
8822496
,
24003793
,
14264025
},
FieldElement
{
27713862
,
-
7355973
,
-
11008240
,
9227530
,
27050101
,
2504721
,
23886875
,
-
13117525
,
13958495
,
-
5732453
},
},
{
FieldElement
{
-
23481610
,
4867226
,
-
27247128
,
3900521
,
29838369
,
-
8212291
,
-
31889399
,
-
10041781
,
7340521
,
-
15410068
},
FieldElement
{
4646514
,
-
8011124
,
-
22766023
,
-
11532654
,
23184553
,
8566613
,
31366726
,
-
1381061
,
-
15066784
,
-
10375192
},
FieldElement
{
-
17270517
,
12723032
,
-
16993061
,
14878794
,
21619651
,
-
6197576
,
27584817
,
3093888
,
-
8843694
,
3849921
},
},
{
FieldElement
{
-
9064912
,
2103172
,
25561640
,
-
15125738
,
-
5239824
,
9582958
,
32477045
,
-
9017955
,
5002294
,
-
15550259
},
FieldElement
{
-
12057553
,
-
11177906
,
21115585
,
-
13365155
,
8808712
,
-
12030708
,
16489530
,
13378448
,
-
25845716
,
12741426
},
FieldElement
{
-
5946367
,
10645103
,
-
30911586
,
15390284
,
-
3286982
,
-
7118677
,
24306472
,
15852464
,
28834118
,
-
7646072
},
},
{
FieldElement
{
-
17335748
,
-
9107057
,
-
24531279
,
9434953
,
-
8472084
,
-
583362
,
-
13090771
,
455841
,
20461858
,
5491305
},
FieldElement
{
13669248
,
-
16095482
,
-
12481974
,
-
10203039
,
-
14569770
,
-
11893198
,
-
24995986
,
11293807
,
-
28588204
,
-
9421832
},
FieldElement
{
28497928
,
6272777
,
-
33022994
,
14470570
,
8906179
,
-
1225630
,
18504674
,
-
14165166
,
29867745
,
-
8795943
},
},
{
FieldElement
{
-
16207023
,
13517196
,
-
27799630
,
-
13697798
,
24009064
,
-
6373891
,
-
6367600
,
-
13175392
,
22853429
,
-
4012011
},
FieldElement
{
24191378
,
16712145
,
-
13931797
,
15217831
,
14542237
,
1646131
,
18603514
,
-
11037887
,
12876623
,
-
2112447
},
FieldElement
{
17902668
,
4518229
,
-
411702
,
-
2829247
,
26878217
,
5258055
,
-
12860753
,
608397
,
16031844
,
3723494
},
},
{
FieldElement
{
-
28632773
,
12763728
,
-
20446446
,
7577504
,
33001348
,
-
13017745
,
17558842
,
-
7872890
,
23896954
,
-
4314245
},
FieldElement
{
-
20005381
,
-
12011952
,
31520464
,
605201
,
2543521
,
5991821
,
-
2945064
,
7229064
,
-
9919646
,
-
8826859
},
FieldElement
{
28816045
,
298879
,
-
28165016
,
-
15920938
,
19000928
,
-
1665890
,
-
12680833
,
-
2949325
,
-
18051778
,
-
2082915
},
},
{
FieldElement
{
16000882
,
-
344896
,
3493092
,
-
11447198
,
-
29504595
,
-
13159789
,
12577740
,
16041268
,
-
19715240
,
7847707
},
FieldElement
{
10151868
,
10572098
,
27312476
,
7922682
,
14825339
,
4723128
,
-
32855931
,
-
6519018
,
-
10020567
,
3852848
},
FieldElement
{
-
11430470
,
15697596
,
-
21121557
,
-
4420647
,
5386314
,
15063598
,
16514493
,
-
15932110
,
29330899
,
-
15076224
},
},
},
{
{
FieldElement
{
-
25499735
,
-
4378794
,
-
15222908
,
-
6901211
,
16615731
,
2051784
,
3303702
,
15490
,
-
27548796
,
12314391
},
FieldElement
{
15683520
,
-
6003043
,
18109120
,
-
9980648
,
15337968
,
-
5997823
,
-
16717435
,
15921866
,
16103996
,
-
3731215
},
FieldElement
{
-
23169824
,
-
10781249
,
13588192
,
-
1628807
,
-
3798557
,
-
1074929
,
-
19273607
,
5402699
,
-
29815713
,
-
9841101
},
},
{
FieldElement
{
23190676
,
2384583
,
-
32714340
,
3462154
,
-
29903655
,
-
1529132
,
-
11266856
,
8911517
,
-
25205859
,
2739713
},
FieldElement
{
21374101
,
-
3554250
,
-
33524649
,
9874411
,
15377179
,
11831242
,
-
33529904
,
6134907
,
4931255
,
11987849
},
FieldElement
{
-
7732
,
-
2978858
,
-
16223486
,
7277597
,
105524
,
-
322051
,
-
31480539
,
13861388
,
-
30076310
,
10117930
},
},
{
FieldElement
{
-
29501170
,
-
10744872
,
-
26163768
,
13051539
,
-
25625564
,
5089643
,
-
6325503
,
6704079
,
12890019
,
15728940
},
FieldElement
{
-
21972360
,
-
11771379
,
-
951059
,
-
4418840
,
14704840
,
2695116
,
903376
,
-
10428139
,
12885167
,
8311031
},
FieldElement
{
-
17516482
,
5352194
,
10384213
,
-
13811658
,
7506451
,
13453191
,
26423267
,
4384730
,
1888765
,
-
5435404
},
},
{
FieldElement
{
-
25817338
,
-
3107312
,
-
13494599
,
-
3182506
,
30896459
,
-
13921729
,
-
32251644
,
-
12707869
,
-
19464434
,
-
3340243
},
FieldElement
{
-
23607977
,
-
2665774
,
-
526091
,
4651136
,
5765089
,
4618330
,
6092245
,
14845197
,
17151279
,
-
9854116
},
FieldElement
{
-
24830458
,
-
12733720
,
-
15165978
,
10367250
,
-
29530908
,
-
265356
,
22825805
,
-
7087279
,
-
16866484
,
16176525
},
},
{
FieldElement
{
-
23583256
,
6564961
,
20063689
,
3798228
,
-
4740178
,
7359225
,
2006182
,
-
10363426
,
-
28746253
,
-
10197509
},
FieldElement
{
-
10626600
,
-
4486402
,
-
13320562
,
-
5125317
,
3432136
,
-
6393229
,
23632037
,
-
1940610
,
32808310
,
1099883
},
FieldElement
{
15030977
,
5768825
,
-
27451236
,
-
2887299
,
-
6427378
,
-
15361371
,
-
15277896
,
-
6809350
,
2051441
,
-
15225865
},
},
{
FieldElement
{
-
3362323
,
-
7239372
,
7517890
,
9824992
,
23555850
,
295369
,
5148398
,
-
14154188
,
-
22686354
,
16633660
},
FieldElement
{
4577086
,
-
16752288
,
13249841
,
-
15304328
,
19958763
,
-
14537274
,
18559670
,
-
10759549
,
8402478
,
-
9864273
},
FieldElement
{
-
28406330
,
-
1051581
,
-
26790155
,
-
907698
,
-
17212414
,
-
11030789
,
9453451
,
-
14980072
,
17983010
,
9967138
},
},
{
FieldElement
{
-
25762494
,
6524722
,
26585488
,
9969270
,
24709298
,
1220360
,
-
1677990
,
7806337
,
17507396
,
3651560
},
FieldElement
{
-
10420457
,
-
4118111
,
14584639
,
15971087
,
-
15768321
,
8861010
,
26556809
,
-
5574557
,
-
18553322
,
-
11357135
},
FieldElement
{
2839101
,
14284142
,
4029895
,
3472686
,
14402957
,
12689363
,
-
26642121
,
8459447
,
-
5605463
,
-
7621941
},
},
{
FieldElement
{
-
4839289
,
-
3535444
,
9744961
,
2871048
,
25113978
,
3187018
,
-
25110813
,
-
849066
,
17258084
,
-
7977739
},
FieldElement
{
18164541
,
-
10595176
,
-
17154882
,
-
1542417
,
19237078
,
-
9745295
,
23357533
,
-
15217008
,
26908270
,
12150756
},
FieldElement
{
-
30264870
,
-
7647865
,
5112249
,
-
7036672
,
-
1499807
,
-
6974257
,
43168
,
-
5537701
,
-
32302074
,
16215819
},
},
},
{
{
FieldElement
{
-
6898905
,
9824394
,
-
12304779
,
-
4401089
,
-
31397141
,
-
6276835
,
32574489
,
12532905
,
-
7503072
,
-
8675347
},
FieldElement
{
-
27343522
,
-
16515468
,
-
27151524
,
-
10722951
,
946346
,
16291093
,
254968
,
7168080
,
21676107
,
-
1943028
},
FieldElement
{
21260961
,
-
8424752
,
-
16831886
,
-
11920822
,
-
23677961
,
3968121
,
-
3651949
,
-
6215466
,
-
3556191
,
-
7913075
},
},
{
FieldElement
{
16544754
,
13250366
,
-
16804428
,
15546242
,
-
4583003
,
12757258
,
-
2462308
,
-
8680336
,
-
18907032
,
-
9662799
},
FieldElement
{
-
2415239
,
-
15577728
,
18312303
,
4964443
,
-
15272530
,
-
12653564
,
26820651
,
16690659
,
25459437
,
-
4564609
},
FieldElement
{
-
25144690
,
11425020
,
28423002
,
-
11020557
,
-
6144921
,
-
15826224
,
9142795
,
-
2391602
,
-
6432418
,
-
1644817
},
},
{
FieldElement
{
-
23104652
,
6253476
,
16964147
,
-
3768872
,
-
25113972
,
-
12296437
,
-
27457225
,
-
16344658
,
6335692
,
7249989
},
FieldElement
{
-
30333227
,
13979675
,
7503222
,
-
12368314
,
-
11956721
,
-
4621693
,
-
30272269
,
2682242
,
25993170
,
-
12478523
},
FieldElement
{
4364628
,
5930691
,
32304656
,
-
10044554
,
-
8054781
,
15091131
,
22857016
,
-
10598955
,
31820368
,
15075278
},
},
{
FieldElement
{
31879134
,
-
8918693
,
17258761
,
90626
,
-
8041836
,
-
4917709
,
24162788
,
-
9650886
,
-
17970238
,
12833045
},
FieldElement
{
19073683
,
14851414
,
-
24403169
,
-
11860168
,
7625278
,
11091125
,
-
19619190
,
2074449
,
-
9413939
,
14905377
},
FieldElement
{
24483667
,
-
11935567
,
-
2518866
,
-
11547418
,
-
1553130
,
15355506
,
-
25282080
,
9253129
,
27628530
,
-
7555480
},
},
{
FieldElement
{
17597607
,
8340603
,
19355617
,
552187
,
26198470
,
-
3176583
,
4593324
,
-
9157582
,
-
14110875
,
15297016
},
FieldElement
{
510886
,
14337390
,
-
31785257
,
16638632
,
6328095
,
2713355
,
-
20217417
,
-
11864220
,
8683221
,
2921426
},
FieldElement
{
18606791
,
11874196
,
27155355
,
-
5281482
,
-
24031742
,
6265446
,
-
25178240
,
-
1278924
,
4674690
,
13890525
},
},
{
FieldElement
{
13609624
,
13069022
,
-
27372361
,
-
13055908
,
24360586
,
9592974
,
14977157
,
9835105
,
4389687
,
288396
},
FieldElement
{
9922506
,
-
519394
,
13613107
,
5883594
,
-
18758345
,
-
434263
,
-
12304062
,
8317628
,
23388070
,
16052080
},
FieldElement
{
12720016
,
11937594
,
-
31970060
,
-
5028689
,
26900120
,
8561328
,
-
20155687
,
-
11632979
,
-
14754271
,
-
10812892
},
},
{
FieldElement
{
15961858
,
14150409
,
26716931
,
-
665832
,
-
22794328
,
13603569
,
11829573
,
7467844
,
-
28822128
,
929275
},
FieldElement
{
11038231
,
-
11582396
,
-
27310482
,
-
7316562
,
-
10498527
,
-
16307831
,
-
23479533
,
-
9371869
,
-
21393143
,
2465074
},
FieldElement
{
20017163
,
-
4323226
,
27915242
,
1529148
,
12396362
,
15675764
,
13817261
,
-
9658066
,
2463391
,
-
4622140
},
},
{
FieldElement
{
-
16358878
,
-
12663911
,
-
12065183
,
4996454
,
-
1256422
,
1073572
,
9583558
,
12851107
,
4003896
,
12673717
},
FieldElement
{
-
1731589
,
-
15155870
,
-
3262930
,
16143082
,
19294135
,
13385325
,
14741514
,
-
9103726
,
7903886
,
2348101
},
FieldElement
{
24536016
,
-
16515207
,
12715592
,
-
3862155
,
1511293
,
10047386
,
-
3842346
,
-
7129159
,
-
28377538
,
10048127
},
},
},
{
{
FieldElement
{
-
12622226
,
-
6204820
,
30718825
,
2591312
,
-
10617028
,
12192840
,
18873298
,
-
7297090
,
-
32297756
,
15221632
},
FieldElement
{
-
26478122
,
-
11103864
,
11546244
,
-
1852483
,
9180880
,
7656409
,
-
21343950
,
2095755
,
29769758
,
6593415
},
FieldElement
{
-
31994208
,
-
2907461
,
4176912
,
3264766
,
12538965
,
-
868111
,
26312345
,
-
6118678
,
30958054
,
8292160
},
},
{
FieldElement
{
31429822
,
-
13959116
,
29173532
,
15632448
,
12174511
,
-
2760094
,
32808831
,
3977186
,
26143136
,
-
3148876
},
FieldElement
{
22648901
,
1402143
,
-
22799984
,
13746059
,
7936347
,
365344
,
-
8668633
,
-
1674433
,
-
3758243
,
-
2304625
},
FieldElement
{
-
15491917
,
8012313
,
-
2514730
,
-
12702462
,
-
23965846
,
-
10254029
,
-
1612713
,
-
1535569
,
-
16664475
,
8194478
},
},
{
FieldElement
{
27338066
,
-
7507420
,
-
7414224
,
10140405
,
-
19026427
,
-
6589889
,
27277191
,
8855376
,
28572286
,
3005164
},
FieldElement
{
26287124
,
4821776
,
25476601
,
-
4145903
,
-
3764513
,
-
15788984
,
-
18008582
,
1182479
,
-
26094821
,
-
13079595
},
FieldElement
{
-
7171154
,
3178080
,
23970071
,
6201893
,
-
17195577
,
-
4489192
,
-
21876275
,
-
13982627
,
32208683
,
-
1198248
},
},
{
FieldElement
{
-
16657702
,
2817643
,
-
10286362
,
14811298
,
6024667
,
13349505
,
-
27315504
,
-
10497842
,
-
27672585
,
-
11539858
},
FieldElement
{
15941029
,
-
9405932
,
-
21367050
,
8062055
,
31876073
,
-
238629
,
-
15278393
,
-
1444429
,
15397331
,
-
4130193
},
FieldElement
{
8934485
,
-
13485467
,
-
23286397
,
-
13423241
,
-
32446090
,
14047986
,
31170398
,
-
1441021
,
-
27505566
,
15087184
},
},
{
FieldElement
{
-
18357243
,
-
2156491
,
24524913
,
-
16677868
,
15520427
,
-
6360776
,
-
15502406
,
11461896
,
16788528
,
-
5868942
},
FieldElement
{
-
1947386
,
16013773
,
21750665
,
3714552
,
-
17401782
,
-
16055433
,
-
3770287
,
-
10323320
,
31322514
,
-
11615635
},
FieldElement
{
21426655
,
-
5650218
,
-
13648287
,
-
5347537
,
-
28812189
,
-
4920970
,
-
18275391
,
-
14621414
,
13040862
,
-
12112948
},
},
{
FieldElement
{
11293895
,
12478086
,
-
27136401
,
15083750
,
-
29307421
,
14748872
,
14555558
,
-
13417103
,
1613711
,
4896935
},
FieldElement
{
-
25894883
,
15323294
,
-
8489791
,
-
8057900
,
25967126
,
-
13425460
,
2825960
,
-
4897045
,
-
23971776
,
-
11267415
},
FieldElement
{
-
15924766
,
-
5229880
,
-
17443532
,
6410664
,
3622847
,
10243618
,
20615400
,
12405433
,
-
23753030
,
-
8436416
},
},
{
FieldElement
{
-
7091295
,
12556208
,
-
20191352
,
9025187
,
-
17072479
,
4333801
,
4378436
,
2432030
,
23097949
,
-
566018
},
FieldElement
{
4565804
,
-
16025654
,
20084412
,
-
7842817
,
1724999
,
189254
,
24767264
,
10103221
,
-
18512313
,
2424778
},
FieldElement
{
366633
,
-
11976806
,
8173090
,
-
6890119
,
30788634
,
5745705
,
-
7168678
,
1344109
,
-
3642553
,
12412659
},
},
{
FieldElement
{
-
24001791
,
7690286
,
14929416
,
-
168257
,
-
32210835
,
-
13412986
,
24162697
,
-
15326504
,
-
3141501
,
11179385
},
FieldElement
{
18289522
,
-
14724954
,
8056945
,
16430056
,
-
21729724
,
7842514
,
-
6001441
,
-
1486897
,
-
18684645
,
-
11443503
},
FieldElement
{
476239
,
6601091
,
-
6152790
,
-
9723375
,
17503545
,
-
4863900
,
27672959
,
13403813
,
11052904
,
5219329
},
},
},
{
{
FieldElement
{
20678546
,
-
8375738
,
-
32671898
,
8849123
,
-
5009758
,
14574752
,
31186971
,
-
3973730
,
9014762
,
-
8579056
},
FieldElement
{
-
13644050
,
-
10350239
,
-
15962508
,
5075808
,
-
1514661
,
-
11534600
,
-
33102500
,
9160280
,
8473550
,
-
3256838
},
FieldElement
{
24900749
,
14435722
,
17209120
,
-
15292541
,
-
22592275
,
9878983
,
-
7689309
,
-
16335821
,
-
24568481
,
11788948
},
},
{
FieldElement
{
-
3118155
,
-
11395194
,
-
13802089
,
14797441
,
9652448
,
-
6845904
,
-
20037437
,
10410733
,
-
24568470
,
-
1458691
},
FieldElement
{
-
15659161
,
16736706
,
-
22467150
,
10215878
,
-
9097177
,
7563911
,
11871841
,
-
12505194
,
-
18513325
,
8464118
},
FieldElement
{
-
23400612
,
8348507
,
-
14585951
,
-
861714
,
-
3950205
,
-
6373419
,
14325289
,
8628612
,
33313881
,
-
8370517
},
},
{
FieldElement
{
-
20186973
,
-
4967935
,
22367356
,
5271547
,
-
1097117
,
-
4788838
,
-
24805667
,
-
10236854
,
-
8940735
,
-
5818269
},
FieldElement
{
-
6948785
,
-
1795212
,
-
32625683
,
-
16021179
,
32635414
,
-
7374245
,
15989197
,
-
12838188
,
28358192
,
-
4253904
},
FieldElement
{
-
23561781
,
-
2799059
,
-
32351682
,
-
1661963
,
-
9147719
,
10429267
,
-
16637684
,
4072016
,
-
5351664
,
5596589
},
},
{
FieldElement
{
-
28236598
,
-
3390048
,
12312896
,
6213178
,
3117142
,
16078565
,
29266239
,
2557221
,
1768301
,
15373193
},
FieldElement
{
-
7243358
,
-
3246960
,
-
4593467
,
-
7553353
,
-
127927
,
-
912245
,
-
1090902
,
-
4504991
,
-
24660491
,
3442910
},
FieldElement
{
-
30210571
,
5124043
,
14181784
,
8197961
,
18964734
,
-
11939093
,
22597931
,
7176455
,
-
18585478
,
13365930
},
},
{
FieldElement
{
-
7877390
,
-
1499958
,
8324673
,
4690079
,
6261860
,
890446
,
24538107
,
-
8570186
,
-
9689599
,
-
3031667
},
FieldElement
{
25008904
,
-
10771599
,
-
4305031
,
-
9638010
,
16265036
,
15721635
,
683793
,
-
11823784
,
15723479
,
-
15163481
},
FieldElement
{
-
9660625
,
12374379
,
-
27006999
,
-
7026148
,
-
7724114
,
-
12314514
,
11879682
,
5400171
,
519526
,
-
1235876
},
},
{
FieldElement
{
22258397
,
-
16332233
,
-
7869817
,
14613016
,
-
22520255
,
-
2950923
,
-
20353881
,
7315967
,
16648397
,
7605640
},
FieldElement
{
-
8081308
,
-
8464597
,
-
8223311
,
9719710
,
19259459
,
-
15348212
,
23994942
,
-
5281555
,
-
9468848
,
4763278
},
FieldElement
{
-
21699244
,
9220969
,
-
15730624
,
1084137
,
-
25476107
,
-
2852390
,
31088447
,
-
7764523
,
-
11356529
,
728112
},
},
{
FieldElement
{
26047220
,
-
11751471
,
-
6900323
,
-
16521798
,
24092068
,
9158119
,
-
4273545
,
-
12555558
,
-
29365436
,
-
5498272
},
FieldElement
{
17510331
,
-
322857
,
5854289
,
8403524
,
17133918
,
-
3112612
,
-
28111007
,
12327945
,
10750447
,
10014012
},
FieldElement
{
-
10312768
,
3936952
,
9156313
,
-
8897683
,
16498692
,
-
994647
,
-
27481051
,
-
666732
,
3424691
,
7540221
},
},
{
FieldElement
{
30322361
,
-
6964110
,
11361005
,
-
4143317
,
7433304
,
4989748
,
-
7071422
,
-
16317219
,
-
9244265
,
15258046
},
FieldElement
{
13054562
,
-
2779497
,
19155474
,
469045
,
-
12482797
,
4566042
,
5631406
,
2711395
,
1062915
,
-
5136345
},
FieldElement
{
-
19240248
,
-
11254599
,
-
29509029
,
-
7499965
,
-
5835763
,
13005411
,
-
6066489
,
12194497
,
32960380
,
1459310
},
},
},
{
{
FieldElement
{
19852034
,
7027924
,
23669353
,
10020366
,
8586503
,
-
6657907
,
394197
,
-
6101885
,
18638003
,
-
11174937
},
FieldElement
{
31395534
,
15098109
,
26581030
,
8030562
,
-
16527914
,
-
5007134
,
9012486
,
-
7584354
,
-
6643087
,
-
5442636
},
FieldElement
{
-
9192165
,
-
2347377
,
-
1997099
,
4529534
,
25766844
,
607986
,
-
13222
,
9677543
,
-
32294889
,
-
6456008
},
},
{
FieldElement
{
-
2444496
,
-
149937
,
29348902
,
8186665
,
1873760
,
12489863
,
-
30934579
,
-
7839692
,
-
7852844
,
-
8138429
},
FieldElement
{
-
15236356
,
-
15433509
,
7766470
,
746860
,
26346930
,
-
10221762
,
-
27333451
,
10754588
,
-
9431476
,
5203576
},
FieldElement
{
31834314
,
14135496
,
-
770007
,
5159118
,
20917671
,
-
16768096
,
-
7467973
,
-
7337524
,
31809243
,
7347066
},
},
{
FieldElement
{
-
9606723
,
-
11874240
,
20414459
,
13033986
,
13716524
,
-
11691881
,
19797970
,
-
12211255
,
15192876
,
-
2087490
},
FieldElement
{
-
12663563
,
-
2181719
,
1168162
,
-
3804809
,
26747877
,
-
14138091
,
10609330
,
12694420
,
33473243
,
-
13382104
},
FieldElement
{
33184999
,
11180355
,
15832085
,
-
11385430
,
-
1633671
,
225884
,
15089336
,
-
11023903
,
-
6135662
,
14480053
},
},
{
FieldElement
{
31308717
,
-
5619998
,
31030840
,
-
1897099
,
15674547
,
-
6582883
,
5496208
,
13685227
,
27595050
,
8737275
},
FieldElement
{
-
20318852
,
-
15150239
,
10933843
,
-
16178022
,
8335352
,
-
7546022
,
-
31008351
,
-
12610604
,
26498114
,
66511
},
FieldElement
{
22644454
,
-
8761729
,
-
16671776
,
4884562
,
-
3105614
,
-
13559366
,
30540766
,
-
4286747
,
-
13327787
,
-
7515095
},
},
{
FieldElement
{
-
28017847
,
9834845
,
18617207
,
-
2681312
,
-
3401956
,
-
13307506
,
8205540
,
13585437
,
-
17127465
,
15115439
},
FieldElement
{
23711543
,
-
672915
,
31206561
,
-
8362711
,
6164647
,
-
9709987
,
-
33535882
,
-
1426096
,
8236921
,
16492939
},
FieldElement
{
-
23910559
,
-
13515526
,
-
26299483
,
-
4503841
,
25005590
,
-
7687270
,
19574902
,
10071562
,
6708380
,
-
6222424
},
},
{
FieldElement
{
2101391
,
-
4930054
,
19702731
,
2367575
,
-
15427167
,
1047675
,
5301017
,
9328700
,
29955601
,
-
11678310
},
FieldElement
{
3096359
,
9271816
,
-
21620864
,
-
15521844
,
-
14847996
,
-
7592937
,
-
25892142
,
-
12635595
,
-
9917575
,
6216608
},
FieldElement
{
-
32615849
,
338663
,
-
25195611
,
2510422
,
-
29213566
,
-
13820213
,
24822830
,
-
6146567
,
-
26767480
,
7525079
},
},
{
FieldElement
{
-
23066649
,
-
13985623
,
16133487
,
-
7896178
,
-
3389565
,
778788
,
-
910336
,
-
2782495
,
-
19386633
,
11994101
},
FieldElement
{
21691500
,
-
13624626
,
-
641331
,
-
14367021
,
3285881
,
-
3483596
,
-
25064666
,
9718258
,
-
7477437
,
13381418
},
FieldElement
{
18445390
,
-
4202236
,
14979846
,
11622458
,
-
1727110
,
-
3582980
,
23111648
,
-
6375247
,
28535282
,
15779576
},
},
{
FieldElement
{
30098053
,
3089662
,
-
9234387
,
16662135
,
-
21306940
,
11308411
,
-
14068454
,
12021730
,
9955285
,
-
16303356
},
FieldElement
{
9734894
,
-
14576830
,
-
7473633
,
-
9138735
,
2060392
,
11313496
,
-
18426029
,
9924399
,
20194861
,
13380996
},
FieldElement
{
-
26378102
,
-
7965207
,
-
22167821
,
15789297
,
-
18055342
,
-
6168792
,
-
1984914
,
15707771
,
26342023
,
10146099
},
},
},
{
{
FieldElement
{
-
26016874
,
-
219943
,
21339191
,
-
41388
,
19745256
,
-
2878700
,
-
29637280
,
2227040
,
21612326
,
-
545728
},
FieldElement
{
-
13077387
,
1184228
,
23562814
,
-
5970442
,
-
20351244
,
-
6348714
,
25764461
,
12243797
,
-
20856566
,
11649658
},
FieldElement
{
-
10031494
,
11262626
,
27384172
,
2271902
,
26947504
,
-
15997771
,
39944
,
6114064
,
33514190
,
2333242
},
},
{
FieldElement
{
-
21433588
,
-
12421821
,
8119782
,
7219913
,
-
21830522
,
-
9016134
,
-
6679750
,
-
12670638
,
24350578
,
-
13450001
},
FieldElement
{
-
4116307
,
-
11271533
,
-
23886186
,
4843615
,
-
30088339
,
690623
,
-
31536088
,
-
10406836
,
8317860
,
12352766
},
FieldElement
{
18200138
,
-
14475911
,
-
33087759
,
-
2696619
,
-
23702521
,
-
9102511
,
-
23552096
,
-
2287550
,
20712163
,
6719373
},
},
{
FieldElement
{
26656208
,
6075253
,
-
7858556
,
1886072
,
-
28344043
,
4262326
,
11117530
,
-
3763210
,
26224235
,
-
3297458
},
FieldElement
{
-
17168938
,
-
14854097
,
-
3395676
,
-
16369877
,
-
19954045
,
14050420
,
21728352
,
9493610
,
18620611
,
-
16428628
},
FieldElement
{
-
13323321
,
13325349
,
11432106
,
5964811
,
18609221
,
6062965
,
-
5269471
,
-
9725556
,
-
30701573
,
-
16479657
},
},
{
FieldElement
{
-
23860538
,
-
11233159
,
26961357
,
1640861
,
-
32413112
,
-
16737940
,
12248509
,
-
5240639
,
13735342
,
1934062
},
FieldElement
{
25089769
,
6742589
,
17081145
,
-
13406266
,
21909293
,
-
16067981
,
-
15136294
,
-
3765346
,
-
21277997
,
5473616
},
FieldElement
{
31883677
,
-
7961101
,
1083432
,
-
11572403
,
22828471
,
13290673
,
-
7125085
,
12469656
,
29111212
,
-
5451014
},
},
{
FieldElement
{
24244947
,
-
15050407
,
-
26262976
,
2791540
,
-
14997599
,
16666678
,
24367466
,
6388839
,
-
10295587
,
452383
},
FieldElement
{
-
25640782
,
-
3417841
,
5217916
,
16224624
,
19987036
,
-
4082269
,
-
24236251
,
-
5915248
,
15766062
,
8407814
},
FieldElement
{
-
20406999
,
13990231
,
15495425
,
16395525
,
5377168
,
15166495
,
-
8917023
,
-
4388953
,
-
8067909
,
2276718
},
},
{
FieldElement
{
30157918
,
12924066
,
-
17712050
,
9245753
,
19895028
,
3368142
,
-
23827587
,
5096219
,
22740376
,
-
7303417
},
FieldElement
{
2041139
,
-
14256350
,
7783687
,
13876377
,
-
25946985
,
-
13352459
,
24051124
,
13742383
,
-
15637599
,
13295222
},
FieldElement
{
33338237
,
-
8505733
,
12532113
,
7977527
,
9106186
,
-
1715251
,
-
17720195
,
-
4612972
,
-
4451357
,
-
14669444
},
},
{
FieldElement
{
-
20045281
,
5454097
,
-
14346548
,
6447146
,
28862071
,
1883651
,
-
2469266
,
-
4141880
,
7770569
,
9620597
},
FieldElement
{
23208068
,
7979712
,
33071466
,
8149229
,
1758231
,
-
10834995
,
30945528
,
-
1694323
,
-
33502340
,
-
14767970
},
FieldElement
{
1439958
,
-
16270480
,
-
1079989
,
-
793782
,
4625402
,
10647766
,
-
5043801
,
1220118
,
30494170
,
-
11440799
},
},
{
FieldElement
{
-
5037580
,
-
13028295
,
-
2970559
,
-
3061767
,
15640974
,
-
6701666
,
-
26739026
,
926050
,
-
1684339
,
-
13333647
},
FieldElement
{
13908495
,
-
3549272
,
30919928
,
-
6273825
,
-
21521863
,
7989039
,
9021034
,
9078865
,
3353509
,
4033511
},
FieldElement
{
-
29663431
,
-
15113610
,
32259991
,
-
344482
,
24295849
,
-
12912123
,
23161163
,
8839127
,
27485041
,
7356032
},
},
},
{
{
FieldElement
{
9661027
,
705443
,
11980065
,
-
5370154
,
-
1628543
,
14661173
,
-
6346142
,
2625015
,
28431036
,
-
16771834
},
FieldElement
{
-
23839233
,
-
8311415
,
-
25945511
,
7480958
,
-
17681669
,
-
8354183
,
-
22545972
,
14150565
,
15970762
,
4099461
},
FieldElement
{
29262576
,
16756590
,
26350592
,
-
8793563
,
8529671
,
-
11208050
,
13617293
,
-
9937143
,
11465739
,
8317062
},
},
{
FieldElement
{
-
25493081
,
-
6962928
,
32500200
,
-
9419051
,
-
23038724
,
-
2302222
,
14898637
,
3848455
,
20969334
,
-
5157516
},
FieldElement
{
-
20384450
,
-
14347713
,
-
18336405
,
13884722
,
-
33039454
,
2842114
,
-
21610826
,
-
3649888
,
11177095
,
14989547
},
FieldElement
{
-
24496721
,
-
11716016
,
16959896
,
2278463
,
12066309
,
10137771
,
13515641
,
2581286
,
-
28487508
,
9930240
},
},
{
FieldElement
{
-
17751622
,
-
2097826
,
16544300
,
-
13009300
,
-
15914807
,
-
14949081
,
18345767
,
-
13403753
,
16291481
,
-
5314038
},
FieldElement
{
-
33229194
,
2553288
,
32678213
,
9875984
,
8534129
,
6889387
,
-
9676774
,
6957617
,
4368891
,
9788741
},
FieldElement
{
16660756
,
7281060
,
-
10830758
,
12911820
,
20108584
,
-
8101676
,
-
21722536
,
-
8613148
,
16250552
,
-
11111103
},
},
{
FieldElement
{
-
19765507
,
2390526
,
-
16551031
,
14161980
,
1905286
,
6414907
,
4689584
,
10604807
,
-
30190403
,
4782747
},
FieldElement
{
-
1354539
,
14736941
,
-
7367442
,
-
13292886
,
7710542
,
-
14155590
,
-
9981571
,
4383045
,
22546403
,
437323
},
FieldElement
{
31665577
,
-
12180464
,
-
16186830
,
1491339
,
-
18368625
,
3294682
,
27343084
,
2786261
,
-
30633590
,
-
14097016
},
},
{
FieldElement
{
-
14467279
,
-
683715
,
-
33374107
,
7448552
,
19294360
,
14334329
,
-
19690631
,
2355319
,
-
19284671
,
-
6114373
},
FieldElement
{
15121312
,
-
15796162
,
6377020
,
-
6031361
,
-
10798111
,
-
12957845
,
18952177
,
15496498
,
-
29380133
,
11754228
},
FieldElement
{
-
2637277
,
-
13483075
,
8488727
,
-
14303896
,
12728761
,
-
1622493
,
7141596
,
11724556
,
22761615
,
-
10134141
},
},
{
FieldElement
{
16918416
,
11729663
,
-
18083579
,
3022987
,
-
31015732
,
-
13339659
,
-
28741185
,
-
12227393
,
32851222
,
11717399
},
FieldElement
{
11166634
,
7338049
,
-
6722523
,
4531520
,
-
29468672
,
-
7302055
,
31474879
,
3483633
,
-
1193175
,
-
4030831
},
FieldElement
{
-
185635
,
9921305
,
31456609
,
-
13536438
,
-
12013818
,
13348923
,
33142652
,
6546660
,
-
19985279
,
-
3948376
},
},
{
FieldElement
{
-
32460596
,
11266712
,
-
11197107
,
-
7899103
,
31703694
,
3855903
,
-
8537131
,
-
12833048
,
-
30772034
,
-
15486313
},
FieldElement
{
-
18006477
,
12709068
,
3991746
,
-
6479188
,
-
21491523
,
-
10550425
,
-
31135347
,
-
16049879
,
10928917
,
3011958
},
FieldElement
{
-
6957757
,
-
15594337
,
31696059
,
334240
,
29576716
,
14796075
,
-
30831056
,
-
12805180
,
18008031
,
10258577
},
},
{
FieldElement
{
-
22448644
,
15655569
,
7018479
,
-
4410003
,
-
30314266
,
-
1201591
,
-
1853465
,
1367120
,
25127874
,
6671743
},
FieldElement
{
29701166
,
-
14373934
,
-
10878120
,
9279288
,
-
17568
,
13127210
,
21382910
,
11042292
,
25838796
,
4642684
},
FieldElement
{
-
20430234
,
14955537
,
-
24126347
,
8124619
,
-
5369288
,
-
5990470
,
30468147
,
-
13900640
,
18423289
,
4177476
},
},
},
}
cmd/gost/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
0 → 100644
View file @
d19d5ada
// Copyright 2016 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
edwards25519
// This code is a port of the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
// FieldElement represents an element of the field GF(2^255 - 19). An element
// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on
// context.
type
FieldElement
[
10
]
int32
var
zero
FieldElement
func
FeZero
(
fe
*
FieldElement
)
{
copy
(
fe
[
:
],
zero
[
:
])
}
func
FeOne
(
fe
*
FieldElement
)
{
FeZero
(
fe
)
fe
[
0
]
=
1
}
func
FeAdd
(
dst
,
a
,
b
*
FieldElement
)
{
dst
[
0
]
=
a
[
0
]
+
b
[
0
]
dst
[
1
]
=
a
[
1
]
+
b
[
1
]
dst
[
2
]
=
a
[
2
]
+
b
[
2
]
dst
[
3
]
=
a
[
3
]
+
b
[
3
]
dst
[
4
]
=
a
[
4
]
+
b
[
4
]
dst
[
5
]
=
a
[
5
]
+
b
[
5
]
dst
[
6
]
=
a
[
6
]
+
b
[
6
]
dst
[
7
]
=
a
[
7
]
+
b
[
7
]
dst
[
8
]
=
a
[
8
]
+
b
[
8
]
dst
[
9
]
=
a
[
9
]
+
b
[
9
]
}
func
FeSub
(
dst
,
a
,
b
*
FieldElement
)
{
dst
[
0
]
=
a
[
0
]
-
b
[
0
]
dst
[
1
]
=
a
[
1
]
-
b
[
1
]
dst
[
2
]
=
a
[
2
]
-
b
[
2
]
dst
[
3
]
=
a
[
3
]
-
b
[
3
]
dst
[
4
]
=
a
[
4
]
-
b
[
4
]
dst
[
5
]
=
a
[
5
]
-
b
[
5
]
dst
[
6
]
=
a
[
6
]
-
b
[
6
]
dst
[
7
]
=
a
[
7
]
-
b
[
7
]
dst
[
8
]
=
a
[
8
]
-
b
[
8
]
dst
[
9
]
=
a
[
9
]
-
b
[
9
]
}
func
FeCopy
(
dst
,
src
*
FieldElement
)
{
copy
(
dst
[
:
],
src
[
:
])
}
// Replace (f,g) with (g,g) if b == 1;
// replace (f,g) with (f,g) if b == 0.
//
// Preconditions: b in {0,1}.
func
FeCMove
(
f
,
g
*
FieldElement
,
b
int32
)
{
b
=
-
b
f
[
0
]
^=
b
&
(
f
[
0
]
^
g
[
0
])
f
[
1
]
^=
b
&
(
f
[
1
]
^
g
[
1
])
f
[
2
]
^=
b
&
(
f
[
2
]
^
g
[
2
])
f
[
3
]
^=
b
&
(
f
[
3
]
^
g
[
3
])
f
[
4
]
^=
b
&
(
f
[
4
]
^
g
[
4
])
f
[
5
]
^=
b
&
(
f
[
5
]
^
g
[
5
])
f
[
6
]
^=
b
&
(
f
[
6
]
^
g
[
6
])
f
[
7
]
^=
b
&
(
f
[
7
]
^
g
[
7
])
f
[
8
]
^=
b
&
(
f
[
8
]
^
g
[
8
])
f
[
9
]
^=
b
&
(
f
[
9
]
^
g
[
9
])
}
func
load3
(
in
[]
byte
)
int64
{
var
r
int64
r
=
int64
(
in
[
0
])
r
|=
int64
(
in
[
1
])
<<
8
r
|=
int64
(
in
[
2
])
<<
16
return
r
}
func
load4
(
in
[]
byte
)
int64
{
var
r
int64
r
=
int64
(
in
[
0
])
r
|=
int64
(
in
[
1
])
<<
8
r
|=
int64
(
in
[
2
])
<<
16
r
|=
int64
(
in
[
3
])
<<
24
return
r
}
func
FeFromBytes
(
dst
*
FieldElement
,
src
*
[
32
]
byte
)
{
h0
:=
load4
(
src
[
:
])
h1
:=
load3
(
src
[
4
:
])
<<
6
h2
:=
load3
(
src
[
7
:
])
<<
5
h3
:=
load3
(
src
[
10
:
])
<<
3
h4
:=
load3
(
src
[
13
:
])
<<
2
h5
:=
load4
(
src
[
16
:
])
h6
:=
load3
(
src
[
20
:
])
<<
7
h7
:=
load3
(
src
[
23
:
])
<<
5
h8
:=
load3
(
src
[
26
:
])
<<
4
h9
:=
(
load3
(
src
[
29
:
])
&
8388607
)
<<
2
FeCombine
(
dst
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
// FeToBytes marshals h to s.
// Preconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
//
// Write p=2^255-19; q=floor(h/p).
// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
//
// Proof:
// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.
//
// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
// Then 0<y<1.
//
// Write r=h-pq.
// Have 0<=r<=p-1=2^255-20.
// Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
//
// Write x=r+19(2^-255)r+y.
// Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
//
// Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
// so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
func
FeToBytes
(
s
*
[
32
]
byte
,
h
*
FieldElement
)
{
var
carry
[
10
]
int32
q
:=
(
19
*
h
[
9
]
+
(
1
<<
24
))
>>
25
q
=
(
h
[
0
]
+
q
)
>>
26
q
=
(
h
[
1
]
+
q
)
>>
25
q
=
(
h
[
2
]
+
q
)
>>
26
q
=
(
h
[
3
]
+
q
)
>>
25
q
=
(
h
[
4
]
+
q
)
>>
26
q
=
(
h
[
5
]
+
q
)
>>
25
q
=
(
h
[
6
]
+
q
)
>>
26
q
=
(
h
[
7
]
+
q
)
>>
25
q
=
(
h
[
8
]
+
q
)
>>
26
q
=
(
h
[
9
]
+
q
)
>>
25
// Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.
h
[
0
]
+=
19
*
q
// Goal: Output h-2^255 q, which is between 0 and 2^255-20.
carry
[
0
]
=
h
[
0
]
>>
26
h
[
1
]
+=
carry
[
0
]
h
[
0
]
-=
carry
[
0
]
<<
26
carry
[
1
]
=
h
[
1
]
>>
25
h
[
2
]
+=
carry
[
1
]
h
[
1
]
-=
carry
[
1
]
<<
25
carry
[
2
]
=
h
[
2
]
>>
26
h
[
3
]
+=
carry
[
2
]
h
[
2
]
-=
carry
[
2
]
<<
26
carry
[
3
]
=
h
[
3
]
>>
25
h
[
4
]
+=
carry
[
3
]
h
[
3
]
-=
carry
[
3
]
<<
25
carry
[
4
]
=
h
[
4
]
>>
26
h
[
5
]
+=
carry
[
4
]
h
[
4
]
-=
carry
[
4
]
<<
26
carry
[
5
]
=
h
[
5
]
>>
25
h
[
6
]
+=
carry
[
5
]
h
[
5
]
-=
carry
[
5
]
<<
25
carry
[
6
]
=
h
[
6
]
>>
26
h
[
7
]
+=
carry
[
6
]
h
[
6
]
-=
carry
[
6
]
<<
26
carry
[
7
]
=
h
[
7
]
>>
25
h
[
8
]
+=
carry
[
7
]
h
[
7
]
-=
carry
[
7
]
<<
25
carry
[
8
]
=
h
[
8
]
>>
26
h
[
9
]
+=
carry
[
8
]
h
[
8
]
-=
carry
[
8
]
<<
26
carry
[
9
]
=
h
[
9
]
>>
25
h
[
9
]
-=
carry
[
9
]
<<
25
// h10 = carry9
// Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
// Have h[0]+...+2^230 h[9] between 0 and 2^255-1;
// evidently 2^255 h10-2^255 q = 0.
// Goal: Output h[0]+...+2^230 h[9].
s
[
0
]
=
byte
(
h
[
0
]
>>
0
)
s
[
1
]
=
byte
(
h
[
0
]
>>
8
)
s
[
2
]
=
byte
(
h
[
0
]
>>
16
)
s
[
3
]
=
byte
((
h
[
0
]
>>
24
)
|
(
h
[
1
]
<<
2
))
s
[
4
]
=
byte
(
h
[
1
]
>>
6
)
s
[
5
]
=
byte
(
h
[
1
]
>>
14
)
s
[
6
]
=
byte
((
h
[
1
]
>>
22
)
|
(
h
[
2
]
<<
3
))
s
[
7
]
=
byte
(
h
[
2
]
>>
5
)
s
[
8
]
=
byte
(
h
[
2
]
>>
13
)
s
[
9
]
=
byte
((
h
[
2
]
>>
21
)
|
(
h
[
3
]
<<
5
))
s
[
10
]
=
byte
(
h
[
3
]
>>
3
)
s
[
11
]
=
byte
(
h
[
3
]
>>
11
)
s
[
12
]
=
byte
((
h
[
3
]
>>
19
)
|
(
h
[
4
]
<<
6
))
s
[
13
]
=
byte
(
h
[
4
]
>>
2
)
s
[
14
]
=
byte
(
h
[
4
]
>>
10
)
s
[
15
]
=
byte
(
h
[
4
]
>>
18
)
s
[
16
]
=
byte
(
h
[
5
]
>>
0
)
s
[
17
]
=
byte
(
h
[
5
]
>>
8
)
s
[
18
]
=
byte
(
h
[
5
]
>>
16
)
s
[
19
]
=
byte
((
h
[
5
]
>>
24
)
|
(
h
[
6
]
<<
1
))
s
[
20
]
=
byte
(
h
[
6
]
>>
7
)
s
[
21
]
=
byte
(
h
[
6
]
>>
15
)
s
[
22
]
=
byte
((
h
[
6
]
>>
23
)
|
(
h
[
7
]
<<
3
))
s
[
23
]
=
byte
(
h
[
7
]
>>
5
)
s
[
24
]
=
byte
(
h
[
7
]
>>
13
)
s
[
25
]
=
byte
((
h
[
7
]
>>
21
)
|
(
h
[
8
]
<<
4
))
s
[
26
]
=
byte
(
h
[
8
]
>>
4
)
s
[
27
]
=
byte
(
h
[
8
]
>>
12
)
s
[
28
]
=
byte
((
h
[
8
]
>>
20
)
|
(
h
[
9
]
<<
6
))
s
[
29
]
=
byte
(
h
[
9
]
>>
2
)
s
[
30
]
=
byte
(
h
[
9
]
>>
10
)
s
[
31
]
=
byte
(
h
[
9
]
>>
18
)
}
func
FeIsNegative
(
f
*
FieldElement
)
byte
{
var
s
[
32
]
byte
FeToBytes
(
&
s
,
f
)
return
s
[
0
]
&
1
}
func
FeIsNonZero
(
f
*
FieldElement
)
int32
{
var
s
[
32
]
byte
FeToBytes
(
&
s
,
f
)
var
x
uint8
for
_
,
b
:=
range
s
{
x
|=
b
}
x
|=
x
>>
4
x
|=
x
>>
2
x
|=
x
>>
1
return
int32
(
x
&
1
)
}
// FeNeg sets h = -f
//
// Preconditions:
// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
//
// Postconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
func
FeNeg
(
h
,
f
*
FieldElement
)
{
h
[
0
]
=
-
f
[
0
]
h
[
1
]
=
-
f
[
1
]
h
[
2
]
=
-
f
[
2
]
h
[
3
]
=
-
f
[
3
]
h
[
4
]
=
-
f
[
4
]
h
[
5
]
=
-
f
[
5
]
h
[
6
]
=
-
f
[
6
]
h
[
7
]
=
-
f
[
7
]
h
[
8
]
=
-
f
[
8
]
h
[
9
]
=
-
f
[
9
]
}
func
FeCombine
(
h
*
FieldElement
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
int64
)
{
var
c0
,
c1
,
c2
,
c3
,
c4
,
c5
,
c6
,
c7
,
c8
,
c9
int64
/*
|h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))
i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8
|h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))
i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9
*/
c0
=
(
h0
+
(
1
<<
25
))
>>
26
h1
+=
c0
h0
-=
c0
<<
26
c4
=
(
h4
+
(
1
<<
25
))
>>
26
h5
+=
c4
h4
-=
c4
<<
26
/* |h0| <= 2^25 */
/* |h4| <= 2^25 */
/* |h1| <= 1.51*2^58 */
/* |h5| <= 1.51*2^58 */
c1
=
(
h1
+
(
1
<<
24
))
>>
25
h2
+=
c1
h1
-=
c1
<<
25
c5
=
(
h5
+
(
1
<<
24
))
>>
25
h6
+=
c5
h5
-=
c5
<<
25
/* |h1| <= 2^24; from now on fits into int32 */
/* |h5| <= 2^24; from now on fits into int32 */
/* |h2| <= 1.21*2^59 */
/* |h6| <= 1.21*2^59 */
c2
=
(
h2
+
(
1
<<
25
))
>>
26
h3
+=
c2
h2
-=
c2
<<
26
c6
=
(
h6
+
(
1
<<
25
))
>>
26
h7
+=
c6
h6
-=
c6
<<
26
/* |h2| <= 2^25; from now on fits into int32 unchanged */
/* |h6| <= 2^25; from now on fits into int32 unchanged */
/* |h3| <= 1.51*2^58 */
/* |h7| <= 1.51*2^58 */
c3
=
(
h3
+
(
1
<<
24
))
>>
25
h4
+=
c3
h3
-=
c3
<<
25
c7
=
(
h7
+
(
1
<<
24
))
>>
25
h8
+=
c7
h7
-=
c7
<<
25
/* |h3| <= 2^24; from now on fits into int32 unchanged */
/* |h7| <= 2^24; from now on fits into int32 unchanged */
/* |h4| <= 1.52*2^33 */
/* |h8| <= 1.52*2^33 */
c4
=
(
h4
+
(
1
<<
25
))
>>
26
h5
+=
c4
h4
-=
c4
<<
26
c8
=
(
h8
+
(
1
<<
25
))
>>
26
h9
+=
c8
h8
-=
c8
<<
26
/* |h4| <= 2^25; from now on fits into int32 unchanged */
/* |h8| <= 2^25; from now on fits into int32 unchanged */
/* |h5| <= 1.01*2^24 */
/* |h9| <= 1.51*2^58 */
c9
=
(
h9
+
(
1
<<
24
))
>>
25
h0
+=
c9
*
19
h9
-=
c9
<<
25
/* |h9| <= 2^24; from now on fits into int32 unchanged */
/* |h0| <= 1.8*2^37 */
c0
=
(
h0
+
(
1
<<
25
))
>>
26
h1
+=
c0
h0
-=
c0
<<
26
/* |h0| <= 2^25; from now on fits into int32 unchanged */
/* |h1| <= 1.01*2^24 */
h
[
0
]
=
int32
(
h0
)
h
[
1
]
=
int32
(
h1
)
h
[
2
]
=
int32
(
h2
)
h
[
3
]
=
int32
(
h3
)
h
[
4
]
=
int32
(
h4
)
h
[
5
]
=
int32
(
h5
)
h
[
6
]
=
int32
(
h6
)
h
[
7
]
=
int32
(
h7
)
h
[
8
]
=
int32
(
h8
)
h
[
9
]
=
int32
(
h9
)
}
// FeMul calculates h = f * g
// Can overlap h with f or g.
//
// Preconditions:
// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
//
// Postconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
//
// Notes on implementation strategy:
//
// Using schoolbook multiplication.
// Karatsuba would save a little in some cost models.
//
// Most multiplications by 2 and 19 are 32-bit precomputations;
// cheaper than 64-bit postcomputations.
//
// There is one remaining multiplication by 19 in the carry chain;
// one *19 precomputation can be merged into this,
// but the resulting data flow is considerably less clean.
//
// There are 12 carries below.
// 10 of them are 2-way parallelizable and vectorizable.
// Can get away with 11 carries, but then data flow is much deeper.
//
// With tighter constraints on inputs, can squeeze carries into int32.
func
FeMul
(
h
,
f
,
g
*
FieldElement
)
{
f0
:=
int64
(
f
[
0
])
f1
:=
int64
(
f
[
1
])
f2
:=
int64
(
f
[
2
])
f3
:=
int64
(
f
[
3
])
f4
:=
int64
(
f
[
4
])
f5
:=
int64
(
f
[
5
])
f6
:=
int64
(
f
[
6
])
f7
:=
int64
(
f
[
7
])
f8
:=
int64
(
f
[
8
])
f9
:=
int64
(
f
[
9
])
f1_2
:=
int64
(
2
*
f
[
1
])
f3_2
:=
int64
(
2
*
f
[
3
])
f5_2
:=
int64
(
2
*
f
[
5
])
f7_2
:=
int64
(
2
*
f
[
7
])
f9_2
:=
int64
(
2
*
f
[
9
])
g0
:=
int64
(
g
[
0
])
g1
:=
int64
(
g
[
1
])
g2
:=
int64
(
g
[
2
])
g3
:=
int64
(
g
[
3
])
g4
:=
int64
(
g
[
4
])
g5
:=
int64
(
g
[
5
])
g6
:=
int64
(
g
[
6
])
g7
:=
int64
(
g
[
7
])
g8
:=
int64
(
g
[
8
])
g9
:=
int64
(
g
[
9
])
g1_19
:=
int64
(
19
*
g
[
1
])
/* 1.4*2^29 */
g2_19
:=
int64
(
19
*
g
[
2
])
/* 1.4*2^30; still ok */
g3_19
:=
int64
(
19
*
g
[
3
])
g4_19
:=
int64
(
19
*
g
[
4
])
g5_19
:=
int64
(
19
*
g
[
5
])
g6_19
:=
int64
(
19
*
g
[
6
])
g7_19
:=
int64
(
19
*
g
[
7
])
g8_19
:=
int64
(
19
*
g
[
8
])
g9_19
:=
int64
(
19
*
g
[
9
])
h0
:=
f0
*
g0
+
f1_2
*
g9_19
+
f2
*
g8_19
+
f3_2
*
g7_19
+
f4
*
g6_19
+
f5_2
*
g5_19
+
f6
*
g4_19
+
f7_2
*
g3_19
+
f8
*
g2_19
+
f9_2
*
g1_19
h1
:=
f0
*
g1
+
f1
*
g0
+
f2
*
g9_19
+
f3
*
g8_19
+
f4
*
g7_19
+
f5
*
g6_19
+
f6
*
g5_19
+
f7
*
g4_19
+
f8
*
g3_19
+
f9
*
g2_19
h2
:=
f0
*
g2
+
f1_2
*
g1
+
f2
*
g0
+
f3_2
*
g9_19
+
f4
*
g8_19
+
f5_2
*
g7_19
+
f6
*
g6_19
+
f7_2
*
g5_19
+
f8
*
g4_19
+
f9_2
*
g3_19
h3
:=
f0
*
g3
+
f1
*
g2
+
f2
*
g1
+
f3
*
g0
+
f4
*
g9_19
+
f5
*
g8_19
+
f6
*
g7_19
+
f7
*
g6_19
+
f8
*
g5_19
+
f9
*
g4_19
h4
:=
f0
*
g4
+
f1_2
*
g3
+
f2
*
g2
+
f3_2
*
g1
+
f4
*
g0
+
f5_2
*
g9_19
+
f6
*
g8_19
+
f7_2
*
g7_19
+
f8
*
g6_19
+
f9_2
*
g5_19
h5
:=
f0
*
g5
+
f1
*
g4
+
f2
*
g3
+
f3
*
g2
+
f4
*
g1
+
f5
*
g0
+
f6
*
g9_19
+
f7
*
g8_19
+
f8
*
g7_19
+
f9
*
g6_19
h6
:=
f0
*
g6
+
f1_2
*
g5
+
f2
*
g4
+
f3_2
*
g3
+
f4
*
g2
+
f5_2
*
g1
+
f6
*
g0
+
f7_2
*
g9_19
+
f8
*
g8_19
+
f9_2
*
g7_19
h7
:=
f0
*
g7
+
f1
*
g6
+
f2
*
g5
+
f3
*
g4
+
f4
*
g3
+
f5
*
g2
+
f6
*
g1
+
f7
*
g0
+
f8
*
g9_19
+
f9
*
g8_19
h8
:=
f0
*
g8
+
f1_2
*
g7
+
f2
*
g6
+
f3_2
*
g5
+
f4
*
g4
+
f5_2
*
g3
+
f6
*
g2
+
f7_2
*
g1
+
f8
*
g0
+
f9_2
*
g9_19
h9
:=
f0
*
g9
+
f1
*
g8
+
f2
*
g7
+
f3
*
g6
+
f4
*
g5
+
f5
*
g4
+
f6
*
g3
+
f7
*
g2
+
f8
*
g1
+
f9
*
g0
FeCombine
(
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
func
feSquare
(
f
*
FieldElement
)
(
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
int64
)
{
f0
:=
int64
(
f
[
0
])
f1
:=
int64
(
f
[
1
])
f2
:=
int64
(
f
[
2
])
f3
:=
int64
(
f
[
3
])
f4
:=
int64
(
f
[
4
])
f5
:=
int64
(
f
[
5
])
f6
:=
int64
(
f
[
6
])
f7
:=
int64
(
f
[
7
])
f8
:=
int64
(
f
[
8
])
f9
:=
int64
(
f
[
9
])
f0_2
:=
int64
(
2
*
f
[
0
])
f1_2
:=
int64
(
2
*
f
[
1
])
f2_2
:=
int64
(
2
*
f
[
2
])
f3_2
:=
int64
(
2
*
f
[
3
])
f4_2
:=
int64
(
2
*
f
[
4
])
f5_2
:=
int64
(
2
*
f
[
5
])
f6_2
:=
int64
(
2
*
f
[
6
])
f7_2
:=
int64
(
2
*
f
[
7
])
f5_38
:=
38
*
f5
// 1.31*2^30
f6_19
:=
19
*
f6
// 1.31*2^30
f7_38
:=
38
*
f7
// 1.31*2^30
f8_19
:=
19
*
f8
// 1.31*2^30
f9_38
:=
38
*
f9
// 1.31*2^30
h0
=
f0
*
f0
+
f1_2
*
f9_38
+
f2_2
*
f8_19
+
f3_2
*
f7_38
+
f4_2
*
f6_19
+
f5
*
f5_38
h1
=
f0_2
*
f1
+
f2
*
f9_38
+
f3_2
*
f8_19
+
f4
*
f7_38
+
f5_2
*
f6_19
h2
=
f0_2
*
f2
+
f1_2
*
f1
+
f3_2
*
f9_38
+
f4_2
*
f8_19
+
f5_2
*
f7_38
+
f6
*
f6_19
h3
=
f0_2
*
f3
+
f1_2
*
f2
+
f4
*
f9_38
+
f5_2
*
f8_19
+
f6
*
f7_38
h4
=
f0_2
*
f4
+
f1_2
*
f3_2
+
f2
*
f2
+
f5_2
*
f9_38
+
f6_2
*
f8_19
+
f7
*
f7_38
h5
=
f0_2
*
f5
+
f1_2
*
f4
+
f2_2
*
f3
+
f6
*
f9_38
+
f7_2
*
f8_19
h6
=
f0_2
*
f6
+
f1_2
*
f5_2
+
f2_2
*
f4
+
f3_2
*
f3
+
f7_2
*
f9_38
+
f8
*
f8_19
h7
=
f0_2
*
f7
+
f1_2
*
f6
+
f2_2
*
f5
+
f3_2
*
f4
+
f8
*
f9_38
h8
=
f0_2
*
f8
+
f1_2
*
f7_2
+
f2_2
*
f6
+
f3_2
*
f5_2
+
f4
*
f4
+
f9
*
f9_38
h9
=
f0_2
*
f9
+
f1_2
*
f8
+
f2_2
*
f7
+
f3_2
*
f6
+
f4_2
*
f5
return
}
// FeSquare calculates h = f*f. Can overlap h with f.
//
// Preconditions:
// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
//
// Postconditions:
// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
func
FeSquare
(
h
,
f
*
FieldElement
)
{
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
:=
feSquare
(
f
)
FeCombine
(
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
// FeSquare2 sets h = 2 * f * f
//
// Can overlap h with f.
//
// Preconditions:
// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
//
// Postconditions:
// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
// See fe_mul.c for discussion of implementation strategy.
func
FeSquare2
(
h
,
f
*
FieldElement
)
{
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
:=
feSquare
(
f
)
h0
+=
h0
h1
+=
h1
h2
+=
h2
h3
+=
h3
h4
+=
h4
h5
+=
h5
h6
+=
h6
h7
+=
h7
h8
+=
h8
h9
+=
h9
FeCombine
(
h
,
h0
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
h7
,
h8
,
h9
)
}
func
FeInvert
(
out
,
z
*
FieldElement
)
{
var
t0
,
t1
,
t2
,
t3
FieldElement
var
i
int
FeSquare
(
&
t0
,
z
)
// 2^1
FeSquare
(
&
t1
,
&
t0
)
// 2^2
for
i
=
1
;
i
<
2
;
i
++
{
// 2^3
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
z
,
&
t1
)
// 2^3 + 2^0
FeMul
(
&
t0
,
&
t0
,
&
t1
)
// 2^3 + 2^1 + 2^0
FeSquare
(
&
t2
,
&
t0
)
// 2^4 + 2^2 + 2^1
FeMul
(
&
t1
,
&
t1
,
&
t2
)
// 2^4 + 2^3 + 2^2 + 2^1 + 2^0
FeSquare
(
&
t2
,
&
t1
)
// 5,4,3,2,1
for
i
=
1
;
i
<
5
;
i
++
{
// 9,8,7,6,5
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
// 9,8,7,6,5,4,3,2,1,0
FeSquare
(
&
t2
,
&
t1
)
// 10..1
for
i
=
1
;
i
<
10
;
i
++
{
// 19..10
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t2
,
&
t2
,
&
t1
)
// 19..0
FeSquare
(
&
t3
,
&
t2
)
// 20..1
for
i
=
1
;
i
<
20
;
i
++
{
// 39..20
FeSquare
(
&
t3
,
&
t3
)
}
FeMul
(
&
t2
,
&
t3
,
&
t2
)
// 39..0
FeSquare
(
&
t2
,
&
t2
)
// 40..1
for
i
=
1
;
i
<
10
;
i
++
{
// 49..10
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
// 49..0
FeSquare
(
&
t2
,
&
t1
)
// 50..1
for
i
=
1
;
i
<
50
;
i
++
{
// 99..50
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t2
,
&
t2
,
&
t1
)
// 99..0
FeSquare
(
&
t3
,
&
t2
)
// 100..1
for
i
=
1
;
i
<
100
;
i
++
{
// 199..100
FeSquare
(
&
t3
,
&
t3
)
}
FeMul
(
&
t2
,
&
t3
,
&
t2
)
// 199..0
FeSquare
(
&
t2
,
&
t2
)
// 200..1
for
i
=
1
;
i
<
50
;
i
++
{
// 249..50
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
// 249..0
FeSquare
(
&
t1
,
&
t1
)
// 250..1
for
i
=
1
;
i
<
5
;
i
++
{
// 254..5
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
out
,
&
t1
,
&
t0
)
// 254..5,3,1,0
}
func
fePow22523
(
out
,
z
*
FieldElement
)
{
var
t0
,
t1
,
t2
FieldElement
var
i
int
FeSquare
(
&
t0
,
z
)
for
i
=
1
;
i
<
1
;
i
++
{
FeSquare
(
&
t0
,
&
t0
)
}
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
2
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
z
,
&
t1
)
FeMul
(
&
t0
,
&
t0
,
&
t1
)
FeSquare
(
&
t0
,
&
t0
)
for
i
=
1
;
i
<
1
;
i
++
{
FeSquare
(
&
t0
,
&
t0
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
5
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
10
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
&
t1
,
&
t0
)
FeSquare
(
&
t2
,
&
t1
)
for
i
=
1
;
i
<
20
;
i
++
{
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
FeSquare
(
&
t1
,
&
t1
)
for
i
=
1
;
i
<
10
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t1
,
&
t0
)
for
i
=
1
;
i
<
50
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t1
,
&
t1
,
&
t0
)
FeSquare
(
&
t2
,
&
t1
)
for
i
=
1
;
i
<
100
;
i
++
{
FeSquare
(
&
t2
,
&
t2
)
}
FeMul
(
&
t1
,
&
t2
,
&
t1
)
FeSquare
(
&
t1
,
&
t1
)
for
i
=
1
;
i
<
50
;
i
++
{
FeSquare
(
&
t1
,
&
t1
)
}
FeMul
(
&
t0
,
&
t1
,
&
t0
)
FeSquare
(
&
t0
,
&
t0
)
for
i
=
1
;
i
<
2
;
i
++
{
FeSquare
(
&
t0
,
&
t0
)
}
FeMul
(
out
,
&
t0
,
z
)
}
// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 *
// y^2 where d = -121665/121666.
//
// Several representations are used:
// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z
// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
// PreComputedGroupElement: (y+x,y-x,2dxy)
type
ProjectiveGroupElement
struct
{
X
,
Y
,
Z
FieldElement
}
type
ExtendedGroupElement
struct
{
X
,
Y
,
Z
,
T
FieldElement
}
type
CompletedGroupElement
struct
{
X
,
Y
,
Z
,
T
FieldElement
}
type
PreComputedGroupElement
struct
{
yPlusX
,
yMinusX
,
xy2d
FieldElement
}
type
CachedGroupElement
struct
{
yPlusX
,
yMinusX
,
Z
,
T2d
FieldElement
}
func
(
p
*
ProjectiveGroupElement
)
Zero
()
{
FeZero
(
&
p
.
X
)
FeOne
(
&
p
.
Y
)
FeOne
(
&
p
.
Z
)
}
func
(
p
*
ProjectiveGroupElement
)
Double
(
r
*
CompletedGroupElement
)
{
var
t0
FieldElement
FeSquare
(
&
r
.
X
,
&
p
.
X
)
FeSquare
(
&
r
.
Z
,
&
p
.
Y
)
FeSquare2
(
&
r
.
T
,
&
p
.
Z
)
FeAdd
(
&
r
.
Y
,
&
p
.
X
,
&
p
.
Y
)
FeSquare
(
&
t0
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
X
)
FeSub
(
&
r
.
Z
,
&
r
.
Z
,
&
r
.
X
)
FeSub
(
&
r
.
X
,
&
t0
,
&
r
.
Y
)
FeSub
(
&
r
.
T
,
&
r
.
T
,
&
r
.
Z
)
}
func
(
p
*
ProjectiveGroupElement
)
ToBytes
(
s
*
[
32
]
byte
)
{
var
recip
,
x
,
y
FieldElement
FeInvert
(
&
recip
,
&
p
.
Z
)
FeMul
(
&
x
,
&
p
.
X
,
&
recip
)
FeMul
(
&
y
,
&
p
.
Y
,
&
recip
)
FeToBytes
(
s
,
&
y
)
s
[
31
]
^=
FeIsNegative
(
&
x
)
<<
7
}
func
(
p
*
ExtendedGroupElement
)
Zero
()
{
FeZero
(
&
p
.
X
)
FeOne
(
&
p
.
Y
)
FeOne
(
&
p
.
Z
)
FeZero
(
&
p
.
T
)
}
func
(
p
*
ExtendedGroupElement
)
Double
(
r
*
CompletedGroupElement
)
{
var
q
ProjectiveGroupElement
p
.
ToProjective
(
&
q
)
q
.
Double
(
r
)
}
func
(
p
*
ExtendedGroupElement
)
ToCached
(
r
*
CachedGroupElement
)
{
FeAdd
(
&
r
.
yPlusX
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
yMinusX
,
&
p
.
Y
,
&
p
.
X
)
FeCopy
(
&
r
.
Z
,
&
p
.
Z
)
FeMul
(
&
r
.
T2d
,
&
p
.
T
,
&
d2
)
}
func
(
p
*
ExtendedGroupElement
)
ToProjective
(
r
*
ProjectiveGroupElement
)
{
FeCopy
(
&
r
.
X
,
&
p
.
X
)
FeCopy
(
&
r
.
Y
,
&
p
.
Y
)
FeCopy
(
&
r
.
Z
,
&
p
.
Z
)
}
func
(
p
*
ExtendedGroupElement
)
ToBytes
(
s
*
[
32
]
byte
)
{
var
recip
,
x
,
y
FieldElement
FeInvert
(
&
recip
,
&
p
.
Z
)
FeMul
(
&
x
,
&
p
.
X
,
&
recip
)
FeMul
(
&
y
,
&
p
.
Y
,
&
recip
)
FeToBytes
(
s
,
&
y
)
s
[
31
]
^=
FeIsNegative
(
&
x
)
<<
7
}
func
(
p
*
ExtendedGroupElement
)
FromBytes
(
s
*
[
32
]
byte
)
bool
{
var
u
,
v
,
v3
,
vxx
,
check
FieldElement
FeFromBytes
(
&
p
.
Y
,
s
)
FeOne
(
&
p
.
Z
)
FeSquare
(
&
u
,
&
p
.
Y
)
FeMul
(
&
v
,
&
u
,
&
d
)
FeSub
(
&
u
,
&
u
,
&
p
.
Z
)
// y = y^2-1
FeAdd
(
&
v
,
&
v
,
&
p
.
Z
)
// v = dy^2+1
FeSquare
(
&
v3
,
&
v
)
FeMul
(
&
v3
,
&
v3
,
&
v
)
// v3 = v^3
FeSquare
(
&
p
.
X
,
&
v3
)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
v
)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
u
)
// x = uv^7
fePow22523
(
&
p
.
X
,
&
p
.
X
)
// x = (uv^7)^((q-5)/8)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
v3
)
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
u
)
// x = uv^3(uv^7)^((q-5)/8)
var
tmpX
,
tmp2
[
32
]
byte
FeSquare
(
&
vxx
,
&
p
.
X
)
FeMul
(
&
vxx
,
&
vxx
,
&
v
)
FeSub
(
&
check
,
&
vxx
,
&
u
)
// vx^2-u
if
FeIsNonZero
(
&
check
)
==
1
{
FeAdd
(
&
check
,
&
vxx
,
&
u
)
// vx^2+u
if
FeIsNonZero
(
&
check
)
==
1
{
return
false
}
FeMul
(
&
p
.
X
,
&
p
.
X
,
&
SqrtM1
)
FeToBytes
(
&
tmpX
,
&
p
.
X
)
for
i
,
v
:=
range
tmpX
{
tmp2
[
31
-
i
]
=
v
}
}
if
FeIsNegative
(
&
p
.
X
)
!=
(
s
[
31
]
>>
7
)
{
FeNeg
(
&
p
.
X
,
&
p
.
X
)
}
FeMul
(
&
p
.
T
,
&
p
.
X
,
&
p
.
Y
)
return
true
}
func
(
p
*
CompletedGroupElement
)
ToProjective
(
r
*
ProjectiveGroupElement
)
{
FeMul
(
&
r
.
X
,
&
p
.
X
,
&
p
.
T
)
FeMul
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
Z
)
FeMul
(
&
r
.
Z
,
&
p
.
Z
,
&
p
.
T
)
}
func
(
p
*
CompletedGroupElement
)
ToExtended
(
r
*
ExtendedGroupElement
)
{
FeMul
(
&
r
.
X
,
&
p
.
X
,
&
p
.
T
)
FeMul
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
Z
)
FeMul
(
&
r
.
Z
,
&
p
.
Z
,
&
p
.
T
)
FeMul
(
&
r
.
T
,
&
p
.
X
,
&
p
.
Y
)
}
func
(
p
*
PreComputedGroupElement
)
Zero
()
{
FeOne
(
&
p
.
yPlusX
)
FeOne
(
&
p
.
yMinusX
)
FeZero
(
&
p
.
xy2d
)
}
func
geAdd
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
CachedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
T
,
&
q
.
T2d
,
&
p
.
T
)
FeMul
(
&
r
.
X
,
&
p
.
Z
,
&
q
.
Z
)
FeAdd
(
&
t0
,
&
r
.
X
,
&
r
.
X
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeSub
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
geSub
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
CachedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
T
,
&
q
.
T2d
,
&
p
.
T
)
FeMul
(
&
r
.
X
,
&
p
.
Z
,
&
q
.
Z
)
FeAdd
(
&
t0
,
&
r
.
X
,
&
r
.
X
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeSub
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeAdd
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
geMixedAdd
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
PreComputedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
T
,
&
q
.
xy2d
,
&
p
.
T
)
FeAdd
(
&
t0
,
&
p
.
Z
,
&
p
.
Z
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeSub
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
geMixedSub
(
r
*
CompletedGroupElement
,
p
*
ExtendedGroupElement
,
q
*
PreComputedGroupElement
)
{
var
t0
FieldElement
FeAdd
(
&
r
.
X
,
&
p
.
Y
,
&
p
.
X
)
FeSub
(
&
r
.
Y
,
&
p
.
Y
,
&
p
.
X
)
FeMul
(
&
r
.
Z
,
&
r
.
X
,
&
q
.
yMinusX
)
FeMul
(
&
r
.
Y
,
&
r
.
Y
,
&
q
.
yPlusX
)
FeMul
(
&
r
.
T
,
&
q
.
xy2d
,
&
p
.
T
)
FeAdd
(
&
t0
,
&
p
.
Z
,
&
p
.
Z
)
FeSub
(
&
r
.
X
,
&
r
.
Z
,
&
r
.
Y
)
FeAdd
(
&
r
.
Y
,
&
r
.
Z
,
&
r
.
Y
)
FeSub
(
&
r
.
Z
,
&
t0
,
&
r
.
T
)
FeAdd
(
&
r
.
T
,
&
t0
,
&
r
.
T
)
}
func
slide
(
r
*
[
256
]
int8
,
a
*
[
32
]
byte
)
{
for
i
:=
range
r
{
r
[
i
]
=
int8
(
1
&
(
a
[
i
>>
3
]
>>
uint
(
i
&
7
)))
}
for
i
:=
range
r
{
if
r
[
i
]
!=
0
{
for
b
:=
1
;
b
<=
6
&&
i
+
b
<
256
;
b
++
{
if
r
[
i
+
b
]
!=
0
{
if
r
[
i
]
+
(
r
[
i
+
b
]
<<
uint
(
b
))
<=
15
{
r
[
i
]
+=
r
[
i
+
b
]
<<
uint
(
b
)
r
[
i
+
b
]
=
0
}
else
if
r
[
i
]
-
(
r
[
i
+
b
]
<<
uint
(
b
))
>=
-
15
{
r
[
i
]
-=
r
[
i
+
b
]
<<
uint
(
b
)
for
k
:=
i
+
b
;
k
<
256
;
k
++
{
if
r
[
k
]
==
0
{
r
[
k
]
=
1
break
}
r
[
k
]
=
0
}
}
else
{
break
}
}
}
}
}
}
// GeDoubleScalarMultVartime sets r = a*A + b*B
// where a = a[0]+256*a[1]+...+256^31 a[31].
// and b = b[0]+256*b[1]+...+256^31 b[31].
// B is the Ed25519 base point (x,4/5) with x positive.
func
GeDoubleScalarMultVartime
(
r
*
ProjectiveGroupElement
,
a
*
[
32
]
byte
,
A
*
ExtendedGroupElement
,
b
*
[
32
]
byte
)
{
var
aSlide
,
bSlide
[
256
]
int8
var
Ai
[
8
]
CachedGroupElement
// A,3A,5A,7A,9A,11A,13A,15A
var
t
CompletedGroupElement
var
u
,
A2
ExtendedGroupElement
var
i
int
slide
(
&
aSlide
,
a
)
slide
(
&
bSlide
,
b
)
A
.
ToCached
(
&
Ai
[
0
])
A
.
Double
(
&
t
)
t
.
ToExtended
(
&
A2
)
for
i
:=
0
;
i
<
7
;
i
++
{
geAdd
(
&
t
,
&
A2
,
&
Ai
[
i
])
t
.
ToExtended
(
&
u
)
u
.
ToCached
(
&
Ai
[
i
+
1
])
}
r
.
Zero
()
for
i
=
255
;
i
>=
0
;
i
--
{
if
aSlide
[
i
]
!=
0
||
bSlide
[
i
]
!=
0
{
break
}
}
for
;
i
>=
0
;
i
--
{
r
.
Double
(
&
t
)
if
aSlide
[
i
]
>
0
{
t
.
ToExtended
(
&
u
)
geAdd
(
&
t
,
&
u
,
&
Ai
[
aSlide
[
i
]
/
2
])
}
else
if
aSlide
[
i
]
<
0
{
t
.
ToExtended
(
&
u
)
geSub
(
&
t
,
&
u
,
&
Ai
[(
-
aSlide
[
i
])
/
2
])
}
if
bSlide
[
i
]
>
0
{
t
.
ToExtended
(
&
u
)
geMixedAdd
(
&
t
,
&
u
,
&
bi
[
bSlide
[
i
]
/
2
])
}
else
if
bSlide
[
i
]
<
0
{
t
.
ToExtended
(
&
u
)
geMixedSub
(
&
t
,
&
u
,
&
bi
[(
-
bSlide
[
i
])
/
2
])
}
t
.
ToProjective
(
r
)
}
}
// equal returns 1 if b == c and 0 otherwise, assuming that b and c are
// non-negative.
func
equal
(
b
,
c
int32
)
int32
{
x
:=
uint32
(
b
^
c
)
x
--
return
int32
(
x
>>
31
)
}
// negative returns 1 if b < 0 and 0 otherwise.
func
negative
(
b
int32
)
int32
{
return
(
b
>>
31
)
&
1
}
func
PreComputedGroupElementCMove
(
t
,
u
*
PreComputedGroupElement
,
b
int32
)
{
FeCMove
(
&
t
.
yPlusX
,
&
u
.
yPlusX
,
b
)
FeCMove
(
&
t
.
yMinusX
,
&
u
.
yMinusX
,
b
)
FeCMove
(
&
t
.
xy2d
,
&
u
.
xy2d
,
b
)
}
func
selectPoint
(
t
*
PreComputedGroupElement
,
pos
int32
,
b
int32
)
{
var
minusT
PreComputedGroupElement
bNegative
:=
negative
(
b
)
bAbs
:=
b
-
(((
-
bNegative
)
&
b
)
<<
1
)
t
.
Zero
()
for
i
:=
int32
(
0
);
i
<
8
;
i
++
{
PreComputedGroupElementCMove
(
t
,
&
base
[
pos
][
i
],
equal
(
bAbs
,
i
+
1
))
}
FeCopy
(
&
minusT
.
yPlusX
,
&
t
.
yMinusX
)
FeCopy
(
&
minusT
.
yMinusX
,
&
t
.
yPlusX
)
FeNeg
(
&
minusT
.
xy2d
,
&
t
.
xy2d
)
PreComputedGroupElementCMove
(
t
,
&
minusT
,
bNegative
)
}
// GeScalarMultBase computes h = a*B, where
// a = a[0]+256*a[1]+...+256^31 a[31]
// B is the Ed25519 base point (x,4/5) with x positive.
//
// Preconditions:
// a[31] <= 127
func
GeScalarMultBase
(
h
*
ExtendedGroupElement
,
a
*
[
32
]
byte
)
{
var
e
[
64
]
int8
for
i
,
v
:=
range
a
{
e
[
2
*
i
]
=
int8
(
v
&
15
)
e
[
2
*
i
+
1
]
=
int8
((
v
>>
4
)
&
15
)
}
// each e[i] is between 0 and 15 and e[63] is between 0 and 7.
carry
:=
int8
(
0
)
for
i
:=
0
;
i
<
63
;
i
++
{
e
[
i
]
+=
carry
carry
=
(
e
[
i
]
+
8
)
>>
4
e
[
i
]
-=
carry
<<
4
}
e
[
63
]
+=
carry
// each e[i] is between -8 and 8.
h
.
Zero
()
var
t
PreComputedGroupElement
var
r
CompletedGroupElement
for
i
:=
int32
(
1
);
i
<
64
;
i
+=
2
{
selectPoint
(
&
t
,
i
/
2
,
int32
(
e
[
i
]))
geMixedAdd
(
&
r
,
h
,
&
t
)
r
.
ToExtended
(
h
)
}
var
s
ProjectiveGroupElement
h
.
Double
(
&
r
)
r
.
ToProjective
(
&
s
)
s
.
Double
(
&
r
)
r
.
ToProjective
(
&
s
)
s
.
Double
(
&
r
)
r
.
ToProjective
(
&
s
)
s
.
Double
(
&
r
)
r
.
ToExtended
(
h
)
for
i
:=
int32
(
0
);
i
<
64
;
i
+=
2
{
selectPoint
(
&
t
,
i
/
2
,
int32
(
e
[
i
]))
geMixedAdd
(
&
r
,
h
,
&
t
)
r
.
ToExtended
(
h
)
}
}
// The scalars are GF(2^252 + 27742317777372353535851937790883648493).
// Input:
// a[0]+256*a[1]+...+256^31*a[31] = a
// b[0]+256*b[1]+...+256^31*b[31] = b
// c[0]+256*c[1]+...+256^31*c[31] = c
//
// Output:
// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
// where l = 2^252 + 27742317777372353535851937790883648493.
func
ScMulAdd
(
s
,
a
,
b
,
c
*
[
32
]
byte
)
{
a0
:=
2097151
&
load3
(
a
[
:
])
a1
:=
2097151
&
(
load4
(
a
[
2
:
])
>>
5
)
a2
:=
2097151
&
(
load3
(
a
[
5
:
])
>>
2
)
a3
:=
2097151
&
(
load4
(
a
[
7
:
])
>>
7
)
a4
:=
2097151
&
(
load4
(
a
[
10
:
])
>>
4
)
a5
:=
2097151
&
(
load3
(
a
[
13
:
])
>>
1
)
a6
:=
2097151
&
(
load4
(
a
[
15
:
])
>>
6
)
a7
:=
2097151
&
(
load3
(
a
[
18
:
])
>>
3
)
a8
:=
2097151
&
load3
(
a
[
21
:
])
a9
:=
2097151
&
(
load4
(
a
[
23
:
])
>>
5
)
a10
:=
2097151
&
(
load3
(
a
[
26
:
])
>>
2
)
a11
:=
(
load4
(
a
[
28
:
])
>>
7
)
b0
:=
2097151
&
load3
(
b
[
:
])
b1
:=
2097151
&
(
load4
(
b
[
2
:
])
>>
5
)
b2
:=
2097151
&
(
load3
(
b
[
5
:
])
>>
2
)
b3
:=
2097151
&
(
load4
(
b
[
7
:
])
>>
7
)
b4
:=
2097151
&
(
load4
(
b
[
10
:
])
>>
4
)
b5
:=
2097151
&
(
load3
(
b
[
13
:
])
>>
1
)
b6
:=
2097151
&
(
load4
(
b
[
15
:
])
>>
6
)
b7
:=
2097151
&
(
load3
(
b
[
18
:
])
>>
3
)
b8
:=
2097151
&
load3
(
b
[
21
:
])
b9
:=
2097151
&
(
load4
(
b
[
23
:
])
>>
5
)
b10
:=
2097151
&
(
load3
(
b
[
26
:
])
>>
2
)
b11
:=
(
load4
(
b
[
28
:
])
>>
7
)
c0
:=
2097151
&
load3
(
c
[
:
])
c1
:=
2097151
&
(
load4
(
c
[
2
:
])
>>
5
)
c2
:=
2097151
&
(
load3
(
c
[
5
:
])
>>
2
)
c3
:=
2097151
&
(
load4
(
c
[
7
:
])
>>
7
)
c4
:=
2097151
&
(
load4
(
c
[
10
:
])
>>
4
)
c5
:=
2097151
&
(
load3
(
c
[
13
:
])
>>
1
)
c6
:=
2097151
&
(
load4
(
c
[
15
:
])
>>
6
)
c7
:=
2097151
&
(
load3
(
c
[
18
:
])
>>
3
)
c8
:=
2097151
&
load3
(
c
[
21
:
])
c9
:=
2097151
&
(
load4
(
c
[
23
:
])
>>
5
)
c10
:=
2097151
&
(
load3
(
c
[
26
:
])
>>
2
)
c11
:=
(
load4
(
c
[
28
:
])
>>
7
)
var
carry
[
23
]
int64
s0
:=
c0
+
a0
*
b0
s1
:=
c1
+
a0
*
b1
+
a1
*
b0
s2
:=
c2
+
a0
*
b2
+
a1
*
b1
+
a2
*
b0
s3
:=
c3
+
a0
*
b3
+
a1
*
b2
+
a2
*
b1
+
a3
*
b0
s4
:=
c4
+
a0
*
b4
+
a1
*
b3
+
a2
*
b2
+
a3
*
b1
+
a4
*
b0
s5
:=
c5
+
a0
*
b5
+
a1
*
b4
+
a2
*
b3
+
a3
*
b2
+
a4
*
b1
+
a5
*
b0
s6
:=
c6
+
a0
*
b6
+
a1
*
b5
+
a2
*
b4
+
a3
*
b3
+
a4
*
b2
+
a5
*
b1
+
a6
*
b0
s7
:=
c7
+
a0
*
b7
+
a1
*
b6
+
a2
*
b5
+
a3
*
b4
+
a4
*
b3
+
a5
*
b2
+
a6
*
b1
+
a7
*
b0
s8
:=
c8
+
a0
*
b8
+
a1
*
b7
+
a2
*
b6
+
a3
*
b5
+
a4
*
b4
+
a5
*
b3
+
a6
*
b2
+
a7
*
b1
+
a8
*
b0
s9
:=
c9
+
a0
*
b9
+
a1
*
b8
+
a2
*
b7
+
a3
*
b6
+
a4
*
b5
+
a5
*
b4
+
a6
*
b3
+
a7
*
b2
+
a8
*
b1
+
a9
*
b0
s10
:=
c10
+
a0
*
b10
+
a1
*
b9
+
a2
*
b8
+
a3
*
b7
+
a4
*
b6
+
a5
*
b5
+
a6
*
b4
+
a7
*
b3
+
a8
*
b2
+
a9
*
b1
+
a10
*
b0
s11
:=
c11
+
a0
*
b11
+
a1
*
b10
+
a2
*
b9
+
a3
*
b8
+
a4
*
b7
+
a5
*
b6
+
a6
*
b5
+
a7
*
b4
+
a8
*
b3
+
a9
*
b2
+
a10
*
b1
+
a11
*
b0
s12
:=
a1
*
b11
+
a2
*
b10
+
a3
*
b9
+
a4
*
b8
+
a5
*
b7
+
a6
*
b6
+
a7
*
b5
+
a8
*
b4
+
a9
*
b3
+
a10
*
b2
+
a11
*
b1
s13
:=
a2
*
b11
+
a3
*
b10
+
a4
*
b9
+
a5
*
b8
+
a6
*
b7
+
a7
*
b6
+
a8
*
b5
+
a9
*
b4
+
a10
*
b3
+
a11
*
b2
s14
:=
a3
*
b11
+
a4
*
b10
+
a5
*
b9
+
a6
*
b8
+
a7
*
b7
+
a8
*
b6
+
a9
*
b5
+
a10
*
b4
+
a11
*
b3
s15
:=
a4
*
b11
+
a5
*
b10
+
a6
*
b9
+
a7
*
b8
+
a8
*
b7
+
a9
*
b6
+
a10
*
b5
+
a11
*
b4
s16
:=
a5
*
b11
+
a6
*
b10
+
a7
*
b9
+
a8
*
b8
+
a9
*
b7
+
a10
*
b6
+
a11
*
b5
s17
:=
a6
*
b11
+
a7
*
b10
+
a8
*
b9
+
a9
*
b8
+
a10
*
b7
+
a11
*
b6
s18
:=
a7
*
b11
+
a8
*
b10
+
a9
*
b9
+
a10
*
b8
+
a11
*
b7
s19
:=
a8
*
b11
+
a9
*
b10
+
a10
*
b9
+
a11
*
b8
s20
:=
a9
*
b11
+
a10
*
b10
+
a11
*
b9
s21
:=
a10
*
b11
+
a11
*
b10
s22
:=
a11
*
b11
s23
:=
int64
(
0
)
carry
[
0
]
=
(
s0
+
(
1
<<
20
))
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
2
]
=
(
s2
+
(
1
<<
20
))
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
4
]
=
(
s4
+
(
1
<<
20
))
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
12
]
=
(
s12
+
(
1
<<
20
))
>>
21
s13
+=
carry
[
12
]
s12
-=
carry
[
12
]
<<
21
carry
[
14
]
=
(
s14
+
(
1
<<
20
))
>>
21
s15
+=
carry
[
14
]
s14
-=
carry
[
14
]
<<
21
carry
[
16
]
=
(
s16
+
(
1
<<
20
))
>>
21
s17
+=
carry
[
16
]
s16
-=
carry
[
16
]
<<
21
carry
[
18
]
=
(
s18
+
(
1
<<
20
))
>>
21
s19
+=
carry
[
18
]
s18
-=
carry
[
18
]
<<
21
carry
[
20
]
=
(
s20
+
(
1
<<
20
))
>>
21
s21
+=
carry
[
20
]
s20
-=
carry
[
20
]
<<
21
carry
[
22
]
=
(
s22
+
(
1
<<
20
))
>>
21
s23
+=
carry
[
22
]
s22
-=
carry
[
22
]
<<
21
carry
[
1
]
=
(
s1
+
(
1
<<
20
))
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
3
]
=
(
s3
+
(
1
<<
20
))
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
5
]
=
(
s5
+
(
1
<<
20
))
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
carry
[
13
]
=
(
s13
+
(
1
<<
20
))
>>
21
s14
+=
carry
[
13
]
s13
-=
carry
[
13
]
<<
21
carry
[
15
]
=
(
s15
+
(
1
<<
20
))
>>
21
s16
+=
carry
[
15
]
s15
-=
carry
[
15
]
<<
21
carry
[
17
]
=
(
s17
+
(
1
<<
20
))
>>
21
s18
+=
carry
[
17
]
s17
-=
carry
[
17
]
<<
21
carry
[
19
]
=
(
s19
+
(
1
<<
20
))
>>
21
s20
+=
carry
[
19
]
s19
-=
carry
[
19
]
<<
21
carry
[
21
]
=
(
s21
+
(
1
<<
20
))
>>
21
s22
+=
carry
[
21
]
s21
-=
carry
[
21
]
<<
21
s11
+=
s23
*
666643
s12
+=
s23
*
470296
s13
+=
s23
*
654183
s14
-=
s23
*
997805
s15
+=
s23
*
136657
s16
-=
s23
*
683901
s23
=
0
s10
+=
s22
*
666643
s11
+=
s22
*
470296
s12
+=
s22
*
654183
s13
-=
s22
*
997805
s14
+=
s22
*
136657
s15
-=
s22
*
683901
s22
=
0
s9
+=
s21
*
666643
s10
+=
s21
*
470296
s11
+=
s21
*
654183
s12
-=
s21
*
997805
s13
+=
s21
*
136657
s14
-=
s21
*
683901
s21
=
0
s8
+=
s20
*
666643
s9
+=
s20
*
470296
s10
+=
s20
*
654183
s11
-=
s20
*
997805
s12
+=
s20
*
136657
s13
-=
s20
*
683901
s20
=
0
s7
+=
s19
*
666643
s8
+=
s19
*
470296
s9
+=
s19
*
654183
s10
-=
s19
*
997805
s11
+=
s19
*
136657
s12
-=
s19
*
683901
s19
=
0
s6
+=
s18
*
666643
s7
+=
s18
*
470296
s8
+=
s18
*
654183
s9
-=
s18
*
997805
s10
+=
s18
*
136657
s11
-=
s18
*
683901
s18
=
0
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
12
]
=
(
s12
+
(
1
<<
20
))
>>
21
s13
+=
carry
[
12
]
s12
-=
carry
[
12
]
<<
21
carry
[
14
]
=
(
s14
+
(
1
<<
20
))
>>
21
s15
+=
carry
[
14
]
s14
-=
carry
[
14
]
<<
21
carry
[
16
]
=
(
s16
+
(
1
<<
20
))
>>
21
s17
+=
carry
[
16
]
s16
-=
carry
[
16
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
carry
[
13
]
=
(
s13
+
(
1
<<
20
))
>>
21
s14
+=
carry
[
13
]
s13
-=
carry
[
13
]
<<
21
carry
[
15
]
=
(
s15
+
(
1
<<
20
))
>>
21
s16
+=
carry
[
15
]
s15
-=
carry
[
15
]
<<
21
s5
+=
s17
*
666643
s6
+=
s17
*
470296
s7
+=
s17
*
654183
s8
-=
s17
*
997805
s9
+=
s17
*
136657
s10
-=
s17
*
683901
s17
=
0
s4
+=
s16
*
666643
s5
+=
s16
*
470296
s6
+=
s16
*
654183
s7
-=
s16
*
997805
s8
+=
s16
*
136657
s9
-=
s16
*
683901
s16
=
0
s3
+=
s15
*
666643
s4
+=
s15
*
470296
s5
+=
s15
*
654183
s6
-=
s15
*
997805
s7
+=
s15
*
136657
s8
-=
s15
*
683901
s15
=
0
s2
+=
s14
*
666643
s3
+=
s14
*
470296
s4
+=
s14
*
654183
s5
-=
s14
*
997805
s6
+=
s14
*
136657
s7
-=
s14
*
683901
s14
=
0
s1
+=
s13
*
666643
s2
+=
s13
*
470296
s3
+=
s13
*
654183
s4
-=
s13
*
997805
s5
+=
s13
*
136657
s6
-=
s13
*
683901
s13
=
0
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
(
s0
+
(
1
<<
20
))
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
2
]
=
(
s2
+
(
1
<<
20
))
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
4
]
=
(
s4
+
(
1
<<
20
))
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
1
]
=
(
s1
+
(
1
<<
20
))
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
3
]
=
(
s3
+
(
1
<<
20
))
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
5
]
=
(
s5
+
(
1
<<
20
))
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
11
]
=
s11
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
s
[
0
]
=
byte
(
s0
>>
0
)
s
[
1
]
=
byte
(
s0
>>
8
)
s
[
2
]
=
byte
((
s0
>>
16
)
|
(
s1
<<
5
))
s
[
3
]
=
byte
(
s1
>>
3
)
s
[
4
]
=
byte
(
s1
>>
11
)
s
[
5
]
=
byte
((
s1
>>
19
)
|
(
s2
<<
2
))
s
[
6
]
=
byte
(
s2
>>
6
)
s
[
7
]
=
byte
((
s2
>>
14
)
|
(
s3
<<
7
))
s
[
8
]
=
byte
(
s3
>>
1
)
s
[
9
]
=
byte
(
s3
>>
9
)
s
[
10
]
=
byte
((
s3
>>
17
)
|
(
s4
<<
4
))
s
[
11
]
=
byte
(
s4
>>
4
)
s
[
12
]
=
byte
(
s4
>>
12
)
s
[
13
]
=
byte
((
s4
>>
20
)
|
(
s5
<<
1
))
s
[
14
]
=
byte
(
s5
>>
7
)
s
[
15
]
=
byte
((
s5
>>
15
)
|
(
s6
<<
6
))
s
[
16
]
=
byte
(
s6
>>
2
)
s
[
17
]
=
byte
(
s6
>>
10
)
s
[
18
]
=
byte
((
s6
>>
18
)
|
(
s7
<<
3
))
s
[
19
]
=
byte
(
s7
>>
5
)
s
[
20
]
=
byte
(
s7
>>
13
)
s
[
21
]
=
byte
(
s8
>>
0
)
s
[
22
]
=
byte
(
s8
>>
8
)
s
[
23
]
=
byte
((
s8
>>
16
)
|
(
s9
<<
5
))
s
[
24
]
=
byte
(
s9
>>
3
)
s
[
25
]
=
byte
(
s9
>>
11
)
s
[
26
]
=
byte
((
s9
>>
19
)
|
(
s10
<<
2
))
s
[
27
]
=
byte
(
s10
>>
6
)
s
[
28
]
=
byte
((
s10
>>
14
)
|
(
s11
<<
7
))
s
[
29
]
=
byte
(
s11
>>
1
)
s
[
30
]
=
byte
(
s11
>>
9
)
s
[
31
]
=
byte
(
s11
>>
17
)
}
// Input:
// s[0]+256*s[1]+...+256^63*s[63] = s
//
// Output:
// s[0]+256*s[1]+...+256^31*s[31] = s mod l
// where l = 2^252 + 27742317777372353535851937790883648493.
func
ScReduce
(
out
*
[
32
]
byte
,
s
*
[
64
]
byte
)
{
s0
:=
2097151
&
load3
(
s
[
:
])
s1
:=
2097151
&
(
load4
(
s
[
2
:
])
>>
5
)
s2
:=
2097151
&
(
load3
(
s
[
5
:
])
>>
2
)
s3
:=
2097151
&
(
load4
(
s
[
7
:
])
>>
7
)
s4
:=
2097151
&
(
load4
(
s
[
10
:
])
>>
4
)
s5
:=
2097151
&
(
load3
(
s
[
13
:
])
>>
1
)
s6
:=
2097151
&
(
load4
(
s
[
15
:
])
>>
6
)
s7
:=
2097151
&
(
load3
(
s
[
18
:
])
>>
3
)
s8
:=
2097151
&
load3
(
s
[
21
:
])
s9
:=
2097151
&
(
load4
(
s
[
23
:
])
>>
5
)
s10
:=
2097151
&
(
load3
(
s
[
26
:
])
>>
2
)
s11
:=
2097151
&
(
load4
(
s
[
28
:
])
>>
7
)
s12
:=
2097151
&
(
load4
(
s
[
31
:
])
>>
4
)
s13
:=
2097151
&
(
load3
(
s
[
34
:
])
>>
1
)
s14
:=
2097151
&
(
load4
(
s
[
36
:
])
>>
6
)
s15
:=
2097151
&
(
load3
(
s
[
39
:
])
>>
3
)
s16
:=
2097151
&
load3
(
s
[
42
:
])
s17
:=
2097151
&
(
load4
(
s
[
44
:
])
>>
5
)
s18
:=
2097151
&
(
load3
(
s
[
47
:
])
>>
2
)
s19
:=
2097151
&
(
load4
(
s
[
49
:
])
>>
7
)
s20
:=
2097151
&
(
load4
(
s
[
52
:
])
>>
4
)
s21
:=
2097151
&
(
load3
(
s
[
55
:
])
>>
1
)
s22
:=
2097151
&
(
load4
(
s
[
57
:
])
>>
6
)
s23
:=
(
load4
(
s
[
60
:
])
>>
3
)
s11
+=
s23
*
666643
s12
+=
s23
*
470296
s13
+=
s23
*
654183
s14
-=
s23
*
997805
s15
+=
s23
*
136657
s16
-=
s23
*
683901
s23
=
0
s10
+=
s22
*
666643
s11
+=
s22
*
470296
s12
+=
s22
*
654183
s13
-=
s22
*
997805
s14
+=
s22
*
136657
s15
-=
s22
*
683901
s22
=
0
s9
+=
s21
*
666643
s10
+=
s21
*
470296
s11
+=
s21
*
654183
s12
-=
s21
*
997805
s13
+=
s21
*
136657
s14
-=
s21
*
683901
s21
=
0
s8
+=
s20
*
666643
s9
+=
s20
*
470296
s10
+=
s20
*
654183
s11
-=
s20
*
997805
s12
+=
s20
*
136657
s13
-=
s20
*
683901
s20
=
0
s7
+=
s19
*
666643
s8
+=
s19
*
470296
s9
+=
s19
*
654183
s10
-=
s19
*
997805
s11
+=
s19
*
136657
s12
-=
s19
*
683901
s19
=
0
s6
+=
s18
*
666643
s7
+=
s18
*
470296
s8
+=
s18
*
654183
s9
-=
s18
*
997805
s10
+=
s18
*
136657
s11
-=
s18
*
683901
s18
=
0
var
carry
[
17
]
int64
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
12
]
=
(
s12
+
(
1
<<
20
))
>>
21
s13
+=
carry
[
12
]
s12
-=
carry
[
12
]
<<
21
carry
[
14
]
=
(
s14
+
(
1
<<
20
))
>>
21
s15
+=
carry
[
14
]
s14
-=
carry
[
14
]
<<
21
carry
[
16
]
=
(
s16
+
(
1
<<
20
))
>>
21
s17
+=
carry
[
16
]
s16
-=
carry
[
16
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
carry
[
13
]
=
(
s13
+
(
1
<<
20
))
>>
21
s14
+=
carry
[
13
]
s13
-=
carry
[
13
]
<<
21
carry
[
15
]
=
(
s15
+
(
1
<<
20
))
>>
21
s16
+=
carry
[
15
]
s15
-=
carry
[
15
]
<<
21
s5
+=
s17
*
666643
s6
+=
s17
*
470296
s7
+=
s17
*
654183
s8
-=
s17
*
997805
s9
+=
s17
*
136657
s10
-=
s17
*
683901
s17
=
0
s4
+=
s16
*
666643
s5
+=
s16
*
470296
s6
+=
s16
*
654183
s7
-=
s16
*
997805
s8
+=
s16
*
136657
s9
-=
s16
*
683901
s16
=
0
s3
+=
s15
*
666643
s4
+=
s15
*
470296
s5
+=
s15
*
654183
s6
-=
s15
*
997805
s7
+=
s15
*
136657
s8
-=
s15
*
683901
s15
=
0
s2
+=
s14
*
666643
s3
+=
s14
*
470296
s4
+=
s14
*
654183
s5
-=
s14
*
997805
s6
+=
s14
*
136657
s7
-=
s14
*
683901
s14
=
0
s1
+=
s13
*
666643
s2
+=
s13
*
470296
s3
+=
s13
*
654183
s4
-=
s13
*
997805
s5
+=
s13
*
136657
s6
-=
s13
*
683901
s13
=
0
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
(
s0
+
(
1
<<
20
))
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
2
]
=
(
s2
+
(
1
<<
20
))
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
4
]
=
(
s4
+
(
1
<<
20
))
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
6
]
=
(
s6
+
(
1
<<
20
))
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
8
]
=
(
s8
+
(
1
<<
20
))
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
10
]
=
(
s10
+
(
1
<<
20
))
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
1
]
=
(
s1
+
(
1
<<
20
))
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
3
]
=
(
s3
+
(
1
<<
20
))
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
5
]
=
(
s5
+
(
1
<<
20
))
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
7
]
=
(
s7
+
(
1
<<
20
))
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
9
]
=
(
s9
+
(
1
<<
20
))
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
11
]
=
(
s11
+
(
1
<<
20
))
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
carry
[
11
]
=
s11
>>
21
s12
+=
carry
[
11
]
s11
-=
carry
[
11
]
<<
21
s0
+=
s12
*
666643
s1
+=
s12
*
470296
s2
+=
s12
*
654183
s3
-=
s12
*
997805
s4
+=
s12
*
136657
s5
-=
s12
*
683901
s12
=
0
carry
[
0
]
=
s0
>>
21
s1
+=
carry
[
0
]
s0
-=
carry
[
0
]
<<
21
carry
[
1
]
=
s1
>>
21
s2
+=
carry
[
1
]
s1
-=
carry
[
1
]
<<
21
carry
[
2
]
=
s2
>>
21
s3
+=
carry
[
2
]
s2
-=
carry
[
2
]
<<
21
carry
[
3
]
=
s3
>>
21
s4
+=
carry
[
3
]
s3
-=
carry
[
3
]
<<
21
carry
[
4
]
=
s4
>>
21
s5
+=
carry
[
4
]
s4
-=
carry
[
4
]
<<
21
carry
[
5
]
=
s5
>>
21
s6
+=
carry
[
5
]
s5
-=
carry
[
5
]
<<
21
carry
[
6
]
=
s6
>>
21
s7
+=
carry
[
6
]
s6
-=
carry
[
6
]
<<
21
carry
[
7
]
=
s7
>>
21
s8
+=
carry
[
7
]
s7
-=
carry
[
7
]
<<
21
carry
[
8
]
=
s8
>>
21
s9
+=
carry
[
8
]
s8
-=
carry
[
8
]
<<
21
carry
[
9
]
=
s9
>>
21
s10
+=
carry
[
9
]
s9
-=
carry
[
9
]
<<
21
carry
[
10
]
=
s10
>>
21
s11
+=
carry
[
10
]
s10
-=
carry
[
10
]
<<
21
out
[
0
]
=
byte
(
s0
>>
0
)
out
[
1
]
=
byte
(
s0
>>
8
)
out
[
2
]
=
byte
((
s0
>>
16
)
|
(
s1
<<
5
))
out
[
3
]
=
byte
(
s1
>>
3
)
out
[
4
]
=
byte
(
s1
>>
11
)
out
[
5
]
=
byte
((
s1
>>
19
)
|
(
s2
<<
2
))
out
[
6
]
=
byte
(
s2
>>
6
)
out
[
7
]
=
byte
((
s2
>>
14
)
|
(
s3
<<
7
))
out
[
8
]
=
byte
(
s3
>>
1
)
out
[
9
]
=
byte
(
s3
>>
9
)
out
[
10
]
=
byte
((
s3
>>
17
)
|
(
s4
<<
4
))
out
[
11
]
=
byte
(
s4
>>
4
)
out
[
12
]
=
byte
(
s4
>>
12
)
out
[
13
]
=
byte
((
s4
>>
20
)
|
(
s5
<<
1
))
out
[
14
]
=
byte
(
s5
>>
7
)
out
[
15
]
=
byte
((
s5
>>
15
)
|
(
s6
<<
6
))
out
[
16
]
=
byte
(
s6
>>
2
)
out
[
17
]
=
byte
(
s6
>>
10
)
out
[
18
]
=
byte
((
s6
>>
18
)
|
(
s7
<<
3
))
out
[
19
]
=
byte
(
s7
>>
5
)
out
[
20
]
=
byte
(
s7
>>
13
)
out
[
21
]
=
byte
(
s8
>>
0
)
out
[
22
]
=
byte
(
s8
>>
8
)
out
[
23
]
=
byte
((
s8
>>
16
)
|
(
s9
<<
5
))
out
[
24
]
=
byte
(
s9
>>
3
)
out
[
25
]
=
byte
(
s9
>>
11
)
out
[
26
]
=
byte
((
s9
>>
19
)
|
(
s10
<<
2
))
out
[
27
]
=
byte
(
s10
>>
6
)
out
[
28
]
=
byte
((
s10
>>
14
)
|
(
s11
<<
7
))
out
[
29
]
=
byte
(
s11
>>
1
)
out
[
30
]
=
byte
(
s11
>>
9
)
out
[
31
]
=
byte
(
s11
>>
17
)
}
cmd/gost/vendor/golang.org/x/crypto/ssh/buffer.go
0 → 100644
View file @
d19d5ada
// Copyright 2012 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
ssh
import
(
"io"
"sync"
)
// buffer provides a linked list buffer for data exchange
// between producer and consumer. Theoretically the buffer is
// of unlimited capacity as it does no allocation of its own.
type
buffer
struct
{
// protects concurrent access to head, tail and closed
*
sync
.
Cond
head
*
element
// the buffer that will be read first
tail
*
element
// the buffer that will be read last
closed
bool
}
// An element represents a single link in a linked list.
type
element
struct
{
buf
[]
byte
next
*
element
}
// newBuffer returns an empty buffer that is not closed.
func
newBuffer
()
*
buffer
{
e
:=
new
(
element
)
b
:=
&
buffer
{
Cond
:
newCond
(),
head
:
e
,
tail
:
e
,
}
return
b
}
// write makes buf available for Read to receive.
// buf must not be modified after the call to write.
func
(
b
*
buffer
)
write
(
buf
[]
byte
)
{
b
.
Cond
.
L
.
Lock
()
e
:=
&
element
{
buf
:
buf
}
b
.
tail
.
next
=
e
b
.
tail
=
e
b
.
Cond
.
Signal
()
b
.
Cond
.
L
.
Unlock
()
}
// eof closes the buffer. Reads from the buffer once all
// the data has been consumed will receive os.EOF.
func
(
b
*
buffer
)
eof
()
error
{
b
.
Cond
.
L
.
Lock
()
b
.
closed
=
true
b
.
Cond
.
Signal
()
b
.
Cond
.
L
.
Unlock
()
return
nil
}
// Read reads data from the internal buffer in buf. Reads will block
// if no data is available, or until the buffer is closed.
func
(
b
*
buffer
)
Read
(
buf
[]
byte
)
(
n
int
,
err
error
)
{
b
.
Cond
.
L
.
Lock
()
defer
b
.
Cond
.
L
.
Unlock
()
for
len
(
buf
)
>
0
{
// if there is data in b.head, copy it
if
len
(
b
.
head
.
buf
)
>
0
{
r
:=
copy
(
buf
,
b
.
head
.
buf
)
buf
,
b
.
head
.
buf
=
buf
[
r
:
],
b
.
head
.
buf
[
r
:
]
n
+=
r
continue
}
// if there is a next buffer, make it the head
if
len
(
b
.
head
.
buf
)
==
0
&&
b
.
head
!=
b
.
tail
{
b
.
head
=
b
.
head
.
next
continue
}
// if at least one byte has been copied, return
if
n
>
0
{
break
}
// if nothing was read, and there is nothing outstanding
// check to see if the buffer is closed.
if
b
.
closed
{
err
=
io
.
EOF
break
}
// out of buffers, wait for producer
b
.
Cond
.
Wait
()
}
return
}
cmd/gost/vendor/golang.org/x/crypto/ssh/certs.go
0 → 100644
View file @
d19d5ada
// Copyright 2012 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
ssh
import
(
"bytes"
"errors"
"fmt"
"io"
"net"
"sort"
"time"
)
// These constants from [PROTOCOL.certkeys] represent the algorithm names
// for certificate types supported by this package.
const
(
CertAlgoRSAv01
=
"ssh-rsa-cert-v01@openssh.com"
CertAlgoDSAv01
=
"ssh-dss-cert-v01@openssh.com"
CertAlgoECDSA256v01
=
"ecdsa-sha2-nistp256-cert-v01@openssh.com"
CertAlgoECDSA384v01
=
"ecdsa-sha2-nistp384-cert-v01@openssh.com"
CertAlgoECDSA521v01
=
"ecdsa-sha2-nistp521-cert-v01@openssh.com"
CertAlgoED25519v01
=
"ssh-ed25519-cert-v01@openssh.com"
)
// Certificate types distinguish between host and user
// certificates. The values can be set in the CertType field of
// Certificate.
const
(
UserCert
=
1
HostCert
=
2
)
// Signature represents a cryptographic signature.
type
Signature
struct
{
Format
string
Blob
[]
byte
}
// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that
// a certificate does not expire.
const
CertTimeInfinity
=
1
<<
64
-
1
// An Certificate represents an OpenSSH certificate as defined in
// [PROTOCOL.certkeys]?rev=1.8.
type
Certificate
struct
{
Nonce
[]
byte
Key
PublicKey
Serial
uint64
CertType
uint32
KeyId
string
ValidPrincipals
[]
string
ValidAfter
uint64
ValidBefore
uint64
Permissions
Reserved
[]
byte
SignatureKey
PublicKey
Signature
*
Signature
}
// genericCertData holds the key-independent part of the certificate data.
// Overall, certificates contain an nonce, public key fields and
// key-independent fields.
type
genericCertData
struct
{
Serial
uint64
CertType
uint32
KeyId
string
ValidPrincipals
[]
byte
ValidAfter
uint64
ValidBefore
uint64
CriticalOptions
[]
byte
Extensions
[]
byte
Reserved
[]
byte
SignatureKey
[]
byte
Signature
[]
byte
}
func
marshalStringList
(
namelist
[]
string
)
[]
byte
{
var
to
[]
byte
for
_
,
name
:=
range
namelist
{
s
:=
struct
{
N
string
}{
name
}
to
=
append
(
to
,
Marshal
(
&
s
)
...
)
}
return
to
}
type
optionsTuple
struct
{
Key
string
Value
[]
byte
}
type
optionsTupleValue
struct
{
Value
string
}
// serialize a map of critical options or extensions
// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation,
// we need two length prefixes for a non-empty string value
func
marshalTuples
(
tups
map
[
string
]
string
)
[]
byte
{
keys
:=
make
([]
string
,
0
,
len
(
tups
))
for
key
:=
range
tups
{
keys
=
append
(
keys
,
key
)
}
sort
.
Strings
(
keys
)
var
ret
[]
byte
for
_
,
key
:=
range
keys
{
s
:=
optionsTuple
{
Key
:
key
}
if
value
:=
tups
[
key
];
len
(
value
)
>
0
{
s
.
Value
=
Marshal
(
&
optionsTupleValue
{
value
})
}
ret
=
append
(
ret
,
Marshal
(
&
s
)
...
)
}
return
ret
}
// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation,
// we need two length prefixes for a non-empty option value
func
parseTuples
(
in
[]
byte
)
(
map
[
string
]
string
,
error
)
{
tups
:=
map
[
string
]
string
{}
var
lastKey
string
var
haveLastKey
bool
for
len
(
in
)
>
0
{
var
key
,
val
,
extra
[]
byte
var
ok
bool
if
key
,
in
,
ok
=
parseString
(
in
);
!
ok
{
return
nil
,
errShortRead
}
keyStr
:=
string
(
key
)
// according to [PROTOCOL.certkeys], the names must be in
// lexical order.
if
haveLastKey
&&
keyStr
<=
lastKey
{
return
nil
,
fmt
.
Errorf
(
"ssh: certificate options are not in lexical order"
)
}
lastKey
,
haveLastKey
=
keyStr
,
true
// the next field is a data field, which if non-empty has a string embedded
if
val
,
in
,
ok
=
parseString
(
in
);
!
ok
{
return
nil
,
errShortRead
}
if
len
(
val
)
>
0
{
val
,
extra
,
ok
=
parseString
(
val
)
if
!
ok
{
return
nil
,
errShortRead
}
if
len
(
extra
)
>
0
{
return
nil
,
fmt
.
Errorf
(
"ssh: unexpected trailing data after certificate option value"
)
}
tups
[
keyStr
]
=
string
(
val
)
}
else
{
tups
[
keyStr
]
=
""
}
}
return
tups
,
nil
}
func
parseCert
(
in
[]
byte
,
privAlgo
string
)
(
*
Certificate
,
error
)
{
nonce
,
rest
,
ok
:=
parseString
(
in
)
if
!
ok
{
return
nil
,
errShortRead
}
key
,
rest
,
err
:=
parsePubKey
(
rest
,
privAlgo
)
if
err
!=
nil
{
return
nil
,
err
}
var
g
genericCertData
if
err
:=
Unmarshal
(
rest
,
&
g
);
err
!=
nil
{
return
nil
,
err
}
c
:=
&
Certificate
{
Nonce
:
nonce
,
Key
:
key
,
Serial
:
g
.
Serial
,
CertType
:
g
.
CertType
,
KeyId
:
g
.
KeyId
,
ValidAfter
:
g
.
ValidAfter
,
ValidBefore
:
g
.
ValidBefore
,
}
for
principals
:=
g
.
ValidPrincipals
;
len
(
principals
)
>
0
;
{
principal
,
rest
,
ok
:=
parseString
(
principals
)
if
!
ok
{
return
nil
,
errShortRead
}
c
.
ValidPrincipals
=
append
(
c
.
ValidPrincipals
,
string
(
principal
))
principals
=
rest
}
c
.
CriticalOptions
,
err
=
parseTuples
(
g
.
CriticalOptions
)
if
err
!=
nil
{
return
nil
,
err
}
c
.
Extensions
,
err
=
parseTuples
(
g
.
Extensions
)
if
err
!=
nil
{
return
nil
,
err
}
c
.
Reserved
=
g
.
Reserved
k
,
err
:=
ParsePublicKey
(
g
.
SignatureKey
)
if
err
!=
nil
{
return
nil
,
err
}
c
.
SignatureKey
=
k
c
.
Signature
,
rest
,
ok
=
parseSignatureBody
(
g
.
Signature
)
if
!
ok
||
len
(
rest
)
>
0
{
return
nil
,
errors
.
New
(
"ssh: signature parse error"
)
}
return
c
,
nil
}
type
openSSHCertSigner
struct
{
pub
*
Certificate
signer
Signer
}
// NewCertSigner returns a Signer that signs with the given Certificate, whose
// private key is held by signer. It returns an error if the public key in cert
// doesn't match the key used by signer.
func
NewCertSigner
(
cert
*
Certificate
,
signer
Signer
)
(
Signer
,
error
)
{
if
bytes
.
Compare
(
cert
.
Key
.
Marshal
(),
signer
.
PublicKey
()
.
Marshal
())
!=
0
{
return
nil
,
errors
.
New
(
"ssh: signer and cert have different public key"
)
}
return
&
openSSHCertSigner
{
cert
,
signer
},
nil
}
func
(
s
*
openSSHCertSigner
)
Sign
(
rand
io
.
Reader
,
data
[]
byte
)
(
*
Signature
,
error
)
{
return
s
.
signer
.
Sign
(
rand
,
data
)
}
func
(
s
*
openSSHCertSigner
)
PublicKey
()
PublicKey
{
return
s
.
pub
}
const
sourceAddressCriticalOption
=
"source-address"
// CertChecker does the work of verifying a certificate. Its methods
// can be plugged into ClientConfig.HostKeyCallback and
// ServerConfig.PublicKeyCallback. For the CertChecker to work,
// minimally, the IsAuthority callback should be set.
type
CertChecker
struct
{
// SupportedCriticalOptions lists the CriticalOptions that the
// server application layer understands. These are only used
// for user certificates.
SupportedCriticalOptions
[]
string
// IsAuthority should return true if the key is recognized as
// an authority. This allows for certificates to be signed by other
// certificates.
IsAuthority
func
(
auth
PublicKey
)
bool
// Clock is used for verifying time stamps. If nil, time.Now
// is used.
Clock
func
()
time
.
Time
// UserKeyFallback is called when CertChecker.Authenticate encounters a
// public key that is not a certificate. It must implement validation
// of user keys or else, if nil, all such keys are rejected.
UserKeyFallback
func
(
conn
ConnMetadata
,
key
PublicKey
)
(
*
Permissions
,
error
)
// HostKeyFallback is called when CertChecker.CheckHostKey encounters a
// public key that is not a certificate. It must implement host key
// validation or else, if nil, all such keys are rejected.
HostKeyFallback
func
(
addr
string
,
remote
net
.
Addr
,
key
PublicKey
)
error
// IsRevoked is called for each certificate so that revocation checking
// can be implemented. It should return true if the given certificate
// is revoked and false otherwise. If nil, no certificates are
// considered to have been revoked.
IsRevoked
func
(
cert
*
Certificate
)
bool
}
// CheckHostKey checks a host key certificate. This method can be
// plugged into ClientConfig.HostKeyCallback.
func
(
c
*
CertChecker
)
CheckHostKey
(
addr
string
,
remote
net
.
Addr
,
key
PublicKey
)
error
{
cert
,
ok
:=
key
.
(
*
Certificate
)
if
!
ok
{
if
c
.
HostKeyFallback
!=
nil
{
return
c
.
HostKeyFallback
(
addr
,
remote
,
key
)
}
return
errors
.
New
(
"ssh: non-certificate host key"
)
}
if
cert
.
CertType
!=
HostCert
{
return
fmt
.
Errorf
(
"ssh: certificate presented as a host key has type %d"
,
cert
.
CertType
)
}
return
c
.
CheckCert
(
addr
,
cert
)
}
// Authenticate checks a user certificate. Authenticate can be used as
// a value for ServerConfig.PublicKeyCallback.
func
(
c
*
CertChecker
)
Authenticate
(
conn
ConnMetadata
,
pubKey
PublicKey
)
(
*
Permissions
,
error
)
{
cert
,
ok
:=
pubKey
.
(
*
Certificate
)
if
!
ok
{
if
c
.
UserKeyFallback
!=
nil
{
return
c
.
UserKeyFallback
(
conn
,
pubKey
)
}
return
nil
,
errors
.
New
(
"ssh: normal key pairs not accepted"
)
}
if
cert
.
CertType
!=
UserCert
{
return
nil
,
fmt
.
Errorf
(
"ssh: cert has type %d"
,
cert
.
CertType
)
}
if
err
:=
c
.
CheckCert
(
conn
.
User
(),
cert
);
err
!=
nil
{
return
nil
,
err
}
return
&
cert
.
Permissions
,
nil
}
// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and
// the signature of the certificate.
func
(
c
*
CertChecker
)
CheckCert
(
principal
string
,
cert
*
Certificate
)
error
{
if
c
.
IsRevoked
!=
nil
&&
c
.
IsRevoked
(
cert
)
{
return
fmt
.
Errorf
(
"ssh: certicate serial %d revoked"
,
cert
.
Serial
)
}
for
opt
,
_
:=
range
cert
.
CriticalOptions
{
// sourceAddressCriticalOption will be enforced by
// serverAuthenticate
if
opt
==
sourceAddressCriticalOption
{
continue
}
found
:=
false
for
_
,
supp
:=
range
c
.
SupportedCriticalOptions
{
if
supp
==
opt
{
found
=
true
break
}
}
if
!
found
{
return
fmt
.
Errorf
(
"ssh: unsupported critical option %q in certificate"
,
opt
)
}
}
if
len
(
cert
.
ValidPrincipals
)
>
0
{
// By default, certs are valid for all users/hosts.
found
:=
false
for
_
,
p
:=
range
cert
.
ValidPrincipals
{
if
p
==
principal
{
found
=
true
break
}
}
if
!
found
{
return
fmt
.
Errorf
(
"ssh: principal %q not in the set of valid principals for given certificate: %q"
,
principal
,
cert
.
ValidPrincipals
)
}
}
if
!
c
.
IsAuthority
(
cert
.
SignatureKey
)
{
return
fmt
.
Errorf
(
"ssh: certificate signed by unrecognized authority"
)
}
clock
:=
c
.
Clock
if
clock
==
nil
{
clock
=
time
.
Now
}
unixNow
:=
clock
()
.
Unix
()
if
after
:=
int64
(
cert
.
ValidAfter
);
after
<
0
||
unixNow
<
int64
(
cert
.
ValidAfter
)
{
return
fmt
.
Errorf
(
"ssh: cert is not yet valid"
)
}
if
before
:=
int64
(
cert
.
ValidBefore
);
cert
.
ValidBefore
!=
uint64
(
CertTimeInfinity
)
&&
(
unixNow
>=
before
||
before
<
0
)
{
return
fmt
.
Errorf
(
"ssh: cert has expired"
)
}
if
err
:=
cert
.
SignatureKey
.
Verify
(
cert
.
bytesForSigning
(),
cert
.
Signature
);
err
!=
nil
{
return
fmt
.
Errorf
(
"ssh: certificate signature does not verify"
)
}
return
nil
}
// SignCert sets c.SignatureKey to the authority's public key and stores a
// Signature, by authority, in the certificate.
func
(
c
*
Certificate
)
SignCert
(
rand
io
.
Reader
,
authority
Signer
)
error
{
c
.
Nonce
=
make
([]
byte
,
32
)
if
_
,
err
:=
io
.
ReadFull
(
rand
,
c
.
Nonce
);
err
!=
nil
{
return
err
}
c
.
SignatureKey
=
authority
.
PublicKey
()
sig
,
err
:=
authority
.
Sign
(
rand
,
c
.
bytesForSigning
())
if
err
!=
nil
{
return
err
}
c
.
Signature
=
sig
return
nil
}
var
certAlgoNames
=
map
[
string
]
string
{
KeyAlgoRSA
:
CertAlgoRSAv01
,
KeyAlgoDSA
:
CertAlgoDSAv01
,
KeyAlgoECDSA256
:
CertAlgoECDSA256v01
,
KeyAlgoECDSA384
:
CertAlgoECDSA384v01
,
KeyAlgoECDSA521
:
CertAlgoECDSA521v01
,
KeyAlgoED25519
:
CertAlgoED25519v01
,
}
// certToPrivAlgo returns the underlying algorithm for a certificate algorithm.
// Panics if a non-certificate algorithm is passed.
func
certToPrivAlgo
(
algo
string
)
string
{
for
privAlgo
,
pubAlgo
:=
range
certAlgoNames
{
if
pubAlgo
==
algo
{
return
privAlgo
}
}
panic
(
"unknown cert algorithm"
)
}
func
(
cert
*
Certificate
)
bytesForSigning
()
[]
byte
{
c2
:=
*
cert
c2
.
Signature
=
nil
out
:=
c2
.
Marshal
()
// Drop trailing signature length.
return
out
[
:
len
(
out
)
-
4
]
}
// Marshal serializes c into OpenSSH's wire format. It is part of the
// PublicKey interface.
func
(
c
*
Certificate
)
Marshal
()
[]
byte
{
generic
:=
genericCertData
{
Serial
:
c
.
Serial
,
CertType
:
c
.
CertType
,
KeyId
:
c
.
KeyId
,
ValidPrincipals
:
marshalStringList
(
c
.
ValidPrincipals
),
ValidAfter
:
uint64
(
c
.
ValidAfter
),
ValidBefore
:
uint64
(
c
.
ValidBefore
),
CriticalOptions
:
marshalTuples
(
c
.
CriticalOptions
),
Extensions
:
marshalTuples
(
c
.
Extensions
),
Reserved
:
c
.
Reserved
,
SignatureKey
:
c
.
SignatureKey
.
Marshal
(),
}
if
c
.
Signature
!=
nil
{
generic
.
Signature
=
Marshal
(
c
.
Signature
)
}
genericBytes
:=
Marshal
(
&
generic
)
keyBytes
:=
c
.
Key
.
Marshal
()
_
,
keyBytes
,
_
=
parseString
(
keyBytes
)
prefix
:=
Marshal
(
&
struct
{
Name
string
Nonce
[]
byte
Key
[]
byte
`ssh:"rest"`
}{
c
.
Type
(),
c
.
Nonce
,
keyBytes
})
result
:=
make
([]
byte
,
0
,
len
(
prefix
)
+
len
(
genericBytes
))
result
=
append
(
result
,
prefix
...
)
result
=
append
(
result
,
genericBytes
...
)
return
result
}
// Type returns the key name. It is part of the PublicKey interface.
func
(
c
*
Certificate
)
Type
()
string
{
algo
,
ok
:=
certAlgoNames
[
c
.
Key
.
Type
()]
if
!
ok
{
panic
(
"unknown cert key type "
+
c
.
Key
.
Type
())
}
return
algo
}
// Verify verifies a signature against the certificate's public
// key. It is part of the PublicKey interface.
func
(
c
*
Certificate
)
Verify
(
data
[]
byte
,
sig
*
Signature
)
error
{
return
c
.
Key
.
Verify
(
data
,
sig
)
}
func
parseSignatureBody
(
in
[]
byte
)
(
out
*
Signature
,
rest
[]
byte
,
ok
bool
)
{
format
,
in
,
ok
:=
parseString
(
in
)
if
!
ok
{
return
}
out
=
&
Signature
{
Format
:
string
(
format
),
}
if
out
.
Blob
,
in
,
ok
=
parseString
(
in
);
!
ok
{
return
}
return
out
,
in
,
ok
}
func
parseSignature
(
in
[]
byte
)
(
out
*
Signature
,
rest
[]
byte
,
ok
bool
)
{
sigBytes
,
rest
,
ok
:=
parseString
(
in
)
if
!
ok
{
return
}
out
,
trailing
,
ok
:=
parseSignatureBody
(
sigBytes
)
if
!
ok
||
len
(
trailing
)
>
0
{
return
nil
,
nil
,
false
}
return
}
cmd/gost/vendor/golang.org/x/crypto/ssh/channel.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"encoding/binary"
"errors"
"fmt"
"io"
"log"
"sync"
)
const
(
minPacketLength
=
9
// channelMaxPacket contains the maximum number of bytes that will be
// sent in a single packet. As per RFC 4253, section 6.1, 32k is also
// the minimum.
channelMaxPacket
=
1
<<
15
// We follow OpenSSH here.
channelWindowSize
=
64
*
channelMaxPacket
)
// NewChannel represents an incoming request to a channel. It must either be
// accepted for use by calling Accept, or rejected by calling Reject.
type
NewChannel
interface
{
// Accept accepts the channel creation request. It returns the Channel
// and a Go channel containing SSH requests. The Go channel must be
// serviced otherwise the Channel will hang.
Accept
()
(
Channel
,
<-
chan
*
Request
,
error
)
// Reject rejects the channel creation request. After calling
// this, no other methods on the Channel may be called.
Reject
(
reason
RejectionReason
,
message
string
)
error
// ChannelType returns the type of the channel, as supplied by the
// client.
ChannelType
()
string
// ExtraData returns the arbitrary payload for this channel, as supplied
// by the client. This data is specific to the channel type.
ExtraData
()
[]
byte
}
// A Channel is an ordered, reliable, flow-controlled, duplex stream
// that is multiplexed over an SSH connection.
type
Channel
interface
{
// Read reads up to len(data) bytes from the channel.
Read
(
data
[]
byte
)
(
int
,
error
)
// Write writes len(data) bytes to the channel.
Write
(
data
[]
byte
)
(
int
,
error
)
// Close signals end of channel use. No data may be sent after this
// call.
Close
()
error
// CloseWrite signals the end of sending in-band
// data. Requests may still be sent, and the other side may
// still send data
CloseWrite
()
error
// SendRequest sends a channel request. If wantReply is true,
// it will wait for a reply and return the result as a
// boolean, otherwise the return value will be false. Channel
// requests are out-of-band messages so they may be sent even
// if the data stream is closed or blocked by flow control.
// If the channel is closed before a reply is returned, io.EOF
// is returned.
SendRequest
(
name
string
,
wantReply
bool
,
payload
[]
byte
)
(
bool
,
error
)
// Stderr returns an io.ReadWriter that writes to this channel
// with the extended data type set to stderr. Stderr may
// safely be read and written from a different goroutine than
// Read and Write respectively.
Stderr
()
io
.
ReadWriter
}
// Request is a request sent outside of the normal stream of
// data. Requests can either be specific to an SSH channel, or they
// can be global.
type
Request
struct
{
Type
string
WantReply
bool
Payload
[]
byte
ch
*
channel
mux
*
mux
}
// Reply sends a response to a request. It must be called for all requests
// where WantReply is true and is a no-op otherwise. The payload argument is
// ignored for replies to channel-specific requests.
func
(
r
*
Request
)
Reply
(
ok
bool
,
payload
[]
byte
)
error
{
if
!
r
.
WantReply
{
return
nil
}
if
r
.
ch
==
nil
{
return
r
.
mux
.
ackRequest
(
ok
,
payload
)
}
return
r
.
ch
.
ackRequest
(
ok
)
}
// RejectionReason is an enumeration used when rejecting channel creation
// requests. See RFC 4254, section 5.1.
type
RejectionReason
uint32
const
(
Prohibited
RejectionReason
=
iota
+
1
ConnectionFailed
UnknownChannelType
ResourceShortage
)
// String converts the rejection reason to human readable form.
func
(
r
RejectionReason
)
String
()
string
{
switch
r
{
case
Prohibited
:
return
"administratively prohibited"
case
ConnectionFailed
:
return
"connect failed"
case
UnknownChannelType
:
return
"unknown channel type"
case
ResourceShortage
:
return
"resource shortage"
}
return
fmt
.
Sprintf
(
"unknown reason %d"
,
int
(
r
))
}
func
min
(
a
uint32
,
b
int
)
uint32
{
if
a
<
uint32
(
b
)
{
return
a
}
return
uint32
(
b
)
}
type
channelDirection
uint8
const
(
channelInbound
channelDirection
=
iota
channelOutbound
)
// channel is an implementation of the Channel interface that works
// with the mux class.
type
channel
struct
{
// R/O after creation
chanType
string
extraData
[]
byte
localId
,
remoteId
uint32
// maxIncomingPayload and maxRemotePayload are the maximum
// payload sizes of normal and extended data packets for
// receiving and sending, respectively. The wire packet will
// be 9 or 13 bytes larger (excluding encryption overhead).
maxIncomingPayload
uint32
maxRemotePayload
uint32
mux
*
mux
// decided is set to true if an accept or reject message has been sent
// (for outbound channels) or received (for inbound channels).
decided
bool
// direction contains either channelOutbound, for channels created
// locally, or channelInbound, for channels created by the peer.
direction
channelDirection
// Pending internal channel messages.
msg
chan
interface
{}
// Since requests have no ID, there can be only one request
// with WantReply=true outstanding. This lock is held by a
// goroutine that has such an outgoing request pending.
sentRequestMu
sync
.
Mutex
incomingRequests
chan
*
Request
sentEOF
bool
// thread-safe data
remoteWin
window
pending
*
buffer
extPending
*
buffer
// windowMu protects myWindow, the flow-control window.
windowMu
sync
.
Mutex
myWindow
uint32
// writeMu serializes calls to mux.conn.writePacket() and
// protects sentClose and packetPool. This mutex must be
// different from windowMu, as writePacket can block if there
// is a key exchange pending.
writeMu
sync
.
Mutex
sentClose
bool
// packetPool has a buffer for each extended channel ID to
// save allocations during writes.
packetPool
map
[
uint32
][]
byte
}
// writePacket sends a packet. If the packet is a channel close, it updates
// sentClose. This method takes the lock c.writeMu.
func
(
c
*
channel
)
writePacket
(
packet
[]
byte
)
error
{
c
.
writeMu
.
Lock
()
if
c
.
sentClose
{
c
.
writeMu
.
Unlock
()
return
io
.
EOF
}
c
.
sentClose
=
(
packet
[
0
]
==
msgChannelClose
)
err
:=
c
.
mux
.
conn
.
writePacket
(
packet
)
c
.
writeMu
.
Unlock
()
return
err
}
func
(
c
*
channel
)
sendMessage
(
msg
interface
{})
error
{
if
debugMux
{
log
.
Printf
(
"send(%d): %#v"
,
c
.
mux
.
chanList
.
offset
,
msg
)
}
p
:=
Marshal
(
msg
)
binary
.
BigEndian
.
PutUint32
(
p
[
1
:
],
c
.
remoteId
)
return
c
.
writePacket
(
p
)
}
// WriteExtended writes data to a specific extended stream. These streams are
// used, for example, for stderr.
func
(
c
*
channel
)
WriteExtended
(
data
[]
byte
,
extendedCode
uint32
)
(
n
int
,
err
error
)
{
if
c
.
sentEOF
{
return
0
,
io
.
EOF
}
// 1 byte message type, 4 bytes remoteId, 4 bytes data length
opCode
:=
byte
(
msgChannelData
)
headerLength
:=
uint32
(
9
)
if
extendedCode
>
0
{
headerLength
+=
4
opCode
=
msgChannelExtendedData
}
c
.
writeMu
.
Lock
()
packet
:=
c
.
packetPool
[
extendedCode
]
// We don't remove the buffer from packetPool, so
// WriteExtended calls from different goroutines will be
// flagged as errors by the race detector.
c
.
writeMu
.
Unlock
()
for
len
(
data
)
>
0
{
space
:=
min
(
c
.
maxRemotePayload
,
len
(
data
))
if
space
,
err
=
c
.
remoteWin
.
reserve
(
space
);
err
!=
nil
{
return
n
,
err
}
if
want
:=
headerLength
+
space
;
uint32
(
cap
(
packet
))
<
want
{
packet
=
make
([]
byte
,
want
)
}
else
{
packet
=
packet
[
:
want
]
}
todo
:=
data
[
:
space
]
packet
[
0
]
=
opCode
binary
.
BigEndian
.
PutUint32
(
packet
[
1
:
],
c
.
remoteId
)
if
extendedCode
>
0
{
binary
.
BigEndian
.
PutUint32
(
packet
[
5
:
],
uint32
(
extendedCode
))
}
binary
.
BigEndian
.
PutUint32
(
packet
[
headerLength
-
4
:
],
uint32
(
len
(
todo
)))
copy
(
packet
[
headerLength
:
],
todo
)
if
err
=
c
.
writePacket
(
packet
);
err
!=
nil
{
return
n
,
err
}
n
+=
len
(
todo
)
data
=
data
[
len
(
todo
)
:
]
}
c
.
writeMu
.
Lock
()
c
.
packetPool
[
extendedCode
]
=
packet
c
.
writeMu
.
Unlock
()
return
n
,
err
}
func
(
c
*
channel
)
handleData
(
packet
[]
byte
)
error
{
headerLen
:=
9
isExtendedData
:=
packet
[
0
]
==
msgChannelExtendedData
if
isExtendedData
{
headerLen
=
13
}
if
len
(
packet
)
<
headerLen
{
// malformed data packet
return
parseError
(
packet
[
0
])
}
var
extended
uint32
if
isExtendedData
{
extended
=
binary
.
BigEndian
.
Uint32
(
packet
[
5
:
])
}
length
:=
binary
.
BigEndian
.
Uint32
(
packet
[
headerLen
-
4
:
headerLen
])
if
length
==
0
{
return
nil
}
if
length
>
c
.
maxIncomingPayload
{
// TODO(hanwen): should send Disconnect?
return
errors
.
New
(
"ssh: incoming packet exceeds maximum payload size"
)
}
data
:=
packet
[
headerLen
:
]
if
length
!=
uint32
(
len
(
data
))
{
return
errors
.
New
(
"ssh: wrong packet length"
)
}
c
.
windowMu
.
Lock
()
if
c
.
myWindow
<
length
{
c
.
windowMu
.
Unlock
()
// TODO(hanwen): should send Disconnect with reason?
return
errors
.
New
(
"ssh: remote side wrote too much"
)
}
c
.
myWindow
-=
length
c
.
windowMu
.
Unlock
()
if
extended
==
1
{
c
.
extPending
.
write
(
data
)
}
else
if
extended
>
0
{
// discard other extended data.
}
else
{
c
.
pending
.
write
(
data
)
}
return
nil
}
func
(
c
*
channel
)
adjustWindow
(
n
uint32
)
error
{
c
.
windowMu
.
Lock
()
// Since myWindow is managed on our side, and can never exceed
// the initial window setting, we don't worry about overflow.
c
.
myWindow
+=
uint32
(
n
)
c
.
windowMu
.
Unlock
()
return
c
.
sendMessage
(
windowAdjustMsg
{
AdditionalBytes
:
uint32
(
n
),
})
}
func
(
c
*
channel
)
ReadExtended
(
data
[]
byte
,
extended
uint32
)
(
n
int
,
err
error
)
{
switch
extended
{
case
1
:
n
,
err
=
c
.
extPending
.
Read
(
data
)
case
0
:
n
,
err
=
c
.
pending
.
Read
(
data
)
default
:
return
0
,
fmt
.
Errorf
(
"ssh: extended code %d unimplemented"
,
extended
)
}
if
n
>
0
{
err
=
c
.
adjustWindow
(
uint32
(
n
))
// sendWindowAdjust can return io.EOF if the remote
// peer has closed the connection, however we want to
// defer forwarding io.EOF to the caller of Read until
// the buffer has been drained.
if
n
>
0
&&
err
==
io
.
EOF
{
err
=
nil
}
}
return
n
,
err
}
func
(
c
*
channel
)
close
()
{
c
.
pending
.
eof
()
c
.
extPending
.
eof
()
close
(
c
.
msg
)
close
(
c
.
incomingRequests
)
c
.
writeMu
.
Lock
()
// This is not necessary for a normal channel teardown, but if
// there was another error, it is.
c
.
sentClose
=
true
c
.
writeMu
.
Unlock
()
// Unblock writers.
c
.
remoteWin
.
close
()
}
// responseMessageReceived is called when a success or failure message is
// received on a channel to check that such a message is reasonable for the
// given channel.
func
(
c
*
channel
)
responseMessageReceived
()
error
{
if
c
.
direction
==
channelInbound
{
return
errors
.
New
(
"ssh: channel response message received on inbound channel"
)
}
if
c
.
decided
{
return
errors
.
New
(
"ssh: duplicate response received for channel"
)
}
c
.
decided
=
true
return
nil
}
func
(
c
*
channel
)
handlePacket
(
packet
[]
byte
)
error
{
switch
packet
[
0
]
{
case
msgChannelData
,
msgChannelExtendedData
:
return
c
.
handleData
(
packet
)
case
msgChannelClose
:
c
.
sendMessage
(
channelCloseMsg
{
PeersId
:
c
.
remoteId
})
c
.
mux
.
chanList
.
remove
(
c
.
localId
)
c
.
close
()
return
nil
case
msgChannelEOF
:
// RFC 4254 is mute on how EOF affects dataExt messages but
// it is logical to signal EOF at the same time.
c
.
extPending
.
eof
()
c
.
pending
.
eof
()
return
nil
}
decoded
,
err
:=
decode
(
packet
)
if
err
!=
nil
{
return
err
}
switch
msg
:=
decoded
.
(
type
)
{
case
*
channelOpenFailureMsg
:
if
err
:=
c
.
responseMessageReceived
();
err
!=
nil
{
return
err
}
c
.
mux
.
chanList
.
remove
(
msg
.
PeersId
)
c
.
msg
<-
msg
case
*
channelOpenConfirmMsg
:
if
err
:=
c
.
responseMessageReceived
();
err
!=
nil
{
return
err
}
if
msg
.
MaxPacketSize
<
minPacketLength
||
msg
.
MaxPacketSize
>
1
<<
31
{
return
fmt
.
Errorf
(
"ssh: invalid MaxPacketSize %d from peer"
,
msg
.
MaxPacketSize
)
}
c
.
remoteId
=
msg
.
MyId
c
.
maxRemotePayload
=
msg
.
MaxPacketSize
c
.
remoteWin
.
add
(
msg
.
MyWindow
)
c
.
msg
<-
msg
case
*
windowAdjustMsg
:
if
!
c
.
remoteWin
.
add
(
msg
.
AdditionalBytes
)
{
return
fmt
.
Errorf
(
"ssh: invalid window update for %d bytes"
,
msg
.
AdditionalBytes
)
}
case
*
channelRequestMsg
:
req
:=
Request
{
Type
:
msg
.
Request
,
WantReply
:
msg
.
WantReply
,
Payload
:
msg
.
RequestSpecificData
,
ch
:
c
,
}
c
.
incomingRequests
<-
&
req
default
:
c
.
msg
<-
msg
}
return
nil
}
func
(
m
*
mux
)
newChannel
(
chanType
string
,
direction
channelDirection
,
extraData
[]
byte
)
*
channel
{
ch
:=
&
channel
{
remoteWin
:
window
{
Cond
:
newCond
()},
myWindow
:
channelWindowSize
,
pending
:
newBuffer
(),
extPending
:
newBuffer
(),
direction
:
direction
,
incomingRequests
:
make
(
chan
*
Request
,
chanSize
),
msg
:
make
(
chan
interface
{},
chanSize
),
chanType
:
chanType
,
extraData
:
extraData
,
mux
:
m
,
packetPool
:
make
(
map
[
uint32
][]
byte
),
}
ch
.
localId
=
m
.
chanList
.
add
(
ch
)
return
ch
}
var
errUndecided
=
errors
.
New
(
"ssh: must Accept or Reject channel"
)
var
errDecidedAlready
=
errors
.
New
(
"ssh: can call Accept or Reject only once"
)
type
extChannel
struct
{
code
uint32
ch
*
channel
}
func
(
e
*
extChannel
)
Write
(
data
[]
byte
)
(
n
int
,
err
error
)
{
return
e
.
ch
.
WriteExtended
(
data
,
e
.
code
)
}
func
(
e
*
extChannel
)
Read
(
data
[]
byte
)
(
n
int
,
err
error
)
{
return
e
.
ch
.
ReadExtended
(
data
,
e
.
code
)
}
func
(
c
*
channel
)
Accept
()
(
Channel
,
<-
chan
*
Request
,
error
)
{
if
c
.
decided
{
return
nil
,
nil
,
errDecidedAlready
}
c
.
maxIncomingPayload
=
channelMaxPacket
confirm
:=
channelOpenConfirmMsg
{
PeersId
:
c
.
remoteId
,
MyId
:
c
.
localId
,
MyWindow
:
c
.
myWindow
,
MaxPacketSize
:
c
.
maxIncomingPayload
,
}
c
.
decided
=
true
if
err
:=
c
.
sendMessage
(
confirm
);
err
!=
nil
{
return
nil
,
nil
,
err
}
return
c
,
c
.
incomingRequests
,
nil
}
func
(
ch
*
channel
)
Reject
(
reason
RejectionReason
,
message
string
)
error
{
if
ch
.
decided
{
return
errDecidedAlready
}
reject
:=
channelOpenFailureMsg
{
PeersId
:
ch
.
remoteId
,
Reason
:
reason
,
Message
:
message
,
Language
:
"en"
,
}
ch
.
decided
=
true
return
ch
.
sendMessage
(
reject
)
}
func
(
ch
*
channel
)
Read
(
data
[]
byte
)
(
int
,
error
)
{
if
!
ch
.
decided
{
return
0
,
errUndecided
}
return
ch
.
ReadExtended
(
data
,
0
)
}
func
(
ch
*
channel
)
Write
(
data
[]
byte
)
(
int
,
error
)
{
if
!
ch
.
decided
{
return
0
,
errUndecided
}
return
ch
.
WriteExtended
(
data
,
0
)
}
func
(
ch
*
channel
)
CloseWrite
()
error
{
if
!
ch
.
decided
{
return
errUndecided
}
ch
.
sentEOF
=
true
return
ch
.
sendMessage
(
channelEOFMsg
{
PeersId
:
ch
.
remoteId
})
}
func
(
ch
*
channel
)
Close
()
error
{
if
!
ch
.
decided
{
return
errUndecided
}
return
ch
.
sendMessage
(
channelCloseMsg
{
PeersId
:
ch
.
remoteId
})
}
// Extended returns an io.ReadWriter that sends and receives data on the given,
// SSH extended stream. Such streams are used, for example, for stderr.
func
(
ch
*
channel
)
Extended
(
code
uint32
)
io
.
ReadWriter
{
if
!
ch
.
decided
{
return
nil
}
return
&
extChannel
{
code
,
ch
}
}
func
(
ch
*
channel
)
Stderr
()
io
.
ReadWriter
{
return
ch
.
Extended
(
1
)
}
func
(
ch
*
channel
)
SendRequest
(
name
string
,
wantReply
bool
,
payload
[]
byte
)
(
bool
,
error
)
{
if
!
ch
.
decided
{
return
false
,
errUndecided
}
if
wantReply
{
ch
.
sentRequestMu
.
Lock
()
defer
ch
.
sentRequestMu
.
Unlock
()
}
msg
:=
channelRequestMsg
{
PeersId
:
ch
.
remoteId
,
Request
:
name
,
WantReply
:
wantReply
,
RequestSpecificData
:
payload
,
}
if
err
:=
ch
.
sendMessage
(
msg
);
err
!=
nil
{
return
false
,
err
}
if
wantReply
{
m
,
ok
:=
(
<-
ch
.
msg
)
if
!
ok
{
return
false
,
io
.
EOF
}
switch
m
.
(
type
)
{
case
*
channelRequestFailureMsg
:
return
false
,
nil
case
*
channelRequestSuccessMsg
:
return
true
,
nil
default
:
return
false
,
fmt
.
Errorf
(
"ssh: unexpected response to channel request: %#v"
,
m
)
}
}
return
false
,
nil
}
// ackRequest either sends an ack or nack to the channel request.
func
(
ch
*
channel
)
ackRequest
(
ok
bool
)
error
{
if
!
ch
.
decided
{
return
errUndecided
}
var
msg
interface
{}
if
!
ok
{
msg
=
channelRequestFailureMsg
{
PeersId
:
ch
.
remoteId
,
}
}
else
{
msg
=
channelRequestSuccessMsg
{
PeersId
:
ch
.
remoteId
,
}
}
return
ch
.
sendMessage
(
msg
)
}
func
(
ch
*
channel
)
ChannelType
()
string
{
return
ch
.
chanType
}
func
(
ch
*
channel
)
ExtraData
()
[]
byte
{
return
ch
.
extraData
}
cmd/gost/vendor/golang.org/x/crypto/ssh/cipher.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"crypto/aes"
"crypto/cipher"
"crypto/des"
"crypto/rc4"
"crypto/subtle"
"encoding/binary"
"errors"
"fmt"
"hash"
"io"
"io/ioutil"
)
const
(
packetSizeMultiple
=
16
// TODO(huin) this should be determined by the cipher.
// RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations
// MUST be able to process (plus a few more kilobytes for padding and mac). The RFC
// indicates implementations SHOULD be able to handle larger packet sizes, but then
// waffles on about reasonable limits.
//
// OpenSSH caps their maxPacket at 256kB so we choose to do
// the same. maxPacket is also used to ensure that uint32
// length fields do not overflow, so it should remain well
// below 4G.
maxPacket
=
256
*
1024
)
// noneCipher implements cipher.Stream and provides no encryption. It is used
// by the transport before the first key-exchange.
type
noneCipher
struct
{}
func
(
c
noneCipher
)
XORKeyStream
(
dst
,
src
[]
byte
)
{
copy
(
dst
,
src
)
}
func
newAESCTR
(
key
,
iv
[]
byte
)
(
cipher
.
Stream
,
error
)
{
c
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
err
}
return
cipher
.
NewCTR
(
c
,
iv
),
nil
}
func
newRC4
(
key
,
iv
[]
byte
)
(
cipher
.
Stream
,
error
)
{
return
rc4
.
NewCipher
(
key
)
}
type
streamCipherMode
struct
{
keySize
int
ivSize
int
skip
int
createFunc
func
(
key
,
iv
[]
byte
)
(
cipher
.
Stream
,
error
)
}
func
(
c
*
streamCipherMode
)
createStream
(
key
,
iv
[]
byte
)
(
cipher
.
Stream
,
error
)
{
if
len
(
key
)
<
c
.
keySize
{
panic
(
"ssh: key length too small for cipher"
)
}
if
len
(
iv
)
<
c
.
ivSize
{
panic
(
"ssh: iv too small for cipher"
)
}
stream
,
err
:=
c
.
createFunc
(
key
[
:
c
.
keySize
],
iv
[
:
c
.
ivSize
])
if
err
!=
nil
{
return
nil
,
err
}
var
streamDump
[]
byte
if
c
.
skip
>
0
{
streamDump
=
make
([]
byte
,
512
)
}
for
remainingToDump
:=
c
.
skip
;
remainingToDump
>
0
;
{
dumpThisTime
:=
remainingToDump
if
dumpThisTime
>
len
(
streamDump
)
{
dumpThisTime
=
len
(
streamDump
)
}
stream
.
XORKeyStream
(
streamDump
[
:
dumpThisTime
],
streamDump
[
:
dumpThisTime
])
remainingToDump
-=
dumpThisTime
}
return
stream
,
nil
}
// cipherModes documents properties of supported ciphers. Ciphers not included
// are not supported and will not be negotiated, even if explicitly requested in
// ClientConfig.Crypto.Ciphers.
var
cipherModes
=
map
[
string
]
*
streamCipherMode
{
// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms
// are defined in the order specified in the RFC.
"aes128-ctr"
:
{
16
,
aes
.
BlockSize
,
0
,
newAESCTR
},
"aes192-ctr"
:
{
24
,
aes
.
BlockSize
,
0
,
newAESCTR
},
"aes256-ctr"
:
{
32
,
aes
.
BlockSize
,
0
,
newAESCTR
},
// Ciphers from RFC4345, which introduces security-improved arcfour ciphers.
// They are defined in the order specified in the RFC.
"arcfour128"
:
{
16
,
0
,
1536
,
newRC4
},
"arcfour256"
:
{
32
,
0
,
1536
,
newRC4
},
// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.
// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and
// RC4) has problems with weak keys, and should be used with caution."
// RFC4345 introduces improved versions of Arcfour.
"arcfour"
:
{
16
,
0
,
0
,
newRC4
},
// AES-GCM is not a stream cipher, so it is constructed with a
// special case. If we add any more non-stream ciphers, we
// should invest a cleaner way to do this.
gcmCipherID
:
{
16
,
12
,
0
,
nil
},
// CBC mode is insecure and so is not included in the default config.
// (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely
// needed, it's possible to specify a custom Config to enable it.
// You should expect that an active attacker can recover plaintext if
// you do.
aes128cbcID
:
{
16
,
aes
.
BlockSize
,
0
,
nil
},
// 3des-cbc is insecure and is disabled by default.
tripledescbcID
:
{
24
,
des
.
BlockSize
,
0
,
nil
},
}
// prefixLen is the length of the packet prefix that contains the packet length
// and number of padding bytes.
const
prefixLen
=
5
// streamPacketCipher is a packetCipher using a stream cipher.
type
streamPacketCipher
struct
{
mac
hash
.
Hash
cipher
cipher
.
Stream
etm
bool
// The following members are to avoid per-packet allocations.
prefix
[
prefixLen
]
byte
seqNumBytes
[
4
]
byte
padding
[
2
*
packetSizeMultiple
]
byte
packetData
[]
byte
macResult
[]
byte
}
// readPacket reads and decrypt a single packet from the reader argument.
func
(
s
*
streamPacketCipher
)
readPacket
(
seqNum
uint32
,
r
io
.
Reader
)
([]
byte
,
error
)
{
if
_
,
err
:=
io
.
ReadFull
(
r
,
s
.
prefix
[
:
]);
err
!=
nil
{
return
nil
,
err
}
var
encryptedPaddingLength
[
1
]
byte
if
s
.
mac
!=
nil
&&
s
.
etm
{
copy
(
encryptedPaddingLength
[
:
],
s
.
prefix
[
4
:
5
])
s
.
cipher
.
XORKeyStream
(
s
.
prefix
[
4
:
5
],
s
.
prefix
[
4
:
5
])
}
else
{
s
.
cipher
.
XORKeyStream
(
s
.
prefix
[
:
],
s
.
prefix
[
:
])
}
length
:=
binary
.
BigEndian
.
Uint32
(
s
.
prefix
[
0
:
4
])
paddingLength
:=
uint32
(
s
.
prefix
[
4
])
var
macSize
uint32
if
s
.
mac
!=
nil
{
s
.
mac
.
Reset
()
binary
.
BigEndian
.
PutUint32
(
s
.
seqNumBytes
[
:
],
seqNum
)
s
.
mac
.
Write
(
s
.
seqNumBytes
[
:
])
if
s
.
etm
{
s
.
mac
.
Write
(
s
.
prefix
[
:
4
])
s
.
mac
.
Write
(
encryptedPaddingLength
[
:
])
}
else
{
s
.
mac
.
Write
(
s
.
prefix
[
:
])
}
macSize
=
uint32
(
s
.
mac
.
Size
())
}
if
length
<=
paddingLength
+
1
{
return
nil
,
errors
.
New
(
"ssh: invalid packet length, packet too small"
)
}
if
length
>
maxPacket
{
return
nil
,
errors
.
New
(
"ssh: invalid packet length, packet too large"
)
}
// the maxPacket check above ensures that length-1+macSize
// does not overflow.
if
uint32
(
cap
(
s
.
packetData
))
<
length
-
1
+
macSize
{
s
.
packetData
=
make
([]
byte
,
length
-
1
+
macSize
)
}
else
{
s
.
packetData
=
s
.
packetData
[
:
length
-
1
+
macSize
]
}
if
_
,
err
:=
io
.
ReadFull
(
r
,
s
.
packetData
);
err
!=
nil
{
return
nil
,
err
}
mac
:=
s
.
packetData
[
length
-
1
:
]
data
:=
s
.
packetData
[
:
length
-
1
]
if
s
.
mac
!=
nil
&&
s
.
etm
{
s
.
mac
.
Write
(
data
)
}
s
.
cipher
.
XORKeyStream
(
data
,
data
)
if
s
.
mac
!=
nil
{
if
!
s
.
etm
{
s
.
mac
.
Write
(
data
)
}
s
.
macResult
=
s
.
mac
.
Sum
(
s
.
macResult
[
:
0
])
if
subtle
.
ConstantTimeCompare
(
s
.
macResult
,
mac
)
!=
1
{
return
nil
,
errors
.
New
(
"ssh: MAC failure"
)
}
}
return
s
.
packetData
[
:
length
-
paddingLength
-
1
],
nil
}
// writePacket encrypts and sends a packet of data to the writer argument
func
(
s
*
streamPacketCipher
)
writePacket
(
seqNum
uint32
,
w
io
.
Writer
,
rand
io
.
Reader
,
packet
[]
byte
)
error
{
if
len
(
packet
)
>
maxPacket
{
return
errors
.
New
(
"ssh: packet too large"
)
}
aadlen
:=
0
if
s
.
mac
!=
nil
&&
s
.
etm
{
// packet length is not encrypted for EtM modes
aadlen
=
4
}
paddingLength
:=
packetSizeMultiple
-
(
prefixLen
+
len
(
packet
)
-
aadlen
)
%
packetSizeMultiple
if
paddingLength
<
4
{
paddingLength
+=
packetSizeMultiple
}
length
:=
len
(
packet
)
+
1
+
paddingLength
binary
.
BigEndian
.
PutUint32
(
s
.
prefix
[
:
],
uint32
(
length
))
s
.
prefix
[
4
]
=
byte
(
paddingLength
)
padding
:=
s
.
padding
[
:
paddingLength
]
if
_
,
err
:=
io
.
ReadFull
(
rand
,
padding
);
err
!=
nil
{
return
err
}
if
s
.
mac
!=
nil
{
s
.
mac
.
Reset
()
binary
.
BigEndian
.
PutUint32
(
s
.
seqNumBytes
[
:
],
seqNum
)
s
.
mac
.
Write
(
s
.
seqNumBytes
[
:
])
if
s
.
etm
{
// For EtM algorithms, the packet length must stay unencrypted,
// but the following data (padding length) must be encrypted
s
.
cipher
.
XORKeyStream
(
s
.
prefix
[
4
:
5
],
s
.
prefix
[
4
:
5
])
}
s
.
mac
.
Write
(
s
.
prefix
[
:
])
if
!
s
.
etm
{
// For non-EtM algorithms, the algorithm is applied on unencrypted data
s
.
mac
.
Write
(
packet
)
s
.
mac
.
Write
(
padding
)
}
}
if
!
(
s
.
mac
!=
nil
&&
s
.
etm
)
{
// For EtM algorithms, the padding length has already been encrypted
// and the packet length must remain unencrypted
s
.
cipher
.
XORKeyStream
(
s
.
prefix
[
:
],
s
.
prefix
[
:
])
}
s
.
cipher
.
XORKeyStream
(
packet
,
packet
)
s
.
cipher
.
XORKeyStream
(
padding
,
padding
)
if
s
.
mac
!=
nil
&&
s
.
etm
{
// For EtM algorithms, packet and padding must be encrypted
s
.
mac
.
Write
(
packet
)
s
.
mac
.
Write
(
padding
)
}
if
_
,
err
:=
w
.
Write
(
s
.
prefix
[
:
]);
err
!=
nil
{
return
err
}
if
_
,
err
:=
w
.
Write
(
packet
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
w
.
Write
(
padding
);
err
!=
nil
{
return
err
}
if
s
.
mac
!=
nil
{
s
.
macResult
=
s
.
mac
.
Sum
(
s
.
macResult
[
:
0
])
if
_
,
err
:=
w
.
Write
(
s
.
macResult
);
err
!=
nil
{
return
err
}
}
return
nil
}
type
gcmCipher
struct
{
aead
cipher
.
AEAD
prefix
[
4
]
byte
iv
[]
byte
buf
[]
byte
}
func
newGCMCipher
(
iv
,
key
,
macKey
[]
byte
)
(
packetCipher
,
error
)
{
c
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
err
}
aead
,
err
:=
cipher
.
NewGCM
(
c
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
gcmCipher
{
aead
:
aead
,
iv
:
iv
,
},
nil
}
const
gcmTagSize
=
16
func
(
c
*
gcmCipher
)
writePacket
(
seqNum
uint32
,
w
io
.
Writer
,
rand
io
.
Reader
,
packet
[]
byte
)
error
{
// Pad out to multiple of 16 bytes. This is different from the
// stream cipher because that encrypts the length too.
padding
:=
byte
(
packetSizeMultiple
-
(
1
+
len
(
packet
))
%
packetSizeMultiple
)
if
padding
<
4
{
padding
+=
packetSizeMultiple
}
length
:=
uint32
(
len
(
packet
)
+
int
(
padding
)
+
1
)
binary
.
BigEndian
.
PutUint32
(
c
.
prefix
[
:
],
length
)
if
_
,
err
:=
w
.
Write
(
c
.
prefix
[
:
]);
err
!=
nil
{
return
err
}
if
cap
(
c
.
buf
)
<
int
(
length
)
{
c
.
buf
=
make
([]
byte
,
length
)
}
else
{
c
.
buf
=
c
.
buf
[
:
length
]
}
c
.
buf
[
0
]
=
padding
copy
(
c
.
buf
[
1
:
],
packet
)
if
_
,
err
:=
io
.
ReadFull
(
rand
,
c
.
buf
[
1
+
len
(
packet
)
:
]);
err
!=
nil
{
return
err
}
c
.
buf
=
c
.
aead
.
Seal
(
c
.
buf
[
:
0
],
c
.
iv
,
c
.
buf
,
c
.
prefix
[
:
])
if
_
,
err
:=
w
.
Write
(
c
.
buf
);
err
!=
nil
{
return
err
}
c
.
incIV
()
return
nil
}
func
(
c
*
gcmCipher
)
incIV
()
{
for
i
:=
4
+
7
;
i
>=
4
;
i
--
{
c
.
iv
[
i
]
++
if
c
.
iv
[
i
]
!=
0
{
break
}
}
}
func
(
c
*
gcmCipher
)
readPacket
(
seqNum
uint32
,
r
io
.
Reader
)
([]
byte
,
error
)
{
if
_
,
err
:=
io
.
ReadFull
(
r
,
c
.
prefix
[
:
]);
err
!=
nil
{
return
nil
,
err
}
length
:=
binary
.
BigEndian
.
Uint32
(
c
.
prefix
[
:
])
if
length
>
maxPacket
{
return
nil
,
errors
.
New
(
"ssh: max packet length exceeded."
)
}
if
cap
(
c
.
buf
)
<
int
(
length
+
gcmTagSize
)
{
c
.
buf
=
make
([]
byte
,
length
+
gcmTagSize
)
}
else
{
c
.
buf
=
c
.
buf
[
:
length
+
gcmTagSize
]
}
if
_
,
err
:=
io
.
ReadFull
(
r
,
c
.
buf
);
err
!=
nil
{
return
nil
,
err
}
plain
,
err
:=
c
.
aead
.
Open
(
c
.
buf
[
:
0
],
c
.
iv
,
c
.
buf
,
c
.
prefix
[
:
])
if
err
!=
nil
{
return
nil
,
err
}
c
.
incIV
()
padding
:=
plain
[
0
]
if
padding
<
4
||
padding
>=
20
{
return
nil
,
fmt
.
Errorf
(
"ssh: illegal padding %d"
,
padding
)
}
if
int
(
padding
+
1
)
>=
len
(
plain
)
{
return
nil
,
fmt
.
Errorf
(
"ssh: padding %d too large"
,
padding
)
}
plain
=
plain
[
1
:
length
-
uint32
(
padding
)]
return
plain
,
nil
}
// cbcCipher implements aes128-cbc cipher defined in RFC 4253 section 6.1
type
cbcCipher
struct
{
mac
hash
.
Hash
macSize
uint32
decrypter
cipher
.
BlockMode
encrypter
cipher
.
BlockMode
// The following members are to avoid per-packet allocations.
seqNumBytes
[
4
]
byte
packetData
[]
byte
macResult
[]
byte
// Amount of data we should still read to hide which
// verification error triggered.
oracleCamouflage
uint32
}
func
newCBCCipher
(
c
cipher
.
Block
,
iv
,
key
,
macKey
[]
byte
,
algs
directionAlgorithms
)
(
packetCipher
,
error
)
{
cbc
:=
&
cbcCipher
{
mac
:
macModes
[
algs
.
MAC
]
.
new
(
macKey
),
decrypter
:
cipher
.
NewCBCDecrypter
(
c
,
iv
),
encrypter
:
cipher
.
NewCBCEncrypter
(
c
,
iv
),
packetData
:
make
([]
byte
,
1024
),
}
if
cbc
.
mac
!=
nil
{
cbc
.
macSize
=
uint32
(
cbc
.
mac
.
Size
())
}
return
cbc
,
nil
}
func
newAESCBCCipher
(
iv
,
key
,
macKey
[]
byte
,
algs
directionAlgorithms
)
(
packetCipher
,
error
)
{
c
,
err
:=
aes
.
NewCipher
(
key
)
if
err
!=
nil
{
return
nil
,
err
}
cbc
,
err
:=
newCBCCipher
(
c
,
iv
,
key
,
macKey
,
algs
)
if
err
!=
nil
{
return
nil
,
err
}
return
cbc
,
nil
}
func
newTripleDESCBCCipher
(
iv
,
key
,
macKey
[]
byte
,
algs
directionAlgorithms
)
(
packetCipher
,
error
)
{
c
,
err
:=
des
.
NewTripleDESCipher
(
key
)
if
err
!=
nil
{
return
nil
,
err
}
cbc
,
err
:=
newCBCCipher
(
c
,
iv
,
key
,
macKey
,
algs
)
if
err
!=
nil
{
return
nil
,
err
}
return
cbc
,
nil
}
func
maxUInt32
(
a
,
b
int
)
uint32
{
if
a
>
b
{
return
uint32
(
a
)
}
return
uint32
(
b
)
}
const
(
cbcMinPacketSizeMultiple
=
8
cbcMinPacketSize
=
16
cbcMinPaddingSize
=
4
)
// cbcError represents a verification error that may leak information.
type
cbcError
string
func
(
e
cbcError
)
Error
()
string
{
return
string
(
e
)
}
func
(
c
*
cbcCipher
)
readPacket
(
seqNum
uint32
,
r
io
.
Reader
)
([]
byte
,
error
)
{
p
,
err
:=
c
.
readPacketLeaky
(
seqNum
,
r
)
if
err
!=
nil
{
if
_
,
ok
:=
err
.
(
cbcError
);
ok
{
// Verification error: read a fixed amount of
// data, to make distinguishing between
// failing MAC and failing length check more
// difficult.
io
.
CopyN
(
ioutil
.
Discard
,
r
,
int64
(
c
.
oracleCamouflage
))
}
}
return
p
,
err
}
func
(
c
*
cbcCipher
)
readPacketLeaky
(
seqNum
uint32
,
r
io
.
Reader
)
([]
byte
,
error
)
{
blockSize
:=
c
.
decrypter
.
BlockSize
()
// Read the header, which will include some of the subsequent data in the
// case of block ciphers - this is copied back to the payload later.
// How many bytes of payload/padding will be read with this first read.
firstBlockLength
:=
uint32
((
prefixLen
+
blockSize
-
1
)
/
blockSize
*
blockSize
)
firstBlock
:=
c
.
packetData
[
:
firstBlockLength
]
if
_
,
err
:=
io
.
ReadFull
(
r
,
firstBlock
);
err
!=
nil
{
return
nil
,
err
}
c
.
oracleCamouflage
=
maxPacket
+
4
+
c
.
macSize
-
firstBlockLength
c
.
decrypter
.
CryptBlocks
(
firstBlock
,
firstBlock
)
length
:=
binary
.
BigEndian
.
Uint32
(
firstBlock
[
:
4
])
if
length
>
maxPacket
{
return
nil
,
cbcError
(
"ssh: packet too large"
)
}
if
length
+
4
<
maxUInt32
(
cbcMinPacketSize
,
blockSize
)
{
// The minimum size of a packet is 16 (or the cipher block size, whichever
// is larger) bytes.
return
nil
,
cbcError
(
"ssh: packet too small"
)
}
// The length of the packet (including the length field but not the MAC) must
// be a multiple of the block size or 8, whichever is larger.
if
(
length
+
4
)
%
maxUInt32
(
cbcMinPacketSizeMultiple
,
blockSize
)
!=
0
{
return
nil
,
cbcError
(
"ssh: invalid packet length multiple"
)
}
paddingLength
:=
uint32
(
firstBlock
[
4
])
if
paddingLength
<
cbcMinPaddingSize
||
length
<=
paddingLength
+
1
{
return
nil
,
cbcError
(
"ssh: invalid packet length"
)
}
// Positions within the c.packetData buffer:
macStart
:=
4
+
length
paddingStart
:=
macStart
-
paddingLength
// Entire packet size, starting before length, ending at end of mac.
entirePacketSize
:=
macStart
+
c
.
macSize
// Ensure c.packetData is large enough for the entire packet data.
if
uint32
(
cap
(
c
.
packetData
))
<
entirePacketSize
{
// Still need to upsize and copy, but this should be rare at runtime, only
// on upsizing the packetData buffer.
c
.
packetData
=
make
([]
byte
,
entirePacketSize
)
copy
(
c
.
packetData
,
firstBlock
)
}
else
{
c
.
packetData
=
c
.
packetData
[
:
entirePacketSize
]
}
if
n
,
err
:=
io
.
ReadFull
(
r
,
c
.
packetData
[
firstBlockLength
:
]);
err
!=
nil
{
return
nil
,
err
}
else
{
c
.
oracleCamouflage
-=
uint32
(
n
)
}
remainingCrypted
:=
c
.
packetData
[
firstBlockLength
:
macStart
]
c
.
decrypter
.
CryptBlocks
(
remainingCrypted
,
remainingCrypted
)
mac
:=
c
.
packetData
[
macStart
:
]
if
c
.
mac
!=
nil
{
c
.
mac
.
Reset
()
binary
.
BigEndian
.
PutUint32
(
c
.
seqNumBytes
[
:
],
seqNum
)
c
.
mac
.
Write
(
c
.
seqNumBytes
[
:
])
c
.
mac
.
Write
(
c
.
packetData
[
:
macStart
])
c
.
macResult
=
c
.
mac
.
Sum
(
c
.
macResult
[
:
0
])
if
subtle
.
ConstantTimeCompare
(
c
.
macResult
,
mac
)
!=
1
{
return
nil
,
cbcError
(
"ssh: MAC failure"
)
}
}
return
c
.
packetData
[
prefixLen
:
paddingStart
],
nil
}
func
(
c
*
cbcCipher
)
writePacket
(
seqNum
uint32
,
w
io
.
Writer
,
rand
io
.
Reader
,
packet
[]
byte
)
error
{
effectiveBlockSize
:=
maxUInt32
(
cbcMinPacketSizeMultiple
,
c
.
encrypter
.
BlockSize
())
// Length of encrypted portion of the packet (header, payload, padding).
// Enforce minimum padding and packet size.
encLength
:=
maxUInt32
(
prefixLen
+
len
(
packet
)
+
cbcMinPaddingSize
,
cbcMinPaddingSize
)
// Enforce block size.
encLength
=
(
encLength
+
effectiveBlockSize
-
1
)
/
effectiveBlockSize
*
effectiveBlockSize
length
:=
encLength
-
4
paddingLength
:=
int
(
length
)
-
(
1
+
len
(
packet
))
// Overall buffer contains: header, payload, padding, mac.
// Space for the MAC is reserved in the capacity but not the slice length.
bufferSize
:=
encLength
+
c
.
macSize
if
uint32
(
cap
(
c
.
packetData
))
<
bufferSize
{
c
.
packetData
=
make
([]
byte
,
encLength
,
bufferSize
)
}
else
{
c
.
packetData
=
c
.
packetData
[
:
encLength
]
}
p
:=
c
.
packetData
// Packet header.
binary
.
BigEndian
.
PutUint32
(
p
,
length
)
p
=
p
[
4
:
]
p
[
0
]
=
byte
(
paddingLength
)
// Payload.
p
=
p
[
1
:
]
copy
(
p
,
packet
)
// Padding.
p
=
p
[
len
(
packet
)
:
]
if
_
,
err
:=
io
.
ReadFull
(
rand
,
p
);
err
!=
nil
{
return
err
}
if
c
.
mac
!=
nil
{
c
.
mac
.
Reset
()
binary
.
BigEndian
.
PutUint32
(
c
.
seqNumBytes
[
:
],
seqNum
)
c
.
mac
.
Write
(
c
.
seqNumBytes
[
:
])
c
.
mac
.
Write
(
c
.
packetData
)
// The MAC is now appended into the capacity reserved for it earlier.
c
.
packetData
=
c
.
mac
.
Sum
(
c
.
packetData
)
}
c
.
encrypter
.
CryptBlocks
(
c
.
packetData
[
:
encLength
],
c
.
packetData
[
:
encLength
])
if
_
,
err
:=
w
.
Write
(
c
.
packetData
);
err
!=
nil
{
return
err
}
return
nil
}
cmd/gost/vendor/golang.org/x/crypto/ssh/client.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"errors"
"fmt"
"net"
"sync"
"time"
)
// Client implements a traditional SSH client that supports shells,
// subprocesses, port forwarding and tunneled dialing.
type
Client
struct
{
Conn
forwards
forwardList
// forwarded tcpip connections from the remote side
mu
sync
.
Mutex
channelHandlers
map
[
string
]
chan
NewChannel
}
// HandleChannelOpen returns a channel on which NewChannel requests
// for the given type are sent. If the type already is being handled,
// nil is returned. The channel is closed when the connection is closed.
func
(
c
*
Client
)
HandleChannelOpen
(
channelType
string
)
<-
chan
NewChannel
{
c
.
mu
.
Lock
()
defer
c
.
mu
.
Unlock
()
if
c
.
channelHandlers
==
nil
{
// The SSH channel has been closed.
c
:=
make
(
chan
NewChannel
)
close
(
c
)
return
c
}
ch
:=
c
.
channelHandlers
[
channelType
]
if
ch
!=
nil
{
return
nil
}
ch
=
make
(
chan
NewChannel
,
chanSize
)
c
.
channelHandlers
[
channelType
]
=
ch
return
ch
}
// NewClient creates a Client on top of the given connection.
func
NewClient
(
c
Conn
,
chans
<-
chan
NewChannel
,
reqs
<-
chan
*
Request
)
*
Client
{
conn
:=
&
Client
{
Conn
:
c
,
channelHandlers
:
make
(
map
[
string
]
chan
NewChannel
,
1
),
}
go
conn
.
handleGlobalRequests
(
reqs
)
go
conn
.
handleChannelOpens
(
chans
)
go
func
()
{
conn
.
Wait
()
conn
.
forwards
.
closeAll
()
}()
go
conn
.
forwards
.
handleChannels
(
conn
.
HandleChannelOpen
(
"forwarded-tcpip"
))
return
conn
}
// NewClientConn establishes an authenticated SSH connection using c
// as the underlying transport. The Request and NewChannel channels
// must be serviced or the connection will hang.
func
NewClientConn
(
c
net
.
Conn
,
addr
string
,
config
*
ClientConfig
)
(
Conn
,
<-
chan
NewChannel
,
<-
chan
*
Request
,
error
)
{
fullConf
:=
*
config
fullConf
.
SetDefaults
()
conn
:=
&
connection
{
sshConn
:
sshConn
{
conn
:
c
},
}
if
err
:=
conn
.
clientHandshake
(
addr
,
&
fullConf
);
err
!=
nil
{
c
.
Close
()
return
nil
,
nil
,
nil
,
fmt
.
Errorf
(
"ssh: handshake failed: %v"
,
err
)
}
conn
.
mux
=
newMux
(
conn
.
transport
)
return
conn
,
conn
.
mux
.
incomingChannels
,
conn
.
mux
.
incomingRequests
,
nil
}
// clientHandshake performs the client side key exchange. See RFC 4253 Section
// 7.
func
(
c
*
connection
)
clientHandshake
(
dialAddress
string
,
config
*
ClientConfig
)
error
{
if
config
.
ClientVersion
!=
""
{
c
.
clientVersion
=
[]
byte
(
config
.
ClientVersion
)
}
else
{
c
.
clientVersion
=
[]
byte
(
packageVersion
)
}
var
err
error
c
.
serverVersion
,
err
=
exchangeVersions
(
c
.
sshConn
.
conn
,
c
.
clientVersion
)
if
err
!=
nil
{
return
err
}
c
.
transport
=
newClientTransport
(
newTransport
(
c
.
sshConn
.
conn
,
config
.
Rand
,
true
/* is client */
),
c
.
clientVersion
,
c
.
serverVersion
,
config
,
dialAddress
,
c
.
sshConn
.
RemoteAddr
())
if
err
:=
c
.
transport
.
waitSession
();
err
!=
nil
{
return
err
}
c
.
sessionID
=
c
.
transport
.
getSessionID
()
return
c
.
clientAuthenticate
(
config
)
}
// verifyHostKeySignature verifies the host key obtained in the key
// exchange.
func
verifyHostKeySignature
(
hostKey
PublicKey
,
result
*
kexResult
)
error
{
sig
,
rest
,
ok
:=
parseSignatureBody
(
result
.
Signature
)
if
len
(
rest
)
>
0
||
!
ok
{
return
errors
.
New
(
"ssh: signature parse error"
)
}
return
hostKey
.
Verify
(
result
.
H
,
sig
)
}
// NewSession opens a new Session for this client. (A session is a remote
// execution of a program.)
func
(
c
*
Client
)
NewSession
()
(
*
Session
,
error
)
{
ch
,
in
,
err
:=
c
.
OpenChannel
(
"session"
,
nil
)
if
err
!=
nil
{
return
nil
,
err
}
return
newSession
(
ch
,
in
)
}
func
(
c
*
Client
)
handleGlobalRequests
(
incoming
<-
chan
*
Request
)
{
for
r
:=
range
incoming
{
// This handles keepalive messages and matches
// the behaviour of OpenSSH.
r
.
Reply
(
false
,
nil
)
}
}
// handleChannelOpens channel open messages from the remote side.
func
(
c
*
Client
)
handleChannelOpens
(
in
<-
chan
NewChannel
)
{
for
ch
:=
range
in
{
c
.
mu
.
Lock
()
handler
:=
c
.
channelHandlers
[
ch
.
ChannelType
()]
c
.
mu
.
Unlock
()
if
handler
!=
nil
{
handler
<-
ch
}
else
{
ch
.
Reject
(
UnknownChannelType
,
fmt
.
Sprintf
(
"unknown channel type: %v"
,
ch
.
ChannelType
()))
}
}
c
.
mu
.
Lock
()
for
_
,
ch
:=
range
c
.
channelHandlers
{
close
(
ch
)
}
c
.
channelHandlers
=
nil
c
.
mu
.
Unlock
()
}
// Dial starts a client connection to the given SSH server. It is a
// convenience function that connects to the given network address,
// initiates the SSH handshake, and then sets up a Client. For access
// to incoming channels and requests, use net.Dial with NewClientConn
// instead.
func
Dial
(
network
,
addr
string
,
config
*
ClientConfig
)
(
*
Client
,
error
)
{
conn
,
err
:=
net
.
DialTimeout
(
network
,
addr
,
config
.
Timeout
)
if
err
!=
nil
{
return
nil
,
err
}
c
,
chans
,
reqs
,
err
:=
NewClientConn
(
conn
,
addr
,
config
)
if
err
!=
nil
{
return
nil
,
err
}
return
NewClient
(
c
,
chans
,
reqs
),
nil
}
// A ClientConfig structure is used to configure a Client. It must not be
// modified after having been passed to an SSH function.
type
ClientConfig
struct
{
// Config contains configuration that is shared between clients and
// servers.
Config
// User contains the username to authenticate as.
User
string
// Auth contains possible authentication methods to use with the
// server. Only the first instance of a particular RFC 4252 method will
// be used during authentication.
Auth
[]
AuthMethod
// HostKeyCallback, if not nil, is called during the cryptographic
// handshake to validate the server's host key. A nil HostKeyCallback
// implies that all host keys are accepted.
HostKeyCallback
func
(
hostname
string
,
remote
net
.
Addr
,
key
PublicKey
)
error
// ClientVersion contains the version identification string that will
// be used for the connection. If empty, a reasonable default is used.
ClientVersion
string
// HostKeyAlgorithms lists the key types that the client will
// accept from the server as host key, in order of
// preference. If empty, a reasonable default is used. Any
// string returned from PublicKey.Type method may be used, or
// any of the CertAlgoXxxx and KeyAlgoXxxx constants.
HostKeyAlgorithms
[]
string
// Timeout is the maximum amount of time for the TCP connection to establish.
//
// A Timeout of zero means no timeout.
Timeout
time
.
Duration
}
cmd/gost/vendor/golang.org/x/crypto/ssh/client_auth.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"bytes"
"errors"
"fmt"
"io"
)
// clientAuthenticate authenticates with the remote server. See RFC 4252.
func
(
c
*
connection
)
clientAuthenticate
(
config
*
ClientConfig
)
error
{
// initiate user auth session
if
err
:=
c
.
transport
.
writePacket
(
Marshal
(
&
serviceRequestMsg
{
serviceUserAuth
}));
err
!=
nil
{
return
err
}
packet
,
err
:=
c
.
transport
.
readPacket
()
if
err
!=
nil
{
return
err
}
var
serviceAccept
serviceAcceptMsg
if
err
:=
Unmarshal
(
packet
,
&
serviceAccept
);
err
!=
nil
{
return
err
}
// during the authentication phase the client first attempts the "none" method
// then any untried methods suggested by the server.
tried
:=
make
(
map
[
string
]
bool
)
var
lastMethods
[]
string
sessionID
:=
c
.
transport
.
getSessionID
()
for
auth
:=
AuthMethod
(
new
(
noneAuth
));
auth
!=
nil
;
{
ok
,
methods
,
err
:=
auth
.
auth
(
sessionID
,
config
.
User
,
c
.
transport
,
config
.
Rand
)
if
err
!=
nil
{
return
err
}
if
ok
{
// success
return
nil
}
tried
[
auth
.
method
()]
=
true
if
methods
==
nil
{
methods
=
lastMethods
}
lastMethods
=
methods
auth
=
nil
findNext
:
for
_
,
a
:=
range
config
.
Auth
{
candidateMethod
:=
a
.
method
()
if
tried
[
candidateMethod
]
{
continue
}
for
_
,
meth
:=
range
methods
{
if
meth
==
candidateMethod
{
auth
=
a
break
findNext
}
}
}
}
return
fmt
.
Errorf
(
"ssh: unable to authenticate, attempted methods %v, no supported methods remain"
,
keys
(
tried
))
}
func
keys
(
m
map
[
string
]
bool
)
[]
string
{
s
:=
make
([]
string
,
0
,
len
(
m
))
for
key
:=
range
m
{
s
=
append
(
s
,
key
)
}
return
s
}
// An AuthMethod represents an instance of an RFC 4252 authentication method.
type
AuthMethod
interface
{
// auth authenticates user over transport t.
// Returns true if authentication is successful.
// If authentication is not successful, a []string of alternative
// method names is returned. If the slice is nil, it will be ignored
// and the previous set of possible methods will be reused.
auth
(
session
[]
byte
,
user
string
,
p
packetConn
,
rand
io
.
Reader
)
(
bool
,
[]
string
,
error
)
// method returns the RFC 4252 method name.
method
()
string
}
// "none" authentication, RFC 4252 section 5.2.
type
noneAuth
int
func
(
n
*
noneAuth
)
auth
(
session
[]
byte
,
user
string
,
c
packetConn
,
rand
io
.
Reader
)
(
bool
,
[]
string
,
error
)
{
if
err
:=
c
.
writePacket
(
Marshal
(
&
userAuthRequestMsg
{
User
:
user
,
Service
:
serviceSSH
,
Method
:
"none"
,
}));
err
!=
nil
{
return
false
,
nil
,
err
}
return
handleAuthResponse
(
c
)
}
func
(
n
*
noneAuth
)
method
()
string
{
return
"none"
}
// passwordCallback is an AuthMethod that fetches the password through
// a function call, e.g. by prompting the user.
type
passwordCallback
func
()
(
password
string
,
err
error
)
func
(
cb
passwordCallback
)
auth
(
session
[]
byte
,
user
string
,
c
packetConn
,
rand
io
.
Reader
)
(
bool
,
[]
string
,
error
)
{
type
passwordAuthMsg
struct
{
User
string
`sshtype:"50"`
Service
string
Method
string
Reply
bool
Password
string
}
pw
,
err
:=
cb
()
// REVIEW NOTE: is there a need to support skipping a password attempt?
// The program may only find out that the user doesn't have a password
// when prompting.
if
err
!=
nil
{
return
false
,
nil
,
err
}
if
err
:=
c
.
writePacket
(
Marshal
(
&
passwordAuthMsg
{
User
:
user
,
Service
:
serviceSSH
,
Method
:
cb
.
method
(),
Reply
:
false
,
Password
:
pw
,
}));
err
!=
nil
{
return
false
,
nil
,
err
}
return
handleAuthResponse
(
c
)
}
func
(
cb
passwordCallback
)
method
()
string
{
return
"password"
}
// Password returns an AuthMethod using the given password.
func
Password
(
secret
string
)
AuthMethod
{
return
passwordCallback
(
func
()
(
string
,
error
)
{
return
secret
,
nil
})
}
// PasswordCallback returns an AuthMethod that uses a callback for
// fetching a password.
func
PasswordCallback
(
prompt
func
()
(
secret
string
,
err
error
))
AuthMethod
{
return
passwordCallback
(
prompt
)
}
type
publickeyAuthMsg
struct
{
User
string
`sshtype:"50"`
Service
string
Method
string
// HasSig indicates to the receiver packet that the auth request is signed and
// should be used for authentication of the request.
HasSig
bool
Algoname
string
PubKey
[]
byte
// Sig is tagged with "rest" so Marshal will exclude it during
// validateKey
Sig
[]
byte
`ssh:"rest"`
}
// publicKeyCallback is an AuthMethod that uses a set of key
// pairs for authentication.
type
publicKeyCallback
func
()
([]
Signer
,
error
)
func
(
cb
publicKeyCallback
)
method
()
string
{
return
"publickey"
}
func
(
cb
publicKeyCallback
)
auth
(
session
[]
byte
,
user
string
,
c
packetConn
,
rand
io
.
Reader
)
(
bool
,
[]
string
,
error
)
{
// Authentication is performed in two stages. The first stage sends an
// enquiry to test if each key is acceptable to the remote. The second
// stage attempts to authenticate with the valid keys obtained in the
// first stage.
signers
,
err
:=
cb
()
if
err
!=
nil
{
return
false
,
nil
,
err
}
var
validKeys
[]
Signer
for
_
,
signer
:=
range
signers
{
if
ok
,
err
:=
validateKey
(
signer
.
PublicKey
(),
user
,
c
);
ok
{
validKeys
=
append
(
validKeys
,
signer
)
}
else
{
if
err
!=
nil
{
return
false
,
nil
,
err
}
}
}
// methods that may continue if this auth is not successful.
var
methods
[]
string
for
_
,
signer
:=
range
validKeys
{
pub
:=
signer
.
PublicKey
()
pubKey
:=
pub
.
Marshal
()
sign
,
err
:=
signer
.
Sign
(
rand
,
buildDataSignedForAuth
(
session
,
userAuthRequestMsg
{
User
:
user
,
Service
:
serviceSSH
,
Method
:
cb
.
method
(),
},
[]
byte
(
pub
.
Type
()),
pubKey
))
if
err
!=
nil
{
return
false
,
nil
,
err
}
// manually wrap the serialized signature in a string
s
:=
Marshal
(
sign
)
sig
:=
make
([]
byte
,
stringLength
(
len
(
s
)))
marshalString
(
sig
,
s
)
msg
:=
publickeyAuthMsg
{
User
:
user
,
Service
:
serviceSSH
,
Method
:
cb
.
method
(),
HasSig
:
true
,
Algoname
:
pub
.
Type
(),
PubKey
:
pubKey
,
Sig
:
sig
,
}
p
:=
Marshal
(
&
msg
)
if
err
:=
c
.
writePacket
(
p
);
err
!=
nil
{
return
false
,
nil
,
err
}
var
success
bool
success
,
methods
,
err
=
handleAuthResponse
(
c
)
if
err
!=
nil
{
return
false
,
nil
,
err
}
if
success
{
return
success
,
methods
,
err
}
}
return
false
,
methods
,
nil
}
// validateKey validates the key provided is acceptable to the server.
func
validateKey
(
key
PublicKey
,
user
string
,
c
packetConn
)
(
bool
,
error
)
{
pubKey
:=
key
.
Marshal
()
msg
:=
publickeyAuthMsg
{
User
:
user
,
Service
:
serviceSSH
,
Method
:
"publickey"
,
HasSig
:
false
,
Algoname
:
key
.
Type
(),
PubKey
:
pubKey
,
}
if
err
:=
c
.
writePacket
(
Marshal
(
&
msg
));
err
!=
nil
{
return
false
,
err
}
return
confirmKeyAck
(
key
,
c
)
}
func
confirmKeyAck
(
key
PublicKey
,
c
packetConn
)
(
bool
,
error
)
{
pubKey
:=
key
.
Marshal
()
algoname
:=
key
.
Type
()
for
{
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
false
,
err
}
switch
packet
[
0
]
{
case
msgUserAuthBanner
:
// TODO(gpaul): add callback to present the banner to the user
case
msgUserAuthPubKeyOk
:
var
msg
userAuthPubKeyOkMsg
if
err
:=
Unmarshal
(
packet
,
&
msg
);
err
!=
nil
{
return
false
,
err
}
if
msg
.
Algo
!=
algoname
||
!
bytes
.
Equal
(
msg
.
PubKey
,
pubKey
)
{
return
false
,
nil
}
return
true
,
nil
case
msgUserAuthFailure
:
return
false
,
nil
default
:
return
false
,
unexpectedMessageError
(
msgUserAuthSuccess
,
packet
[
0
])
}
}
}
// PublicKeys returns an AuthMethod that uses the given key
// pairs.
func
PublicKeys
(
signers
...
Signer
)
AuthMethod
{
return
publicKeyCallback
(
func
()
([]
Signer
,
error
)
{
return
signers
,
nil
})
}
// PublicKeysCallback returns an AuthMethod that runs the given
// function to obtain a list of key pairs.
func
PublicKeysCallback
(
getSigners
func
()
(
signers
[]
Signer
,
err
error
))
AuthMethod
{
return
publicKeyCallback
(
getSigners
)
}
// handleAuthResponse returns whether the preceding authentication request succeeded
// along with a list of remaining authentication methods to try next and
// an error if an unexpected response was received.
func
handleAuthResponse
(
c
packetConn
)
(
bool
,
[]
string
,
error
)
{
for
{
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
false
,
nil
,
err
}
switch
packet
[
0
]
{
case
msgUserAuthBanner
:
// TODO: add callback to present the banner to the user
case
msgUserAuthFailure
:
var
msg
userAuthFailureMsg
if
err
:=
Unmarshal
(
packet
,
&
msg
);
err
!=
nil
{
return
false
,
nil
,
err
}
return
false
,
msg
.
Methods
,
nil
case
msgUserAuthSuccess
:
return
true
,
nil
,
nil
default
:
return
false
,
nil
,
unexpectedMessageError
(
msgUserAuthSuccess
,
packet
[
0
])
}
}
}
// KeyboardInteractiveChallenge should print questions, optionally
// disabling echoing (e.g. for passwords), and return all the answers.
// Challenge may be called multiple times in a single session. After
// successful authentication, the server may send a challenge with no
// questions, for which the user and instruction messages should be
// printed. RFC 4256 section 3.3 details how the UI should behave for
// both CLI and GUI environments.
type
KeyboardInteractiveChallenge
func
(
user
,
instruction
string
,
questions
[]
string
,
echos
[]
bool
)
(
answers
[]
string
,
err
error
)
// KeyboardInteractive returns a AuthMethod using a prompt/response
// sequence controlled by the server.
func
KeyboardInteractive
(
challenge
KeyboardInteractiveChallenge
)
AuthMethod
{
return
challenge
}
func
(
cb
KeyboardInteractiveChallenge
)
method
()
string
{
return
"keyboard-interactive"
}
func
(
cb
KeyboardInteractiveChallenge
)
auth
(
session
[]
byte
,
user
string
,
c
packetConn
,
rand
io
.
Reader
)
(
bool
,
[]
string
,
error
)
{
type
initiateMsg
struct
{
User
string
`sshtype:"50"`
Service
string
Method
string
Language
string
Submethods
string
}
if
err
:=
c
.
writePacket
(
Marshal
(
&
initiateMsg
{
User
:
user
,
Service
:
serviceSSH
,
Method
:
"keyboard-interactive"
,
}));
err
!=
nil
{
return
false
,
nil
,
err
}
for
{
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
false
,
nil
,
err
}
// like handleAuthResponse, but with less options.
switch
packet
[
0
]
{
case
msgUserAuthBanner
:
// TODO: Print banners during userauth.
continue
case
msgUserAuthInfoRequest
:
// OK
case
msgUserAuthFailure
:
var
msg
userAuthFailureMsg
if
err
:=
Unmarshal
(
packet
,
&
msg
);
err
!=
nil
{
return
false
,
nil
,
err
}
return
false
,
msg
.
Methods
,
nil
case
msgUserAuthSuccess
:
return
true
,
nil
,
nil
default
:
return
false
,
nil
,
unexpectedMessageError
(
msgUserAuthInfoRequest
,
packet
[
0
])
}
var
msg
userAuthInfoRequestMsg
if
err
:=
Unmarshal
(
packet
,
&
msg
);
err
!=
nil
{
return
false
,
nil
,
err
}
// Manually unpack the prompt/echo pairs.
rest
:=
msg
.
Prompts
var
prompts
[]
string
var
echos
[]
bool
for
i
:=
0
;
i
<
int
(
msg
.
NumPrompts
);
i
++
{
prompt
,
r
,
ok
:=
parseString
(
rest
)
if
!
ok
||
len
(
r
)
==
0
{
return
false
,
nil
,
errors
.
New
(
"ssh: prompt format error"
)
}
prompts
=
append
(
prompts
,
string
(
prompt
))
echos
=
append
(
echos
,
r
[
0
]
!=
0
)
rest
=
r
[
1
:
]
}
if
len
(
rest
)
!=
0
{
return
false
,
nil
,
errors
.
New
(
"ssh: extra data following keyboard-interactive pairs"
)
}
answers
,
err
:=
cb
(
msg
.
User
,
msg
.
Instruction
,
prompts
,
echos
)
if
err
!=
nil
{
return
false
,
nil
,
err
}
if
len
(
answers
)
!=
len
(
prompts
)
{
return
false
,
nil
,
errors
.
New
(
"ssh: not enough answers from keyboard-interactive callback"
)
}
responseLength
:=
1
+
4
for
_
,
a
:=
range
answers
{
responseLength
+=
stringLength
(
len
(
a
))
}
serialized
:=
make
([]
byte
,
responseLength
)
p
:=
serialized
p
[
0
]
=
msgUserAuthInfoResponse
p
=
p
[
1
:
]
p
=
marshalUint32
(
p
,
uint32
(
len
(
answers
)))
for
_
,
a
:=
range
answers
{
p
=
marshalString
(
p
,
[]
byte
(
a
))
}
if
err
:=
c
.
writePacket
(
serialized
);
err
!=
nil
{
return
false
,
nil
,
err
}
}
}
type
retryableAuthMethod
struct
{
authMethod
AuthMethod
maxTries
int
}
func
(
r
*
retryableAuthMethod
)
auth
(
session
[]
byte
,
user
string
,
c
packetConn
,
rand
io
.
Reader
)
(
ok
bool
,
methods
[]
string
,
err
error
)
{
for
i
:=
0
;
r
.
maxTries
<=
0
||
i
<
r
.
maxTries
;
i
++
{
ok
,
methods
,
err
=
r
.
authMethod
.
auth
(
session
,
user
,
c
,
rand
)
if
ok
||
err
!=
nil
{
// either success or error terminate
return
ok
,
methods
,
err
}
}
return
ok
,
methods
,
err
}
func
(
r
*
retryableAuthMethod
)
method
()
string
{
return
r
.
authMethod
.
method
()
}
// RetryableAuthMethod is a decorator for other auth methods enabling them to
// be retried up to maxTries before considering that AuthMethod itself failed.
// If maxTries is <= 0, will retry indefinitely
//
// This is useful for interactive clients using challenge/response type
// authentication (e.g. Keyboard-Interactive, Password, etc) where the user
// could mistype their response resulting in the server issuing a
// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4
// [keyboard-interactive]); Without this decorator, the non-retryable
// AuthMethod would be removed from future consideration, and never tried again
// (and so the user would never be able to retry their entry).
func
RetryableAuthMethod
(
auth
AuthMethod
,
maxTries
int
)
AuthMethod
{
return
&
retryableAuthMethod
{
authMethod
:
auth
,
maxTries
:
maxTries
}
}
cmd/gost/vendor/golang.org/x/crypto/ssh/common.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"crypto"
"crypto/rand"
"fmt"
"io"
"sync"
_
"crypto/sha1"
_
"crypto/sha256"
_
"crypto/sha512"
)
// These are string constants in the SSH protocol.
const
(
compressionNone
=
"none"
serviceUserAuth
=
"ssh-userauth"
serviceSSH
=
"ssh-connection"
)
// supportedCiphers specifies the supported ciphers in preference order.
var
supportedCiphers
=
[]
string
{
"aes128-ctr"
,
"aes192-ctr"
,
"aes256-ctr"
,
"aes128-gcm@openssh.com"
,
"arcfour256"
,
"arcfour128"
,
}
// supportedKexAlgos specifies the supported key-exchange algorithms in
// preference order.
var
supportedKexAlgos
=
[]
string
{
kexAlgoCurve25519SHA256
,
// P384 and P521 are not constant-time yet, but since we don't
// reuse ephemeral keys, using them for ECDH should be OK.
kexAlgoECDH256
,
kexAlgoECDH384
,
kexAlgoECDH521
,
kexAlgoDH14SHA1
,
kexAlgoDH1SHA1
,
}
// supportedKexAlgos specifies the supported host-key algorithms (i.e. methods
// of authenticating servers) in preference order.
var
supportedHostKeyAlgos
=
[]
string
{
CertAlgoRSAv01
,
CertAlgoDSAv01
,
CertAlgoECDSA256v01
,
CertAlgoECDSA384v01
,
CertAlgoECDSA521v01
,
CertAlgoED25519v01
,
KeyAlgoECDSA256
,
KeyAlgoECDSA384
,
KeyAlgoECDSA521
,
KeyAlgoRSA
,
KeyAlgoDSA
,
KeyAlgoED25519
,
}
// supportedMACs specifies a default set of MAC algorithms in preference order.
// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed
// because they have reached the end of their useful life.
var
supportedMACs
=
[]
string
{
"hmac-sha2-256-etm@openssh.com"
,
"hmac-sha2-256"
,
"hmac-sha1"
,
"hmac-sha1-96"
,
}
var
supportedCompressions
=
[]
string
{
compressionNone
}
// hashFuncs keeps the mapping of supported algorithms to their respective
// hashes needed for signature verification.
var
hashFuncs
=
map
[
string
]
crypto
.
Hash
{
KeyAlgoRSA
:
crypto
.
SHA1
,
KeyAlgoDSA
:
crypto
.
SHA1
,
KeyAlgoECDSA256
:
crypto
.
SHA256
,
KeyAlgoECDSA384
:
crypto
.
SHA384
,
KeyAlgoECDSA521
:
crypto
.
SHA512
,
CertAlgoRSAv01
:
crypto
.
SHA1
,
CertAlgoDSAv01
:
crypto
.
SHA1
,
CertAlgoECDSA256v01
:
crypto
.
SHA256
,
CertAlgoECDSA384v01
:
crypto
.
SHA384
,
CertAlgoECDSA521v01
:
crypto
.
SHA512
,
}
// unexpectedMessageError results when the SSH message that we received didn't
// match what we wanted.
func
unexpectedMessageError
(
expected
,
got
uint8
)
error
{
return
fmt
.
Errorf
(
"ssh: unexpected message type %d (expected %d)"
,
got
,
expected
)
}
// parseError results from a malformed SSH message.
func
parseError
(
tag
uint8
)
error
{
return
fmt
.
Errorf
(
"ssh: parse error in message type %d"
,
tag
)
}
func
findCommon
(
what
string
,
client
[]
string
,
server
[]
string
)
(
common
string
,
err
error
)
{
for
_
,
c
:=
range
client
{
for
_
,
s
:=
range
server
{
if
c
==
s
{
return
c
,
nil
}
}
}
return
""
,
fmt
.
Errorf
(
"ssh: no common algorithm for %s; client offered: %v, server offered: %v"
,
what
,
client
,
server
)
}
type
directionAlgorithms
struct
{
Cipher
string
MAC
string
Compression
string
}
// rekeyBytes returns a rekeying intervals in bytes.
func
(
a
*
directionAlgorithms
)
rekeyBytes
()
int64
{
// According to RFC4344 block ciphers should rekey after
// 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is
// 128.
switch
a
.
Cipher
{
case
"aes128-ctr"
,
"aes192-ctr"
,
"aes256-ctr"
,
gcmCipherID
,
aes128cbcID
:
return
16
*
(
1
<<
32
)
}
// For others, stick with RFC4253 recommendation to rekey after 1 Gb of data.
return
1
<<
30
}
type
algorithms
struct
{
kex
string
hostKey
string
w
directionAlgorithms
r
directionAlgorithms
}
func
findAgreedAlgorithms
(
clientKexInit
,
serverKexInit
*
kexInitMsg
)
(
algs
*
algorithms
,
err
error
)
{
result
:=
&
algorithms
{}
result
.
kex
,
err
=
findCommon
(
"key exchange"
,
clientKexInit
.
KexAlgos
,
serverKexInit
.
KexAlgos
)
if
err
!=
nil
{
return
}
result
.
hostKey
,
err
=
findCommon
(
"host key"
,
clientKexInit
.
ServerHostKeyAlgos
,
serverKexInit
.
ServerHostKeyAlgos
)
if
err
!=
nil
{
return
}
result
.
w
.
Cipher
,
err
=
findCommon
(
"client to server cipher"
,
clientKexInit
.
CiphersClientServer
,
serverKexInit
.
CiphersClientServer
)
if
err
!=
nil
{
return
}
result
.
r
.
Cipher
,
err
=
findCommon
(
"server to client cipher"
,
clientKexInit
.
CiphersServerClient
,
serverKexInit
.
CiphersServerClient
)
if
err
!=
nil
{
return
}
result
.
w
.
MAC
,
err
=
findCommon
(
"client to server MAC"
,
clientKexInit
.
MACsClientServer
,
serverKexInit
.
MACsClientServer
)
if
err
!=
nil
{
return
}
result
.
r
.
MAC
,
err
=
findCommon
(
"server to client MAC"
,
clientKexInit
.
MACsServerClient
,
serverKexInit
.
MACsServerClient
)
if
err
!=
nil
{
return
}
result
.
w
.
Compression
,
err
=
findCommon
(
"client to server compression"
,
clientKexInit
.
CompressionClientServer
,
serverKexInit
.
CompressionClientServer
)
if
err
!=
nil
{
return
}
result
.
r
.
Compression
,
err
=
findCommon
(
"server to client compression"
,
clientKexInit
.
CompressionServerClient
,
serverKexInit
.
CompressionServerClient
)
if
err
!=
nil
{
return
}
return
result
,
nil
}
// If rekeythreshold is too small, we can't make any progress sending
// stuff.
const
minRekeyThreshold
uint64
=
256
// Config contains configuration data common to both ServerConfig and
// ClientConfig.
type
Config
struct
{
// Rand provides the source of entropy for cryptographic
// primitives. If Rand is nil, the cryptographic random reader
// in package crypto/rand will be used.
Rand
io
.
Reader
// The maximum number of bytes sent or received after which a
// new key is negotiated. It must be at least 256. If
// unspecified, 1 gigabyte is used.
RekeyThreshold
uint64
// The allowed key exchanges algorithms. If unspecified then a
// default set of algorithms is used.
KeyExchanges
[]
string
// The allowed cipher algorithms. If unspecified then a sensible
// default is used.
Ciphers
[]
string
// The allowed MAC algorithms. If unspecified then a sensible default
// is used.
MACs
[]
string
}
// SetDefaults sets sensible values for unset fields in config. This is
// exported for testing: Configs passed to SSH functions are copied and have
// default values set automatically.
func
(
c
*
Config
)
SetDefaults
()
{
if
c
.
Rand
==
nil
{
c
.
Rand
=
rand
.
Reader
}
if
c
.
Ciphers
==
nil
{
c
.
Ciphers
=
supportedCiphers
}
var
ciphers
[]
string
for
_
,
c
:=
range
c
.
Ciphers
{
if
cipherModes
[
c
]
!=
nil
{
// reject the cipher if we have no cipherModes definition
ciphers
=
append
(
ciphers
,
c
)
}
}
c
.
Ciphers
=
ciphers
if
c
.
KeyExchanges
==
nil
{
c
.
KeyExchanges
=
supportedKexAlgos
}
if
c
.
MACs
==
nil
{
c
.
MACs
=
supportedMACs
}
if
c
.
RekeyThreshold
==
0
{
// RFC 4253, section 9 suggests rekeying after 1G.
c
.
RekeyThreshold
=
1
<<
30
}
if
c
.
RekeyThreshold
<
minRekeyThreshold
{
c
.
RekeyThreshold
=
minRekeyThreshold
}
}
// buildDataSignedForAuth returns the data that is signed in order to prove
// possession of a private key. See RFC 4252, section 7.
func
buildDataSignedForAuth
(
sessionId
[]
byte
,
req
userAuthRequestMsg
,
algo
,
pubKey
[]
byte
)
[]
byte
{
data
:=
struct
{
Session
[]
byte
Type
byte
User
string
Service
string
Method
string
Sign
bool
Algo
[]
byte
PubKey
[]
byte
}{
sessionId
,
msgUserAuthRequest
,
req
.
User
,
req
.
Service
,
req
.
Method
,
true
,
algo
,
pubKey
,
}
return
Marshal
(
data
)
}
func
appendU16
(
buf
[]
byte
,
n
uint16
)
[]
byte
{
return
append
(
buf
,
byte
(
n
>>
8
),
byte
(
n
))
}
func
appendU32
(
buf
[]
byte
,
n
uint32
)
[]
byte
{
return
append
(
buf
,
byte
(
n
>>
24
),
byte
(
n
>>
16
),
byte
(
n
>>
8
),
byte
(
n
))
}
func
appendU64
(
buf
[]
byte
,
n
uint64
)
[]
byte
{
return
append
(
buf
,
byte
(
n
>>
56
),
byte
(
n
>>
48
),
byte
(
n
>>
40
),
byte
(
n
>>
32
),
byte
(
n
>>
24
),
byte
(
n
>>
16
),
byte
(
n
>>
8
),
byte
(
n
))
}
func
appendInt
(
buf
[]
byte
,
n
int
)
[]
byte
{
return
appendU32
(
buf
,
uint32
(
n
))
}
func
appendString
(
buf
[]
byte
,
s
string
)
[]
byte
{
buf
=
appendU32
(
buf
,
uint32
(
len
(
s
)))
buf
=
append
(
buf
,
s
...
)
return
buf
}
func
appendBool
(
buf
[]
byte
,
b
bool
)
[]
byte
{
if
b
{
return
append
(
buf
,
1
)
}
return
append
(
buf
,
0
)
}
// newCond is a helper to hide the fact that there is no usable zero
// value for sync.Cond.
func
newCond
()
*
sync
.
Cond
{
return
sync
.
NewCond
(
new
(
sync
.
Mutex
))
}
// window represents the buffer available to clients
// wishing to write to a channel.
type
window
struct
{
*
sync
.
Cond
win
uint32
// RFC 4254 5.2 says the window size can grow to 2^32-1
writeWaiters
int
closed
bool
}
// add adds win to the amount of window available
// for consumers.
func
(
w
*
window
)
add
(
win
uint32
)
bool
{
// a zero sized window adjust is a noop.
if
win
==
0
{
return
true
}
w
.
L
.
Lock
()
if
w
.
win
+
win
<
win
{
w
.
L
.
Unlock
()
return
false
}
w
.
win
+=
win
// It is unusual that multiple goroutines would be attempting to reserve
// window space, but not guaranteed. Use broadcast to notify all waiters
// that additional window is available.
w
.
Broadcast
()
w
.
L
.
Unlock
()
return
true
}
// close sets the window to closed, so all reservations fail
// immediately.
func
(
w
*
window
)
close
()
{
w
.
L
.
Lock
()
w
.
closed
=
true
w
.
Broadcast
()
w
.
L
.
Unlock
()
}
// reserve reserves win from the available window capacity.
// If no capacity remains, reserve will block. reserve may
// return less than requested.
func
(
w
*
window
)
reserve
(
win
uint32
)
(
uint32
,
error
)
{
var
err
error
w
.
L
.
Lock
()
w
.
writeWaiters
++
w
.
Broadcast
()
for
w
.
win
==
0
&&
!
w
.
closed
{
w
.
Wait
()
}
w
.
writeWaiters
--
if
w
.
win
<
win
{
win
=
w
.
win
}
w
.
win
-=
win
if
w
.
closed
{
err
=
io
.
EOF
}
w
.
L
.
Unlock
()
return
win
,
err
}
// waitWriterBlocked waits until some goroutine is blocked for further
// writes. It is used in tests only.
func
(
w
*
window
)
waitWriterBlocked
()
{
w
.
Cond
.
L
.
Lock
()
for
w
.
writeWaiters
==
0
{
w
.
Cond
.
Wait
()
}
w
.
Cond
.
L
.
Unlock
()
}
cmd/gost/vendor/golang.org/x/crypto/ssh/connection.go
0 → 100644
View file @
d19d5ada
// Copyright 2013 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
ssh
import
(
"fmt"
"net"
)
// OpenChannelError is returned if the other side rejects an
// OpenChannel request.
type
OpenChannelError
struct
{
Reason
RejectionReason
Message
string
}
func
(
e
*
OpenChannelError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"ssh: rejected: %s (%s)"
,
e
.
Reason
,
e
.
Message
)
}
// ConnMetadata holds metadata for the connection.
type
ConnMetadata
interface
{
// User returns the user ID for this connection.
User
()
string
// SessionID returns the sesson hash, also denoted by H.
SessionID
()
[]
byte
// ClientVersion returns the client's version string as hashed
// into the session ID.
ClientVersion
()
[]
byte
// ServerVersion returns the server's version string as hashed
// into the session ID.
ServerVersion
()
[]
byte
// RemoteAddr returns the remote address for this connection.
RemoteAddr
()
net
.
Addr
// LocalAddr returns the local address for this connection.
LocalAddr
()
net
.
Addr
}
// Conn represents an SSH connection for both server and client roles.
// Conn is the basis for implementing an application layer, such
// as ClientConn, which implements the traditional shell access for
// clients.
type
Conn
interface
{
ConnMetadata
// SendRequest sends a global request, and returns the
// reply. If wantReply is true, it returns the response status
// and payload. See also RFC4254, section 4.
SendRequest
(
name
string
,
wantReply
bool
,
payload
[]
byte
)
(
bool
,
[]
byte
,
error
)
// OpenChannel tries to open an channel. If the request is
// rejected, it returns *OpenChannelError. On success it returns
// the SSH Channel and a Go channel for incoming, out-of-band
// requests. The Go channel must be serviced, or the
// connection will hang.
OpenChannel
(
name
string
,
data
[]
byte
)
(
Channel
,
<-
chan
*
Request
,
error
)
// Close closes the underlying network connection
Close
()
error
// Wait blocks until the connection has shut down, and returns the
// error causing the shutdown.
Wait
()
error
// TODO(hanwen): consider exposing:
// RequestKeyChange
// Disconnect
}
// DiscardRequests consumes and rejects all requests from the
// passed-in channel.
func
DiscardRequests
(
in
<-
chan
*
Request
)
{
for
req
:=
range
in
{
if
req
.
WantReply
{
req
.
Reply
(
false
,
nil
)
}
}
}
// A connection represents an incoming connection.
type
connection
struct
{
transport
*
handshakeTransport
sshConn
// The connection protocol.
*
mux
}
func
(
c
*
connection
)
Close
()
error
{
return
c
.
sshConn
.
conn
.
Close
()
}
// sshconn provides net.Conn metadata, but disallows direct reads and
// writes.
type
sshConn
struct
{
conn
net
.
Conn
user
string
sessionID
[]
byte
clientVersion
[]
byte
serverVersion
[]
byte
}
func
dup
(
src
[]
byte
)
[]
byte
{
dst
:=
make
([]
byte
,
len
(
src
))
copy
(
dst
,
src
)
return
dst
}
func
(
c
*
sshConn
)
User
()
string
{
return
c
.
user
}
func
(
c
*
sshConn
)
RemoteAddr
()
net
.
Addr
{
return
c
.
conn
.
RemoteAddr
()
}
func
(
c
*
sshConn
)
Close
()
error
{
return
c
.
conn
.
Close
()
}
func
(
c
*
sshConn
)
LocalAddr
()
net
.
Addr
{
return
c
.
conn
.
LocalAddr
()
}
func
(
c
*
sshConn
)
SessionID
()
[]
byte
{
return
dup
(
c
.
sessionID
)
}
func
(
c
*
sshConn
)
ClientVersion
()
[]
byte
{
return
dup
(
c
.
clientVersion
)
}
func
(
c
*
sshConn
)
ServerVersion
()
[]
byte
{
return
dup
(
c
.
serverVersion
)
}
cmd/gost/vendor/golang.org/x/crypto/ssh/doc.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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 ssh implements an SSH client and server.
SSH is a transport security protocol, an authentication protocol and a
family of application protocols. The most typical application level
protocol is a remote shell and this is specifically implemented. However,
the multiplexed nature of SSH is exposed to users that wish to support
others.
References:
[PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD
[SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
*/
package
ssh
// import "golang.org/x/crypto/ssh"
cmd/gost/vendor/golang.org/x/crypto/ssh/handshake.go
0 → 100644
View file @
d19d5ada
// Copyright 2013 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
ssh
import
(
"crypto/rand"
"errors"
"fmt"
"io"
"log"
"net"
"sync"
)
// debugHandshake, if set, prints messages sent and received. Key
// exchange messages are printed as if DH were used, so the debug
// messages are wrong when using ECDH.
const
debugHandshake
=
false
// chanSize sets the amount of buffering SSH connections. This is
// primarily for testing: setting chanSize=0 uncovers deadlocks more
// quickly.
const
chanSize
=
16
// keyingTransport is a packet based transport that supports key
// changes. It need not be thread-safe. It should pass through
// msgNewKeys in both directions.
type
keyingTransport
interface
{
packetConn
// prepareKeyChange sets up a key change. The key change for a
// direction will be effected if a msgNewKeys message is sent
// or received.
prepareKeyChange
(
*
algorithms
,
*
kexResult
)
error
}
// handshakeTransport implements rekeying on top of a keyingTransport
// and offers a thread-safe writePacket() interface.
type
handshakeTransport
struct
{
conn
keyingTransport
config
*
Config
serverVersion
[]
byte
clientVersion
[]
byte
// hostKeys is non-empty if we are the server. In that case,
// it contains all host keys that can be used to sign the
// connection.
hostKeys
[]
Signer
// hostKeyAlgorithms is non-empty if we are the client. In that case,
// we accept these key types from the server as host key.
hostKeyAlgorithms
[]
string
// On read error, incoming is closed, and readError is set.
incoming
chan
[]
byte
readError
error
mu
sync
.
Mutex
writeError
error
sentInitPacket
[]
byte
sentInitMsg
*
kexInitMsg
pendingPackets
[][]
byte
// Used when a key exchange is in progress.
// If the read loop wants to schedule a kex, it pings this
// channel, and the write loop will send out a kex
// message.
requestKex
chan
struct
{}
// If the other side requests or confirms a kex, its kexInit
// packet is sent here for the write loop to find it.
startKex
chan
*
pendingKex
// data for host key checking
hostKeyCallback
func
(
hostname
string
,
remote
net
.
Addr
,
key
PublicKey
)
error
dialAddress
string
remoteAddr
net
.
Addr
// Algorithms agreed in the last key exchange.
algorithms
*
algorithms
readPacketsLeft
uint32
readBytesLeft
int64
writePacketsLeft
uint32
writeBytesLeft
int64
// The session ID or nil if first kex did not complete yet.
sessionID
[]
byte
}
type
pendingKex
struct
{
otherInit
[]
byte
done
chan
error
}
func
newHandshakeTransport
(
conn
keyingTransport
,
config
*
Config
,
clientVersion
,
serverVersion
[]
byte
)
*
handshakeTransport
{
t
:=
&
handshakeTransport
{
conn
:
conn
,
serverVersion
:
serverVersion
,
clientVersion
:
clientVersion
,
incoming
:
make
(
chan
[]
byte
,
chanSize
),
requestKex
:
make
(
chan
struct
{},
1
),
startKex
:
make
(
chan
*
pendingKex
,
1
),
config
:
config
,
}
// We always start with a mandatory key exchange.
t
.
requestKex
<-
struct
{}{}
return
t
}
func
newClientTransport
(
conn
keyingTransport
,
clientVersion
,
serverVersion
[]
byte
,
config
*
ClientConfig
,
dialAddr
string
,
addr
net
.
Addr
)
*
handshakeTransport
{
t
:=
newHandshakeTransport
(
conn
,
&
config
.
Config
,
clientVersion
,
serverVersion
)
t
.
dialAddress
=
dialAddr
t
.
remoteAddr
=
addr
t
.
hostKeyCallback
=
config
.
HostKeyCallback
if
config
.
HostKeyAlgorithms
!=
nil
{
t
.
hostKeyAlgorithms
=
config
.
HostKeyAlgorithms
}
else
{
t
.
hostKeyAlgorithms
=
supportedHostKeyAlgos
}
go
t
.
readLoop
()
go
t
.
kexLoop
()
return
t
}
func
newServerTransport
(
conn
keyingTransport
,
clientVersion
,
serverVersion
[]
byte
,
config
*
ServerConfig
)
*
handshakeTransport
{
t
:=
newHandshakeTransport
(
conn
,
&
config
.
Config
,
clientVersion
,
serverVersion
)
t
.
hostKeys
=
config
.
hostKeys
go
t
.
readLoop
()
go
t
.
kexLoop
()
return
t
}
func
(
t
*
handshakeTransport
)
getSessionID
()
[]
byte
{
return
t
.
sessionID
}
// waitSession waits for the session to be established. This should be
// the first thing to call after instantiating handshakeTransport.
func
(
t
*
handshakeTransport
)
waitSession
()
error
{
p
,
err
:=
t
.
readPacket
()
if
err
!=
nil
{
return
err
}
if
p
[
0
]
!=
msgNewKeys
{
return
fmt
.
Errorf
(
"ssh: first packet should be msgNewKeys"
)
}
return
nil
}
func
(
t
*
handshakeTransport
)
id
()
string
{
if
len
(
t
.
hostKeys
)
>
0
{
return
"server"
}
return
"client"
}
func
(
t
*
handshakeTransport
)
printPacket
(
p
[]
byte
,
write
bool
)
{
action
:=
"got"
if
write
{
action
=
"sent"
}
if
p
[
0
]
==
msgChannelData
||
p
[
0
]
==
msgChannelExtendedData
{
log
.
Printf
(
"%s %s data (packet %d bytes)"
,
t
.
id
(),
action
,
len
(
p
))
}
else
{
msg
,
err
:=
decode
(
p
)
log
.
Printf
(
"%s %s %T %v (%v)"
,
t
.
id
(),
action
,
msg
,
msg
,
err
)
}
}
func
(
t
*
handshakeTransport
)
readPacket
()
([]
byte
,
error
)
{
p
,
ok
:=
<-
t
.
incoming
if
!
ok
{
return
nil
,
t
.
readError
}
return
p
,
nil
}
func
(
t
*
handshakeTransport
)
readLoop
()
{
first
:=
true
for
{
p
,
err
:=
t
.
readOnePacket
(
first
)
first
=
false
if
err
!=
nil
{
t
.
readError
=
err
close
(
t
.
incoming
)
break
}
if
p
[
0
]
==
msgIgnore
||
p
[
0
]
==
msgDebug
{
continue
}
t
.
incoming
<-
p
}
// Stop writers too.
t
.
recordWriteError
(
t
.
readError
)
// Unblock the writer should it wait for this.
close
(
t
.
startKex
)
// Don't close t.requestKex; it's also written to from writePacket.
}
func
(
t
*
handshakeTransport
)
pushPacket
(
p
[]
byte
)
error
{
if
debugHandshake
{
t
.
printPacket
(
p
,
true
)
}
return
t
.
conn
.
writePacket
(
p
)
}
func
(
t
*
handshakeTransport
)
getWriteError
()
error
{
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
return
t
.
writeError
}
func
(
t
*
handshakeTransport
)
recordWriteError
(
err
error
)
{
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
if
t
.
writeError
==
nil
&&
err
!=
nil
{
t
.
writeError
=
err
}
}
func
(
t
*
handshakeTransport
)
requestKeyExchange
()
{
select
{
case
t
.
requestKex
<-
struct
{}{}
:
default
:
// something already requested a kex, so do nothing.
}
}
func
(
t
*
handshakeTransport
)
kexLoop
()
{
write
:
for
t
.
getWriteError
()
==
nil
{
var
request
*
pendingKex
var
sent
bool
for
request
==
nil
||
!
sent
{
var
ok
bool
select
{
case
request
,
ok
=
<-
t
.
startKex
:
if
!
ok
{
break
write
}
case
<-
t
.
requestKex
:
break
}
if
!
sent
{
if
err
:=
t
.
sendKexInit
();
err
!=
nil
{
t
.
recordWriteError
(
err
)
break
}
sent
=
true
}
}
if
err
:=
t
.
getWriteError
();
err
!=
nil
{
if
request
!=
nil
{
request
.
done
<-
err
}
break
}
// We're not servicing t.requestKex, but that is OK:
// we never block on sending to t.requestKex.
// We're not servicing t.startKex, but the remote end
// has just sent us a kexInitMsg, so it can't send
// another key change request, until we close the done
// channel on the pendingKex request.
err
:=
t
.
enterKeyExchange
(
request
.
otherInit
)
t
.
mu
.
Lock
()
t
.
writeError
=
err
t
.
sentInitPacket
=
nil
t
.
sentInitMsg
=
nil
t
.
writePacketsLeft
=
packetRekeyThreshold
if
t
.
config
.
RekeyThreshold
>
0
{
t
.
writeBytesLeft
=
int64
(
t
.
config
.
RekeyThreshold
)
}
else
if
t
.
algorithms
!=
nil
{
t
.
writeBytesLeft
=
t
.
algorithms
.
w
.
rekeyBytes
()
}
// we have completed the key exchange. Since the
// reader is still blocked, it is safe to clear out
// the requestKex channel. This avoids the situation
// where: 1) we consumed our own request for the
// initial kex, and 2) the kex from the remote side
// caused another send on the requestKex channel,
clear
:
for
{
select
{
case
<-
t
.
requestKex
:
//
default
:
break
clear
}
}
request
.
done
<-
t
.
writeError
// kex finished. Push packets that we received while
// the kex was in progress. Don't look at t.startKex
// and don't increment writtenSinceKex: if we trigger
// another kex while we are still busy with the last
// one, things will become very confusing.
for
_
,
p
:=
range
t
.
pendingPackets
{
t
.
writeError
=
t
.
pushPacket
(
p
)
if
t
.
writeError
!=
nil
{
break
}
}
t
.
pendingPackets
=
t
.
pendingPackets
[
:
0
]
t
.
mu
.
Unlock
()
}
// drain startKex channel. We don't service t.requestKex
// because nobody does blocking sends there.
go
func
()
{
for
init
:=
range
t
.
startKex
{
init
.
done
<-
t
.
writeError
}
}()
// Unblock reader.
t
.
conn
.
Close
()
}
// The protocol uses uint32 for packet counters, so we can't let them
// reach 1<<32. We will actually read and write more packets than
// this, though: the other side may send more packets, and after we
// hit this limit on writing we will send a few more packets for the
// key exchange itself.
const
packetRekeyThreshold
=
(
1
<<
31
)
func
(
t
*
handshakeTransport
)
readOnePacket
(
first
bool
)
([]
byte
,
error
)
{
p
,
err
:=
t
.
conn
.
readPacket
()
if
err
!=
nil
{
return
nil
,
err
}
if
t
.
readPacketsLeft
>
0
{
t
.
readPacketsLeft
--
}
else
{
t
.
requestKeyExchange
()
}
if
t
.
readBytesLeft
>
0
{
t
.
readBytesLeft
-=
int64
(
len
(
p
))
}
else
{
t
.
requestKeyExchange
()
}
if
debugHandshake
{
t
.
printPacket
(
p
,
false
)
}
if
first
&&
p
[
0
]
!=
msgKexInit
{
return
nil
,
fmt
.
Errorf
(
"ssh: first packet should be msgKexInit"
)
}
if
p
[
0
]
!=
msgKexInit
{
return
p
,
nil
}
firstKex
:=
t
.
sessionID
==
nil
kex
:=
pendingKex
{
done
:
make
(
chan
error
,
1
),
otherInit
:
p
,
}
t
.
startKex
<-
&
kex
err
=
<-
kex
.
done
if
debugHandshake
{
log
.
Printf
(
"%s exited key exchange (first %v), err %v"
,
t
.
id
(),
firstKex
,
err
)
}
if
err
!=
nil
{
return
nil
,
err
}
t
.
readPacketsLeft
=
packetRekeyThreshold
if
t
.
config
.
RekeyThreshold
>
0
{
t
.
readBytesLeft
=
int64
(
t
.
config
.
RekeyThreshold
)
}
else
{
t
.
readBytesLeft
=
t
.
algorithms
.
r
.
rekeyBytes
()
}
// By default, a key exchange is hidden from higher layers by
// translating it into msgIgnore.
successPacket
:=
[]
byte
{
msgIgnore
}
if
firstKex
{
// sendKexInit() for the first kex waits for
// msgNewKeys so the authentication process is
// guaranteed to happen over an encrypted transport.
successPacket
=
[]
byte
{
msgNewKeys
}
}
return
successPacket
,
nil
}
// sendKexInit sends a key change message.
func
(
t
*
handshakeTransport
)
sendKexInit
()
error
{
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
if
t
.
sentInitMsg
!=
nil
{
// kexInits may be sent either in response to the other side,
// or because our side wants to initiate a key change, so we
// may have already sent a kexInit. In that case, don't send a
// second kexInit.
return
nil
}
msg
:=
&
kexInitMsg
{
KexAlgos
:
t
.
config
.
KeyExchanges
,
CiphersClientServer
:
t
.
config
.
Ciphers
,
CiphersServerClient
:
t
.
config
.
Ciphers
,
MACsClientServer
:
t
.
config
.
MACs
,
MACsServerClient
:
t
.
config
.
MACs
,
CompressionClientServer
:
supportedCompressions
,
CompressionServerClient
:
supportedCompressions
,
}
io
.
ReadFull
(
rand
.
Reader
,
msg
.
Cookie
[
:
])
if
len
(
t
.
hostKeys
)
>
0
{
for
_
,
k
:=
range
t
.
hostKeys
{
msg
.
ServerHostKeyAlgos
=
append
(
msg
.
ServerHostKeyAlgos
,
k
.
PublicKey
()
.
Type
())
}
}
else
{
msg
.
ServerHostKeyAlgos
=
t
.
hostKeyAlgorithms
}
packet
:=
Marshal
(
msg
)
// writePacket destroys the contents, so save a copy.
packetCopy
:=
make
([]
byte
,
len
(
packet
))
copy
(
packetCopy
,
packet
)
if
err
:=
t
.
pushPacket
(
packetCopy
);
err
!=
nil
{
return
err
}
t
.
sentInitMsg
=
msg
t
.
sentInitPacket
=
packet
return
nil
}
func
(
t
*
handshakeTransport
)
writePacket
(
p
[]
byte
)
error
{
switch
p
[
0
]
{
case
msgKexInit
:
return
errors
.
New
(
"ssh: only handshakeTransport can send kexInit"
)
case
msgNewKeys
:
return
errors
.
New
(
"ssh: only handshakeTransport can send newKeys"
)
}
t
.
mu
.
Lock
()
defer
t
.
mu
.
Unlock
()
if
t
.
writeError
!=
nil
{
return
t
.
writeError
}
if
t
.
sentInitMsg
!=
nil
{
// Copy the packet so the writer can reuse the buffer.
cp
:=
make
([]
byte
,
len
(
p
))
copy
(
cp
,
p
)
t
.
pendingPackets
=
append
(
t
.
pendingPackets
,
cp
)
return
nil
}
if
t
.
writeBytesLeft
>
0
{
t
.
writeBytesLeft
-=
int64
(
len
(
p
))
}
else
{
t
.
requestKeyExchange
()
}
if
t
.
writePacketsLeft
>
0
{
t
.
writePacketsLeft
--
}
else
{
t
.
requestKeyExchange
()
}
if
err
:=
t
.
pushPacket
(
p
);
err
!=
nil
{
t
.
writeError
=
err
}
return
nil
}
func
(
t
*
handshakeTransport
)
Close
()
error
{
return
t
.
conn
.
Close
()
}
func
(
t
*
handshakeTransport
)
enterKeyExchange
(
otherInitPacket
[]
byte
)
error
{
if
debugHandshake
{
log
.
Printf
(
"%s entered key exchange"
,
t
.
id
())
}
otherInit
:=
&
kexInitMsg
{}
if
err
:=
Unmarshal
(
otherInitPacket
,
otherInit
);
err
!=
nil
{
return
err
}
magics
:=
handshakeMagics
{
clientVersion
:
t
.
clientVersion
,
serverVersion
:
t
.
serverVersion
,
clientKexInit
:
otherInitPacket
,
serverKexInit
:
t
.
sentInitPacket
,
}
clientInit
:=
otherInit
serverInit
:=
t
.
sentInitMsg
if
len
(
t
.
hostKeys
)
==
0
{
clientInit
,
serverInit
=
serverInit
,
clientInit
magics
.
clientKexInit
=
t
.
sentInitPacket
magics
.
serverKexInit
=
otherInitPacket
}
var
err
error
t
.
algorithms
,
err
=
findAgreedAlgorithms
(
clientInit
,
serverInit
)
if
err
!=
nil
{
return
err
}
// We don't send FirstKexFollows, but we handle receiving it.
//
// RFC 4253 section 7 defines the kex and the agreement method for
// first_kex_packet_follows. It states that the guessed packet
// should be ignored if the "kex algorithm and/or the host
// key algorithm is guessed wrong (server and client have
// different preferred algorithm), or if any of the other
// algorithms cannot be agreed upon". The other algorithms have
// already been checked above so the kex algorithm and host key
// algorithm are checked here.
if
otherInit
.
FirstKexFollows
&&
(
clientInit
.
KexAlgos
[
0
]
!=
serverInit
.
KexAlgos
[
0
]
||
clientInit
.
ServerHostKeyAlgos
[
0
]
!=
serverInit
.
ServerHostKeyAlgos
[
0
])
{
// other side sent a kex message for the wrong algorithm,
// which we have to ignore.
if
_
,
err
:=
t
.
conn
.
readPacket
();
err
!=
nil
{
return
err
}
}
kex
,
ok
:=
kexAlgoMap
[
t
.
algorithms
.
kex
]
if
!
ok
{
return
fmt
.
Errorf
(
"ssh: unexpected key exchange algorithm %v"
,
t
.
algorithms
.
kex
)
}
var
result
*
kexResult
if
len
(
t
.
hostKeys
)
>
0
{
result
,
err
=
t
.
server
(
kex
,
t
.
algorithms
,
&
magics
)
}
else
{
result
,
err
=
t
.
client
(
kex
,
t
.
algorithms
,
&
magics
)
}
if
err
!=
nil
{
return
err
}
if
t
.
sessionID
==
nil
{
t
.
sessionID
=
result
.
H
}
result
.
SessionID
=
t
.
sessionID
t
.
conn
.
prepareKeyChange
(
t
.
algorithms
,
result
)
if
err
=
t
.
conn
.
writePacket
([]
byte
{
msgNewKeys
});
err
!=
nil
{
return
err
}
if
packet
,
err
:=
t
.
conn
.
readPacket
();
err
!=
nil
{
return
err
}
else
if
packet
[
0
]
!=
msgNewKeys
{
return
unexpectedMessageError
(
msgNewKeys
,
packet
[
0
])
}
return
nil
}
func
(
t
*
handshakeTransport
)
server
(
kex
kexAlgorithm
,
algs
*
algorithms
,
magics
*
handshakeMagics
)
(
*
kexResult
,
error
)
{
var
hostKey
Signer
for
_
,
k
:=
range
t
.
hostKeys
{
if
algs
.
hostKey
==
k
.
PublicKey
()
.
Type
()
{
hostKey
=
k
}
}
r
,
err
:=
kex
.
Server
(
t
.
conn
,
t
.
config
.
Rand
,
magics
,
hostKey
)
return
r
,
err
}
func
(
t
*
handshakeTransport
)
client
(
kex
kexAlgorithm
,
algs
*
algorithms
,
magics
*
handshakeMagics
)
(
*
kexResult
,
error
)
{
result
,
err
:=
kex
.
Client
(
t
.
conn
,
t
.
config
.
Rand
,
magics
)
if
err
!=
nil
{
return
nil
,
err
}
hostKey
,
err
:=
ParsePublicKey
(
result
.
HostKey
)
if
err
!=
nil
{
return
nil
,
err
}
if
err
:=
verifyHostKeySignature
(
hostKey
,
result
);
err
!=
nil
{
return
nil
,
err
}
if
t
.
hostKeyCallback
!=
nil
{
err
=
t
.
hostKeyCallback
(
t
.
dialAddress
,
t
.
remoteAddr
,
hostKey
)
if
err
!=
nil
{
return
nil
,
err
}
}
return
result
,
nil
}
cmd/gost/vendor/golang.org/x/crypto/ssh/kex.go
0 → 100644
View file @
d19d5ada
// Copyright 2013 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
ssh
import
(
"crypto"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/subtle"
"errors"
"io"
"math/big"
"golang.org/x/crypto/curve25519"
)
const
(
kexAlgoDH1SHA1
=
"diffie-hellman-group1-sha1"
kexAlgoDH14SHA1
=
"diffie-hellman-group14-sha1"
kexAlgoECDH256
=
"ecdh-sha2-nistp256"
kexAlgoECDH384
=
"ecdh-sha2-nistp384"
kexAlgoECDH521
=
"ecdh-sha2-nistp521"
kexAlgoCurve25519SHA256
=
"curve25519-sha256@libssh.org"
)
// kexResult captures the outcome of a key exchange.
type
kexResult
struct
{
// Session hash. See also RFC 4253, section 8.
H
[]
byte
// Shared secret. See also RFC 4253, section 8.
K
[]
byte
// Host key as hashed into H.
HostKey
[]
byte
// Signature of H.
Signature
[]
byte
// A cryptographic hash function that matches the security
// level of the key exchange algorithm. It is used for
// calculating H, and for deriving keys from H and K.
Hash
crypto
.
Hash
// The session ID, which is the first H computed. This is used
// to derive key material inside the transport.
SessionID
[]
byte
}
// handshakeMagics contains data that is always included in the
// session hash.
type
handshakeMagics
struct
{
clientVersion
,
serverVersion
[]
byte
clientKexInit
,
serverKexInit
[]
byte
}
func
(
m
*
handshakeMagics
)
write
(
w
io
.
Writer
)
{
writeString
(
w
,
m
.
clientVersion
)
writeString
(
w
,
m
.
serverVersion
)
writeString
(
w
,
m
.
clientKexInit
)
writeString
(
w
,
m
.
serverKexInit
)
}
// kexAlgorithm abstracts different key exchange algorithms.
type
kexAlgorithm
interface
{
// Server runs server-side key agreement, signing the result
// with a hostkey.
Server
(
p
packetConn
,
rand
io
.
Reader
,
magics
*
handshakeMagics
,
s
Signer
)
(
*
kexResult
,
error
)
// Client runs the client-side key agreement. Caller is
// responsible for verifying the host key signature.
Client
(
p
packetConn
,
rand
io
.
Reader
,
magics
*
handshakeMagics
)
(
*
kexResult
,
error
)
}
// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement.
type
dhGroup
struct
{
g
,
p
,
pMinus1
*
big
.
Int
}
func
(
group
*
dhGroup
)
diffieHellman
(
theirPublic
,
myPrivate
*
big
.
Int
)
(
*
big
.
Int
,
error
)
{
if
theirPublic
.
Cmp
(
bigOne
)
<=
0
||
theirPublic
.
Cmp
(
group
.
pMinus1
)
>=
0
{
return
nil
,
errors
.
New
(
"ssh: DH parameter out of bounds"
)
}
return
new
(
big
.
Int
)
.
Exp
(
theirPublic
,
myPrivate
,
group
.
p
),
nil
}
func
(
group
*
dhGroup
)
Client
(
c
packetConn
,
randSource
io
.
Reader
,
magics
*
handshakeMagics
)
(
*
kexResult
,
error
)
{
hashFunc
:=
crypto
.
SHA1
var
x
*
big
.
Int
for
{
var
err
error
if
x
,
err
=
rand
.
Int
(
randSource
,
group
.
pMinus1
);
err
!=
nil
{
return
nil
,
err
}
if
x
.
Sign
()
>
0
{
break
}
}
X
:=
new
(
big
.
Int
)
.
Exp
(
group
.
g
,
x
,
group
.
p
)
kexDHInit
:=
kexDHInitMsg
{
X
:
X
,
}
if
err
:=
c
.
writePacket
(
Marshal
(
&
kexDHInit
));
err
!=
nil
{
return
nil
,
err
}
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
nil
,
err
}
var
kexDHReply
kexDHReplyMsg
if
err
=
Unmarshal
(
packet
,
&
kexDHReply
);
err
!=
nil
{
return
nil
,
err
}
kInt
,
err
:=
group
.
diffieHellman
(
kexDHReply
.
Y
,
x
)
if
err
!=
nil
{
return
nil
,
err
}
h
:=
hashFunc
.
New
()
magics
.
write
(
h
)
writeString
(
h
,
kexDHReply
.
HostKey
)
writeInt
(
h
,
X
)
writeInt
(
h
,
kexDHReply
.
Y
)
K
:=
make
([]
byte
,
intLength
(
kInt
))
marshalInt
(
K
,
kInt
)
h
.
Write
(
K
)
return
&
kexResult
{
H
:
h
.
Sum
(
nil
),
K
:
K
,
HostKey
:
kexDHReply
.
HostKey
,
Signature
:
kexDHReply
.
Signature
,
Hash
:
crypto
.
SHA1
,
},
nil
}
func
(
group
*
dhGroup
)
Server
(
c
packetConn
,
randSource
io
.
Reader
,
magics
*
handshakeMagics
,
priv
Signer
)
(
result
*
kexResult
,
err
error
)
{
hashFunc
:=
crypto
.
SHA1
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
}
var
kexDHInit
kexDHInitMsg
if
err
=
Unmarshal
(
packet
,
&
kexDHInit
);
err
!=
nil
{
return
}
var
y
*
big
.
Int
for
{
if
y
,
err
=
rand
.
Int
(
randSource
,
group
.
pMinus1
);
err
!=
nil
{
return
}
if
y
.
Sign
()
>
0
{
break
}
}
Y
:=
new
(
big
.
Int
)
.
Exp
(
group
.
g
,
y
,
group
.
p
)
kInt
,
err
:=
group
.
diffieHellman
(
kexDHInit
.
X
,
y
)
if
err
!=
nil
{
return
nil
,
err
}
hostKeyBytes
:=
priv
.
PublicKey
()
.
Marshal
()
h
:=
hashFunc
.
New
()
magics
.
write
(
h
)
writeString
(
h
,
hostKeyBytes
)
writeInt
(
h
,
kexDHInit
.
X
)
writeInt
(
h
,
Y
)
K
:=
make
([]
byte
,
intLength
(
kInt
))
marshalInt
(
K
,
kInt
)
h
.
Write
(
K
)
H
:=
h
.
Sum
(
nil
)
// H is already a hash, but the hostkey signing will apply its
// own key-specific hash algorithm.
sig
,
err
:=
signAndMarshal
(
priv
,
randSource
,
H
)
if
err
!=
nil
{
return
nil
,
err
}
kexDHReply
:=
kexDHReplyMsg
{
HostKey
:
hostKeyBytes
,
Y
:
Y
,
Signature
:
sig
,
}
packet
=
Marshal
(
&
kexDHReply
)
err
=
c
.
writePacket
(
packet
)
return
&
kexResult
{
H
:
H
,
K
:
K
,
HostKey
:
hostKeyBytes
,
Signature
:
sig
,
Hash
:
crypto
.
SHA1
,
},
nil
}
// ecdh performs Elliptic Curve Diffie-Hellman key exchange as
// described in RFC 5656, section 4.
type
ecdh
struct
{
curve
elliptic
.
Curve
}
func
(
kex
*
ecdh
)
Client
(
c
packetConn
,
rand
io
.
Reader
,
magics
*
handshakeMagics
)
(
*
kexResult
,
error
)
{
ephKey
,
err
:=
ecdsa
.
GenerateKey
(
kex
.
curve
,
rand
)
if
err
!=
nil
{
return
nil
,
err
}
kexInit
:=
kexECDHInitMsg
{
ClientPubKey
:
elliptic
.
Marshal
(
kex
.
curve
,
ephKey
.
PublicKey
.
X
,
ephKey
.
PublicKey
.
Y
),
}
serialized
:=
Marshal
(
&
kexInit
)
if
err
:=
c
.
writePacket
(
serialized
);
err
!=
nil
{
return
nil
,
err
}
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
nil
,
err
}
var
reply
kexECDHReplyMsg
if
err
=
Unmarshal
(
packet
,
&
reply
);
err
!=
nil
{
return
nil
,
err
}
x
,
y
,
err
:=
unmarshalECKey
(
kex
.
curve
,
reply
.
EphemeralPubKey
)
if
err
!=
nil
{
return
nil
,
err
}
// generate shared secret
secret
,
_
:=
kex
.
curve
.
ScalarMult
(
x
,
y
,
ephKey
.
D
.
Bytes
())
h
:=
ecHash
(
kex
.
curve
)
.
New
()
magics
.
write
(
h
)
writeString
(
h
,
reply
.
HostKey
)
writeString
(
h
,
kexInit
.
ClientPubKey
)
writeString
(
h
,
reply
.
EphemeralPubKey
)
K
:=
make
([]
byte
,
intLength
(
secret
))
marshalInt
(
K
,
secret
)
h
.
Write
(
K
)
return
&
kexResult
{
H
:
h
.
Sum
(
nil
),
K
:
K
,
HostKey
:
reply
.
HostKey
,
Signature
:
reply
.
Signature
,
Hash
:
ecHash
(
kex
.
curve
),
},
nil
}
// unmarshalECKey parses and checks an EC key.
func
unmarshalECKey
(
curve
elliptic
.
Curve
,
pubkey
[]
byte
)
(
x
,
y
*
big
.
Int
,
err
error
)
{
x
,
y
=
elliptic
.
Unmarshal
(
curve
,
pubkey
)
if
x
==
nil
{
return
nil
,
nil
,
errors
.
New
(
"ssh: elliptic.Unmarshal failure"
)
}
if
!
validateECPublicKey
(
curve
,
x
,
y
)
{
return
nil
,
nil
,
errors
.
New
(
"ssh: public key not on curve"
)
}
return
x
,
y
,
nil
}
// validateECPublicKey checks that the point is a valid public key for
// the given curve. See [SEC1], 3.2.2
func
validateECPublicKey
(
curve
elliptic
.
Curve
,
x
,
y
*
big
.
Int
)
bool
{
if
x
.
Sign
()
==
0
&&
y
.
Sign
()
==
0
{
return
false
}
if
x
.
Cmp
(
curve
.
Params
()
.
P
)
>=
0
{
return
false
}
if
y
.
Cmp
(
curve
.
Params
()
.
P
)
>=
0
{
return
false
}
if
!
curve
.
IsOnCurve
(
x
,
y
)
{
return
false
}
// We don't check if N * PubKey == 0, since
//
// - the NIST curves have cofactor = 1, so this is implicit.
// (We don't foresee an implementation that supports non NIST
// curves)
//
// - for ephemeral keys, we don't need to worry about small
// subgroup attacks.
return
true
}
func
(
kex
*
ecdh
)
Server
(
c
packetConn
,
rand
io
.
Reader
,
magics
*
handshakeMagics
,
priv
Signer
)
(
result
*
kexResult
,
err
error
)
{
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
nil
,
err
}
var
kexECDHInit
kexECDHInitMsg
if
err
=
Unmarshal
(
packet
,
&
kexECDHInit
);
err
!=
nil
{
return
nil
,
err
}
clientX
,
clientY
,
err
:=
unmarshalECKey
(
kex
.
curve
,
kexECDHInit
.
ClientPubKey
)
if
err
!=
nil
{
return
nil
,
err
}
// We could cache this key across multiple users/multiple
// connection attempts, but the benefit is small. OpenSSH
// generates a new key for each incoming connection.
ephKey
,
err
:=
ecdsa
.
GenerateKey
(
kex
.
curve
,
rand
)
if
err
!=
nil
{
return
nil
,
err
}
hostKeyBytes
:=
priv
.
PublicKey
()
.
Marshal
()
serializedEphKey
:=
elliptic
.
Marshal
(
kex
.
curve
,
ephKey
.
PublicKey
.
X
,
ephKey
.
PublicKey
.
Y
)
// generate shared secret
secret
,
_
:=
kex
.
curve
.
ScalarMult
(
clientX
,
clientY
,
ephKey
.
D
.
Bytes
())
h
:=
ecHash
(
kex
.
curve
)
.
New
()
magics
.
write
(
h
)
writeString
(
h
,
hostKeyBytes
)
writeString
(
h
,
kexECDHInit
.
ClientPubKey
)
writeString
(
h
,
serializedEphKey
)
K
:=
make
([]
byte
,
intLength
(
secret
))
marshalInt
(
K
,
secret
)
h
.
Write
(
K
)
H
:=
h
.
Sum
(
nil
)
// H is already a hash, but the hostkey signing will apply its
// own key-specific hash algorithm.
sig
,
err
:=
signAndMarshal
(
priv
,
rand
,
H
)
if
err
!=
nil
{
return
nil
,
err
}
reply
:=
kexECDHReplyMsg
{
EphemeralPubKey
:
serializedEphKey
,
HostKey
:
hostKeyBytes
,
Signature
:
sig
,
}
serialized
:=
Marshal
(
&
reply
)
if
err
:=
c
.
writePacket
(
serialized
);
err
!=
nil
{
return
nil
,
err
}
return
&
kexResult
{
H
:
H
,
K
:
K
,
HostKey
:
reply
.
HostKey
,
Signature
:
sig
,
Hash
:
ecHash
(
kex
.
curve
),
},
nil
}
var
kexAlgoMap
=
map
[
string
]
kexAlgorithm
{}
func
init
()
{
// This is the group called diffie-hellman-group1-sha1 in RFC
// 4253 and Oakley Group 2 in RFC 2409.
p
,
_
:=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF"
,
16
)
kexAlgoMap
[
kexAlgoDH1SHA1
]
=
&
dhGroup
{
g
:
new
(
big
.
Int
)
.
SetInt64
(
2
),
p
:
p
,
pMinus1
:
new
(
big
.
Int
)
.
Sub
(
p
,
bigOne
),
}
// This is the group called diffie-hellman-group14-sha1 in RFC
// 4253 and Oakley Group 14 in RFC 3526.
p
,
_
=
new
(
big
.
Int
)
.
SetString
(
"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF"
,
16
)
kexAlgoMap
[
kexAlgoDH14SHA1
]
=
&
dhGroup
{
g
:
new
(
big
.
Int
)
.
SetInt64
(
2
),
p
:
p
,
pMinus1
:
new
(
big
.
Int
)
.
Sub
(
p
,
bigOne
),
}
kexAlgoMap
[
kexAlgoECDH521
]
=
&
ecdh
{
elliptic
.
P521
()}
kexAlgoMap
[
kexAlgoECDH384
]
=
&
ecdh
{
elliptic
.
P384
()}
kexAlgoMap
[
kexAlgoECDH256
]
=
&
ecdh
{
elliptic
.
P256
()}
kexAlgoMap
[
kexAlgoCurve25519SHA256
]
=
&
curve25519sha256
{}
}
// curve25519sha256 implements the curve25519-sha256@libssh.org key
// agreement protocol, as described in
// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt
type
curve25519sha256
struct
{}
type
curve25519KeyPair
struct
{
priv
[
32
]
byte
pub
[
32
]
byte
}
func
(
kp
*
curve25519KeyPair
)
generate
(
rand
io
.
Reader
)
error
{
if
_
,
err
:=
io
.
ReadFull
(
rand
,
kp
.
priv
[
:
]);
err
!=
nil
{
return
err
}
curve25519
.
ScalarBaseMult
(
&
kp
.
pub
,
&
kp
.
priv
)
return
nil
}
// curve25519Zeros is just an array of 32 zero bytes so that we have something
// convenient to compare against in order to reject curve25519 points with the
// wrong order.
var
curve25519Zeros
[
32
]
byte
func
(
kex
*
curve25519sha256
)
Client
(
c
packetConn
,
rand
io
.
Reader
,
magics
*
handshakeMagics
)
(
*
kexResult
,
error
)
{
var
kp
curve25519KeyPair
if
err
:=
kp
.
generate
(
rand
);
err
!=
nil
{
return
nil
,
err
}
if
err
:=
c
.
writePacket
(
Marshal
(
&
kexECDHInitMsg
{
kp
.
pub
[
:
]}));
err
!=
nil
{
return
nil
,
err
}
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
nil
,
err
}
var
reply
kexECDHReplyMsg
if
err
=
Unmarshal
(
packet
,
&
reply
);
err
!=
nil
{
return
nil
,
err
}
if
len
(
reply
.
EphemeralPubKey
)
!=
32
{
return
nil
,
errors
.
New
(
"ssh: peer's curve25519 public value has wrong length"
)
}
var
servPub
,
secret
[
32
]
byte
copy
(
servPub
[
:
],
reply
.
EphemeralPubKey
)
curve25519
.
ScalarMult
(
&
secret
,
&
kp
.
priv
,
&
servPub
)
if
subtle
.
ConstantTimeCompare
(
secret
[
:
],
curve25519Zeros
[
:
])
==
1
{
return
nil
,
errors
.
New
(
"ssh: peer's curve25519 public value has wrong order"
)
}
h
:=
crypto
.
SHA256
.
New
()
magics
.
write
(
h
)
writeString
(
h
,
reply
.
HostKey
)
writeString
(
h
,
kp
.
pub
[
:
])
writeString
(
h
,
reply
.
EphemeralPubKey
)
kInt
:=
new
(
big
.
Int
)
.
SetBytes
(
secret
[
:
])
K
:=
make
([]
byte
,
intLength
(
kInt
))
marshalInt
(
K
,
kInt
)
h
.
Write
(
K
)
return
&
kexResult
{
H
:
h
.
Sum
(
nil
),
K
:
K
,
HostKey
:
reply
.
HostKey
,
Signature
:
reply
.
Signature
,
Hash
:
crypto
.
SHA256
,
},
nil
}
func
(
kex
*
curve25519sha256
)
Server
(
c
packetConn
,
rand
io
.
Reader
,
magics
*
handshakeMagics
,
priv
Signer
)
(
result
*
kexResult
,
err
error
)
{
packet
,
err
:=
c
.
readPacket
()
if
err
!=
nil
{
return
}
var
kexInit
kexECDHInitMsg
if
err
=
Unmarshal
(
packet
,
&
kexInit
);
err
!=
nil
{
return
}
if
len
(
kexInit
.
ClientPubKey
)
!=
32
{
return
nil
,
errors
.
New
(
"ssh: peer's curve25519 public value has wrong length"
)
}
var
kp
curve25519KeyPair
if
err
:=
kp
.
generate
(
rand
);
err
!=
nil
{
return
nil
,
err
}
var
clientPub
,
secret
[
32
]
byte
copy
(
clientPub
[
:
],
kexInit
.
ClientPubKey
)
curve25519
.
ScalarMult
(
&
secret
,
&
kp
.
priv
,
&
clientPub
)
if
subtle
.
ConstantTimeCompare
(
secret
[
:
],
curve25519Zeros
[
:
])
==
1
{
return
nil
,
errors
.
New
(
"ssh: peer's curve25519 public value has wrong order"
)
}
hostKeyBytes
:=
priv
.
PublicKey
()
.
Marshal
()
h
:=
crypto
.
SHA256
.
New
()
magics
.
write
(
h
)
writeString
(
h
,
hostKeyBytes
)
writeString
(
h
,
kexInit
.
ClientPubKey
)
writeString
(
h
,
kp
.
pub
[
:
])
kInt
:=
new
(
big
.
Int
)
.
SetBytes
(
secret
[
:
])
K
:=
make
([]
byte
,
intLength
(
kInt
))
marshalInt
(
K
,
kInt
)
h
.
Write
(
K
)
H
:=
h
.
Sum
(
nil
)
sig
,
err
:=
signAndMarshal
(
priv
,
rand
,
H
)
if
err
!=
nil
{
return
nil
,
err
}
reply
:=
kexECDHReplyMsg
{
EphemeralPubKey
:
kp
.
pub
[
:
],
HostKey
:
hostKeyBytes
,
Signature
:
sig
,
}
if
err
:=
c
.
writePacket
(
Marshal
(
&
reply
));
err
!=
nil
{
return
nil
,
err
}
return
&
kexResult
{
H
:
H
,
K
:
K
,
HostKey
:
hostKeyBytes
,
Signature
:
sig
,
Hash
:
crypto
.
SHA256
,
},
nil
}
cmd/gost/vendor/golang.org/x/crypto/ssh/keys.go
0 → 100644
View file @
d19d5ada
// Copyright 2012 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
ssh
import
(
"bytes"
"crypto"
"crypto/dsa"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/md5"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/asn1"
"encoding/base64"
"encoding/hex"
"encoding/pem"
"errors"
"fmt"
"io"
"math/big"
"strings"
"golang.org/x/crypto/ed25519"
)
// These constants represent the algorithm names for key types supported by this
// package.
const
(
KeyAlgoRSA
=
"ssh-rsa"
KeyAlgoDSA
=
"ssh-dss"
KeyAlgoECDSA256
=
"ecdsa-sha2-nistp256"
KeyAlgoECDSA384
=
"ecdsa-sha2-nistp384"
KeyAlgoECDSA521
=
"ecdsa-sha2-nistp521"
KeyAlgoED25519
=
"ssh-ed25519"
)
// parsePubKey parses a public key of the given algorithm.
// Use ParsePublicKey for keys with prepended algorithm.
func
parsePubKey
(
in
[]
byte
,
algo
string
)
(
pubKey
PublicKey
,
rest
[]
byte
,
err
error
)
{
switch
algo
{
case
KeyAlgoRSA
:
return
parseRSA
(
in
)
case
KeyAlgoDSA
:
return
parseDSA
(
in
)
case
KeyAlgoECDSA256
,
KeyAlgoECDSA384
,
KeyAlgoECDSA521
:
return
parseECDSA
(
in
)
case
KeyAlgoED25519
:
return
parseED25519
(
in
)
case
CertAlgoRSAv01
,
CertAlgoDSAv01
,
CertAlgoECDSA256v01
,
CertAlgoECDSA384v01
,
CertAlgoECDSA521v01
,
CertAlgoED25519v01
:
cert
,
err
:=
parseCert
(
in
,
certToPrivAlgo
(
algo
))
if
err
!=
nil
{
return
nil
,
nil
,
err
}
return
cert
,
nil
,
nil
}
return
nil
,
nil
,
fmt
.
Errorf
(
"ssh: unknown key algorithm: %v"
,
algo
)
}
// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format
// (see sshd(8) manual page) once the options and key type fields have been
// removed.
func
parseAuthorizedKey
(
in
[]
byte
)
(
out
PublicKey
,
comment
string
,
err
error
)
{
in
=
bytes
.
TrimSpace
(
in
)
i
:=
bytes
.
IndexAny
(
in
,
"
\t
"
)
if
i
==
-
1
{
i
=
len
(
in
)
}
base64Key
:=
in
[
:
i
]
key
:=
make
([]
byte
,
base64
.
StdEncoding
.
DecodedLen
(
len
(
base64Key
)))
n
,
err
:=
base64
.
StdEncoding
.
Decode
(
key
,
base64Key
)
if
err
!=
nil
{
return
nil
,
""
,
err
}
key
=
key
[
:
n
]
out
,
err
=
ParsePublicKey
(
key
)
if
err
!=
nil
{
return
nil
,
""
,
err
}
comment
=
string
(
bytes
.
TrimSpace
(
in
[
i
:
]))
return
out
,
comment
,
nil
}
// ParseKnownHosts parses an entry in the format of the known_hosts file.
//
// The known_hosts format is documented in the sshd(8) manual page. This
// function will parse a single entry from in. On successful return, marker
// will contain the optional marker value (i.e. "cert-authority" or "revoked")
// or else be empty, hosts will contain the hosts that this entry matches,
// pubKey will contain the public key and comment will contain any trailing
// comment at the end of the line. See the sshd(8) manual page for the various
// forms that a host string can take.
//
// The unparsed remainder of the input will be returned in rest. This function
// can be called repeatedly to parse multiple entries.
//
// If no entries were found in the input then err will be io.EOF. Otherwise a
// non-nil err value indicates a parse error.
func
ParseKnownHosts
(
in
[]
byte
)
(
marker
string
,
hosts
[]
string
,
pubKey
PublicKey
,
comment
string
,
rest
[]
byte
,
err
error
)
{
for
len
(
in
)
>
0
{
end
:=
bytes
.
IndexByte
(
in
,
'\n'
)
if
end
!=
-
1
{
rest
=
in
[
end
+
1
:
]
in
=
in
[
:
end
]
}
else
{
rest
=
nil
}
end
=
bytes
.
IndexByte
(
in
,
'\r'
)
if
end
!=
-
1
{
in
=
in
[
:
end
]
}
in
=
bytes
.
TrimSpace
(
in
)
if
len
(
in
)
==
0
||
in
[
0
]
==
'#'
{
in
=
rest
continue
}
i
:=
bytes
.
IndexAny
(
in
,
"
\t
"
)
if
i
==
-
1
{
in
=
rest
continue
}
// Strip out the beginning of the known_host key.
// This is either an optional marker or a (set of) hostname(s).
keyFields
:=
bytes
.
Fields
(
in
)
if
len
(
keyFields
)
<
3
||
len
(
keyFields
)
>
5
{
return
""
,
nil
,
nil
,
""
,
nil
,
errors
.
New
(
"ssh: invalid entry in known_hosts data"
)
}
// keyFields[0] is either "@cert-authority", "@revoked" or a comma separated
// list of hosts
marker
:=
""
if
keyFields
[
0
][
0
]
==
'@'
{
marker
=
string
(
keyFields
[
0
][
1
:
])
keyFields
=
keyFields
[
1
:
]
}
hosts
:=
string
(
keyFields
[
0
])
// keyFields[1] contains the key type (e.g. “ssh-rsa”).
// However, that information is duplicated inside the
// base64-encoded key and so is ignored here.
key
:=
bytes
.
Join
(
keyFields
[
2
:
],
[]
byte
(
" "
))
if
pubKey
,
comment
,
err
=
parseAuthorizedKey
(
key
);
err
!=
nil
{
return
""
,
nil
,
nil
,
""
,
nil
,
err
}
return
marker
,
strings
.
Split
(
hosts
,
","
),
pubKey
,
comment
,
rest
,
nil
}
return
""
,
nil
,
nil
,
""
,
nil
,
io
.
EOF
}
// ParseAuthorizedKeys parses a public key from an authorized_keys
// file used in OpenSSH according to the sshd(8) manual page.
func
ParseAuthorizedKey
(
in
[]
byte
)
(
out
PublicKey
,
comment
string
,
options
[]
string
,
rest
[]
byte
,
err
error
)
{
for
len
(
in
)
>
0
{
end
:=
bytes
.
IndexByte
(
in
,
'\n'
)
if
end
!=
-
1
{
rest
=
in
[
end
+
1
:
]
in
=
in
[
:
end
]
}
else
{
rest
=
nil
}
end
=
bytes
.
IndexByte
(
in
,
'\r'
)
if
end
!=
-
1
{
in
=
in
[
:
end
]
}
in
=
bytes
.
TrimSpace
(
in
)
if
len
(
in
)
==
0
||
in
[
0
]
==
'#'
{
in
=
rest
continue
}
i
:=
bytes
.
IndexAny
(
in
,
"
\t
"
)
if
i
==
-
1
{
in
=
rest
continue
}
if
out
,
comment
,
err
=
parseAuthorizedKey
(
in
[
i
:
]);
err
==
nil
{
return
out
,
comment
,
options
,
rest
,
nil
}
// No key type recognised. Maybe there's an options field at
// the beginning.
var
b
byte
inQuote
:=
false
var
candidateOptions
[]
string
optionStart
:=
0
for
i
,
b
=
range
in
{
isEnd
:=
!
inQuote
&&
(
b
==
' '
||
b
==
'\t'
)
if
(
b
==
','
&&
!
inQuote
)
||
isEnd
{
if
i
-
optionStart
>
0
{
candidateOptions
=
append
(
candidateOptions
,
string
(
in
[
optionStart
:
i
]))
}
optionStart
=
i
+
1
}
if
isEnd
{
break
}
if
b
==
'"'
&&
(
i
==
0
||
(
i
>
0
&&
in
[
i
-
1
]
!=
'\\'
))
{
inQuote
=
!
inQuote
}
}
for
i
<
len
(
in
)
&&
(
in
[
i
]
==
' '
||
in
[
i
]
==
'\t'
)
{
i
++
}
if
i
==
len
(
in
)
{
// Invalid line: unmatched quote
in
=
rest
continue
}
in
=
in
[
i
:
]
i
=
bytes
.
IndexAny
(
in
,
"
\t
"
)
if
i
==
-
1
{
in
=
rest
continue
}
if
out
,
comment
,
err
=
parseAuthorizedKey
(
in
[
i
:
]);
err
==
nil
{
options
=
candidateOptions
return
out
,
comment
,
options
,
rest
,
nil
}
in
=
rest
continue
}
return
nil
,
""
,
nil
,
nil
,
errors
.
New
(
"ssh: no key found"
)
}
// ParsePublicKey parses an SSH public key formatted for use in
// the SSH wire protocol according to RFC 4253, section 6.6.
func
ParsePublicKey
(
in
[]
byte
)
(
out
PublicKey
,
err
error
)
{
algo
,
in
,
ok
:=
parseString
(
in
)
if
!
ok
{
return
nil
,
errShortRead
}
var
rest
[]
byte
out
,
rest
,
err
=
parsePubKey
(
in
,
string
(
algo
))
if
len
(
rest
)
>
0
{
return
nil
,
errors
.
New
(
"ssh: trailing junk in public key"
)
}
return
out
,
err
}
// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH
// authorized_keys file. The return value ends with newline.
func
MarshalAuthorizedKey
(
key
PublicKey
)
[]
byte
{
b
:=
&
bytes
.
Buffer
{}
b
.
WriteString
(
key
.
Type
())
b
.
WriteByte
(
' '
)
e
:=
base64
.
NewEncoder
(
base64
.
StdEncoding
,
b
)
e
.
Write
(
key
.
Marshal
())
e
.
Close
()
b
.
WriteByte
(
'\n'
)
return
b
.
Bytes
()
}
// PublicKey is an abstraction of different types of public keys.
type
PublicKey
interface
{
// Type returns the key's type, e.g. "ssh-rsa".
Type
()
string
// Marshal returns the serialized key data in SSH wire format,
// with the name prefix.
Marshal
()
[]
byte
// Verify that sig is a signature on the given data using this
// key. This function will hash the data appropriately first.
Verify
(
data
[]
byte
,
sig
*
Signature
)
error
}
// CryptoPublicKey, if implemented by a PublicKey,
// returns the underlying crypto.PublicKey form of the key.
type
CryptoPublicKey
interface
{
CryptoPublicKey
()
crypto
.
PublicKey
}
// A Signer can create signatures that verify against a public key.
type
Signer
interface
{
// PublicKey returns an associated PublicKey instance.
PublicKey
()
PublicKey
// Sign returns raw signature for the given data. This method
// will apply the hash specified for the keytype to the data.
Sign
(
rand
io
.
Reader
,
data
[]
byte
)
(
*
Signature
,
error
)
}
type
rsaPublicKey
rsa
.
PublicKey
func
(
r
*
rsaPublicKey
)
Type
()
string
{
return
"ssh-rsa"
}
// parseRSA parses an RSA key according to RFC 4253, section 6.6.
func
parseRSA
(
in
[]
byte
)
(
out
PublicKey
,
rest
[]
byte
,
err
error
)
{
var
w
struct
{
E
*
big
.
Int
N
*
big
.
Int
Rest
[]
byte
`ssh:"rest"`
}
if
err
:=
Unmarshal
(
in
,
&
w
);
err
!=
nil
{
return
nil
,
nil
,
err
}
if
w
.
E
.
BitLen
()
>
24
{
return
nil
,
nil
,
errors
.
New
(
"ssh: exponent too large"
)
}
e
:=
w
.
E
.
Int64
()
if
e
<
3
||
e
&
1
==
0
{
return
nil
,
nil
,
errors
.
New
(
"ssh: incorrect exponent"
)
}
var
key
rsa
.
PublicKey
key
.
E
=
int
(
e
)
key
.
N
=
w
.
N
return
(
*
rsaPublicKey
)(
&
key
),
w
.
Rest
,
nil
}
func
(
r
*
rsaPublicKey
)
Marshal
()
[]
byte
{
e
:=
new
(
big
.
Int
)
.
SetInt64
(
int64
(
r
.
E
))
// RSA publickey struct layout should match the struct used by
// parseRSACert in the x/crypto/ssh/agent package.
wirekey
:=
struct
{
Name
string
E
*
big
.
Int
N
*
big
.
Int
}{
KeyAlgoRSA
,
e
,
r
.
N
,
}
return
Marshal
(
&
wirekey
)
}
func
(
r
*
rsaPublicKey
)
Verify
(
data
[]
byte
,
sig
*
Signature
)
error
{
if
sig
.
Format
!=
r
.
Type
()
{
return
fmt
.
Errorf
(
"ssh: signature type %s for key type %s"
,
sig
.
Format
,
r
.
Type
())
}
h
:=
crypto
.
SHA1
.
New
()
h
.
Write
(
data
)
digest
:=
h
.
Sum
(
nil
)
return
rsa
.
VerifyPKCS1v15
((
*
rsa
.
PublicKey
)(
r
),
crypto
.
SHA1
,
digest
,
sig
.
Blob
)
}
func
(
r
*
rsaPublicKey
)
CryptoPublicKey
()
crypto
.
PublicKey
{
return
(
*
rsa
.
PublicKey
)(
r
)
}
type
dsaPublicKey
dsa
.
PublicKey
func
(
r
*
dsaPublicKey
)
Type
()
string
{
return
"ssh-dss"
}
// parseDSA parses an DSA key according to RFC 4253, section 6.6.
func
parseDSA
(
in
[]
byte
)
(
out
PublicKey
,
rest
[]
byte
,
err
error
)
{
var
w
struct
{
P
,
Q
,
G
,
Y
*
big
.
Int
Rest
[]
byte
`ssh:"rest"`
}
if
err
:=
Unmarshal
(
in
,
&
w
);
err
!=
nil
{
return
nil
,
nil
,
err
}
key
:=
&
dsaPublicKey
{
Parameters
:
dsa
.
Parameters
{
P
:
w
.
P
,
Q
:
w
.
Q
,
G
:
w
.
G
,
},
Y
:
w
.
Y
,
}
return
key
,
w
.
Rest
,
nil
}
func
(
k
*
dsaPublicKey
)
Marshal
()
[]
byte
{
// DSA publickey struct layout should match the struct used by
// parseDSACert in the x/crypto/ssh/agent package.
w
:=
struct
{
Name
string
P
,
Q
,
G
,
Y
*
big
.
Int
}{
k
.
Type
(),
k
.
P
,
k
.
Q
,
k
.
G
,
k
.
Y
,
}
return
Marshal
(
&
w
)
}
func
(
k
*
dsaPublicKey
)
Verify
(
data
[]
byte
,
sig
*
Signature
)
error
{
if
sig
.
Format
!=
k
.
Type
()
{
return
fmt
.
Errorf
(
"ssh: signature type %s for key type %s"
,
sig
.
Format
,
k
.
Type
())
}
h
:=
crypto
.
SHA1
.
New
()
h
.
Write
(
data
)
digest
:=
h
.
Sum
(
nil
)
// Per RFC 4253, section 6.6,
// The value for 'dss_signature_blob' is encoded as a string containing
// r, followed by s (which are 160-bit integers, without lengths or
// padding, unsigned, and in network byte order).
// For DSS purposes, sig.Blob should be exactly 40 bytes in length.
if
len
(
sig
.
Blob
)
!=
40
{
return
errors
.
New
(
"ssh: DSA signature parse error"
)
}
r
:=
new
(
big
.
Int
)
.
SetBytes
(
sig
.
Blob
[
:
20
])
s
:=
new
(
big
.
Int
)
.
SetBytes
(
sig
.
Blob
[
20
:
])
if
dsa
.
Verify
((
*
dsa
.
PublicKey
)(
k
),
digest
,
r
,
s
)
{
return
nil
}
return
errors
.
New
(
"ssh: signature did not verify"
)
}
func
(
k
*
dsaPublicKey
)
CryptoPublicKey
()
crypto
.
PublicKey
{
return
(
*
dsa
.
PublicKey
)(
k
)
}
type
dsaPrivateKey
struct
{
*
dsa
.
PrivateKey
}
func
(
k
*
dsaPrivateKey
)
PublicKey
()
PublicKey
{
return
(
*
dsaPublicKey
)(
&
k
.
PrivateKey
.
PublicKey
)
}
func
(
k
*
dsaPrivateKey
)
Sign
(
rand
io
.
Reader
,
data
[]
byte
)
(
*
Signature
,
error
)
{
h
:=
crypto
.
SHA1
.
New
()
h
.
Write
(
data
)
digest
:=
h
.
Sum
(
nil
)
r
,
s
,
err
:=
dsa
.
Sign
(
rand
,
k
.
PrivateKey
,
digest
)
if
err
!=
nil
{
return
nil
,
err
}
sig
:=
make
([]
byte
,
40
)
rb
:=
r
.
Bytes
()
sb
:=
s
.
Bytes
()
copy
(
sig
[
20
-
len
(
rb
)
:
20
],
rb
)
copy
(
sig
[
40
-
len
(
sb
)
:
],
sb
)
return
&
Signature
{
Format
:
k
.
PublicKey
()
.
Type
(),
Blob
:
sig
,
},
nil
}
type
ecdsaPublicKey
ecdsa
.
PublicKey
func
(
key
*
ecdsaPublicKey
)
Type
()
string
{
return
"ecdsa-sha2-"
+
key
.
nistID
()
}
func
(
key
*
ecdsaPublicKey
)
nistID
()
string
{
switch
key
.
Params
()
.
BitSize
{
case
256
:
return
"nistp256"
case
384
:
return
"nistp384"
case
521
:
return
"nistp521"
}
panic
(
"ssh: unsupported ecdsa key size"
)
}
type
ed25519PublicKey
ed25519
.
PublicKey
func
(
key
ed25519PublicKey
)
Type
()
string
{
return
KeyAlgoED25519
}
func
parseED25519
(
in
[]
byte
)
(
out
PublicKey
,
rest
[]
byte
,
err
error
)
{
var
w
struct
{
KeyBytes
[]
byte
Rest
[]
byte
`ssh:"rest"`
}
if
err
:=
Unmarshal
(
in
,
&
w
);
err
!=
nil
{
return
nil
,
nil
,
err
}
key
:=
ed25519
.
PublicKey
(
w
.
KeyBytes
)
return
(
ed25519PublicKey
)(
key
),
w
.
Rest
,
nil
}
func
(
key
ed25519PublicKey
)
Marshal
()
[]
byte
{
w
:=
struct
{
Name
string
KeyBytes
[]
byte
}{
KeyAlgoED25519
,
[]
byte
(
key
),
}
return
Marshal
(
&
w
)
}
func
(
key
ed25519PublicKey
)
Verify
(
b
[]
byte
,
sig
*
Signature
)
error
{
if
sig
.
Format
!=
key
.
Type
()
{
return
fmt
.
Errorf
(
"ssh: signature type %s for key type %s"
,
sig
.
Format
,
key
.
Type
())
}
edKey
:=
(
ed25519
.
PublicKey
)(
key
)
if
ok
:=
ed25519
.
Verify
(
edKey
,
b
,
sig
.
Blob
);
!
ok
{
return
errors
.
New
(
"ssh: signature did not verify"
)
}
return
nil
}
func
(
k
ed25519PublicKey
)
CryptoPublicKey
()
crypto
.
PublicKey
{
return
ed25519
.
PublicKey
(
k
)
}
func
supportedEllipticCurve
(
curve
elliptic
.
Curve
)
bool
{
return
curve
==
elliptic
.
P256
()
||
curve
==
elliptic
.
P384
()
||
curve
==
elliptic
.
P521
()
}
// ecHash returns the hash to match the given elliptic curve, see RFC
// 5656, section 6.2.1
func
ecHash
(
curve
elliptic
.
Curve
)
crypto
.
Hash
{
bitSize
:=
curve
.
Params
()
.
BitSize
switch
{
case
bitSize
<=
256
:
return
crypto
.
SHA256
case
bitSize
<=
384
:
return
crypto
.
SHA384
}
return
crypto
.
SHA512
}
// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1.
func
parseECDSA
(
in
[]
byte
)
(
out
PublicKey
,
rest
[]
byte
,
err
error
)
{
var
w
struct
{
Curve
string
KeyBytes
[]
byte
Rest
[]
byte
`ssh:"rest"`
}
if
err
:=
Unmarshal
(
in
,
&
w
);
err
!=
nil
{
return
nil
,
nil
,
err
}
key
:=
new
(
ecdsa
.
PublicKey
)
switch
w
.
Curve
{
case
"nistp256"
:
key
.
Curve
=
elliptic
.
P256
()
case
"nistp384"
:
key
.
Curve
=
elliptic
.
P384
()
case
"nistp521"
:
key
.
Curve
=
elliptic
.
P521
()
default
:
return
nil
,
nil
,
errors
.
New
(
"ssh: unsupported curve"
)
}
key
.
X
,
key
.
Y
=
elliptic
.
Unmarshal
(
key
.
Curve
,
w
.
KeyBytes
)
if
key
.
X
==
nil
||
key
.
Y
==
nil
{
return
nil
,
nil
,
errors
.
New
(
"ssh: invalid curve point"
)
}
return
(
*
ecdsaPublicKey
)(
key
),
w
.
Rest
,
nil
}
func
(
key
*
ecdsaPublicKey
)
Marshal
()
[]
byte
{
// See RFC 5656, section 3.1.
keyBytes
:=
elliptic
.
Marshal
(
key
.
Curve
,
key
.
X
,
key
.
Y
)
// ECDSA publickey struct layout should match the struct used by
// parseECDSACert in the x/crypto/ssh/agent package.
w
:=
struct
{
Name
string
ID
string
Key
[]
byte
}{
key
.
Type
(),
key
.
nistID
(),
keyBytes
,
}
return
Marshal
(
&
w
)
}
func
(
key
*
ecdsaPublicKey
)
Verify
(
data
[]
byte
,
sig
*
Signature
)
error
{
if
sig
.
Format
!=
key
.
Type
()
{
return
fmt
.
Errorf
(
"ssh: signature type %s for key type %s"
,
sig
.
Format
,
key
.
Type
())
}
h
:=
ecHash
(
key
.
Curve
)
.
New
()
h
.
Write
(
data
)
digest
:=
h
.
Sum
(
nil
)
// Per RFC 5656, section 3.1.2,
// The ecdsa_signature_blob value has the following specific encoding:
// mpint r
// mpint s
var
ecSig
struct
{
R
*
big
.
Int
S
*
big
.
Int
}
if
err
:=
Unmarshal
(
sig
.
Blob
,
&
ecSig
);
err
!=
nil
{
return
err
}
if
ecdsa
.
Verify
((
*
ecdsa
.
PublicKey
)(
key
),
digest
,
ecSig
.
R
,
ecSig
.
S
)
{
return
nil
}
return
errors
.
New
(
"ssh: signature did not verify"
)
}
func
(
k
*
ecdsaPublicKey
)
CryptoPublicKey
()
crypto
.
PublicKey
{
return
(
*
ecdsa
.
PublicKey
)(
k
)
}
// NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey,
// *ecdsa.PrivateKey or any other crypto.Signer and returns a corresponding
// Signer instance. ECDSA keys must use P-256, P-384 or P-521.
func
NewSignerFromKey
(
key
interface
{})
(
Signer
,
error
)
{
switch
key
:=
key
.
(
type
)
{
case
crypto
.
Signer
:
return
NewSignerFromSigner
(
key
)
case
*
dsa
.
PrivateKey
:
return
&
dsaPrivateKey
{
key
},
nil
default
:
return
nil
,
fmt
.
Errorf
(
"ssh: unsupported key type %T"
,
key
)
}
}
type
wrappedSigner
struct
{
signer
crypto
.
Signer
pubKey
PublicKey
}
// NewSignerFromSigner takes any crypto.Signer implementation and
// returns a corresponding Signer interface. This can be used, for
// example, with keys kept in hardware modules.
func
NewSignerFromSigner
(
signer
crypto
.
Signer
)
(
Signer
,
error
)
{
pubKey
,
err
:=
NewPublicKey
(
signer
.
Public
())
if
err
!=
nil
{
return
nil
,
err
}
return
&
wrappedSigner
{
signer
,
pubKey
},
nil
}
func
(
s
*
wrappedSigner
)
PublicKey
()
PublicKey
{
return
s
.
pubKey
}
func
(
s
*
wrappedSigner
)
Sign
(
rand
io
.
Reader
,
data
[]
byte
)
(
*
Signature
,
error
)
{
var
hashFunc
crypto
.
Hash
switch
key
:=
s
.
pubKey
.
(
type
)
{
case
*
rsaPublicKey
,
*
dsaPublicKey
:
hashFunc
=
crypto
.
SHA1
case
*
ecdsaPublicKey
:
hashFunc
=
ecHash
(
key
.
Curve
)
case
ed25519PublicKey
:
default
:
return
nil
,
fmt
.
Errorf
(
"ssh: unsupported key type %T"
,
key
)
}
var
digest
[]
byte
if
hashFunc
!=
0
{
h
:=
hashFunc
.
New
()
h
.
Write
(
data
)
digest
=
h
.
Sum
(
nil
)
}
else
{
digest
=
data
}
signature
,
err
:=
s
.
signer
.
Sign
(
rand
,
digest
,
hashFunc
)
if
err
!=
nil
{
return
nil
,
err
}
// crypto.Signer.Sign is expected to return an ASN.1-encoded signature
// for ECDSA and DSA, but that's not the encoding expected by SSH, so
// re-encode.
switch
s
.
pubKey
.
(
type
)
{
case
*
ecdsaPublicKey
,
*
dsaPublicKey
:
type
asn1Signature
struct
{
R
,
S
*
big
.
Int
}
asn1Sig
:=
new
(
asn1Signature
)
_
,
err
:=
asn1
.
Unmarshal
(
signature
,
asn1Sig
)
if
err
!=
nil
{
return
nil
,
err
}
switch
s
.
pubKey
.
(
type
)
{
case
*
ecdsaPublicKey
:
signature
=
Marshal
(
asn1Sig
)
case
*
dsaPublicKey
:
signature
=
make
([]
byte
,
40
)
r
:=
asn1Sig
.
R
.
Bytes
()
s
:=
asn1Sig
.
S
.
Bytes
()
copy
(
signature
[
20
-
len
(
r
)
:
20
],
r
)
copy
(
signature
[
40
-
len
(
s
)
:
40
],
s
)
}
}
return
&
Signature
{
Format
:
s
.
pubKey
.
Type
(),
Blob
:
signature
,
},
nil
}
// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey,
// or ed25519.PublicKey returns a corresponding PublicKey instance.
// ECDSA keys must use P-256, P-384 or P-521.
func
NewPublicKey
(
key
interface
{})
(
PublicKey
,
error
)
{
switch
key
:=
key
.
(
type
)
{
case
*
rsa
.
PublicKey
:
return
(
*
rsaPublicKey
)(
key
),
nil
case
*
ecdsa
.
PublicKey
:
if
!
supportedEllipticCurve
(
key
.
Curve
)
{
return
nil
,
errors
.
New
(
"ssh: only P-256, P-384 and P-521 EC keys are supported."
)
}
return
(
*
ecdsaPublicKey
)(
key
),
nil
case
*
dsa
.
PublicKey
:
return
(
*
dsaPublicKey
)(
key
),
nil
case
ed25519
.
PublicKey
:
return
(
ed25519PublicKey
)(
key
),
nil
default
:
return
nil
,
fmt
.
Errorf
(
"ssh: unsupported key type %T"
,
key
)
}
}
// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports
// the same keys as ParseRawPrivateKey.
func
ParsePrivateKey
(
pemBytes
[]
byte
)
(
Signer
,
error
)
{
key
,
err
:=
ParseRawPrivateKey
(
pemBytes
)
if
err
!=
nil
{
return
nil
,
err
}
return
NewSignerFromKey
(
key
)
}
// encryptedBlock tells whether a private key is
// encrypted by examining its Proc-Type header
// for a mention of ENCRYPTED
// according to RFC 1421 Section 4.6.1.1.
func
encryptedBlock
(
block
*
pem
.
Block
)
bool
{
return
strings
.
Contains
(
block
.
Headers
[
"Proc-Type"
],
"ENCRYPTED"
)
}
// ParseRawPrivateKey returns a private key from a PEM encoded private key. It
// supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys.
func
ParseRawPrivateKey
(
pemBytes
[]
byte
)
(
interface
{},
error
)
{
block
,
_
:=
pem
.
Decode
(
pemBytes
)
if
block
==
nil
{
return
nil
,
errors
.
New
(
"ssh: no key found"
)
}
if
encryptedBlock
(
block
)
{
return
nil
,
errors
.
New
(
"ssh: cannot decode encrypted private keys"
)
}
switch
block
.
Type
{
case
"RSA PRIVATE KEY"
:
return
x509
.
ParsePKCS1PrivateKey
(
block
.
Bytes
)
case
"EC PRIVATE KEY"
:
return
x509
.
ParseECPrivateKey
(
block
.
Bytes
)
case
"DSA PRIVATE KEY"
:
return
ParseDSAPrivateKey
(
block
.
Bytes
)
case
"OPENSSH PRIVATE KEY"
:
return
parseOpenSSHPrivateKey
(
block
.
Bytes
)
default
:
return
nil
,
fmt
.
Errorf
(
"ssh: unsupported key type %q"
,
block
.
Type
)
}
}
// ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as
// specified by the OpenSSL DSA man page.
func
ParseDSAPrivateKey
(
der
[]
byte
)
(
*
dsa
.
PrivateKey
,
error
)
{
var
k
struct
{
Version
int
P
*
big
.
Int
Q
*
big
.
Int
G
*
big
.
Int
Pub
*
big
.
Int
Priv
*
big
.
Int
}
rest
,
err
:=
asn1
.
Unmarshal
(
der
,
&
k
)
if
err
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: failed to parse DSA key: "
+
err
.
Error
())
}
if
len
(
rest
)
>
0
{
return
nil
,
errors
.
New
(
"ssh: garbage after DSA key"
)
}
return
&
dsa
.
PrivateKey
{
PublicKey
:
dsa
.
PublicKey
{
Parameters
:
dsa
.
Parameters
{
P
:
k
.
P
,
Q
:
k
.
Q
,
G
:
k
.
G
,
},
Y
:
k
.
Pub
,
},
X
:
k
.
Priv
,
},
nil
}
// Implemented based on the documentation at
// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key
func
parseOpenSSHPrivateKey
(
key
[]
byte
)
(
*
ed25519
.
PrivateKey
,
error
)
{
magic
:=
append
([]
byte
(
"openssh-key-v1"
),
0
)
if
!
bytes
.
Equal
(
magic
,
key
[
0
:
len
(
magic
)])
{
return
nil
,
errors
.
New
(
"ssh: invalid openssh private key format"
)
}
remaining
:=
key
[
len
(
magic
)
:
]
var
w
struct
{
CipherName
string
KdfName
string
KdfOpts
string
NumKeys
uint32
PubKey
[]
byte
PrivKeyBlock
[]
byte
}
if
err
:=
Unmarshal
(
remaining
,
&
w
);
err
!=
nil
{
return
nil
,
err
}
pk1
:=
struct
{
Check1
uint32
Check2
uint32
Keytype
string
Pub
[]
byte
Priv
[]
byte
Comment
string
Pad
[]
byte
`ssh:"rest"`
}{}
if
err
:=
Unmarshal
(
w
.
PrivKeyBlock
,
&
pk1
);
err
!=
nil
{
return
nil
,
err
}
if
pk1
.
Check1
!=
pk1
.
Check2
{
return
nil
,
errors
.
New
(
"ssh: checkint mismatch"
)
}
// we only handle ed25519 keys currently
if
pk1
.
Keytype
!=
KeyAlgoED25519
{
return
nil
,
errors
.
New
(
"ssh: unhandled key type"
)
}
for
i
,
b
:=
range
pk1
.
Pad
{
if
int
(
b
)
!=
i
+
1
{
return
nil
,
errors
.
New
(
"ssh: padding not as expected"
)
}
}
if
len
(
pk1
.
Priv
)
!=
ed25519
.
PrivateKeySize
{
return
nil
,
errors
.
New
(
"ssh: private key unexpected length"
)
}
pk
:=
ed25519
.
PrivateKey
(
make
([]
byte
,
ed25519
.
PrivateKeySize
))
copy
(
pk
,
pk1
.
Priv
)
return
&
pk
,
nil
}
// FingerprintLegacyMD5 returns the user presentation of the key's
// fingerprint as described by RFC 4716 section 4.
func
FingerprintLegacyMD5
(
pubKey
PublicKey
)
string
{
md5sum
:=
md5
.
Sum
(
pubKey
.
Marshal
())
hexarray
:=
make
([]
string
,
len
(
md5sum
))
for
i
,
c
:=
range
md5sum
{
hexarray
[
i
]
=
hex
.
EncodeToString
([]
byte
{
c
})
}
return
strings
.
Join
(
hexarray
,
":"
)
}
// FingerprintSHA256 returns the user presentation of the key's
// fingerprint as unpadded base64 encoded sha256 hash.
// This format was introduced from OpenSSH 6.8.
// https://www.openssh.com/txt/release-6.8
// https://tools.ietf.org/html/rfc4648#section-3.2 (unpadded base64 encoding)
func
FingerprintSHA256
(
pubKey
PublicKey
)
string
{
sha256sum
:=
sha256
.
Sum256
(
pubKey
.
Marshal
())
hash
:=
base64
.
RawStdEncoding
.
EncodeToString
(
sha256sum
[
:
])
return
"SHA256:"
+
hash
}
cmd/gost/vendor/golang.org/x/crypto/ssh/mac.go
0 → 100644
View file @
d19d5ada
// Copyright 2012 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
ssh
// Message authentication support
import
(
"crypto/hmac"
"crypto/sha1"
"crypto/sha256"
"hash"
)
type
macMode
struct
{
keySize
int
etm
bool
new
func
(
key
[]
byte
)
hash
.
Hash
}
// truncatingMAC wraps around a hash.Hash and truncates the output digest to
// a given size.
type
truncatingMAC
struct
{
length
int
hmac
hash
.
Hash
}
func
(
t
truncatingMAC
)
Write
(
data
[]
byte
)
(
int
,
error
)
{
return
t
.
hmac
.
Write
(
data
)
}
func
(
t
truncatingMAC
)
Sum
(
in
[]
byte
)
[]
byte
{
out
:=
t
.
hmac
.
Sum
(
in
)
return
out
[
:
len
(
in
)
+
t
.
length
]
}
func
(
t
truncatingMAC
)
Reset
()
{
t
.
hmac
.
Reset
()
}
func
(
t
truncatingMAC
)
Size
()
int
{
return
t
.
length
}
func
(
t
truncatingMAC
)
BlockSize
()
int
{
return
t
.
hmac
.
BlockSize
()
}
var
macModes
=
map
[
string
]
*
macMode
{
"hmac-sha2-256-etm@openssh.com"
:
{
32
,
true
,
func
(
key
[]
byte
)
hash
.
Hash
{
return
hmac
.
New
(
sha256
.
New
,
key
)
}},
"hmac-sha2-256"
:
{
32
,
false
,
func
(
key
[]
byte
)
hash
.
Hash
{
return
hmac
.
New
(
sha256
.
New
,
key
)
}},
"hmac-sha1"
:
{
20
,
false
,
func
(
key
[]
byte
)
hash
.
Hash
{
return
hmac
.
New
(
sha1
.
New
,
key
)
}},
"hmac-sha1-96"
:
{
20
,
false
,
func
(
key
[]
byte
)
hash
.
Hash
{
return
truncatingMAC
{
12
,
hmac
.
New
(
sha1
.
New
,
key
)}
}},
}
cmd/gost/vendor/golang.org/x/crypto/ssh/messages.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"bytes"
"encoding/binary"
"errors"
"fmt"
"io"
"math/big"
"reflect"
"strconv"
"strings"
)
// These are SSH message type numbers. They are scattered around several
// documents but many were taken from [SSH-PARAMETERS].
const
(
msgIgnore
=
2
msgUnimplemented
=
3
msgDebug
=
4
msgNewKeys
=
21
// Standard authentication messages
msgUserAuthSuccess
=
52
msgUserAuthBanner
=
53
)
// SSH messages:
//
// These structures mirror the wire format of the corresponding SSH messages.
// They are marshaled using reflection with the marshal and unmarshal functions
// in this file. The only wrinkle is that a final member of type []byte with a
// ssh tag of "rest" receives the remainder of a packet when unmarshaling.
// See RFC 4253, section 11.1.
const
msgDisconnect
=
1
// disconnectMsg is the message that signals a disconnect. It is also
// the error type returned from mux.Wait()
type
disconnectMsg
struct
{
Reason
uint32
`sshtype:"1"`
Message
string
Language
string
}
func
(
d
*
disconnectMsg
)
Error
()
string
{
return
fmt
.
Sprintf
(
"ssh: disconnect, reason %d: %s"
,
d
.
Reason
,
d
.
Message
)
}
// See RFC 4253, section 7.1.
const
msgKexInit
=
20
type
kexInitMsg
struct
{
Cookie
[
16
]
byte
`sshtype:"20"`
KexAlgos
[]
string
ServerHostKeyAlgos
[]
string
CiphersClientServer
[]
string
CiphersServerClient
[]
string
MACsClientServer
[]
string
MACsServerClient
[]
string
CompressionClientServer
[]
string
CompressionServerClient
[]
string
LanguagesClientServer
[]
string
LanguagesServerClient
[]
string
FirstKexFollows
bool
Reserved
uint32
}
// See RFC 4253, section 8.
// Diffie-Helman
const
msgKexDHInit
=
30
type
kexDHInitMsg
struct
{
X
*
big
.
Int
`sshtype:"30"`
}
const
msgKexECDHInit
=
30
type
kexECDHInitMsg
struct
{
ClientPubKey
[]
byte
`sshtype:"30"`
}
const
msgKexECDHReply
=
31
type
kexECDHReplyMsg
struct
{
HostKey
[]
byte
`sshtype:"31"`
EphemeralPubKey
[]
byte
Signature
[]
byte
}
const
msgKexDHReply
=
31
type
kexDHReplyMsg
struct
{
HostKey
[]
byte
`sshtype:"31"`
Y
*
big
.
Int
Signature
[]
byte
}
// See RFC 4253, section 10.
const
msgServiceRequest
=
5
type
serviceRequestMsg
struct
{
Service
string
`sshtype:"5"`
}
// See RFC 4253, section 10.
const
msgServiceAccept
=
6
type
serviceAcceptMsg
struct
{
Service
string
`sshtype:"6"`
}
// See RFC 4252, section 5.
const
msgUserAuthRequest
=
50
type
userAuthRequestMsg
struct
{
User
string
`sshtype:"50"`
Service
string
Method
string
Payload
[]
byte
`ssh:"rest"`
}
// Used for debug printouts of packets.
type
userAuthSuccessMsg
struct
{
}
// See RFC 4252, section 5.1
const
msgUserAuthFailure
=
51
type
userAuthFailureMsg
struct
{
Methods
[]
string
`sshtype:"51"`
PartialSuccess
bool
}
// See RFC 4256, section 3.2
const
msgUserAuthInfoRequest
=
60
const
msgUserAuthInfoResponse
=
61
type
userAuthInfoRequestMsg
struct
{
User
string
`sshtype:"60"`
Instruction
string
DeprecatedLanguage
string
NumPrompts
uint32
Prompts
[]
byte
`ssh:"rest"`
}
// See RFC 4254, section 5.1.
const
msgChannelOpen
=
90
type
channelOpenMsg
struct
{
ChanType
string
`sshtype:"90"`
PeersId
uint32
PeersWindow
uint32
MaxPacketSize
uint32
TypeSpecificData
[]
byte
`ssh:"rest"`
}
const
msgChannelExtendedData
=
95
const
msgChannelData
=
94
// Used for debug print outs of packets.
type
channelDataMsg
struct
{
PeersId
uint32
`sshtype:"94"`
Length
uint32
Rest
[]
byte
`ssh:"rest"`
}
// See RFC 4254, section 5.1.
const
msgChannelOpenConfirm
=
91
type
channelOpenConfirmMsg
struct
{
PeersId
uint32
`sshtype:"91"`
MyId
uint32
MyWindow
uint32
MaxPacketSize
uint32
TypeSpecificData
[]
byte
`ssh:"rest"`
}
// See RFC 4254, section 5.1.
const
msgChannelOpenFailure
=
92
type
channelOpenFailureMsg
struct
{
PeersId
uint32
`sshtype:"92"`
Reason
RejectionReason
Message
string
Language
string
}
const
msgChannelRequest
=
98
type
channelRequestMsg
struct
{
PeersId
uint32
`sshtype:"98"`
Request
string
WantReply
bool
RequestSpecificData
[]
byte
`ssh:"rest"`
}
// See RFC 4254, section 5.4.
const
msgChannelSuccess
=
99
type
channelRequestSuccessMsg
struct
{
PeersId
uint32
`sshtype:"99"`
}
// See RFC 4254, section 5.4.
const
msgChannelFailure
=
100
type
channelRequestFailureMsg
struct
{
PeersId
uint32
`sshtype:"100"`
}
// See RFC 4254, section 5.3
const
msgChannelClose
=
97
type
channelCloseMsg
struct
{
PeersId
uint32
`sshtype:"97"`
}
// See RFC 4254, section 5.3
const
msgChannelEOF
=
96
type
channelEOFMsg
struct
{
PeersId
uint32
`sshtype:"96"`
}
// See RFC 4254, section 4
const
msgGlobalRequest
=
80
type
globalRequestMsg
struct
{
Type
string
`sshtype:"80"`
WantReply
bool
Data
[]
byte
`ssh:"rest"`
}
// See RFC 4254, section 4
const
msgRequestSuccess
=
81
type
globalRequestSuccessMsg
struct
{
Data
[]
byte
`ssh:"rest" sshtype:"81"`
}
// See RFC 4254, section 4
const
msgRequestFailure
=
82
type
globalRequestFailureMsg
struct
{
Data
[]
byte
`ssh:"rest" sshtype:"82"`
}
// See RFC 4254, section 5.2
const
msgChannelWindowAdjust
=
93
type
windowAdjustMsg
struct
{
PeersId
uint32
`sshtype:"93"`
AdditionalBytes
uint32
}
// See RFC 4252, section 7
const
msgUserAuthPubKeyOk
=
60
type
userAuthPubKeyOkMsg
struct
{
Algo
string
`sshtype:"60"`
PubKey
[]
byte
}
// typeTags returns the possible type bytes for the given reflect.Type, which
// should be a struct. The possible values are separated by a '|' character.
func
typeTags
(
structType
reflect
.
Type
)
(
tags
[]
byte
)
{
tagStr
:=
structType
.
Field
(
0
)
.
Tag
.
Get
(
"sshtype"
)
for
_
,
tag
:=
range
strings
.
Split
(
tagStr
,
"|"
)
{
i
,
err
:=
strconv
.
Atoi
(
tag
)
if
err
==
nil
{
tags
=
append
(
tags
,
byte
(
i
))
}
}
return
tags
}
func
fieldError
(
t
reflect
.
Type
,
field
int
,
problem
string
)
error
{
if
problem
!=
""
{
problem
=
": "
+
problem
}
return
fmt
.
Errorf
(
"ssh: unmarshal error for field %s of type %s%s"
,
t
.
Field
(
field
)
.
Name
,
t
.
Name
(),
problem
)
}
var
errShortRead
=
errors
.
New
(
"ssh: short read"
)
// Unmarshal parses data in SSH wire format into a structure. The out
// argument should be a pointer to struct. If the first member of the
// struct has the "sshtype" tag set to a '|'-separated set of numbers
// in decimal, the packet must start with one of those numbers. In
// case of error, Unmarshal returns a ParseError or
// UnexpectedMessageError.
func
Unmarshal
(
data
[]
byte
,
out
interface
{})
error
{
v
:=
reflect
.
ValueOf
(
out
)
.
Elem
()
structType
:=
v
.
Type
()
expectedTypes
:=
typeTags
(
structType
)
var
expectedType
byte
if
len
(
expectedTypes
)
>
0
{
expectedType
=
expectedTypes
[
0
]
}
if
len
(
data
)
==
0
{
return
parseError
(
expectedType
)
}
if
len
(
expectedTypes
)
>
0
{
goodType
:=
false
for
_
,
e
:=
range
expectedTypes
{
if
e
>
0
&&
data
[
0
]
==
e
{
goodType
=
true
break
}
}
if
!
goodType
{
return
fmt
.
Errorf
(
"ssh: unexpected message type %d (expected one of %v)"
,
data
[
0
],
expectedTypes
)
}
data
=
data
[
1
:
]
}
var
ok
bool
for
i
:=
0
;
i
<
v
.
NumField
();
i
++
{
field
:=
v
.
Field
(
i
)
t
:=
field
.
Type
()
switch
t
.
Kind
()
{
case
reflect
.
Bool
:
if
len
(
data
)
<
1
{
return
errShortRead
}
field
.
SetBool
(
data
[
0
]
!=
0
)
data
=
data
[
1
:
]
case
reflect
.
Array
:
if
t
.
Elem
()
.
Kind
()
!=
reflect
.
Uint8
{
return
fieldError
(
structType
,
i
,
"array of unsupported type"
)
}
if
len
(
data
)
<
t
.
Len
()
{
return
errShortRead
}
for
j
,
n
:=
0
,
t
.
Len
();
j
<
n
;
j
++
{
field
.
Index
(
j
)
.
Set
(
reflect
.
ValueOf
(
data
[
j
]))
}
data
=
data
[
t
.
Len
()
:
]
case
reflect
.
Uint64
:
var
u64
uint64
if
u64
,
data
,
ok
=
parseUint64
(
data
);
!
ok
{
return
errShortRead
}
field
.
SetUint
(
u64
)
case
reflect
.
Uint32
:
var
u32
uint32
if
u32
,
data
,
ok
=
parseUint32
(
data
);
!
ok
{
return
errShortRead
}
field
.
SetUint
(
uint64
(
u32
))
case
reflect
.
Uint8
:
if
len
(
data
)
<
1
{
return
errShortRead
}
field
.
SetUint
(
uint64
(
data
[
0
]))
data
=
data
[
1
:
]
case
reflect
.
String
:
var
s
[]
byte
if
s
,
data
,
ok
=
parseString
(
data
);
!
ok
{
return
fieldError
(
structType
,
i
,
""
)
}
field
.
SetString
(
string
(
s
))
case
reflect
.
Slice
:
switch
t
.
Elem
()
.
Kind
()
{
case
reflect
.
Uint8
:
if
structType
.
Field
(
i
)
.
Tag
.
Get
(
"ssh"
)
==
"rest"
{
field
.
Set
(
reflect
.
ValueOf
(
data
))
data
=
nil
}
else
{
var
s
[]
byte
if
s
,
data
,
ok
=
parseString
(
data
);
!
ok
{
return
errShortRead
}
field
.
Set
(
reflect
.
ValueOf
(
s
))
}
case
reflect
.
String
:
var
nl
[]
string
if
nl
,
data
,
ok
=
parseNameList
(
data
);
!
ok
{
return
errShortRead
}
field
.
Set
(
reflect
.
ValueOf
(
nl
))
default
:
return
fieldError
(
structType
,
i
,
"slice of unsupported type"
)
}
case
reflect
.
Ptr
:
if
t
==
bigIntType
{
var
n
*
big
.
Int
if
n
,
data
,
ok
=
parseInt
(
data
);
!
ok
{
return
errShortRead
}
field
.
Set
(
reflect
.
ValueOf
(
n
))
}
else
{
return
fieldError
(
structType
,
i
,
"pointer to unsupported type"
)
}
default
:
return
fieldError
(
structType
,
i
,
fmt
.
Sprintf
(
"unsupported type: %v"
,
t
))
}
}
if
len
(
data
)
!=
0
{
return
parseError
(
expectedType
)
}
return
nil
}
// Marshal serializes the message in msg to SSH wire format. The msg
// argument should be a struct or pointer to struct. If the first
// member has the "sshtype" tag set to a number in decimal, that
// number is prepended to the result. If the last of member has the
// "ssh" tag set to "rest", its contents are appended to the output.
func
Marshal
(
msg
interface
{})
[]
byte
{
out
:=
make
([]
byte
,
0
,
64
)
return
marshalStruct
(
out
,
msg
)
}
func
marshalStruct
(
out
[]
byte
,
msg
interface
{})
[]
byte
{
v
:=
reflect
.
Indirect
(
reflect
.
ValueOf
(
msg
))
msgTypes
:=
typeTags
(
v
.
Type
())
if
len
(
msgTypes
)
>
0
{
out
=
append
(
out
,
msgTypes
[
0
])
}
for
i
,
n
:=
0
,
v
.
NumField
();
i
<
n
;
i
++
{
field
:=
v
.
Field
(
i
)
switch
t
:=
field
.
Type
();
t
.
Kind
()
{
case
reflect
.
Bool
:
var
v
uint8
if
field
.
Bool
()
{
v
=
1
}
out
=
append
(
out
,
v
)
case
reflect
.
Array
:
if
t
.
Elem
()
.
Kind
()
!=
reflect
.
Uint8
{
panic
(
fmt
.
Sprintf
(
"array of non-uint8 in field %d: %T"
,
i
,
field
.
Interface
()))
}
for
j
,
l
:=
0
,
t
.
Len
();
j
<
l
;
j
++
{
out
=
append
(
out
,
uint8
(
field
.
Index
(
j
)
.
Uint
()))
}
case
reflect
.
Uint32
:
out
=
appendU32
(
out
,
uint32
(
field
.
Uint
()))
case
reflect
.
Uint64
:
out
=
appendU64
(
out
,
uint64
(
field
.
Uint
()))
case
reflect
.
Uint8
:
out
=
append
(
out
,
uint8
(
field
.
Uint
()))
case
reflect
.
String
:
s
:=
field
.
String
()
out
=
appendInt
(
out
,
len
(
s
))
out
=
append
(
out
,
s
...
)
case
reflect
.
Slice
:
switch
t
.
Elem
()
.
Kind
()
{
case
reflect
.
Uint8
:
if
v
.
Type
()
.
Field
(
i
)
.
Tag
.
Get
(
"ssh"
)
!=
"rest"
{
out
=
appendInt
(
out
,
field
.
Len
())
}
out
=
append
(
out
,
field
.
Bytes
()
...
)
case
reflect
.
String
:
offset
:=
len
(
out
)
out
=
appendU32
(
out
,
0
)
if
n
:=
field
.
Len
();
n
>
0
{
for
j
:=
0
;
j
<
n
;
j
++
{
f
:=
field
.
Index
(
j
)
if
j
!=
0
{
out
=
append
(
out
,
','
)
}
out
=
append
(
out
,
f
.
String
()
...
)
}
// overwrite length value
binary
.
BigEndian
.
PutUint32
(
out
[
offset
:
],
uint32
(
len
(
out
)
-
offset
-
4
))
}
default
:
panic
(
fmt
.
Sprintf
(
"slice of unknown type in field %d: %T"
,
i
,
field
.
Interface
()))
}
case
reflect
.
Ptr
:
if
t
==
bigIntType
{
var
n
*
big
.
Int
nValue
:=
reflect
.
ValueOf
(
&
n
)
nValue
.
Elem
()
.
Set
(
field
)
needed
:=
intLength
(
n
)
oldLength
:=
len
(
out
)
if
cap
(
out
)
-
len
(
out
)
<
needed
{
newOut
:=
make
([]
byte
,
len
(
out
),
2
*
(
len
(
out
)
+
needed
))
copy
(
newOut
,
out
)
out
=
newOut
}
out
=
out
[
:
oldLength
+
needed
]
marshalInt
(
out
[
oldLength
:
],
n
)
}
else
{
panic
(
fmt
.
Sprintf
(
"pointer to unknown type in field %d: %T"
,
i
,
field
.
Interface
()))
}
}
}
return
out
}
var
bigOne
=
big
.
NewInt
(
1
)
func
parseString
(
in
[]
byte
)
(
out
,
rest
[]
byte
,
ok
bool
)
{
if
len
(
in
)
<
4
{
return
}
length
:=
binary
.
BigEndian
.
Uint32
(
in
)
in
=
in
[
4
:
]
if
uint32
(
len
(
in
))
<
length
{
return
}
out
=
in
[
:
length
]
rest
=
in
[
length
:
]
ok
=
true
return
}
var
(
comma
=
[]
byte
{
','
}
emptyNameList
=
[]
string
{}
)
func
parseNameList
(
in
[]
byte
)
(
out
[]
string
,
rest
[]
byte
,
ok
bool
)
{
contents
,
rest
,
ok
:=
parseString
(
in
)
if
!
ok
{
return
}
if
len
(
contents
)
==
0
{
out
=
emptyNameList
return
}
parts
:=
bytes
.
Split
(
contents
,
comma
)
out
=
make
([]
string
,
len
(
parts
))
for
i
,
part
:=
range
parts
{
out
[
i
]
=
string
(
part
)
}
return
}
func
parseInt
(
in
[]
byte
)
(
out
*
big
.
Int
,
rest
[]
byte
,
ok
bool
)
{
contents
,
rest
,
ok
:=
parseString
(
in
)
if
!
ok
{
return
}
out
=
new
(
big
.
Int
)
if
len
(
contents
)
>
0
&&
contents
[
0
]
&
0x80
==
0x80
{
// This is a negative number
notBytes
:=
make
([]
byte
,
len
(
contents
))
for
i
:=
range
notBytes
{
notBytes
[
i
]
=
^
contents
[
i
]
}
out
.
SetBytes
(
notBytes
)
out
.
Add
(
out
,
bigOne
)
out
.
Neg
(
out
)
}
else
{
// Positive number
out
.
SetBytes
(
contents
)
}
ok
=
true
return
}
func
parseUint32
(
in
[]
byte
)
(
uint32
,
[]
byte
,
bool
)
{
if
len
(
in
)
<
4
{
return
0
,
nil
,
false
}
return
binary
.
BigEndian
.
Uint32
(
in
),
in
[
4
:
],
true
}
func
parseUint64
(
in
[]
byte
)
(
uint64
,
[]
byte
,
bool
)
{
if
len
(
in
)
<
8
{
return
0
,
nil
,
false
}
return
binary
.
BigEndian
.
Uint64
(
in
),
in
[
8
:
],
true
}
func
intLength
(
n
*
big
.
Int
)
int
{
length
:=
4
/* length bytes */
if
n
.
Sign
()
<
0
{
nMinus1
:=
new
(
big
.
Int
)
.
Neg
(
n
)
nMinus1
.
Sub
(
nMinus1
,
bigOne
)
bitLen
:=
nMinus1
.
BitLen
()
if
bitLen
%
8
==
0
{
// The number will need 0xff padding
length
++
}
length
+=
(
bitLen
+
7
)
/
8
}
else
if
n
.
Sign
()
==
0
{
// A zero is the zero length string
}
else
{
bitLen
:=
n
.
BitLen
()
if
bitLen
%
8
==
0
{
// The number will need 0x00 padding
length
++
}
length
+=
(
bitLen
+
7
)
/
8
}
return
length
}
func
marshalUint32
(
to
[]
byte
,
n
uint32
)
[]
byte
{
binary
.
BigEndian
.
PutUint32
(
to
,
n
)
return
to
[
4
:
]
}
func
marshalUint64
(
to
[]
byte
,
n
uint64
)
[]
byte
{
binary
.
BigEndian
.
PutUint64
(
to
,
n
)
return
to
[
8
:
]
}
func
marshalInt
(
to
[]
byte
,
n
*
big
.
Int
)
[]
byte
{
lengthBytes
:=
to
to
=
to
[
4
:
]
length
:=
0
if
n
.
Sign
()
<
0
{
// A negative number has to be converted to two's-complement
// form. So we'll subtract 1 and invert. If the
// most-significant-bit isn't set then we'll need to pad the
// beginning with 0xff in order to keep the number negative.
nMinus1
:=
new
(
big
.
Int
)
.
Neg
(
n
)
nMinus1
.
Sub
(
nMinus1
,
bigOne
)
bytes
:=
nMinus1
.
Bytes
()
for
i
:=
range
bytes
{
bytes
[
i
]
^=
0xff
}
if
len
(
bytes
)
==
0
||
bytes
[
0
]
&
0x80
==
0
{
to
[
0
]
=
0xff
to
=
to
[
1
:
]
length
++
}
nBytes
:=
copy
(
to
,
bytes
)
to
=
to
[
nBytes
:
]
length
+=
nBytes
}
else
if
n
.
Sign
()
==
0
{
// A zero is the zero length string
}
else
{
bytes
:=
n
.
Bytes
()
if
len
(
bytes
)
>
0
&&
bytes
[
0
]
&
0x80
!=
0
{
// We'll have to pad this with a 0x00 in order to
// stop it looking like a negative number.
to
[
0
]
=
0
to
=
to
[
1
:
]
length
++
}
nBytes
:=
copy
(
to
,
bytes
)
to
=
to
[
nBytes
:
]
length
+=
nBytes
}
lengthBytes
[
0
]
=
byte
(
length
>>
24
)
lengthBytes
[
1
]
=
byte
(
length
>>
16
)
lengthBytes
[
2
]
=
byte
(
length
>>
8
)
lengthBytes
[
3
]
=
byte
(
length
)
return
to
}
func
writeInt
(
w
io
.
Writer
,
n
*
big
.
Int
)
{
length
:=
intLength
(
n
)
buf
:=
make
([]
byte
,
length
)
marshalInt
(
buf
,
n
)
w
.
Write
(
buf
)
}
func
writeString
(
w
io
.
Writer
,
s
[]
byte
)
{
var
lengthBytes
[
4
]
byte
lengthBytes
[
0
]
=
byte
(
len
(
s
)
>>
24
)
lengthBytes
[
1
]
=
byte
(
len
(
s
)
>>
16
)
lengthBytes
[
2
]
=
byte
(
len
(
s
)
>>
8
)
lengthBytes
[
3
]
=
byte
(
len
(
s
))
w
.
Write
(
lengthBytes
[
:
])
w
.
Write
(
s
)
}
func
stringLength
(
n
int
)
int
{
return
4
+
n
}
func
marshalString
(
to
[]
byte
,
s
[]
byte
)
[]
byte
{
to
[
0
]
=
byte
(
len
(
s
)
>>
24
)
to
[
1
]
=
byte
(
len
(
s
)
>>
16
)
to
[
2
]
=
byte
(
len
(
s
)
>>
8
)
to
[
3
]
=
byte
(
len
(
s
))
to
=
to
[
4
:
]
copy
(
to
,
s
)
return
to
[
len
(
s
)
:
]
}
var
bigIntType
=
reflect
.
TypeOf
((
*
big
.
Int
)(
nil
))
// Decode a packet into its corresponding message.
func
decode
(
packet
[]
byte
)
(
interface
{},
error
)
{
var
msg
interface
{}
switch
packet
[
0
]
{
case
msgDisconnect
:
msg
=
new
(
disconnectMsg
)
case
msgServiceRequest
:
msg
=
new
(
serviceRequestMsg
)
case
msgServiceAccept
:
msg
=
new
(
serviceAcceptMsg
)
case
msgKexInit
:
msg
=
new
(
kexInitMsg
)
case
msgKexDHInit
:
msg
=
new
(
kexDHInitMsg
)
case
msgKexDHReply
:
msg
=
new
(
kexDHReplyMsg
)
case
msgUserAuthRequest
:
msg
=
new
(
userAuthRequestMsg
)
case
msgUserAuthSuccess
:
return
new
(
userAuthSuccessMsg
),
nil
case
msgUserAuthFailure
:
msg
=
new
(
userAuthFailureMsg
)
case
msgUserAuthPubKeyOk
:
msg
=
new
(
userAuthPubKeyOkMsg
)
case
msgGlobalRequest
:
msg
=
new
(
globalRequestMsg
)
case
msgRequestSuccess
:
msg
=
new
(
globalRequestSuccessMsg
)
case
msgRequestFailure
:
msg
=
new
(
globalRequestFailureMsg
)
case
msgChannelOpen
:
msg
=
new
(
channelOpenMsg
)
case
msgChannelData
:
msg
=
new
(
channelDataMsg
)
case
msgChannelOpenConfirm
:
msg
=
new
(
channelOpenConfirmMsg
)
case
msgChannelOpenFailure
:
msg
=
new
(
channelOpenFailureMsg
)
case
msgChannelWindowAdjust
:
msg
=
new
(
windowAdjustMsg
)
case
msgChannelEOF
:
msg
=
new
(
channelEOFMsg
)
case
msgChannelClose
:
msg
=
new
(
channelCloseMsg
)
case
msgChannelRequest
:
msg
=
new
(
channelRequestMsg
)
case
msgChannelSuccess
:
msg
=
new
(
channelRequestSuccessMsg
)
case
msgChannelFailure
:
msg
=
new
(
channelRequestFailureMsg
)
default
:
return
nil
,
unexpectedMessageError
(
0
,
packet
[
0
])
}
if
err
:=
Unmarshal
(
packet
,
msg
);
err
!=
nil
{
return
nil
,
err
}
return
msg
,
nil
}
cmd/gost/vendor/golang.org/x/crypto/ssh/mux.go
0 → 100644
View file @
d19d5ada
// Copyright 2013 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
ssh
import
(
"encoding/binary"
"fmt"
"io"
"log"
"sync"
"sync/atomic"
)
// debugMux, if set, causes messages in the connection protocol to be
// logged.
const
debugMux
=
false
// chanList is a thread safe channel list.
type
chanList
struct
{
// protects concurrent access to chans
sync
.
Mutex
// chans are indexed by the local id of the channel, which the
// other side should send in the PeersId field.
chans
[]
*
channel
// This is a debugging aid: it offsets all IDs by this
// amount. This helps distinguish otherwise identical
// server/client muxes
offset
uint32
}
// Assigns a channel ID to the given channel.
func
(
c
*
chanList
)
add
(
ch
*
channel
)
uint32
{
c
.
Lock
()
defer
c
.
Unlock
()
for
i
:=
range
c
.
chans
{
if
c
.
chans
[
i
]
==
nil
{
c
.
chans
[
i
]
=
ch
return
uint32
(
i
)
+
c
.
offset
}
}
c
.
chans
=
append
(
c
.
chans
,
ch
)
return
uint32
(
len
(
c
.
chans
)
-
1
)
+
c
.
offset
}
// getChan returns the channel for the given ID.
func
(
c
*
chanList
)
getChan
(
id
uint32
)
*
channel
{
id
-=
c
.
offset
c
.
Lock
()
defer
c
.
Unlock
()
if
id
<
uint32
(
len
(
c
.
chans
))
{
return
c
.
chans
[
id
]
}
return
nil
}
func
(
c
*
chanList
)
remove
(
id
uint32
)
{
id
-=
c
.
offset
c
.
Lock
()
if
id
<
uint32
(
len
(
c
.
chans
))
{
c
.
chans
[
id
]
=
nil
}
c
.
Unlock
()
}
// dropAll forgets all channels it knows, returning them in a slice.
func
(
c
*
chanList
)
dropAll
()
[]
*
channel
{
c
.
Lock
()
defer
c
.
Unlock
()
var
r
[]
*
channel
for
_
,
ch
:=
range
c
.
chans
{
if
ch
==
nil
{
continue
}
r
=
append
(
r
,
ch
)
}
c
.
chans
=
nil
return
r
}
// mux represents the state for the SSH connection protocol, which
// multiplexes many channels onto a single packet transport.
type
mux
struct
{
conn
packetConn
chanList
chanList
incomingChannels
chan
NewChannel
globalSentMu
sync
.
Mutex
globalResponses
chan
interface
{}
incomingRequests
chan
*
Request
errCond
*
sync
.
Cond
err
error
}
// When debugging, each new chanList instantiation has a different
// offset.
var
globalOff
uint32
func
(
m
*
mux
)
Wait
()
error
{
m
.
errCond
.
L
.
Lock
()
defer
m
.
errCond
.
L
.
Unlock
()
for
m
.
err
==
nil
{
m
.
errCond
.
Wait
()
}
return
m
.
err
}
// newMux returns a mux that runs over the given connection.
func
newMux
(
p
packetConn
)
*
mux
{
m
:=
&
mux
{
conn
:
p
,
incomingChannels
:
make
(
chan
NewChannel
,
chanSize
),
globalResponses
:
make
(
chan
interface
{},
1
),
incomingRequests
:
make
(
chan
*
Request
,
chanSize
),
errCond
:
newCond
(),
}
if
debugMux
{
m
.
chanList
.
offset
=
atomic
.
AddUint32
(
&
globalOff
,
1
)
}
go
m
.
loop
()
return
m
}
func
(
m
*
mux
)
sendMessage
(
msg
interface
{})
error
{
p
:=
Marshal
(
msg
)
if
debugMux
{
log
.
Printf
(
"send global(%d): %#v"
,
m
.
chanList
.
offset
,
msg
)
}
return
m
.
conn
.
writePacket
(
p
)
}
func
(
m
*
mux
)
SendRequest
(
name
string
,
wantReply
bool
,
payload
[]
byte
)
(
bool
,
[]
byte
,
error
)
{
if
wantReply
{
m
.
globalSentMu
.
Lock
()
defer
m
.
globalSentMu
.
Unlock
()
}
if
err
:=
m
.
sendMessage
(
globalRequestMsg
{
Type
:
name
,
WantReply
:
wantReply
,
Data
:
payload
,
});
err
!=
nil
{
return
false
,
nil
,
err
}
if
!
wantReply
{
return
false
,
nil
,
nil
}
msg
,
ok
:=
<-
m
.
globalResponses
if
!
ok
{
return
false
,
nil
,
io
.
EOF
}
switch
msg
:=
msg
.
(
type
)
{
case
*
globalRequestFailureMsg
:
return
false
,
msg
.
Data
,
nil
case
*
globalRequestSuccessMsg
:
return
true
,
msg
.
Data
,
nil
default
:
return
false
,
nil
,
fmt
.
Errorf
(
"ssh: unexpected response to request: %#v"
,
msg
)
}
}
// ackRequest must be called after processing a global request that
// has WantReply set.
func
(
m
*
mux
)
ackRequest
(
ok
bool
,
data
[]
byte
)
error
{
if
ok
{
return
m
.
sendMessage
(
globalRequestSuccessMsg
{
Data
:
data
})
}
return
m
.
sendMessage
(
globalRequestFailureMsg
{
Data
:
data
})
}
func
(
m
*
mux
)
Close
()
error
{
return
m
.
conn
.
Close
()
}
// loop runs the connection machine. It will process packets until an
// error is encountered. To synchronize on loop exit, use mux.Wait.
func
(
m
*
mux
)
loop
()
{
var
err
error
for
err
==
nil
{
err
=
m
.
onePacket
()
}
for
_
,
ch
:=
range
m
.
chanList
.
dropAll
()
{
ch
.
close
()
}
close
(
m
.
incomingChannels
)
close
(
m
.
incomingRequests
)
close
(
m
.
globalResponses
)
m
.
conn
.
Close
()
m
.
errCond
.
L
.
Lock
()
m
.
err
=
err
m
.
errCond
.
Broadcast
()
m
.
errCond
.
L
.
Unlock
()
if
debugMux
{
log
.
Println
(
"loop exit"
,
err
)
}
}
// onePacket reads and processes one packet.
func
(
m
*
mux
)
onePacket
()
error
{
packet
,
err
:=
m
.
conn
.
readPacket
()
if
err
!=
nil
{
return
err
}
if
debugMux
{
if
packet
[
0
]
==
msgChannelData
||
packet
[
0
]
==
msgChannelExtendedData
{
log
.
Printf
(
"decoding(%d): data packet - %d bytes"
,
m
.
chanList
.
offset
,
len
(
packet
))
}
else
{
p
,
_
:=
decode
(
packet
)
log
.
Printf
(
"decoding(%d): %d %#v - %d bytes"
,
m
.
chanList
.
offset
,
packet
[
0
],
p
,
len
(
packet
))
}
}
switch
packet
[
0
]
{
case
msgChannelOpen
:
return
m
.
handleChannelOpen
(
packet
)
case
msgGlobalRequest
,
msgRequestSuccess
,
msgRequestFailure
:
return
m
.
handleGlobalPacket
(
packet
)
}
// assume a channel packet.
if
len
(
packet
)
<
5
{
return
parseError
(
packet
[
0
])
}
id
:=
binary
.
BigEndian
.
Uint32
(
packet
[
1
:
])
ch
:=
m
.
chanList
.
getChan
(
id
)
if
ch
==
nil
{
return
fmt
.
Errorf
(
"ssh: invalid channel %d"
,
id
)
}
return
ch
.
handlePacket
(
packet
)
}
func
(
m
*
mux
)
handleGlobalPacket
(
packet
[]
byte
)
error
{
msg
,
err
:=
decode
(
packet
)
if
err
!=
nil
{
return
err
}
switch
msg
:=
msg
.
(
type
)
{
case
*
globalRequestMsg
:
m
.
incomingRequests
<-
&
Request
{
Type
:
msg
.
Type
,
WantReply
:
msg
.
WantReply
,
Payload
:
msg
.
Data
,
mux
:
m
,
}
case
*
globalRequestSuccessMsg
,
*
globalRequestFailureMsg
:
m
.
globalResponses
<-
msg
default
:
panic
(
fmt
.
Sprintf
(
"not a global message %#v"
,
msg
))
}
return
nil
}
// handleChannelOpen schedules a channel to be Accept()ed.
func
(
m
*
mux
)
handleChannelOpen
(
packet
[]
byte
)
error
{
var
msg
channelOpenMsg
if
err
:=
Unmarshal
(
packet
,
&
msg
);
err
!=
nil
{
return
err
}
if
msg
.
MaxPacketSize
<
minPacketLength
||
msg
.
MaxPacketSize
>
1
<<
31
{
failMsg
:=
channelOpenFailureMsg
{
PeersId
:
msg
.
PeersId
,
Reason
:
ConnectionFailed
,
Message
:
"invalid request"
,
Language
:
"en_US.UTF-8"
,
}
return
m
.
sendMessage
(
failMsg
)
}
c
:=
m
.
newChannel
(
msg
.
ChanType
,
channelInbound
,
msg
.
TypeSpecificData
)
c
.
remoteId
=
msg
.
PeersId
c
.
maxRemotePayload
=
msg
.
MaxPacketSize
c
.
remoteWin
.
add
(
msg
.
PeersWindow
)
m
.
incomingChannels
<-
c
return
nil
}
func
(
m
*
mux
)
OpenChannel
(
chanType
string
,
extra
[]
byte
)
(
Channel
,
<-
chan
*
Request
,
error
)
{
ch
,
err
:=
m
.
openChannel
(
chanType
,
extra
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
return
ch
,
ch
.
incomingRequests
,
nil
}
func
(
m
*
mux
)
openChannel
(
chanType
string
,
extra
[]
byte
)
(
*
channel
,
error
)
{
ch
:=
m
.
newChannel
(
chanType
,
channelOutbound
,
extra
)
ch
.
maxIncomingPayload
=
channelMaxPacket
open
:=
channelOpenMsg
{
ChanType
:
chanType
,
PeersWindow
:
ch
.
myWindow
,
MaxPacketSize
:
ch
.
maxIncomingPayload
,
TypeSpecificData
:
extra
,
PeersId
:
ch
.
localId
,
}
if
err
:=
m
.
sendMessage
(
open
);
err
!=
nil
{
return
nil
,
err
}
switch
msg
:=
(
<-
ch
.
msg
)
.
(
type
)
{
case
*
channelOpenConfirmMsg
:
return
ch
,
nil
case
*
channelOpenFailureMsg
:
return
nil
,
&
OpenChannelError
{
msg
.
Reason
,
msg
.
Message
}
default
:
return
nil
,
fmt
.
Errorf
(
"ssh: unexpected packet in response to channel open: %T"
,
msg
)
}
}
cmd/gost/vendor/golang.org/x/crypto/ssh/server.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"bytes"
"errors"
"fmt"
"io"
"net"
"strings"
)
// The Permissions type holds fine-grained permissions that are
// specific to a user or a specific authentication method for a
// user. Permissions, except for "source-address", must be enforced in
// the server application layer, after successful authentication. The
// Permissions are passed on in ServerConn so a server implementation
// can honor them.
type
Permissions
struct
{
// Critical options restrict default permissions. Common
// restrictions are "source-address" and "force-command". If
// the server cannot enforce the restriction, or does not
// recognize it, the user should not authenticate.
CriticalOptions
map
[
string
]
string
// Extensions are extra functionality that the server may
// offer on authenticated connections. Common extensions are
// "permit-agent-forwarding", "permit-X11-forwarding". Lack of
// support for an extension does not preclude authenticating a
// user.
Extensions
map
[
string
]
string
}
// ServerConfig holds server specific configuration data.
type
ServerConfig
struct
{
// Config contains configuration shared between client and server.
Config
hostKeys
[]
Signer
// NoClientAuth is true if clients are allowed to connect without
// authenticating.
NoClientAuth
bool
// PasswordCallback, if non-nil, is called when a user
// attempts to authenticate using a password.
PasswordCallback
func
(
conn
ConnMetadata
,
password
[]
byte
)
(
*
Permissions
,
error
)
// PublicKeyCallback, if non-nil, is called when a client attempts public
// key authentication. It must return true if the given public key is
// valid for the given user. For example, see CertChecker.Authenticate.
PublicKeyCallback
func
(
conn
ConnMetadata
,
key
PublicKey
)
(
*
Permissions
,
error
)
// KeyboardInteractiveCallback, if non-nil, is called when
// keyboard-interactive authentication is selected (RFC
// 4256). The client object's Challenge function should be
// used to query the user. The callback may offer multiple
// Challenge rounds. To avoid information leaks, the client
// should be presented a challenge even if the user is
// unknown.
KeyboardInteractiveCallback
func
(
conn
ConnMetadata
,
client
KeyboardInteractiveChallenge
)
(
*
Permissions
,
error
)
// AuthLogCallback, if non-nil, is called to log all authentication
// attempts.
AuthLogCallback
func
(
conn
ConnMetadata
,
method
string
,
err
error
)
// ServerVersion is the version identification string to announce in
// the public handshake.
// If empty, a reasonable default is used.
// Note that RFC 4253 section 4.2 requires that this string start with
// "SSH-2.0-".
ServerVersion
string
}
// AddHostKey adds a private key as a host key. If an existing host
// key exists with the same algorithm, it is overwritten. Each server
// config must have at least one host key.
func
(
s
*
ServerConfig
)
AddHostKey
(
key
Signer
)
{
for
i
,
k
:=
range
s
.
hostKeys
{
if
k
.
PublicKey
()
.
Type
()
==
key
.
PublicKey
()
.
Type
()
{
s
.
hostKeys
[
i
]
=
key
return
}
}
s
.
hostKeys
=
append
(
s
.
hostKeys
,
key
)
}
// cachedPubKey contains the results of querying whether a public key is
// acceptable for a user.
type
cachedPubKey
struct
{
user
string
pubKeyData
[]
byte
result
error
perms
*
Permissions
}
const
maxCachedPubKeys
=
16
// pubKeyCache caches tests for public keys. Since SSH clients
// will query whether a public key is acceptable before attempting to
// authenticate with it, we end up with duplicate queries for public
// key validity. The cache only applies to a single ServerConn.
type
pubKeyCache
struct
{
keys
[]
cachedPubKey
}
// get returns the result for a given user/algo/key tuple.
func
(
c
*
pubKeyCache
)
get
(
user
string
,
pubKeyData
[]
byte
)
(
cachedPubKey
,
bool
)
{
for
_
,
k
:=
range
c
.
keys
{
if
k
.
user
==
user
&&
bytes
.
Equal
(
k
.
pubKeyData
,
pubKeyData
)
{
return
k
,
true
}
}
return
cachedPubKey
{},
false
}
// add adds the given tuple to the cache.
func
(
c
*
pubKeyCache
)
add
(
candidate
cachedPubKey
)
{
if
len
(
c
.
keys
)
<
maxCachedPubKeys
{
c
.
keys
=
append
(
c
.
keys
,
candidate
)
}
}
// ServerConn is an authenticated SSH connection, as seen from the
// server
type
ServerConn
struct
{
Conn
// If the succeeding authentication callback returned a
// non-nil Permissions pointer, it is stored here.
Permissions
*
Permissions
}
// NewServerConn starts a new SSH server with c as the underlying
// transport. It starts with a handshake and, if the handshake is
// unsuccessful, it closes the connection and returns an error. The
// Request and NewChannel channels must be serviced, or the connection
// will hang.
func
NewServerConn
(
c
net
.
Conn
,
config
*
ServerConfig
)
(
*
ServerConn
,
<-
chan
NewChannel
,
<-
chan
*
Request
,
error
)
{
fullConf
:=
*
config
fullConf
.
SetDefaults
()
s
:=
&
connection
{
sshConn
:
sshConn
{
conn
:
c
},
}
perms
,
err
:=
s
.
serverHandshake
(
&
fullConf
)
if
err
!=
nil
{
c
.
Close
()
return
nil
,
nil
,
nil
,
err
}
return
&
ServerConn
{
s
,
perms
},
s
.
mux
.
incomingChannels
,
s
.
mux
.
incomingRequests
,
nil
}
// signAndMarshal signs the data with the appropriate algorithm,
// and serializes the result in SSH wire format.
func
signAndMarshal
(
k
Signer
,
rand
io
.
Reader
,
data
[]
byte
)
([]
byte
,
error
)
{
sig
,
err
:=
k
.
Sign
(
rand
,
data
)
if
err
!=
nil
{
return
nil
,
err
}
return
Marshal
(
sig
),
nil
}
// handshake performs key exchange and user authentication.
func
(
s
*
connection
)
serverHandshake
(
config
*
ServerConfig
)
(
*
Permissions
,
error
)
{
if
len
(
config
.
hostKeys
)
==
0
{
return
nil
,
errors
.
New
(
"ssh: server has no host keys"
)
}
if
!
config
.
NoClientAuth
&&
config
.
PasswordCallback
==
nil
&&
config
.
PublicKeyCallback
==
nil
&&
config
.
KeyboardInteractiveCallback
==
nil
{
return
nil
,
errors
.
New
(
"ssh: no authentication methods configured but NoClientAuth is also false"
)
}
if
config
.
ServerVersion
!=
""
{
s
.
serverVersion
=
[]
byte
(
config
.
ServerVersion
)
}
else
{
s
.
serverVersion
=
[]
byte
(
packageVersion
)
}
var
err
error
s
.
clientVersion
,
err
=
exchangeVersions
(
s
.
sshConn
.
conn
,
s
.
serverVersion
)
if
err
!=
nil
{
return
nil
,
err
}
tr
:=
newTransport
(
s
.
sshConn
.
conn
,
config
.
Rand
,
false
/* not client */
)
s
.
transport
=
newServerTransport
(
tr
,
s
.
clientVersion
,
s
.
serverVersion
,
config
)
if
err
:=
s
.
transport
.
waitSession
();
err
!=
nil
{
return
nil
,
err
}
// We just did the key change, so the session ID is established.
s
.
sessionID
=
s
.
transport
.
getSessionID
()
var
packet
[]
byte
if
packet
,
err
=
s
.
transport
.
readPacket
();
err
!=
nil
{
return
nil
,
err
}
var
serviceRequest
serviceRequestMsg
if
err
=
Unmarshal
(
packet
,
&
serviceRequest
);
err
!=
nil
{
return
nil
,
err
}
if
serviceRequest
.
Service
!=
serviceUserAuth
{
return
nil
,
errors
.
New
(
"ssh: requested service '"
+
serviceRequest
.
Service
+
"' before authenticating"
)
}
serviceAccept
:=
serviceAcceptMsg
{
Service
:
serviceUserAuth
,
}
if
err
:=
s
.
transport
.
writePacket
(
Marshal
(
&
serviceAccept
));
err
!=
nil
{
return
nil
,
err
}
perms
,
err
:=
s
.
serverAuthenticate
(
config
)
if
err
!=
nil
{
return
nil
,
err
}
s
.
mux
=
newMux
(
s
.
transport
)
return
perms
,
err
}
func
isAcceptableAlgo
(
algo
string
)
bool
{
switch
algo
{
case
KeyAlgoRSA
,
KeyAlgoDSA
,
KeyAlgoECDSA256
,
KeyAlgoECDSA384
,
KeyAlgoECDSA521
,
KeyAlgoED25519
,
CertAlgoRSAv01
,
CertAlgoDSAv01
,
CertAlgoECDSA256v01
,
CertAlgoECDSA384v01
,
CertAlgoECDSA521v01
:
return
true
}
return
false
}
func
checkSourceAddress
(
addr
net
.
Addr
,
sourceAddrs
string
)
error
{
if
addr
==
nil
{
return
errors
.
New
(
"ssh: no address known for client, but source-address match required"
)
}
tcpAddr
,
ok
:=
addr
.
(
*
net
.
TCPAddr
)
if
!
ok
{
return
fmt
.
Errorf
(
"ssh: remote address %v is not an TCP address when checking source-address match"
,
addr
)
}
for
_
,
sourceAddr
:=
range
strings
.
Split
(
sourceAddrs
,
","
)
{
if
allowedIP
:=
net
.
ParseIP
(
sourceAddr
);
allowedIP
!=
nil
{
if
allowedIP
.
Equal
(
tcpAddr
.
IP
)
{
return
nil
}
}
else
{
_
,
ipNet
,
err
:=
net
.
ParseCIDR
(
sourceAddr
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"ssh: error parsing source-address restriction %q: %v"
,
sourceAddr
,
err
)
}
if
ipNet
.
Contains
(
tcpAddr
.
IP
)
{
return
nil
}
}
}
return
fmt
.
Errorf
(
"ssh: remote address %v is not allowed because of source-address restriction"
,
addr
)
}
func
(
s
*
connection
)
serverAuthenticate
(
config
*
ServerConfig
)
(
*
Permissions
,
error
)
{
sessionID
:=
s
.
transport
.
getSessionID
()
var
cache
pubKeyCache
var
perms
*
Permissions
userAuthLoop
:
for
{
var
userAuthReq
userAuthRequestMsg
if
packet
,
err
:=
s
.
transport
.
readPacket
();
err
!=
nil
{
return
nil
,
err
}
else
if
err
=
Unmarshal
(
packet
,
&
userAuthReq
);
err
!=
nil
{
return
nil
,
err
}
if
userAuthReq
.
Service
!=
serviceSSH
{
return
nil
,
errors
.
New
(
"ssh: client attempted to negotiate for unknown service: "
+
userAuthReq
.
Service
)
}
s
.
user
=
userAuthReq
.
User
perms
=
nil
authErr
:=
errors
.
New
(
"no auth passed yet"
)
switch
userAuthReq
.
Method
{
case
"none"
:
if
config
.
NoClientAuth
{
authErr
=
nil
}
case
"password"
:
if
config
.
PasswordCallback
==
nil
{
authErr
=
errors
.
New
(
"ssh: password auth not configured"
)
break
}
payload
:=
userAuthReq
.
Payload
if
len
(
payload
)
<
1
||
payload
[
0
]
!=
0
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
payload
=
payload
[
1
:
]
password
,
payload
,
ok
:=
parseString
(
payload
)
if
!
ok
||
len
(
payload
)
>
0
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
perms
,
authErr
=
config
.
PasswordCallback
(
s
,
password
)
case
"keyboard-interactive"
:
if
config
.
KeyboardInteractiveCallback
==
nil
{
authErr
=
errors
.
New
(
"ssh: keyboard-interactive auth not configubred"
)
break
}
prompter
:=
&
sshClientKeyboardInteractive
{
s
}
perms
,
authErr
=
config
.
KeyboardInteractiveCallback
(
s
,
prompter
.
Challenge
)
case
"publickey"
:
if
config
.
PublicKeyCallback
==
nil
{
authErr
=
errors
.
New
(
"ssh: publickey auth not configured"
)
break
}
payload
:=
userAuthReq
.
Payload
if
len
(
payload
)
<
1
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
isQuery
:=
payload
[
0
]
==
0
payload
=
payload
[
1
:
]
algoBytes
,
payload
,
ok
:=
parseString
(
payload
)
if
!
ok
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
algo
:=
string
(
algoBytes
)
if
!
isAcceptableAlgo
(
algo
)
{
authErr
=
fmt
.
Errorf
(
"ssh: algorithm %q not accepted"
,
algo
)
break
}
pubKeyData
,
payload
,
ok
:=
parseString
(
payload
)
if
!
ok
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
pubKey
,
err
:=
ParsePublicKey
(
pubKeyData
)
if
err
!=
nil
{
return
nil
,
err
}
candidate
,
ok
:=
cache
.
get
(
s
.
user
,
pubKeyData
)
if
!
ok
{
candidate
.
user
=
s
.
user
candidate
.
pubKeyData
=
pubKeyData
candidate
.
perms
,
candidate
.
result
=
config
.
PublicKeyCallback
(
s
,
pubKey
)
if
candidate
.
result
==
nil
&&
candidate
.
perms
!=
nil
&&
candidate
.
perms
.
CriticalOptions
!=
nil
&&
candidate
.
perms
.
CriticalOptions
[
sourceAddressCriticalOption
]
!=
""
{
candidate
.
result
=
checkSourceAddress
(
s
.
RemoteAddr
(),
candidate
.
perms
.
CriticalOptions
[
sourceAddressCriticalOption
])
}
cache
.
add
(
candidate
)
}
if
isQuery
{
// The client can query if the given public key
// would be okay.
if
len
(
payload
)
>
0
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
if
candidate
.
result
==
nil
{
okMsg
:=
userAuthPubKeyOkMsg
{
Algo
:
algo
,
PubKey
:
pubKeyData
,
}
if
err
=
s
.
transport
.
writePacket
(
Marshal
(
&
okMsg
));
err
!=
nil
{
return
nil
,
err
}
continue
userAuthLoop
}
authErr
=
candidate
.
result
}
else
{
sig
,
payload
,
ok
:=
parseSignature
(
payload
)
if
!
ok
||
len
(
payload
)
>
0
{
return
nil
,
parseError
(
msgUserAuthRequest
)
}
// Ensure the public key algo and signature algo
// are supported. Compare the private key
// algorithm name that corresponds to algo with
// sig.Format. This is usually the same, but
// for certs, the names differ.
if
!
isAcceptableAlgo
(
sig
.
Format
)
{
break
}
signedData
:=
buildDataSignedForAuth
(
sessionID
,
userAuthReq
,
algoBytes
,
pubKeyData
)
if
err
:=
pubKey
.
Verify
(
signedData
,
sig
);
err
!=
nil
{
return
nil
,
err
}
authErr
=
candidate
.
result
perms
=
candidate
.
perms
}
default
:
authErr
=
fmt
.
Errorf
(
"ssh: unknown method %q"
,
userAuthReq
.
Method
)
}
if
config
.
AuthLogCallback
!=
nil
{
config
.
AuthLogCallback
(
s
,
userAuthReq
.
Method
,
authErr
)
}
if
authErr
==
nil
{
break
userAuthLoop
}
var
failureMsg
userAuthFailureMsg
if
config
.
PasswordCallback
!=
nil
{
failureMsg
.
Methods
=
append
(
failureMsg
.
Methods
,
"password"
)
}
if
config
.
PublicKeyCallback
!=
nil
{
failureMsg
.
Methods
=
append
(
failureMsg
.
Methods
,
"publickey"
)
}
if
config
.
KeyboardInteractiveCallback
!=
nil
{
failureMsg
.
Methods
=
append
(
failureMsg
.
Methods
,
"keyboard-interactive"
)
}
if
len
(
failureMsg
.
Methods
)
==
0
{
return
nil
,
errors
.
New
(
"ssh: no authentication methods configured but NoClientAuth is also false"
)
}
if
err
:=
s
.
transport
.
writePacket
(
Marshal
(
&
failureMsg
));
err
!=
nil
{
return
nil
,
err
}
}
if
err
:=
s
.
transport
.
writePacket
([]
byte
{
msgUserAuthSuccess
});
err
!=
nil
{
return
nil
,
err
}
return
perms
,
nil
}
// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by
// asking the client on the other side of a ServerConn.
type
sshClientKeyboardInteractive
struct
{
*
connection
}
func
(
c
*
sshClientKeyboardInteractive
)
Challenge
(
user
,
instruction
string
,
questions
[]
string
,
echos
[]
bool
)
(
answers
[]
string
,
err
error
)
{
if
len
(
questions
)
!=
len
(
echos
)
{
return
nil
,
errors
.
New
(
"ssh: echos and questions must have equal length"
)
}
var
prompts
[]
byte
for
i
:=
range
questions
{
prompts
=
appendString
(
prompts
,
questions
[
i
])
prompts
=
appendBool
(
prompts
,
echos
[
i
])
}
if
err
:=
c
.
transport
.
writePacket
(
Marshal
(
&
userAuthInfoRequestMsg
{
Instruction
:
instruction
,
NumPrompts
:
uint32
(
len
(
questions
)),
Prompts
:
prompts
,
}));
err
!=
nil
{
return
nil
,
err
}
packet
,
err
:=
c
.
transport
.
readPacket
()
if
err
!=
nil
{
return
nil
,
err
}
if
packet
[
0
]
!=
msgUserAuthInfoResponse
{
return
nil
,
unexpectedMessageError
(
msgUserAuthInfoResponse
,
packet
[
0
])
}
packet
=
packet
[
1
:
]
n
,
packet
,
ok
:=
parseUint32
(
packet
)
if
!
ok
||
int
(
n
)
!=
len
(
questions
)
{
return
nil
,
parseError
(
msgUserAuthInfoResponse
)
}
for
i
:=
uint32
(
0
);
i
<
n
;
i
++
{
ans
,
rest
,
ok
:=
parseString
(
packet
)
if
!
ok
{
return
nil
,
parseError
(
msgUserAuthInfoResponse
)
}
answers
=
append
(
answers
,
string
(
ans
))
packet
=
rest
}
if
len
(
packet
)
!=
0
{
return
nil
,
errors
.
New
(
"ssh: junk at end of message"
)
}
return
answers
,
nil
}
cmd/gost/vendor/golang.org/x/crypto/ssh/session.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
// Session implements an interactive session described in
// "RFC 4254, section 6".
import
(
"bytes"
"encoding/binary"
"errors"
"fmt"
"io"
"io/ioutil"
"sync"
)
type
Signal
string
// POSIX signals as listed in RFC 4254 Section 6.10.
const
(
SIGABRT
Signal
=
"ABRT"
SIGALRM
Signal
=
"ALRM"
SIGFPE
Signal
=
"FPE"
SIGHUP
Signal
=
"HUP"
SIGILL
Signal
=
"ILL"
SIGINT
Signal
=
"INT"
SIGKILL
Signal
=
"KILL"
SIGPIPE
Signal
=
"PIPE"
SIGQUIT
Signal
=
"QUIT"
SIGSEGV
Signal
=
"SEGV"
SIGTERM
Signal
=
"TERM"
SIGUSR1
Signal
=
"USR1"
SIGUSR2
Signal
=
"USR2"
)
var
signals
=
map
[
Signal
]
int
{
SIGABRT
:
6
,
SIGALRM
:
14
,
SIGFPE
:
8
,
SIGHUP
:
1
,
SIGILL
:
4
,
SIGINT
:
2
,
SIGKILL
:
9
,
SIGPIPE
:
13
,
SIGQUIT
:
3
,
SIGSEGV
:
11
,
SIGTERM
:
15
,
}
type
TerminalModes
map
[
uint8
]
uint32
// POSIX terminal mode flags as listed in RFC 4254 Section 8.
const
(
tty_OP_END
=
0
VINTR
=
1
VQUIT
=
2
VERASE
=
3
VKILL
=
4
VEOF
=
5
VEOL
=
6
VEOL2
=
7
VSTART
=
8
VSTOP
=
9
VSUSP
=
10
VDSUSP
=
11
VREPRINT
=
12
VWERASE
=
13
VLNEXT
=
14
VFLUSH
=
15
VSWTCH
=
16
VSTATUS
=
17
VDISCARD
=
18
IGNPAR
=
30
PARMRK
=
31
INPCK
=
32
ISTRIP
=
33
INLCR
=
34
IGNCR
=
35
ICRNL
=
36
IUCLC
=
37
IXON
=
38
IXANY
=
39
IXOFF
=
40
IMAXBEL
=
41
ISIG
=
50
ICANON
=
51
XCASE
=
52
ECHO
=
53
ECHOE
=
54
ECHOK
=
55
ECHONL
=
56
NOFLSH
=
57
TOSTOP
=
58
IEXTEN
=
59
ECHOCTL
=
60
ECHOKE
=
61
PENDIN
=
62
OPOST
=
70
OLCUC
=
71
ONLCR
=
72
OCRNL
=
73
ONOCR
=
74
ONLRET
=
75
CS7
=
90
CS8
=
91
PARENB
=
92
PARODD
=
93
TTY_OP_ISPEED
=
128
TTY_OP_OSPEED
=
129
)
// A Session represents a connection to a remote command or shell.
type
Session
struct
{
// Stdin specifies the remote process's standard input.
// If Stdin is nil, the remote process reads from an empty
// bytes.Buffer.
Stdin
io
.
Reader
// Stdout and Stderr specify the remote process's standard
// output and error.
//
// If either is nil, Run connects the corresponding file
// descriptor to an instance of ioutil.Discard. There is a
// fixed amount of buffering that is shared for the two streams.
// If either blocks it may eventually cause the remote
// command to block.
Stdout
io
.
Writer
Stderr
io
.
Writer
ch
Channel
// the channel backing this session
started
bool
// true once Start, Run or Shell is invoked.
copyFuncs
[]
func
()
error
errors
chan
error
// one send per copyFunc
// true if pipe method is active
stdinpipe
,
stdoutpipe
,
stderrpipe
bool
// stdinPipeWriter is non-nil if StdinPipe has not been called
// and Stdin was specified by the user; it is the write end of
// a pipe connecting Session.Stdin to the stdin channel.
stdinPipeWriter
io
.
WriteCloser
exitStatus
chan
error
}
// SendRequest sends an out-of-band channel request on the SSH channel
// underlying the session.
func
(
s
*
Session
)
SendRequest
(
name
string
,
wantReply
bool
,
payload
[]
byte
)
(
bool
,
error
)
{
return
s
.
ch
.
SendRequest
(
name
,
wantReply
,
payload
)
}
func
(
s
*
Session
)
Close
()
error
{
return
s
.
ch
.
Close
()
}
// RFC 4254 Section 6.4.
type
setenvRequest
struct
{
Name
string
Value
string
}
// Setenv sets an environment variable that will be applied to any
// command executed by Shell or Run.
func
(
s
*
Session
)
Setenv
(
name
,
value
string
)
error
{
msg
:=
setenvRequest
{
Name
:
name
,
Value
:
value
,
}
ok
,
err
:=
s
.
ch
.
SendRequest
(
"env"
,
true
,
Marshal
(
&
msg
))
if
err
==
nil
&&
!
ok
{
err
=
errors
.
New
(
"ssh: setenv failed"
)
}
return
err
}
// RFC 4254 Section 6.2.
type
ptyRequestMsg
struct
{
Term
string
Columns
uint32
Rows
uint32
Width
uint32
Height
uint32
Modelist
string
}
// RequestPty requests the association of a pty with the session on the remote host.
func
(
s
*
Session
)
RequestPty
(
term
string
,
h
,
w
int
,
termmodes
TerminalModes
)
error
{
var
tm
[]
byte
for
k
,
v
:=
range
termmodes
{
kv
:=
struct
{
Key
byte
Val
uint32
}{
k
,
v
}
tm
=
append
(
tm
,
Marshal
(
&
kv
)
...
)
}
tm
=
append
(
tm
,
tty_OP_END
)
req
:=
ptyRequestMsg
{
Term
:
term
,
Columns
:
uint32
(
w
),
Rows
:
uint32
(
h
),
Width
:
uint32
(
w
*
8
),
Height
:
uint32
(
h
*
8
),
Modelist
:
string
(
tm
),
}
ok
,
err
:=
s
.
ch
.
SendRequest
(
"pty-req"
,
true
,
Marshal
(
&
req
))
if
err
==
nil
&&
!
ok
{
err
=
errors
.
New
(
"ssh: pty-req failed"
)
}
return
err
}
// RFC 4254 Section 6.5.
type
subsystemRequestMsg
struct
{
Subsystem
string
}
// RequestSubsystem requests the association of a subsystem with the session on the remote host.
// A subsystem is a predefined command that runs in the background when the ssh session is initiated
func
(
s
*
Session
)
RequestSubsystem
(
subsystem
string
)
error
{
msg
:=
subsystemRequestMsg
{
Subsystem
:
subsystem
,
}
ok
,
err
:=
s
.
ch
.
SendRequest
(
"subsystem"
,
true
,
Marshal
(
&
msg
))
if
err
==
nil
&&
!
ok
{
err
=
errors
.
New
(
"ssh: subsystem request failed"
)
}
return
err
}
// RFC 4254 Section 6.9.
type
signalMsg
struct
{
Signal
string
}
// Signal sends the given signal to the remote process.
// sig is one of the SIG* constants.
func
(
s
*
Session
)
Signal
(
sig
Signal
)
error
{
msg
:=
signalMsg
{
Signal
:
string
(
sig
),
}
_
,
err
:=
s
.
ch
.
SendRequest
(
"signal"
,
false
,
Marshal
(
&
msg
))
return
err
}
// RFC 4254 Section 6.5.
type
execMsg
struct
{
Command
string
}
// Start runs cmd on the remote host. Typically, the remote
// server passes cmd to the shell for interpretation.
// A Session only accepts one call to Run, Start or Shell.
func
(
s
*
Session
)
Start
(
cmd
string
)
error
{
if
s
.
started
{
return
errors
.
New
(
"ssh: session already started"
)
}
req
:=
execMsg
{
Command
:
cmd
,
}
ok
,
err
:=
s
.
ch
.
SendRequest
(
"exec"
,
true
,
Marshal
(
&
req
))
if
err
==
nil
&&
!
ok
{
err
=
fmt
.
Errorf
(
"ssh: command %v failed"
,
cmd
)
}
if
err
!=
nil
{
return
err
}
return
s
.
start
()
}
// Run runs cmd on the remote host. Typically, the remote
// server passes cmd to the shell for interpretation.
// A Session only accepts one call to Run, Start, Shell, Output,
// or CombinedOutput.
//
// The returned error is nil if the command runs, has no problems
// copying stdin, stdout, and stderr, and exits with a zero exit
// status.
//
// If the remote server does not send an exit status, an error of type
// *ExitMissingError is returned. If the command completes
// unsuccessfully or is interrupted by a signal, the error is of type
// *ExitError. Other error types may be returned for I/O problems.
func
(
s
*
Session
)
Run
(
cmd
string
)
error
{
err
:=
s
.
Start
(
cmd
)
if
err
!=
nil
{
return
err
}
return
s
.
Wait
()
}
// Output runs cmd on the remote host and returns its standard output.
func
(
s
*
Session
)
Output
(
cmd
string
)
([]
byte
,
error
)
{
if
s
.
Stdout
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: Stdout already set"
)
}
var
b
bytes
.
Buffer
s
.
Stdout
=
&
b
err
:=
s
.
Run
(
cmd
)
return
b
.
Bytes
(),
err
}
type
singleWriter
struct
{
b
bytes
.
Buffer
mu
sync
.
Mutex
}
func
(
w
*
singleWriter
)
Write
(
p
[]
byte
)
(
int
,
error
)
{
w
.
mu
.
Lock
()
defer
w
.
mu
.
Unlock
()
return
w
.
b
.
Write
(
p
)
}
// CombinedOutput runs cmd on the remote host and returns its combined
// standard output and standard error.
func
(
s
*
Session
)
CombinedOutput
(
cmd
string
)
([]
byte
,
error
)
{
if
s
.
Stdout
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: Stdout already set"
)
}
if
s
.
Stderr
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: Stderr already set"
)
}
var
b
singleWriter
s
.
Stdout
=
&
b
s
.
Stderr
=
&
b
err
:=
s
.
Run
(
cmd
)
return
b
.
b
.
Bytes
(),
err
}
// Shell starts a login shell on the remote host. A Session only
// accepts one call to Run, Start, Shell, Output, or CombinedOutput.
func
(
s
*
Session
)
Shell
()
error
{
if
s
.
started
{
return
errors
.
New
(
"ssh: session already started"
)
}
ok
,
err
:=
s
.
ch
.
SendRequest
(
"shell"
,
true
,
nil
)
if
err
==
nil
&&
!
ok
{
return
errors
.
New
(
"ssh: could not start shell"
)
}
if
err
!=
nil
{
return
err
}
return
s
.
start
()
}
func
(
s
*
Session
)
start
()
error
{
s
.
started
=
true
type
F
func
(
*
Session
)
for
_
,
setupFd
:=
range
[]
F
{(
*
Session
)
.
stdin
,
(
*
Session
)
.
stdout
,
(
*
Session
)
.
stderr
}
{
setupFd
(
s
)
}
s
.
errors
=
make
(
chan
error
,
len
(
s
.
copyFuncs
))
for
_
,
fn
:=
range
s
.
copyFuncs
{
go
func
(
fn
func
()
error
)
{
s
.
errors
<-
fn
()
}(
fn
)
}
return
nil
}
// Wait waits for the remote command to exit.
//
// The returned error is nil if the command runs, has no problems
// copying stdin, stdout, and stderr, and exits with a zero exit
// status.
//
// If the remote server does not send an exit status, an error of type
// *ExitMissingError is returned. If the command completes
// unsuccessfully or is interrupted by a signal, the error is of type
// *ExitError. Other error types may be returned for I/O problems.
func
(
s
*
Session
)
Wait
()
error
{
if
!
s
.
started
{
return
errors
.
New
(
"ssh: session not started"
)
}
waitErr
:=
<-
s
.
exitStatus
if
s
.
stdinPipeWriter
!=
nil
{
s
.
stdinPipeWriter
.
Close
()
}
var
copyError
error
for
_
=
range
s
.
copyFuncs
{
if
err
:=
<-
s
.
errors
;
err
!=
nil
&&
copyError
==
nil
{
copyError
=
err
}
}
if
waitErr
!=
nil
{
return
waitErr
}
return
copyError
}
func
(
s
*
Session
)
wait
(
reqs
<-
chan
*
Request
)
error
{
wm
:=
Waitmsg
{
status
:
-
1
}
// Wait for msg channel to be closed before returning.
for
msg
:=
range
reqs
{
switch
msg
.
Type
{
case
"exit-status"
:
wm
.
status
=
int
(
binary
.
BigEndian
.
Uint32
(
msg
.
Payload
))
case
"exit-signal"
:
var
sigval
struct
{
Signal
string
CoreDumped
bool
Error
string
Lang
string
}
if
err
:=
Unmarshal
(
msg
.
Payload
,
&
sigval
);
err
!=
nil
{
return
err
}
// Must sanitize strings?
wm
.
signal
=
sigval
.
Signal
wm
.
msg
=
sigval
.
Error
wm
.
lang
=
sigval
.
Lang
default
:
// This handles keepalives and matches
// OpenSSH's behaviour.
if
msg
.
WantReply
{
msg
.
Reply
(
false
,
nil
)
}
}
}
if
wm
.
status
==
0
{
return
nil
}
if
wm
.
status
==
-
1
{
// exit-status was never sent from server
if
wm
.
signal
==
""
{
// signal was not sent either. RFC 4254
// section 6.10 recommends against this
// behavior, but it is allowed, so we let
// clients handle it.
return
&
ExitMissingError
{}
}
wm
.
status
=
128
if
_
,
ok
:=
signals
[
Signal
(
wm
.
signal
)];
ok
{
wm
.
status
+=
signals
[
Signal
(
wm
.
signal
)]
}
}
return
&
ExitError
{
wm
}
}
// ExitMissingError is returned if a session is torn down cleanly, but
// the server sends no confirmation of the exit status.
type
ExitMissingError
struct
{}
func
(
e
*
ExitMissingError
)
Error
()
string
{
return
"wait: remote command exited without exit status or exit signal"
}
func
(
s
*
Session
)
stdin
()
{
if
s
.
stdinpipe
{
return
}
var
stdin
io
.
Reader
if
s
.
Stdin
==
nil
{
stdin
=
new
(
bytes
.
Buffer
)
}
else
{
r
,
w
:=
io
.
Pipe
()
go
func
()
{
_
,
err
:=
io
.
Copy
(
w
,
s
.
Stdin
)
w
.
CloseWithError
(
err
)
}()
stdin
,
s
.
stdinPipeWriter
=
r
,
w
}
s
.
copyFuncs
=
append
(
s
.
copyFuncs
,
func
()
error
{
_
,
err
:=
io
.
Copy
(
s
.
ch
,
stdin
)
if
err1
:=
s
.
ch
.
CloseWrite
();
err
==
nil
&&
err1
!=
io
.
EOF
{
err
=
err1
}
return
err
})
}
func
(
s
*
Session
)
stdout
()
{
if
s
.
stdoutpipe
{
return
}
if
s
.
Stdout
==
nil
{
s
.
Stdout
=
ioutil
.
Discard
}
s
.
copyFuncs
=
append
(
s
.
copyFuncs
,
func
()
error
{
_
,
err
:=
io
.
Copy
(
s
.
Stdout
,
s
.
ch
)
return
err
})
}
func
(
s
*
Session
)
stderr
()
{
if
s
.
stderrpipe
{
return
}
if
s
.
Stderr
==
nil
{
s
.
Stderr
=
ioutil
.
Discard
}
s
.
copyFuncs
=
append
(
s
.
copyFuncs
,
func
()
error
{
_
,
err
:=
io
.
Copy
(
s
.
Stderr
,
s
.
ch
.
Stderr
())
return
err
})
}
// sessionStdin reroutes Close to CloseWrite.
type
sessionStdin
struct
{
io
.
Writer
ch
Channel
}
func
(
s
*
sessionStdin
)
Close
()
error
{
return
s
.
ch
.
CloseWrite
()
}
// StdinPipe returns a pipe that will be connected to the
// remote command's standard input when the command starts.
func
(
s
*
Session
)
StdinPipe
()
(
io
.
WriteCloser
,
error
)
{
if
s
.
Stdin
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: Stdin already set"
)
}
if
s
.
started
{
return
nil
,
errors
.
New
(
"ssh: StdinPipe after process started"
)
}
s
.
stdinpipe
=
true
return
&
sessionStdin
{
s
.
ch
,
s
.
ch
},
nil
}
// StdoutPipe returns a pipe that will be connected to the
// remote command's standard output when the command starts.
// There is a fixed amount of buffering that is shared between
// stdout and stderr streams. If the StdoutPipe reader is
// not serviced fast enough it may eventually cause the
// remote command to block.
func
(
s
*
Session
)
StdoutPipe
()
(
io
.
Reader
,
error
)
{
if
s
.
Stdout
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: Stdout already set"
)
}
if
s
.
started
{
return
nil
,
errors
.
New
(
"ssh: StdoutPipe after process started"
)
}
s
.
stdoutpipe
=
true
return
s
.
ch
,
nil
}
// StderrPipe returns a pipe that will be connected to the
// remote command's standard error when the command starts.
// There is a fixed amount of buffering that is shared between
// stdout and stderr streams. If the StderrPipe reader is
// not serviced fast enough it may eventually cause the
// remote command to block.
func
(
s
*
Session
)
StderrPipe
()
(
io
.
Reader
,
error
)
{
if
s
.
Stderr
!=
nil
{
return
nil
,
errors
.
New
(
"ssh: Stderr already set"
)
}
if
s
.
started
{
return
nil
,
errors
.
New
(
"ssh: StderrPipe after process started"
)
}
s
.
stderrpipe
=
true
return
s
.
ch
.
Stderr
(),
nil
}
// newSession returns a new interactive session on the remote host.
func
newSession
(
ch
Channel
,
reqs
<-
chan
*
Request
)
(
*
Session
,
error
)
{
s
:=
&
Session
{
ch
:
ch
,
}
s
.
exitStatus
=
make
(
chan
error
,
1
)
go
func
()
{
s
.
exitStatus
<-
s
.
wait
(
reqs
)
}()
return
s
,
nil
}
// An ExitError reports unsuccessful completion of a remote command.
type
ExitError
struct
{
Waitmsg
}
func
(
e
*
ExitError
)
Error
()
string
{
return
e
.
Waitmsg
.
String
()
}
// Waitmsg stores the information about an exited remote command
// as reported by Wait.
type
Waitmsg
struct
{
status
int
signal
string
msg
string
lang
string
}
// ExitStatus returns the exit status of the remote command.
func
(
w
Waitmsg
)
ExitStatus
()
int
{
return
w
.
status
}
// Signal returns the exit signal of the remote command if
// it was terminated violently.
func
(
w
Waitmsg
)
Signal
()
string
{
return
w
.
signal
}
// Msg returns the exit message given by the remote command
func
(
w
Waitmsg
)
Msg
()
string
{
return
w
.
msg
}
// Lang returns the language tag. See RFC 3066
func
(
w
Waitmsg
)
Lang
()
string
{
return
w
.
lang
}
func
(
w
Waitmsg
)
String
()
string
{
str
:=
fmt
.
Sprintf
(
"Process exited with status %v"
,
w
.
status
)
if
w
.
signal
!=
""
{
str
+=
fmt
.
Sprintf
(
" from signal %v"
,
w
.
signal
)
}
if
w
.
msg
!=
""
{
str
+=
fmt
.
Sprintf
(
". Reason was: %v"
,
w
.
msg
)
}
return
str
}
cmd/gost/vendor/golang.org/x/crypto/ssh/tcpip.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"errors"
"fmt"
"io"
"math/rand"
"net"
"strconv"
"strings"
"sync"
"time"
)
// Listen requests the remote peer open a listening socket on
// addr. Incoming connections will be available by calling Accept on
// the returned net.Listener. The listener must be serviced, or the
// SSH connection may hang.
func
(
c
*
Client
)
Listen
(
n
,
addr
string
)
(
net
.
Listener
,
error
)
{
laddr
,
err
:=
net
.
ResolveTCPAddr
(
n
,
addr
)
if
err
!=
nil
{
return
nil
,
err
}
return
c
.
ListenTCP
(
laddr
)
}
// Automatic port allocation is broken with OpenSSH before 6.0. See
// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In
// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0,
// rather than the actual port number. This means you can never open
// two different listeners with auto allocated ports. We work around
// this by trying explicit ports until we succeed.
const
openSSHPrefix
=
"OpenSSH_"
var
portRandomizer
=
rand
.
New
(
rand
.
NewSource
(
time
.
Now
()
.
UnixNano
()))
// isBrokenOpenSSHVersion returns true if the given version string
// specifies a version of OpenSSH that is known to have a bug in port
// forwarding.
func
isBrokenOpenSSHVersion
(
versionStr
string
)
bool
{
i
:=
strings
.
Index
(
versionStr
,
openSSHPrefix
)
if
i
<
0
{
return
false
}
i
+=
len
(
openSSHPrefix
)
j
:=
i
for
;
j
<
len
(
versionStr
);
j
++
{
if
versionStr
[
j
]
<
'0'
||
versionStr
[
j
]
>
'9'
{
break
}
}
version
,
_
:=
strconv
.
Atoi
(
versionStr
[
i
:
j
])
return
version
<
6
}
// autoPortListenWorkaround simulates automatic port allocation by
// trying random ports repeatedly.
func
(
c
*
Client
)
autoPortListenWorkaround
(
laddr
*
net
.
TCPAddr
)
(
net
.
Listener
,
error
)
{
var
sshListener
net
.
Listener
var
err
error
const
tries
=
10
for
i
:=
0
;
i
<
tries
;
i
++
{
addr
:=
*
laddr
addr
.
Port
=
1024
+
portRandomizer
.
Intn
(
60000
)
sshListener
,
err
=
c
.
ListenTCP
(
&
addr
)
if
err
==
nil
{
laddr
.
Port
=
addr
.
Port
return
sshListener
,
err
}
}
return
nil
,
fmt
.
Errorf
(
"ssh: listen on random port failed after %d tries: %v"
,
tries
,
err
)
}
// RFC 4254 7.1
type
channelForwardMsg
struct
{
addr
string
rport
uint32
}
// ListenTCP requests the remote peer open a listening socket
// on laddr. Incoming connections will be available by calling
// Accept on the returned net.Listener.
func
(
c
*
Client
)
ListenTCP
(
laddr
*
net
.
TCPAddr
)
(
net
.
Listener
,
error
)
{
if
laddr
.
Port
==
0
&&
isBrokenOpenSSHVersion
(
string
(
c
.
ServerVersion
()))
{
return
c
.
autoPortListenWorkaround
(
laddr
)
}
m
:=
channelForwardMsg
{
laddr
.
IP
.
String
(),
uint32
(
laddr
.
Port
),
}
// send message
ok
,
resp
,
err
:=
c
.
SendRequest
(
"tcpip-forward"
,
true
,
Marshal
(
&
m
))
if
err
!=
nil
{
return
nil
,
err
}
if
!
ok
{
return
nil
,
errors
.
New
(
"ssh: tcpip-forward request denied by peer"
)
}
// If the original port was 0, then the remote side will
// supply a real port number in the response.
if
laddr
.
Port
==
0
{
var
p
struct
{
Port
uint32
}
if
err
:=
Unmarshal
(
resp
,
&
p
);
err
!=
nil
{
return
nil
,
err
}
laddr
.
Port
=
int
(
p
.
Port
)
}
// Register this forward, using the port number we obtained.
ch
:=
c
.
forwards
.
add
(
*
laddr
)
return
&
tcpListener
{
laddr
,
c
,
ch
},
nil
}
// forwardList stores a mapping between remote
// forward requests and the tcpListeners.
type
forwardList
struct
{
sync
.
Mutex
entries
[]
forwardEntry
}
// forwardEntry represents an established mapping of a laddr on a
// remote ssh server to a channel connected to a tcpListener.
type
forwardEntry
struct
{
laddr
net
.
TCPAddr
c
chan
forward
}
// forward represents an incoming forwarded tcpip connection. The
// arguments to add/remove/lookup should be address as specified in
// the original forward-request.
type
forward
struct
{
newCh
NewChannel
// the ssh client channel underlying this forward
raddr
*
net
.
TCPAddr
// the raddr of the incoming connection
}
func
(
l
*
forwardList
)
add
(
addr
net
.
TCPAddr
)
chan
forward
{
l
.
Lock
()
defer
l
.
Unlock
()
f
:=
forwardEntry
{
addr
,
make
(
chan
forward
,
1
),
}
l
.
entries
=
append
(
l
.
entries
,
f
)
return
f
.
c
}
// See RFC 4254, section 7.2
type
forwardedTCPPayload
struct
{
Addr
string
Port
uint32
OriginAddr
string
OriginPort
uint32
}
// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr.
func
parseTCPAddr
(
addr
string
,
port
uint32
)
(
*
net
.
TCPAddr
,
error
)
{
if
port
==
0
||
port
>
65535
{
return
nil
,
fmt
.
Errorf
(
"ssh: port number out of range: %d"
,
port
)
}
ip
:=
net
.
ParseIP
(
string
(
addr
))
if
ip
==
nil
{
return
nil
,
fmt
.
Errorf
(
"ssh: cannot parse IP address %q"
,
addr
)
}
return
&
net
.
TCPAddr
{
IP
:
ip
,
Port
:
int
(
port
)},
nil
}
func
(
l
*
forwardList
)
handleChannels
(
in
<-
chan
NewChannel
)
{
for
ch
:=
range
in
{
var
payload
forwardedTCPPayload
if
err
:=
Unmarshal
(
ch
.
ExtraData
(),
&
payload
);
err
!=
nil
{
ch
.
Reject
(
ConnectionFailed
,
"could not parse forwarded-tcpip payload: "
+
err
.
Error
())
continue
}
// RFC 4254 section 7.2 specifies that incoming
// addresses should list the address, in string
// format. It is implied that this should be an IP
// address, as it would be impossible to connect to it
// otherwise.
laddr
,
err
:=
parseTCPAddr
(
payload
.
Addr
,
payload
.
Port
)
if
err
!=
nil
{
ch
.
Reject
(
ConnectionFailed
,
err
.
Error
())
continue
}
raddr
,
err
:=
parseTCPAddr
(
payload
.
OriginAddr
,
payload
.
OriginPort
)
if
err
!=
nil
{
ch
.
Reject
(
ConnectionFailed
,
err
.
Error
())
continue
}
if
ok
:=
l
.
forward
(
*
laddr
,
*
raddr
,
ch
);
!
ok
{
// Section 7.2, implementations MUST reject spurious incoming
// connections.
ch
.
Reject
(
Prohibited
,
"no forward for address"
)
continue
}
}
}
// remove removes the forward entry, and the channel feeding its
// listener.
func
(
l
*
forwardList
)
remove
(
addr
net
.
TCPAddr
)
{
l
.
Lock
()
defer
l
.
Unlock
()
for
i
,
f
:=
range
l
.
entries
{
if
addr
.
IP
.
Equal
(
f
.
laddr
.
IP
)
&&
addr
.
Port
==
f
.
laddr
.
Port
{
l
.
entries
=
append
(
l
.
entries
[
:
i
],
l
.
entries
[
i
+
1
:
]
...
)
close
(
f
.
c
)
return
}
}
}
// closeAll closes and clears all forwards.
func
(
l
*
forwardList
)
closeAll
()
{
l
.
Lock
()
defer
l
.
Unlock
()
for
_
,
f
:=
range
l
.
entries
{
close
(
f
.
c
)
}
l
.
entries
=
nil
}
func
(
l
*
forwardList
)
forward
(
laddr
,
raddr
net
.
TCPAddr
,
ch
NewChannel
)
bool
{
l
.
Lock
()
defer
l
.
Unlock
()
for
_
,
f
:=
range
l
.
entries
{
if
laddr
.
IP
.
Equal
(
f
.
laddr
.
IP
)
&&
laddr
.
Port
==
f
.
laddr
.
Port
{
f
.
c
<-
forward
{
ch
,
&
raddr
}
return
true
}
}
return
false
}
type
tcpListener
struct
{
laddr
*
net
.
TCPAddr
conn
*
Client
in
<-
chan
forward
}
// Accept waits for and returns the next connection to the listener.
func
(
l
*
tcpListener
)
Accept
()
(
net
.
Conn
,
error
)
{
s
,
ok
:=
<-
l
.
in
if
!
ok
{
return
nil
,
io
.
EOF
}
ch
,
incoming
,
err
:=
s
.
newCh
.
Accept
()
if
err
!=
nil
{
return
nil
,
err
}
go
DiscardRequests
(
incoming
)
return
&
tcpChanConn
{
Channel
:
ch
,
laddr
:
l
.
laddr
,
raddr
:
s
.
raddr
,
},
nil
}
// Close closes the listener.
func
(
l
*
tcpListener
)
Close
()
error
{
m
:=
channelForwardMsg
{
l
.
laddr
.
IP
.
String
(),
uint32
(
l
.
laddr
.
Port
),
}
// this also closes the listener.
l
.
conn
.
forwards
.
remove
(
*
l
.
laddr
)
ok
,
_
,
err
:=
l
.
conn
.
SendRequest
(
"cancel-tcpip-forward"
,
true
,
Marshal
(
&
m
))
if
err
==
nil
&&
!
ok
{
err
=
errors
.
New
(
"ssh: cancel-tcpip-forward failed"
)
}
return
err
}
// Addr returns the listener's network address.
func
(
l
*
tcpListener
)
Addr
()
net
.
Addr
{
return
l
.
laddr
}
// Dial initiates a connection to the addr from the remote host.
// The resulting connection has a zero LocalAddr() and RemoteAddr().
func
(
c
*
Client
)
Dial
(
n
,
addr
string
)
(
net
.
Conn
,
error
)
{
// Parse the address into host and numeric port.
host
,
portString
,
err
:=
net
.
SplitHostPort
(
addr
)
if
err
!=
nil
{
return
nil
,
err
}
port
,
err
:=
strconv
.
ParseUint
(
portString
,
10
,
16
)
if
err
!=
nil
{
return
nil
,
err
}
// Use a zero address for local and remote address.
zeroAddr
:=
&
net
.
TCPAddr
{
IP
:
net
.
IPv4zero
,
Port
:
0
,
}
ch
,
err
:=
c
.
dial
(
net
.
IPv4zero
.
String
(),
0
,
host
,
int
(
port
))
if
err
!=
nil
{
return
nil
,
err
}
return
&
tcpChanConn
{
Channel
:
ch
,
laddr
:
zeroAddr
,
raddr
:
zeroAddr
,
},
nil
}
// DialTCP connects to the remote address raddr on the network net,
// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used
// as the local address for the connection.
func
(
c
*
Client
)
DialTCP
(
n
string
,
laddr
,
raddr
*
net
.
TCPAddr
)
(
net
.
Conn
,
error
)
{
if
laddr
==
nil
{
laddr
=
&
net
.
TCPAddr
{
IP
:
net
.
IPv4zero
,
Port
:
0
,
}
}
ch
,
err
:=
c
.
dial
(
laddr
.
IP
.
String
(),
laddr
.
Port
,
raddr
.
IP
.
String
(),
raddr
.
Port
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
tcpChanConn
{
Channel
:
ch
,
laddr
:
laddr
,
raddr
:
raddr
,
},
nil
}
// RFC 4254 7.2
type
channelOpenDirectMsg
struct
{
raddr
string
rport
uint32
laddr
string
lport
uint32
}
func
(
c
*
Client
)
dial
(
laddr
string
,
lport
int
,
raddr
string
,
rport
int
)
(
Channel
,
error
)
{
msg
:=
channelOpenDirectMsg
{
raddr
:
raddr
,
rport
:
uint32
(
rport
),
laddr
:
laddr
,
lport
:
uint32
(
lport
),
}
ch
,
in
,
err
:=
c
.
OpenChannel
(
"direct-tcpip"
,
Marshal
(
&
msg
))
if
err
!=
nil
{
return
nil
,
err
}
go
DiscardRequests
(
in
)
return
ch
,
err
}
type
tcpChan
struct
{
Channel
// the backing channel
}
// tcpChanConn fulfills the net.Conn interface without
// the tcpChan having to hold laddr or raddr directly.
type
tcpChanConn
struct
{
Channel
laddr
,
raddr
net
.
Addr
}
// LocalAddr returns the local network address.
func
(
t
*
tcpChanConn
)
LocalAddr
()
net
.
Addr
{
return
t
.
laddr
}
// RemoteAddr returns the remote network address.
func
(
t
*
tcpChanConn
)
RemoteAddr
()
net
.
Addr
{
return
t
.
raddr
}
// SetDeadline sets the read and write deadlines associated
// with the connection.
func
(
t
*
tcpChanConn
)
SetDeadline
(
deadline
time
.
Time
)
error
{
if
err
:=
t
.
SetReadDeadline
(
deadline
);
err
!=
nil
{
return
err
}
return
t
.
SetWriteDeadline
(
deadline
)
}
// SetReadDeadline sets the read deadline.
// A zero value for t means Read will not time out.
// After the deadline, the error from Read will implement net.Error
// with Timeout() == true.
func
(
t
*
tcpChanConn
)
SetReadDeadline
(
deadline
time
.
Time
)
error
{
return
errors
.
New
(
"ssh: tcpChan: deadline not supported"
)
}
// SetWriteDeadline exists to satisfy the net.Conn interface
// but is not implemented by this type. It always returns an error.
func
(
t
*
tcpChanConn
)
SetWriteDeadline
(
deadline
time
.
Time
)
error
{
return
errors
.
New
(
"ssh: tcpChan: deadline not supported"
)
}
cmd/gost/vendor/golang.org/x/crypto/ssh/transport.go
0 → 100644
View file @
d19d5ada
// Copyright 2011 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
ssh
import
(
"bufio"
"errors"
"io"
"log"
)
// debugTransport if set, will print packet types as they go over the
// wire. No message decoding is done, to minimize the impact on timing.
const
debugTransport
=
false
const
(
gcmCipherID
=
"aes128-gcm@openssh.com"
aes128cbcID
=
"aes128-cbc"
tripledescbcID
=
"3des-cbc"
)
// packetConn represents a transport that implements packet based
// operations.
type
packetConn
interface
{
// Encrypt and send a packet of data to the remote peer.
writePacket
(
packet
[]
byte
)
error
// Read a packet from the connection. The read is blocking,
// i.e. if error is nil, then the returned byte slice is
// always non-empty.
readPacket
()
([]
byte
,
error
)
// Close closes the write-side of the connection.
Close
()
error
}
// transport is the keyingTransport that implements the SSH packet
// protocol.
type
transport
struct
{
reader
connectionState
writer
connectionState
bufReader
*
bufio
.
Reader
bufWriter
*
bufio
.
Writer
rand
io
.
Reader
isClient
bool
io
.
Closer
}
// packetCipher represents a combination of SSH encryption/MAC
// protocol. A single instance should be used for one direction only.
type
packetCipher
interface
{
// writePacket encrypts the packet and writes it to w. The
// contents of the packet are generally scrambled.
writePacket
(
seqnum
uint32
,
w
io
.
Writer
,
rand
io
.
Reader
,
packet
[]
byte
)
error
// readPacket reads and decrypts a packet of data. The
// returned packet may be overwritten by future calls of
// readPacket.
readPacket
(
seqnum
uint32
,
r
io
.
Reader
)
([]
byte
,
error
)
}
// connectionState represents one side (read or write) of the
// connection. This is necessary because each direction has its own
// keys, and can even have its own algorithms
type
connectionState
struct
{
packetCipher
seqNum
uint32
dir
direction
pendingKeyChange
chan
packetCipher
}
// prepareKeyChange sets up key material for a keychange. The key changes in
// both directions are triggered by reading and writing a msgNewKey packet
// respectively.
func
(
t
*
transport
)
prepareKeyChange
(
algs
*
algorithms
,
kexResult
*
kexResult
)
error
{
if
ciph
,
err
:=
newPacketCipher
(
t
.
reader
.
dir
,
algs
.
r
,
kexResult
);
err
!=
nil
{
return
err
}
else
{
t
.
reader
.
pendingKeyChange
<-
ciph
}
if
ciph
,
err
:=
newPacketCipher
(
t
.
writer
.
dir
,
algs
.
w
,
kexResult
);
err
!=
nil
{
return
err
}
else
{
t
.
writer
.
pendingKeyChange
<-
ciph
}
return
nil
}
func
(
t
*
transport
)
printPacket
(
p
[]
byte
,
write
bool
)
{
if
len
(
p
)
==
0
{
return
}
who
:=
"server"
if
t
.
isClient
{
who
=
"client"
}
what
:=
"read"
if
write
{
what
=
"write"
}
log
.
Println
(
what
,
who
,
p
[
0
])
}
// Read and decrypt next packet.
func
(
t
*
transport
)
readPacket
()
(
p
[]
byte
,
err
error
)
{
for
{
p
,
err
=
t
.
reader
.
readPacket
(
t
.
bufReader
)
if
err
!=
nil
{
break
}
if
len
(
p
)
==
0
||
(
p
[
0
]
!=
msgIgnore
&&
p
[
0
]
!=
msgDebug
)
{
break
}
}
if
debugTransport
{
t
.
printPacket
(
p
,
false
)
}
return
p
,
err
}
func
(
s
*
connectionState
)
readPacket
(
r
*
bufio
.
Reader
)
([]
byte
,
error
)
{
packet
,
err
:=
s
.
packetCipher
.
readPacket
(
s
.
seqNum
,
r
)
s
.
seqNum
++
if
err
==
nil
&&
len
(
packet
)
==
0
{
err
=
errors
.
New
(
"ssh: zero length packet"
)
}
if
len
(
packet
)
>
0
{
switch
packet
[
0
]
{
case
msgNewKeys
:
select
{
case
cipher
:=
<-
s
.
pendingKeyChange
:
s
.
packetCipher
=
cipher
default
:
return
nil
,
errors
.
New
(
"ssh: got bogus newkeys message."
)
}
case
msgDisconnect
:
// Transform a disconnect message into an
// error. Since this is lowest level at which
// we interpret message types, doing it here
// ensures that we don't have to handle it
// elsewhere.
var
msg
disconnectMsg
if
err
:=
Unmarshal
(
packet
,
&
msg
);
err
!=
nil
{
return
nil
,
err
}
return
nil
,
&
msg
}
}
// The packet may point to an internal buffer, so copy the
// packet out here.
fresh
:=
make
([]
byte
,
len
(
packet
))
copy
(
fresh
,
packet
)
return
fresh
,
err
}
func
(
t
*
transport
)
writePacket
(
packet
[]
byte
)
error
{
if
debugTransport
{
t
.
printPacket
(
packet
,
true
)
}
return
t
.
writer
.
writePacket
(
t
.
bufWriter
,
t
.
rand
,
packet
)
}
func
(
s
*
connectionState
)
writePacket
(
w
*
bufio
.
Writer
,
rand
io
.
Reader
,
packet
[]
byte
)
error
{
changeKeys
:=
len
(
packet
)
>
0
&&
packet
[
0
]
==
msgNewKeys
err
:=
s
.
packetCipher
.
writePacket
(
s
.
seqNum
,
w
,
rand
,
packet
)
if
err
!=
nil
{
return
err
}
if
err
=
w
.
Flush
();
err
!=
nil
{
return
err
}
s
.
seqNum
++
if
changeKeys
{
select
{
case
cipher
:=
<-
s
.
pendingKeyChange
:
s
.
packetCipher
=
cipher
default
:
panic
(
"ssh: no key material for msgNewKeys"
)
}
}
return
err
}
func
newTransport
(
rwc
io
.
ReadWriteCloser
,
rand
io
.
Reader
,
isClient
bool
)
*
transport
{
t
:=
&
transport
{
bufReader
:
bufio
.
NewReader
(
rwc
),
bufWriter
:
bufio
.
NewWriter
(
rwc
),
rand
:
rand
,
reader
:
connectionState
{
packetCipher
:
&
streamPacketCipher
{
cipher
:
noneCipher
{}},
pendingKeyChange
:
make
(
chan
packetCipher
,
1
),
},
writer
:
connectionState
{
packetCipher
:
&
streamPacketCipher
{
cipher
:
noneCipher
{}},
pendingKeyChange
:
make
(
chan
packetCipher
,
1
),
},
Closer
:
rwc
,
}
t
.
isClient
=
isClient
if
isClient
{
t
.
reader
.
dir
=
serverKeys
t
.
writer
.
dir
=
clientKeys
}
else
{
t
.
reader
.
dir
=
clientKeys
t
.
writer
.
dir
=
serverKeys
}
return
t
}
type
direction
struct
{
ivTag
[]
byte
keyTag
[]
byte
macKeyTag
[]
byte
}
var
(
serverKeys
=
direction
{[]
byte
{
'B'
},
[]
byte
{
'D'
},
[]
byte
{
'F'
}}
clientKeys
=
direction
{[]
byte
{
'A'
},
[]
byte
{
'C'
},
[]
byte
{
'E'
}}
)
// generateKeys generates key material for IV, MAC and encryption.
func
generateKeys
(
d
direction
,
algs
directionAlgorithms
,
kex
*
kexResult
)
(
iv
,
key
,
macKey
[]
byte
)
{
cipherMode
:=
cipherModes
[
algs
.
Cipher
]
macMode
:=
macModes
[
algs
.
MAC
]
iv
=
make
([]
byte
,
cipherMode
.
ivSize
)
key
=
make
([]
byte
,
cipherMode
.
keySize
)
macKey
=
make
([]
byte
,
macMode
.
keySize
)
generateKeyMaterial
(
iv
,
d
.
ivTag
,
kex
)
generateKeyMaterial
(
key
,
d
.
keyTag
,
kex
)
generateKeyMaterial
(
macKey
,
d
.
macKeyTag
,
kex
)
return
}
// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as
// described in RFC 4253, section 6.4. direction should either be serverKeys
// (to setup server->client keys) or clientKeys (for client->server keys).
func
newPacketCipher
(
d
direction
,
algs
directionAlgorithms
,
kex
*
kexResult
)
(
packetCipher
,
error
)
{
iv
,
key
,
macKey
:=
generateKeys
(
d
,
algs
,
kex
)
if
algs
.
Cipher
==
gcmCipherID
{
return
newGCMCipher
(
iv
,
key
,
macKey
)
}
if
algs
.
Cipher
==
aes128cbcID
{
return
newAESCBCCipher
(
iv
,
key
,
macKey
,
algs
)
}
if
algs
.
Cipher
==
tripledescbcID
{
return
newTripleDESCBCCipher
(
iv
,
key
,
macKey
,
algs
)
}
c
:=
&
streamPacketCipher
{
mac
:
macModes
[
algs
.
MAC
]
.
new
(
macKey
),
etm
:
macModes
[
algs
.
MAC
]
.
etm
,
}
c
.
macResult
=
make
([]
byte
,
c
.
mac
.
Size
())
var
err
error
c
.
cipher
,
err
=
cipherModes
[
algs
.
Cipher
]
.
createStream
(
key
,
iv
)
if
err
!=
nil
{
return
nil
,
err
}
return
c
,
nil
}
// generateKeyMaterial fills out with key material generated from tag, K, H
// and sessionId, as specified in RFC 4253, section 7.2.
func
generateKeyMaterial
(
out
,
tag
[]
byte
,
r
*
kexResult
)
{
var
digestsSoFar
[]
byte
h
:=
r
.
Hash
.
New
()
for
len
(
out
)
>
0
{
h
.
Reset
()
h
.
Write
(
r
.
K
)
h
.
Write
(
r
.
H
)
if
len
(
digestsSoFar
)
==
0
{
h
.
Write
(
tag
)
h
.
Write
(
r
.
SessionID
)
}
else
{
h
.
Write
(
digestsSoFar
)
}
digest
:=
h
.
Sum
(
nil
)
n
:=
copy
(
out
,
digest
)
out
=
out
[
n
:
]
if
len
(
out
)
>
0
{
digestsSoFar
=
append
(
digestsSoFar
,
digest
...
)
}
}
}
const
packageVersion
=
"SSH-2.0-Go"
// Sends and receives a version line. The versionLine string should
// be US ASCII, start with "SSH-2.0-", and should not include a
// newline. exchangeVersions returns the other side's version line.
func
exchangeVersions
(
rw
io
.
ReadWriter
,
versionLine
[]
byte
)
(
them
[]
byte
,
err
error
)
{
// Contrary to the RFC, we do not ignore lines that don't
// start with "SSH-2.0-" to make the library usable with
// nonconforming servers.
for
_
,
c
:=
range
versionLine
{
// The spec disallows non US-ASCII chars, and
// specifically forbids null chars.
if
c
<
32
{
return
nil
,
errors
.
New
(
"ssh: junk character in version line"
)
}
}
if
_
,
err
=
rw
.
Write
(
append
(
versionLine
,
'\r'
,
'\n'
));
err
!=
nil
{
return
}
them
,
err
=
readVersion
(
rw
)
return
them
,
err
}
// maxVersionStringBytes is the maximum number of bytes that we'll
// accept as a version string. RFC 4253 section 4.2 limits this at 255
// chars
const
maxVersionStringBytes
=
255
// Read version string as specified by RFC 4253, section 4.2.
func
readVersion
(
r
io
.
Reader
)
([]
byte
,
error
)
{
versionString
:=
make
([]
byte
,
0
,
64
)
var
ok
bool
var
buf
[
1
]
byte
for
len
(
versionString
)
<
maxVersionStringBytes
{
_
,
err
:=
io
.
ReadFull
(
r
,
buf
[
:
])
if
err
!=
nil
{
return
nil
,
err
}
// The RFC says that the version should be terminated with \r\n
// but several SSH servers actually only send a \n.
if
buf
[
0
]
==
'\n'
{
ok
=
true
break
}
// non ASCII chars are disallowed, but we are lenient,
// since Go doesn't use null-terminated strings.
// The RFC allows a comment after a space, however,
// all of it (version and comments) goes into the
// session hash.
versionString
=
append
(
versionString
,
buf
[
0
])
}
if
!
ok
{
return
nil
,
errors
.
New
(
"ssh: overflow reading version string"
)
}
// There might be a '\r' on the end which we should remove.
if
len
(
versionString
)
>
0
&&
versionString
[
len
(
versionString
)
-
1
]
==
'\r'
{
versionString
=
versionString
[
:
len
(
versionString
)
-
1
]
}
return
versionString
,
nil
}
cmd/gost/vendor/vendor.json
View file @
d19d5ada
...
...
@@ -21,10 +21,10 @@
"revisionTime"
:
"2017-01-19T05:34:58Z"
},
{
"checksumSHA1"
:
"
/unEypznQ0qT7TWxnA4KLOgOXwo
="
,
"checksumSHA1"
:
"
lSL+LZe/WK67zmkONjox+zr66qI
="
,
"path"
:
"github.com/ginuerzh/gost"
,
"revision"
:
"
1e709ceababe54dc0254683304147359b9d59146
"
,
"revisionTime"
:
"2017-02-11T1
2:45:40
Z"
"revision"
:
"
f31949d1ed0ddf2ea3c930f2859528c3f146d48c
"
,
"revisionTime"
:
"2017-02-11T1
3:17:58
Z"
},
{
"checksumSHA1"
:
"+XIOnTW0rv8Kr/amkXgMraNeUr4="
,
...
...
@@ -182,6 +182,18 @@
"revision"
:
"453249f01cfeb54c3d549ddb75ff152ca243f9d8"
,
"revisionTime"
:
"2017-02-08T20:51:15Z"
},
{
"checksumSHA1"
:
"wGb//LjBPNxYHqk+dcLo7BjPXK8="
,
"path"
:
"golang.org/x/crypto/ed25519"
,
"revision"
:
"453249f01cfeb54c3d549ddb75ff152ca243f9d8"
,
"revisionTime"
:
"2017-02-08T20:51:15Z"
},
{
"checksumSHA1"
:
"LXFcVx8I587SnWmKycSDEq9yvK8="
,
"path"
:
"golang.org/x/crypto/ed25519/internal/edwards25519"
,
"revision"
:
"453249f01cfeb54c3d549ddb75ff152ca243f9d8"
,
"revisionTime"
:
"2017-02-08T20:51:15Z"
},
{
"checksumSHA1"
:
"4D8hxMIaSDEW5pCQk22Xj4DcDh4="
,
"path"
:
"golang.org/x/crypto/hkdf"
,
...
...
@@ -206,6 +218,12 @@
"revision"
:
"1150b8bd09e53aea1d415621adae9bad665061a1"
,
"revisionTime"
:
"2016-10-21T22:59:10Z"
},
{
"checksumSHA1"
:
"fsrFs762jlaILyqqQImS1GfvIvw="
,
"path"
:
"golang.org/x/crypto/ssh"
,
"revision"
:
"453249f01cfeb54c3d549ddb75ff152ca243f9d8"
,
"revisionTime"
:
"2017-02-08T20:51:15Z"
},
{
"checksumSHA1"
:
"Iwv89z1aXYKaB936lnsmE2NcfqA="
,
"path"
:
"golang.org/x/crypto/tea"
,
...
...
forward.go
View file @
d19d5ada
...
...
@@ -5,13 +5,15 @@ import (
"fmt"
"github.com/ginuerzh/gosocks5"
"github.com/golang/glog"
"golang.org/x/crypto/ssh"
"net"
"time"
)
type
TcpForwardServer
struct
{
Base
*
ProxyServer
Handler
func
(
conn
net
.
Conn
,
raddr
net
.
Addr
)
Base
*
ProxyServer
sshClient
*
ssh
.
Client
Handler
func
(
conn
net
.
Conn
,
raddr
*
net
.
TCPAddr
)
}
func
NewTcpForwardServer
(
base
*
ProxyServer
)
*
TcpForwardServer
{
...
...
@@ -34,19 +36,75 @@ func (s *TcpForwardServer) ListenAndServe() error {
s
.
Handler
=
s
.
handleTcpForward
}
quit
:=
make
(
chan
interface
{})
close
(
quit
)
for
{
start
:
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infoln
(
err
)
glog
.
V
(
LWARNING
)
.
Infoln
(
"[tcp]"
,
err
)
continue
}
setKeepAlive
(
conn
,
KeepAliveTime
)
select
{
case
<-
quit
:
if
s
.
Base
.
Chain
.
lastNode
.
Transport
!=
"ssh"
{
break
}
if
err
:=
s
.
initSSHClient
();
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infoln
(
"[tcp]"
,
err
)
conn
.
Close
()
goto
start
}
quit
=
make
(
chan
interface
{})
go
func
(
ch
chan
interface
{})
{
s
.
sshClient
.
Wait
()
glog
.
V
(
LINFO
)
.
Infoln
(
"[tcp] connection closed"
)
close
(
ch
)
}(
quit
)
default
:
}
go
s
.
Handler
(
conn
,
raddr
)
}
}
func
(
s
*
TcpForwardServer
)
handleTcpForward
(
conn
net
.
Conn
,
raddr
net
.
Addr
)
{
func
(
s
*
TcpForwardServer
)
initSSHClient
()
error
{
if
s
.
sshClient
!=
nil
{
s
.
sshClient
.
Close
()
s
.
sshClient
=
nil
}
sshNode
:=
s
.
Base
.
Chain
.
lastNode
c
,
err
:=
s
.
Base
.
Chain
.
GetConn
()
if
err
!=
nil
{
return
err
}
var
user
,
password
string
if
len
(
sshNode
.
Users
)
>
0
{
user
=
sshNode
.
Users
[
0
]
.
Username
()
password
,
_
=
sshNode
.
Users
[
0
]
.
Password
()
}
config
:=
ssh
.
ClientConfig
{
User
:
user
,
Auth
:
[]
ssh
.
AuthMethod
{
ssh
.
Password
(
password
),
},
}
sshConn
,
chans
,
reqs
,
err
:=
ssh
.
NewClientConn
(
c
,
sshNode
.
Addr
,
&
config
)
if
err
!=
nil
{
return
err
}
s
.
sshClient
=
ssh
.
NewClient
(
sshConn
,
chans
,
reqs
)
s
.
Handler
=
s
.
handleTcpForwardSSH
return
nil
}
func
(
s
*
TcpForwardServer
)
handleTcpForward
(
conn
net
.
Conn
,
raddr
*
net
.
TCPAddr
)
{
defer
conn
.
Close
()
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s - %s"
,
conn
.
RemoteAddr
(),
raddr
)
...
...
@@ -62,6 +120,25 @@ func (s *TcpForwardServer) handleTcpForward(conn net.Conn, raddr net.Addr) {
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s >-< %s"
,
conn
.
RemoteAddr
(),
raddr
)
}
func
(
s
*
TcpForwardServer
)
handleTcpForwardSSH
(
conn
net
.
Conn
,
raddr
*
net
.
TCPAddr
)
{
defer
conn
.
Close
()
if
s
.
sshClient
==
nil
{
return
}
rc
,
err
:=
s
.
sshClient
.
DialTCP
(
"tcp"
,
nil
,
raddr
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[tcp] %s -> %s : %s"
,
conn
.
RemoteAddr
(),
raddr
,
err
)
return
}
defer
rc
.
Close
()
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s <-> %s"
,
conn
.
RemoteAddr
(),
raddr
)
Transport
(
conn
,
rc
)
glog
.
V
(
LINFO
)
.
Infof
(
"[tcp] %s >-< %s"
,
conn
.
RemoteAddr
(),
raddr
)
}
type
packet
struct
{
srcAddr
string
// src address
dstAddr
string
// dest address
...
...
@@ -348,16 +425,73 @@ func (s *RTcpForwardServer) Serve() error {
}
retry
=
0
if
err
:=
s
.
connectRTcpForward
(
conn
,
laddr
,
raddr
);
err
!=
nil
{
conn
.
Close
()
time
.
Sleep
(
6
*
time
.
Second
)
glog
.
V
(
LINFO
)
.
Infof
(
"[rtcp] %s - %s"
,
laddr
,
raddr
)
lastNode
:=
s
.
Base
.
Chain
.
lastNode
if
lastNode
.
Transport
==
"ssh"
{
s
.
connectRTcpForwardSSH
(
conn
,
lastNode
,
laddr
,
raddr
)
}
else
{
if
err
:=
s
.
connectRTcpForward
(
conn
,
laddr
,
raddr
);
err
!=
nil
{
conn
.
Close
()
}
}
time
.
Sleep
(
3
*
time
.
Second
)
}
}
func
(
s
*
RTcpForwardServer
)
connectRTcpForward
(
conn
net
.
Conn
,
laddr
,
raddr
net
.
Addr
)
error
{
glog
.
V
(
LINFO
)
.
Infof
(
"[rtcp] %s - %s"
,
laddr
,
raddr
)
func
(
s
*
RTcpForwardServer
)
connectRTcpForward
SSH
(
conn
net
.
Conn
,
sshNode
*
ProxyNode
,
laddr
,
raddr
net
.
Addr
)
error
{
defer
conn
.
Close
(
)
var
user
,
password
string
if
len
(
sshNode
.
Users
)
>
0
{
user
=
sshNode
.
Users
[
0
]
.
Username
()
password
,
_
=
sshNode
.
Users
[
0
]
.
Password
()
}
config
:=
ssh
.
ClientConfig
{
User
:
user
,
Auth
:
[]
ssh
.
AuthMethod
{
ssh
.
Password
(
password
),
},
}
c
,
chans
,
reqs
,
err
:=
ssh
.
NewClientConn
(
conn
,
sshNode
.
Addr
,
&
config
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
return
err
}
client
:=
ssh
.
NewClient
(
c
,
chans
,
reqs
)
defer
client
.
Close
()
ln
,
err
:=
client
.
Listen
(
"tcp"
,
laddr
.
String
())
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
return
err
}
defer
ln
.
Close
()
for
{
rc
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
return
err
}
go
func
(
c
net
.
Conn
)
{
defer
c
.
Close
()
tc
,
err
:=
net
.
DialTimeout
(
"tcp"
,
raddr
.
String
(),
time
.
Second
*
30
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
return
}
defer
tc
.
Close
()
glog
.
V
(
3
)
.
Infof
(
"[rtcp] %s <-> %s"
,
c
.
RemoteAddr
(),
c
.
LocalAddr
())
Transport
(
c
,
tc
)
glog
.
V
(
3
)
.
Infof
(
"[rtcp] %s >-< %s"
,
c
.
RemoteAddr
(),
c
.
LocalAddr
())
}(
rc
)
}
}
func
(
s
*
RTcpForwardServer
)
connectRTcpForward
(
conn
net
.
Conn
,
laddr
,
raddr
net
.
Addr
)
error
{
req
:=
gosocks5
.
NewRequest
(
gosocks5
.
CmdBind
,
ToSocksAddr
(
laddr
))
if
err
:=
req
.
Write
(
conn
);
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
laddr
,
raddr
,
err
)
...
...
@@ -394,7 +528,7 @@ func (s *RTcpForwardServer) connectRTcpForward(conn net.Conn, laddr, raddr net.A
go
func
()
{
defer
conn
.
Close
()
lconn
,
err
:=
net
.
DialTimeout
(
"tcp"
,
raddr
.
String
(),
time
.
Second
*
18
0
)
lconn
,
err
:=
net
.
DialTimeout
(
"tcp"
,
raddr
.
String
(),
time
.
Second
*
3
0
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infof
(
"[rtcp] %s -> %s : %s"
,
rep
.
Addr
,
raddr
,
err
)
return
...
...
gost.go
View file @
d19d5ada
...
...
@@ -5,6 +5,7 @@ import (
"encoding/base64"
"errors"
"github.com/golang/glog"
"io"
"net"
"strings"
"time"
...
...
@@ -144,3 +145,18 @@ func basicProxyAuth(proxyAuth string) (username, password string, ok bool) {
return
cs
[
:
s
],
cs
[
s
+
1
:
],
true
}
func
Transport
(
rw1
,
rw2
io
.
ReadWriter
)
error
{
errc
:=
make
(
chan
error
,
1
)
go
func
()
{
_
,
err
:=
io
.
Copy
(
rw1
,
rw2
)
errc
<-
err
}()
go
func
()
{
_
,
err
:=
io
.
Copy
(
rw2
,
rw1
)
errc
<-
err
}()
return
<-
errc
}
http.go
View file @
d19d5ada
...
...
@@ -46,7 +46,6 @@ func (s *HttpServer) HandleRequest(req *http.Request) {
valid
:=
false
u
,
p
,
_
:=
basicProxyAuth
(
req
.
Header
.
Get
(
"Proxy-Authorization"
))
glog
.
V
(
LINFO
)
.
Infoln
(
u
,
p
)
for
_
,
user
:=
range
s
.
Base
.
Node
.
Users
{
username
:=
user
.
Username
()
password
,
_
:=
user
.
Password
()
...
...
node.go
View file @
d19d5ada
...
...
@@ -71,7 +71,7 @@ func ParseProxyNode(s string) (node ProxyNode, err error) {
}
switch
node
.
Transport
{
case
"ws"
,
"wss"
,
"tls"
,
"http2"
,
"quic"
,
"kcp"
,
"redirect"
,
"ssu"
,
"pht"
:
case
"ws"
,
"wss"
,
"tls"
,
"http2"
,
"quic"
,
"kcp"
,
"redirect"
,
"ssu"
,
"pht"
,
"ssh"
:
case
"https"
:
node
.
Protocol
=
"http"
node
.
Transport
=
"tls"
...
...
server.go
View file @
d19d5ada
...
...
@@ -7,7 +7,9 @@ import (
"github.com/ginuerzh/gosocks5"
"github.com/golang/glog"
ss
"github.com/shadowsocks/shadowsocks-go/shadowsocks"
"golang.org/x/crypto/ssh"
"io"
"io/ioutil"
"net"
"net/http"
"strconv"
...
...
@@ -125,6 +127,31 @@ func (s *ProxyServer) Serve() error {
return
NewShadowUdpServer
(
s
,
ttl
)
.
ListenAndServe
()
case
"pht"
:
// pure http tunnel
return
NewPureHttpServer
(
s
)
.
ListenAndServe
()
case
"ssh"
:
// SSH tunnel
key
:=
s
.
Node
.
Get
(
"key"
)
privateBytes
,
err
:=
ioutil
.
ReadFile
(
key
)
if
err
!=
nil
{
glog
.
V
(
LWARNING
)
.
Infoln
(
"[ssh]"
,
err
)
privateBytes
=
defaultRawKey
}
private
,
err
:=
ssh
.
ParsePrivateKey
(
privateBytes
)
if
err
!=
nil
{
return
err
}
config
:=
ssh
.
ServerConfig
{
PasswordCallback
:
DefaultPasswordCallback
(
s
.
Node
.
Users
),
}
if
len
(
s
.
Node
.
Users
)
==
0
{
config
.
NoClientAuth
=
true
}
config
.
AddHostKey
(
private
)
s
:=
&
SSHServer
{
Addr
:
node
.
Addr
,
Base
:
s
,
Config
:
&
config
,
}
return
s
.
ListenAndServe
()
default
:
ln
,
err
=
net
.
Listen
(
"tcp"
,
node
.
Addr
)
}
...
...
ssh.go
0 → 100644
View file @
d19d5ada
// The ssh tunnel is inspired by easyssh(https://dev.justinjudd.org/justin/easyssh)
package
gost
import
(
"encoding/binary"
"fmt"
"github.com/golang/glog"
"golang.org/x/crypto/ssh"
"net"
"net/url"
"strconv"
)
// Applicaple SSH Request types for Port Forwarding - RFC 4254 7.X
const
(
DirectForwardRequest
=
"direct-tcpip"
// RFC 4254 7.2
RemoteForwardRequest
=
"tcpip-forward"
// RFC 4254 7.1
ForwardedTCPReturnRequest
=
"forwarded-tcpip"
// RFC 4254 7.2
CancelRemoteForwardRequest
=
"cancel-tcpip-forward"
// RFC 4254 7.1
)
type
SSHServer
struct
{
Addr
string
Base
*
ProxyServer
Config
*
ssh
.
ServerConfig
Handler
func
(
ssh
.
Conn
,
<-
chan
ssh
.
NewChannel
,
<-
chan
*
ssh
.
Request
)
}
func
(
s
*
SSHServer
)
ListenAndServe
()
error
{
ln
,
err
:=
net
.
Listen
(
"tcp"
,
s
.
Addr
)
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh] Listen:"
,
err
)
return
err
}
defer
ln
.
Close
()
for
{
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh] Accept:"
,
err
)
return
err
}
go
func
(
conn
net
.
Conn
)
{
sshConn
,
chans
,
reqs
,
err
:=
ssh
.
NewServerConn
(
conn
,
s
.
Config
)
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infof
(
"[ssh] %s -> %s : %s"
,
conn
.
RemoteAddr
(),
s
.
Addr
,
err
)
return
}
defer
sshConn
.
Close
()
if
s
.
Handler
==
nil
{
s
.
Handler
=
s
.
handleSSHConn
}
glog
.
V
(
3
)
.
Infof
(
"[ssh] %s <-> %s"
,
conn
.
RemoteAddr
(),
s
.
Addr
)
s
.
Handler
(
sshConn
,
chans
,
reqs
)
glog
.
V
(
3
)
.
Infof
(
"[ssh] %s >-< %s"
,
conn
.
RemoteAddr
(),
s
.
Addr
)
}(
conn
)
}
}
func
(
s
*
SSHServer
)
handleSSHConn
(
conn
ssh
.
Conn
,
chans
<-
chan
ssh
.
NewChannel
,
reqs
<-
chan
*
ssh
.
Request
)
{
quit
:=
make
(
chan
interface
{})
go
func
()
{
for
req
:=
range
reqs
{
switch
req
.
Type
{
case
RemoteForwardRequest
:
go
s
.
tcpipForwardRequest
(
conn
,
req
,
quit
)
default
:
if
req
.
WantReply
{
req
.
Reply
(
false
,
nil
)
}
}
}
}()
go
func
()
{
for
newChannel
:=
range
chans
{
// Check the type of channel
t
:=
newChannel
.
ChannelType
()
switch
t
{
case
DirectForwardRequest
:
channel
,
requests
,
err
:=
newChannel
.
Accept
()
if
err
!=
nil
{
glog
.
V
(
3
)
.
Infoln
(
"[ssh] Could not accept channel:"
,
err
)
continue
}
p
:=
directForward
{}
ssh
.
Unmarshal
(
newChannel
.
ExtraData
(),
&
p
)
go
ssh
.
DiscardRequests
(
requests
)
go
s
.
directPortForwardChannel
(
channel
,
fmt
.
Sprintf
(
"%s:%d"
,
p
.
Host1
,
p
.
Port1
))
default
:
glog
.
V
(
3
)
.
Infoln
(
"[ssh] Unknown channel type:"
,
t
)
newChannel
.
Reject
(
ssh
.
UnknownChannelType
,
fmt
.
Sprintf
(
"unknown channel type: %s"
,
t
))
}
}
}()
conn
.
Wait
()
close
(
quit
)
}
// directForward is structure for RFC 4254 7.2 - can be used for "forwarded-tcpip" and "direct-tcpip"
type
directForward
struct
{
Host1
string
Port1
uint32
Host2
string
Port2
uint32
}
func
(
p
directForward
)
String
()
string
{
return
fmt
.
Sprintf
(
"%s:%d -> %s:%d"
,
p
.
Host2
,
p
.
Port2
,
p
.
Host1
,
p
.
Port1
)
}
func
(
s
*
SSHServer
)
directPortForwardChannel
(
channel
ssh
.
Channel
,
raddr
string
)
{
defer
channel
.
Close
()
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s - %s"
,
s
.
Addr
,
raddr
)
conn
,
err
:=
s
.
Base
.
Chain
.
Dial
(
raddr
)
if
err
!=
nil
{
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s - %s : %s"
,
s
.
Addr
,
raddr
,
err
)
return
}
defer
conn
.
Close
()
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s <-> %s"
,
s
.
Addr
,
raddr
)
Transport
(
conn
,
channel
)
glog
.
V
(
3
)
.
Infof
(
"[ssh-tcp] %s >-< %s"
,
s
.
Addr
,
raddr
)
}
// tcpipForward is structure for RFC 4254 7.1 "tcpip-forward" request
type
tcpipForward
struct
{
Host
string
Port
uint32
}
func
(
s
*
SSHServer
)
tcpipForwardRequest
(
sshConn
ssh
.
Conn
,
req
*
ssh
.
Request
,
quit
<-
chan
interface
{})
{
t
:=
tcpipForward
{}
ssh
.
Unmarshal
(
req
.
Payload
,
&
t
)
addr
:=
fmt
.
Sprintf
(
"%s:%d"
,
t
.
Host
,
t
.
Port
)
glog
.
V
(
3
)
.
Infoln
(
"[ssh-rtcp] listening tcp"
,
addr
)
ln
,
err
:=
net
.
Listen
(
"tcp"
,
addr
)
//tie to the client connection
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh-rtcp]"
,
err
)
req
.
Reply
(
false
,
nil
)
return
}
defer
ln
.
Close
()
replyFunc
:=
func
()
error
{
if
t
.
Port
==
0
&&
req
.
WantReply
{
// Client sent port 0. let them know which port is actually being used
_
,
port
,
err
:=
getHostPortFromAddr
(
ln
.
Addr
())
if
err
!=
nil
{
return
err
}
var
b
[
4
]
byte
binary
.
BigEndian
.
PutUint32
(
b
[
:
],
uint32
(
port
))
t
.
Port
=
uint32
(
port
)
return
req
.
Reply
(
true
,
b
[
:
])
}
return
req
.
Reply
(
true
,
nil
)
}
if
err
:=
replyFunc
();
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh-rtcp]"
,
err
)
return
}
go
func
()
{
for
{
conn
,
err
:=
ln
.
Accept
()
if
err
!=
nil
{
// Unable to accept new connection - listener likely closed
return
}
go
func
(
conn
net
.
Conn
)
{
defer
conn
.
Close
()
p
:=
directForward
{}
var
err
error
var
portnum
int
p
.
Host1
=
t
.
Host
p
.
Port1
=
t
.
Port
p
.
Host2
,
portnum
,
err
=
getHostPortFromAddr
(
conn
.
RemoteAddr
())
if
err
!=
nil
{
return
}
p
.
Port2
=
uint32
(
portnum
)
ch
,
reqs
,
err
:=
sshConn
.
OpenChannel
(
ForwardedTCPReturnRequest
,
ssh
.
Marshal
(
p
))
if
err
!=
nil
{
glog
.
V
(
1
)
.
Infoln
(
"[ssh-rtcp] open forwarded channel:"
,
err
)
return
}
defer
ch
.
Close
()
go
ssh
.
DiscardRequests
(
reqs
)
glog
.
V
(
3
)
.
Infof
(
"[ssh-rtcp] %s <-> %s"
,
conn
.
RemoteAddr
(),
conn
.
LocalAddr
())
Transport
(
ch
,
conn
)
glog
.
V
(
3
)
.
Infof
(
"[ssh-rtcp] %s >-< %s"
,
conn
.
RemoteAddr
(),
conn
.
LocalAddr
())
}(
conn
)
}
}()
<-
quit
}
func
getHostPortFromAddr
(
addr
net
.
Addr
)
(
host
string
,
port
int
,
err
error
)
{
host
,
portString
,
err
:=
net
.
SplitHostPort
(
addr
.
String
())
if
err
!=
nil
{
return
}
port
,
err
=
strconv
.
Atoi
(
portString
)
return
}
type
PasswordCallbackFunc
func
(
conn
ssh
.
ConnMetadata
,
password
[]
byte
)
(
*
ssh
.
Permissions
,
error
)
func
DefaultPasswordCallback
(
users
[]
*
url
.
Userinfo
)
PasswordCallbackFunc
{
return
func
(
conn
ssh
.
ConnMetadata
,
password
[]
byte
)
(
*
ssh
.
Permissions
,
error
)
{
for
_
,
user
:=
range
users
{
u
:=
user
.
Username
()
p
,
_
:=
user
.
Password
()
if
u
==
conn
.
User
()
&&
p
==
string
(
password
)
{
return
nil
,
nil
}
}
glog
.
V
(
3
)
.
Infof
(
"[ssh] %s -> %s : password rejected for %s"
,
conn
.
RemoteAddr
(),
conn
.
LocalAddr
(),
conn
.
User
())
return
nil
,
fmt
.
Errorf
(
"password rejected for %s"
,
conn
.
User
())
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment