Giter VIP home page Giter VIP logo

gotlcp's People

Contributors

emmansun avatar trisia avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

gotlcp's Issues

RequireAndVerifyClientCert error

Greetings!

I'm trying to configure TLCP to work like standard TLS, with just one key and one certificate for each side. It happens that I get an error message referring to cipher suites: "server: handshake failed: tlcp: no cipher suite supported by both client and server".

Can anyone point me out what's wrong with my code please?

package main

import (
	"bufio"
	"bytes"
	"crypto/rand"
	"encoding/pem"
	"errors"
	"flag"
	"fmt"
	"log"
	"net"
	"os"

	"gitee.com/Trisia/gotlcp/tlcp"
	"github.com/emmansun/gmsm/smx509"
)
var (
	cert      = flag.String("cert", "Certificate.pem", "Certificate path.")
	tcpip     = flag.String("tcp", "", "Encrypted TCP Transfer Protocol. [server|client]")
	key       = flag.String("key", "", "`Private key.")
	iport     = flag.String("ipport", "", "Local Port/remote's side Public IP:Port.")
)

func handleConnection(c net.Conn) {
	log.Printf("Client(TLS) %v connected via secure channel.", c.RemoteAddr())
}

func main() {
	flag.Parse()
	if (*tcpip == "server" || *tcpip == "client") {
		var certPEM []byte 
		var privPEM []byte

		file, err := os.Open(*key)
		if err != nil {
			log.Fatal(err)
		}
		info, err := file.Stat()
		if err != nil {
			log.Fatal(err)
		}
		buf := make([]byte, info.Size())
		file.Read(buf)

		var block *pem.Block
		block, _ = pem.Decode(buf)

		if block == nil {
			errors.New("no valid private key found")
		}

		privPEM = buf

		file, err = os.Open(*cert)
		if err != nil {
			log.Fatal(err)
		}
		info, err = file.Stat()
		if err != nil {
			log.Fatal(err)
		}
		buf = make([]byte, info.Size())
		file.Read(buf)
		certPEM = buf

		if *tcpip == "server" {
			var cert tlcp.Certificate
 			cert, err = tlcp.X509KeyPair(certPEM, privPEM)
			cfg := tlcp.Config{Certificates: []tlcp.Certificate{cert, cert}, CipherSuites: []uint16{tlcp.ECC_SM4_GCM_SM3}, ClientAuth: tlcp.RequireAndVerifyClientCert}
			cfg.Rand = rand.Reader

			port := "8081"
			if *iport != "" {
				port = *iport
			}

			ln, err := tlcp.Listen("tcp", ":"+port, &cfg)
			if err != nil {
				log.Fatal(err)
			}

			fmt.Fprintln(os.Stderr, "Server(TLCP) up and listening on port "+port)

			conn, err := ln.Accept()
			if err != nil {
				log.Fatal(err)
			}
			defer ln.Close()

			tlcpcon := conn.(*tlcp.Conn)
			err = tlcpcon.Handshake()
			if err != nil {
				log.Fatalf("server: handshake failed: %s", err)
			} else {
				log.Print("server: conn: Handshake completed")
			}

			state := tlcpcon.ConnectionState()
		
			for _, v := range state.PeerCertificates {
				derBytes, err := smx509.MarshalPKIXPublicKey(v.PublicKey)
				if err != nil {
					log.Fatal(err)
				}
				pubPEM := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: derBytes})
				fmt.Printf("%s\n", pubPEM)
			}

			go handleConnection(conn)
			fmt.Println("Connection accepted")

			for {
				message, err := bufio.NewReader(conn).ReadString('\n')
				if err != nil {
					fmt.Println(err)
					os.Exit(3)
				}
				fmt.Print("Client response: " + string(message))

				reader := bufio.NewReader(os.Stdin)
				fmt.Print("Text to be sent: ")
				text, err := reader.ReadString('\n')
				if err != nil {
					fmt.Println(err)
					os.Exit(3)
				}
				fmt.Fprintf(conn, text+"\n")
			}
		}

		if *tcpip == "client" {
			var cert tlcp.Certificate
			cert, err = tlcp.X509KeyPair(certPEM, privPEM)
			cfg := tlcp.Config{Certificates: []tlcp.Certificate{cert}, InsecureSkipVerify: true, CipherSuites: []uint16{tlcp.ECC_SM4_GCM_SM3}}

			ipport := "127.0.0.1:8081"
			if *iport != "" {
				ipport = *iport
			}

			conn, err := tlcp.Dial("tcp", ipport, &cfg)
			if err != nil {
				log.Fatal(err)
			}
			certs := conn.ConnectionState().PeerCertificates
			for _, cert := range certs {
				fmt.Printf("Issuer: \n\t%s\n", cert.Issuer)
				fmt.Printf("Subject: \n\t%s\n", cert.Subject)
				fmt.Printf("Expiry: %s \n", cert.NotAfter.Format("Monday, 02-Jan-06 15:04:05 MST"))
			}
			if err != nil {
				log.Fatal(err)
			}
			defer conn.Close()

			var b bytes.Buffer
			for _, cert := range conn.ConnectionState().PeerCertificates {
				err := pem.Encode(&b, &pem.Block{
					Type: "CERTIFICATE",
					Bytes: cert.Raw,
			        })
				if err != nil {
					log.Fatal(err)
				}
			}
			fmt.Println(b.String())

			for {
				reader := bufio.NewReader(os.Stdin)
				fmt.Print("Text to be sent: ")
				text, err := reader.ReadString('\n')
				if err != nil {
					fmt.Println(err)
					os.Exit(3)
				}
				fmt.Fprintf(conn, text+"\n")

				message, err := bufio.NewReader(conn).ReadString('\n')
				if err != nil {
					fmt.Println(err)
					os.Exit(3)
				}
				fmt.Print("Server response: " + message)
			}
		}
		os.Exit(0)
	}
}

I don't understand what's wrong, if anyone can help me that would be great.

Thanks in advance.

[sync sdk] tls: use certificate cache in client

In verifyServerCertificate parse certificates using the global certificate cache.

This should significantly reduce memory usage in TLS clients which make concurrent connections which reuse certificates (anywhere in the chain) since there will only ever be one copy of the certificate at once.

Doubt about Cipher Suites

Greetings!

I was reading about the cipher suites, which include RSA_SM4_GCM_SM3 and RSA_SM4_GCM_SHA256, but I didn't understand how this happens. I can't use RSA keys to perform the handshake:

handshake failed: tlcp: no cipher suite supported by both client and server

Does the library accept other algorithms or is it restricted to SM2 (the only one that works)?

Thank you in advance.

单向认证时client异常

单向认证时,客户端没有配置证书,如果服务端要求客户端上送证书,会panic

handshake_client.go文件的373行

panic:runtim error: index out of range [0] with length 0

没有处理intermediate CAs,导致服务器证书验证失败

当前实现没有处理intermediate CAs,测试网站:https://sm2test.ovssl.cn/

握手时服务器发来的服务器证书:

-----BEGIN CERTIFICATE-----
MIIDdjCCAx2gAwIBAgIQE5f65t5a+c85yZtONLrT5DAKBggqgRzPVQGDdTBkMQsw
CQYDVQQGEwJDTjEtMCsGA1UECgwk5rKD6YCa55S15a2Q6K6k6K+B5pyN5Yqh5pyJ
6ZmQ5YWs5Y+4MSYwJAYDVQQDDB3lm73lr4ZTTTLmnI3liqHlmajmoLnor4HkuaZW
MzAeFw0yMjAzMjEwOTMwMzFaFw0yMzAzMjEwOTMwMzFaMH8xCzAJBgNVBAYTAkNO
MRIwEAYDVQQIDAnlub/kuJznnIExEjAQBgNVBAcMCea3seWcs+W4gjEtMCsGA1UE
Cgwk5rKD6YCa55S15a2Q6K6k6K+B5pyN5Yqh5pyJ6ZmQ5YWs5Y+4MRkwFwYDVQQD
DBBzbTJvbmx5Lm92c3NsLmNuMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeqYd
2KDy/PsoiOsV40E8rkBZDU5dJBItFkySXzXiunsvpxrzxXC3LTTh+IvCcDQyD7gk
PfmU8tEEJ6WsU4iMLaOCAZQwggGQMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUnaG3yg+E
yTAPpUAkgO9PsS/6X/8wHwYDVR0jBBgwFoAUjoZouSzYrssgJvZftjtaXuqbmWYw
ZQYIKwYBBQUHAQEEWTBXMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC53b3RydXMu
Y29tMDEGCCsGAQUFBzAChiVodHRwOi8vYWlhLndvdHJ1cy5jb20vd3Mtc20yLXNz
bDMuY2VyMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwud290cnVzLmNvbS93
cy1zbTItc3NsMy5jcmwwGwYDVR0RBBQwEoIQc20yb25seS5vdnNzbC5jbjBYBgNV
HSAEUTBPMAgGBmeBDAECAjAJBgcqgRyJmCoNMDgGCSqBHImYKgMBAzArMCkGCCsG
AQUFBwIBFh1odHRwOi8vd3d3LndvdHJ1cy5jb20vcG9saWN5LzAKBggqgRzPVQGD
dQNHADBEAiAaPcI31SiLWUALxSnREub9YHbkcHEzBJRBbj6fUgspDwIgUakesRLL
EgZ3Nn3UWKJeCggfMQkUmCbWNNEgeCXziPA=
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
MIIDdzCCAx2gAwIBAgIQId7IQbPd/UUZpCdLZgm2eDAKBggqgRzPVQGDdTBkMQsw
CQYDVQQGEwJDTjEtMCsGA1UECgwk5rKD6YCa55S15a2Q6K6k6K+B5pyN5Yqh5pyJ
6ZmQ5YWs5Y+4MSYwJAYDVQQDDB3lm73lr4ZTTTLmnI3liqHlmajmoLnor4HkuaZW
MzAeFw0yMjAzMjEwOTMwNTBaFw0yMzAzMjEwOTMwNTBaMH8xCzAJBgNVBAYTAkNO
MRIwEAYDVQQIDAnlub/kuJznnIExEjAQBgNVBAcMCea3seWcs+W4gjEtMCsGA1UE
Cgwk5rKD6YCa55S15a2Q6K6k6K+B5pyN5Yqh5pyJ6ZmQ5YWs5Y+4MRkwFwYDVQQD
DBBzbTJvbmx5Lm92c3NsLmNuMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeqYd
2KDy/PsoiOsV40E8rkBZDU5dJBItFkySXzXiunsvpxrzxXC3LTTh+IvCcDQyD7gk
PfmU8tEEJ6WsU4iMLaOCAZQwggGQMA4GA1UdDwEB/wQEAwIFIDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwCQYDVR0TBAIwADAdBgNVHQ4EFgQUnaG3yg+E
yTAPpUAkgO9PsS/6X/8wHwYDVR0jBBgwFoAUjoZouSzYrssgJvZftjtaXuqbmWYw
ZQYIKwYBBQUHAQEEWTBXMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC53b3RydXMu
Y29tMDEGCCsGAQUFBzAChiVodHRwOi8vYWlhLndvdHJ1cy5jb20vd3Mtc20yLXNz
bDMuY2VyMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwud290cnVzLmNvbS93
cy1zbTItc3NsMy5jcmwwGwYDVR0RBBQwEoIQc20yb25seS5vdnNzbC5jbjBYBgNV
HSAEUTBPMAgGBmeBDAECAjAJBgcqgRyJmCoNMDgGCSqBHImYKgMBAzArMCkGCCsG
AQUFBwIBFh1odHRwOi8vd3d3LndvdHJ1cy5jb20vcG9saWN5LzAKBggqgRzPVQGD
dQNIADBFAiBEbz3oXKac4Lyt4h9Qp3dxpAtZJ8CaZf3DbVgS/g9KVgIhAPGuPBsi
QKoKWqNRB2bqyiBSdjc3SgJWPy8cyO8dkLob
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
MIIDJjCCAsugAwIBAgIQC4LrMsbMVTwXKaCKgOkwlDAKBggqgRzPVQGDdTBZMQsw
CQYDVQQGEwJDTjEtMCsGA1UECgwk5rKD6YCa55S15a2Q6K6k6K+B5pyN5Yqh5pyJ
6ZmQ5YWs5Y+4MRswGQYDVQQDDBLlm73lr4ZTTTLmoLnor4HkuaYwHhcNMTkwNDA0
MDYxODE4WhcNMzQwNDA0MDYxODE4WjBkMQswCQYDVQQGEwJDTjEtMCsGA1UECgwk
5rKD6YCa55S15a2Q6K6k6K+B5pyN5Yqh5pyJ6ZmQ5YWs5Y+4MSYwJAYDVQQDDB3l
m73lr4ZTTTLmnI3liqHlmajmoLnor4HkuaZWMzBZMBMGByqGSM49AgEGCCqBHM9V
AYItA0IABO+ktsEtsJ81WrKNhIaQKfQC6yVpAbHAZKbpzBAb8CQMFp1hvUsGnn16
p449RAYmckmJ1JeGR0bFsVwoHC8HS5+jggFoMIIBZDAfBgNVHSMEGDAWgBQxuBWH
TMw3lzrt702RSiutCzV2IDAdBgNVHQ4EFgQUjoZouSzYrssgJvZftjtaXuqbmWYw
NQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC53b3RydXMuY29tL3dvdHJ1cy1z
bTIuY3JsMGQGCCsGAQUFBwEBBFgwVjAiBggrBgEFBQcwAYYWaHR0cDovL29jc3Au
d290cnVzLmNvbTAwBggrBgEFBQcwAoYkaHR0cDovL2FpYS53b3RydXMuY29tL3dv
dHJ1cy1zbTIuY2VyMEIGA1UdIAQ7MDkwNwYIKoEciZgqAwEwKzApBggrBgEFBQcC
ARYdaHR0cDovL3d3dy53b3RydXMuY29tL3BvbGljeS8wEgYDVR0TAQH/BAgwBgEB
/wIBADAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAoGCCqBHM9VAYN1A0kAMEYCIQC/DGPAPQeARs/+TxvMfTNiTFjgvKV21drw
zdx7AiqdWAIhAI4YaGSoqdVclOIYMzGvbL92pI4hhS85BSRi0XZYQrzu
-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----
MIIB9DCCAZmgAwIBAgIRAIHDVL1guSy7XoFVo0I4+tQwCgYIKoEcz1UBg3UwWTEL
MAkGA1UEBhMCQ04xLTArBgNVBAoMJOayg+mAmueUteWtkOiupOivgeacjeWKoeac
iemZkOWFrOWPuDEbMBkGA1UEAwwS5Zu95a+GU00y5qC56K+B5LmmMB4XDTE5MDQw
NDA2MTYxNloXDTQ0MDQwNDA2MTYxNlowWTELMAkGA1UEBhMCQ04xLTArBgNVBAoM
JOayg+mAmueUteWtkOiupOivgeacjeWKoeaciemZkOWFrOWPuDEbMBkGA1UEAwwS
5Zu95a+GU00y5qC56K+B5LmmMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEG2iw
QWmdsI7+MzAWrLdrH4nEzb4q2Ujy/QbGrlque74ieYFEI5xV1J8/RqPH1n9D8BBz
zeYuv9mHJpYgB6jXoqNCMEAwHQYDVR0OBBYEFDG4FYdMzDeXOu3vTZFKK60LNXYg
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqBHM9VAYN1A0kA
MEYCIQCsobYw4P1XbSuLxvoR3RThjv+OLUHdoGdxTtZdv6jayAIhALBB8scNmtNg
yEUt1z54gasQb8OiCZEPIdRZBDR2GI7A
-----END CERTIFICATE-----

最后两个分别是国密SM2服务器根证书V3国密SM2根证书。除非客户端把国密SM2服务器根证书V3作为root CA,否则证书验证失败。

除了签名、加密证书,发送证书链到客户端

考虑到国密双证书应该拥有一样的证书链(申请国密证书时,客户发送CSR给CA,CA签发证书给客户,包含签名证书、加密证书和加密私钥)。

因为本实现分开了签名、加密证书配置,所以服务端先检查签名证书是否包含证书链,如有,则附加到加密证书之后;否则检查加密证书是否包含证书链,如有,则附加到加密证书之后。

[question] 为什么不支持 pkcs1 格式的私钥

  • 所属包名 tlcp
  • 方法 parsePrivateKey

// 解析PKCS8(PEM)格式 SM2密钥对
func parsePrivateKey(der []byte) (crypto.PrivateKey, error) {
        // ❌  这里注释了 就不支持 pckcs1 格式的私钥了
	//if key, err := x509.ParsePKCS1PrivateKey(der); err == nil {
	//	return key, nil
	//}
	if key, err := x509.ParsePKCS8PrivateKey(der); err == nil {
		switch key := key.(type) {
		case *rsa.PrivateKey, *ecdsa.PrivateKey, ed25519.PrivateKey, *sm2.PrivateKey:
			return key, nil
		default:
			return nil, errors.New("tlcp: found unknown private key type in PKCS#8 wrapping")
		}
	}
	if key, err := x509.ParseECPrivateKey(der); err == nil {
		return key, nil
	}

	return nil, errors.New("tlcp: failed to parse private key")
}

步骤

  • 生成 RSA 格式的私钥,案例如下
  • 使用如下方式读取 tlcp.LoadX509KeyPair("config/tls/server.crt", "config/tls/server_pkcs1.key")
  • 发现无法读取
server.crt
-----BEGIN CERTIFICATE-----
MIID2zCCAsOgAwIBAgIUM9uFSX7i7/i/7H+CxRFtTVvwufAwDQYJKoZIhvcNAQEL
BQAwSDELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkJKMQswCQYDVQQHDAJIRDERMA8G
A1UECgwIdGVsZWluZm8xDDAKBgNVBAsMA1ImRDAeFw0yMjA5MjkwOTQ0NTJaFw0z
MjA5MjYwOTQ0NTJaMGAxCzAJBgNVBAYTAkNOMQswCQYDVQQIDAJCSjELMAkGA1UE
BwwCSEQxETAPBgNVBAoMCHRlbGVpbmZvMQwwCgYDVQQLDANSJkQxFjAUBgNVBAMM
DSoudGVsZWluZm8uY24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7
XEkke47NuT8jm+r1P+dLVibGGBy+fdBQ1GLexAZlhzavhW+y5O1YTOGH6jKqMyjt
Pf4+Tqr8vvtl22MGsNTWR30ViPo2QOAgy9s+7+gSCUrp6CqhefG2Y+iZB7os/3hl
zSvFvqtMIJ9CCTD2rFwA8DqtX6//1QKLqwB3Atf2EbzGe6Cgfzsy6IbjMTVnaY3x
IXatVDW5IAlw/psGirCAR8pjQ46VXxDaFQIzeG4ZtUJybVmgsWohpOKD87iflYg6
Y1yy/h/UHfvUaRErXrL1a3ki45aysZmqhwZOPPy+SJPbJBp1uSB1RUWq4VE24JlL
EEwnaUVItRxi6nuYrIUlAgMBAAGjgaQwgaEwbQYDVR0jBGYwZKFMpEowSDELMAkG
A1UEBhMCQ04xCzAJBgNVBAgMAkJKMQswCQYDVQQHDAJIRDERMA8GA1UECgwIdGVs
ZWluZm8xDDAKBgNVBAsMA1ImRIIUR16lCMx2c/aHNCtd7B9kQs4JMQgwCQYDVR0T
BAIwADALBgNVHQ8EBAMCBPAwGAYDVR0RBBEwD4INKi50ZWxlaW5mby5jbjANBgkq
hkiG9w0BAQsFAAOCAQEAhQu2rfKIxOinjBLJipzmzseN5K6RMKOW4q8dCR+OB+N1
hUPPQodDENJlrNWuA+gvznHv0buRETb3vENIDiaugejMC1mJw1TsYWcdndUx7/IE
Z7Td8uUfKEnaTTU01+WOkI8Gs/fl55npcl4KuuMa4oZGpP+JPAyZ2FybAzBOVBwV
WowJajvS3pQsaYiKe9vGZ2BrjDwkxUsLCQ0eI41Myf49rQ7WZdGFNHwg3qGAr4WJ
hVn5h2/NcY+zjBxAZgLiBIKz3jVPwyzvBbR07gXr2i1oZhlTBBomo1D8cBvl5seQ
iu1nBa0c9Tlm1e3bKCeu5Ax2LRbreL4RNbOueBF5sQ==
-----END CERTIFICATE-----


server_pkcs1.key  (pkcs1 格式的私钥)
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAu1xJJHuOzbk/I5vq9T/nS1Ymxhgcvn3QUNRi3sQGZYc2r4Vv
suTtWEzhh+oyqjMo7T3+Pk6q/L77ZdtjBrDU1kd9FYj6NkDgIMvbPu/oEglK6egq
oXnxtmPomQe6LP94Zc0rxb6rTCCfQgkw9qxcAPA6rV+v/9UCi6sAdwLX9hG8xnug
oH87MuiG4zE1Z2mN8SF2rVQ1uSAJcP6bBoqwgEfKY0OOlV8Q2hUCM3huGbVCcm1Z
oLFqIaTig/O4n5WIOmNcsv4f1B371GkRK16y9Wt5IuOWsrGZqocGTjz8vkiT2yQa
dbkgdUVFquFRNuCZSxBMJ2lFSLUcYup7mKyFJQIDAQABAoIBAEd+f6qcO3HlLmK4
LIBJUkk9Jq6QpOdLuyIc6V14D7jOT9/KW0U4dhkrvSPQCmVIAGYHMe00t6qadfP4
M2FqOM1Lmj+NdW0edGgPYioyAaxgP2XiYeIcVk/y7971Q+XH1nmCQSHEEDmMeTkJ
qNV4D+OLx9hAmzhUYBRLvHGtdBtBIYq1cZueFOYWmdQOwmYP5Zmfdj0lYoB0u822
38TiqaZbHZAPcQq5QgWSDtPsUaasKg/7eq+KzSngk87E9x4pJlRd2/1MNvIRmPEY
pB0zSpRxDnkgIm5KA9rX//jja2+F2GtZ0Ay35GIVqJxc/H4PNm1xa5smvzgxk30S
K4grjgECgYEA8UN2DiJms7S9HLPOJm+MwpoWpDZZ6tQipYRdman5LbuoT8VE/y/X
BztLMBISZ//8aHHdE4XH4BKltSVomTGr7f9yjR/seXn4YTFHODXcm2RjSYHSwraX
sOqQ0qrlxuLiBM3YwOpBHSkGYD2gLujQyCCRY7xOEkYVy3aESaBRtjkCgYEAxs33
CGikj/eVDwKVxDtRyHVKiXNBYUYKsgakzFZ7vfeDGoXywZNJVxqR7JpSzboXrVPf
7d/kft+FgboCyo4tCXepuS9m8JDDtcxj9t9SL7pZ4t9Ru8Kl7PVmHyfPYt5V71jH
DnaWI3Y8fmI5LnnWSBwqdvLcsKVrRp5g3a1uZk0CgYBao1p9suTcjIEjgFVpUS0T
iuoIpTagpzOg9Rpo+VdYnBB+b4EdUa6508fKdm+dzKjZ4DUK+Y5+muLQLA6gxu1t
izNQ23ZuqKjscqPr9Sg85Lj8S56PciOI3oar7nJGhsQcw+yzhQ4TU29GxsAf/204
UivsyTiXWucjOhI2ytkH2QKBgF8yRTZ7lUFzFqdnX3vlw9WvhI+o5wfDWF/DGqrW
Rs7CdL8AoSvccWQKTxHzG+9zSt8uqK3pZirysaVbAvcneZ1s9ZK9hhdv2qd1RfDz
IxHDtEMVGLhGDtoW8F2+3GnFeXTxF/BvDJnShkkmk6cTpG5HPnZS+SaFL4dTU6MS
5yiJAoGAHlAq/VAsjwXxa8G+sOR+anVmIhT/xWBgUP3p4027cJWDo/zX2Su9LGbP
ECc+LmVnt+QKpgoMjhBNvDpS3zfzuVBc04QSTVh0DRsB12JPMoMYxNyGrtibcXzp
VRirHodw+9HiNLuVXDtdzLqw3L/Qa/nBoFai7ZmOq74TAruycVk=
-----END RSA PRIVATE KEY-----


server_pkcs8.key  (pkcs8 格式的私钥)
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7XEkke47NuT8j
m+r1P+dLVibGGBy+fdBQ1GLexAZlhzavhW+y5O1YTOGH6jKqMyjtPf4+Tqr8vvtl
22MGsNTWR30ViPo2QOAgy9s+7+gSCUrp6CqhefG2Y+iZB7os/3hlzSvFvqtMIJ9C
CTD2rFwA8DqtX6//1QKLqwB3Atf2EbzGe6Cgfzsy6IbjMTVnaY3xIXatVDW5IAlw
/psGirCAR8pjQ46VXxDaFQIzeG4ZtUJybVmgsWohpOKD87iflYg6Y1yy/h/UHfvU
aRErXrL1a3ki45aysZmqhwZOPPy+SJPbJBp1uSB1RUWq4VE24JlLEEwnaUVItRxi
6nuYrIUlAgMBAAECggEAR35/qpw7ceUuYrgsgElSST0mrpCk50u7IhzpXXgPuM5P
38pbRTh2GSu9I9AKZUgAZgcx7TS3qpp18/gzYWo4zUuaP411bR50aA9iKjIBrGA/
ZeJh4hxWT/Lv3vVD5cfWeYJBIcQQOYx5OQmo1XgP44vH2ECbOFRgFEu8ca10G0Eh
irVxm54U5haZ1A7CZg/lmZ92PSVigHS7zbbfxOKpplsdkA9xCrlCBZIO0+xRpqwq
D/t6r4rNKeCTzsT3HikmVF3b/Uw28hGY8RikHTNKlHEOeSAibkoD2tf/+ONrb4XY
a1nQDLfkYhWonFz8fg82bXFrmya/ODGTfRIriCuOAQKBgQDxQ3YOImaztL0cs84m
b4zCmhakNlnq1CKlhF2Zqfktu6hPxUT/L9cHO0swEhJn//xocd0ThcfgEqW1JWiZ
Mavt/3KNH+x5efhhMUc4NdybZGNJgdLCtpew6pDSquXG4uIEzdjA6kEdKQZgPaAu
6NDIIJFjvE4SRhXLdoRJoFG2OQKBgQDGzfcIaKSP95UPApXEO1HIdUqJc0FhRgqy
BqTMVnu994MahfLBk0lXGpHsmlLNuhetU9/t3+R+34WBugLKji0Jd6m5L2bwkMO1
zGP231Ivulni31G7wqXs9WYfJ89i3lXvWMcOdpYjdjx+YjkuedZIHCp28tywpWtG
nmDdrW5mTQKBgFqjWn2y5NyMgSOAVWlRLROK6gilNqCnM6D1Gmj5V1icEH5vgR1R
rrnTx8p2b53MqNngNQr5jn6a4tAsDqDG7W2LM1Dbdm6oqOxyo+v1KDzkuPxLno9y
I4jehqvuckaGxBzD7LOFDhNTb0bGwB//bThSK+zJOJda5yM6EjbK2QfZAoGAXzJF
NnuVQXMWp2dfe+XD1a+Ej6jnB8NYX8MaqtZGzsJ0vwChK9xxZApPEfMb73NK3y6o
relmKvKxpVsC9yd5nWz1kr2GF2/ap3VF8PMjEcO0QxUYuEYO2hbwXb7cacV5dPEX
8G8MmdKGSSaTpxOkbkc+dlL5JoUvh1NToxLnKIkCgYAeUCr9UCyPBfFrwb6w5H5q
dWYiFP/FYGBQ/enjTbtwlYOj/NfZK70sZs8QJz4uZWe35AqmCgyOEE28OlLfN/O5
UFzThBJNWHQNGwHXYk8ygxjE3Iau2JtxfOlVGKseh3D70eI0u5VcO13MurDcv9Br
+cGgVqLtmY6rvhMCu7JxWQ==
-----END PRIVATE KEY-----

TLCP的ECDHE实现问题

// 由于TLCP标准并未明确提及密钥长度,因此与ECC密钥交换类型保持一致48字节。

TLCP标准文档相当简约,只说ECDHE实现参考GB/T 35276,但是GB/T 35276是SM2完整密钥协商的输入、输出定义而已。所以:

  1. TLCP交换生成shared secret 或叫预主密钥的过程使用了完整的SM2密钥协商过程。
  2. 如果真要使用SM2密钥协商过程来交换生成预主密钥,却不对相关参数给出规定。

这样的话,怎么验证实现的正确性?不同的实现如何能互操作?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.