2016-07-26 2 views
0

Ich habe eine rsa.PublicKey, die aus einem Modul und einem öffentlichen Exponenet in einer Struktur besteht. Ich möchte eine ssh.Signature verifizieren, die mit diesem Schlüssel signiert ist, und ich denke, wenn ich eine ssh.PublicKey habe, kann ich die Verify Methode auf dieser Schnittstelle aufrufen. Ich kann jedoch keine Klassen finden, die ssh.PublicKey implementieren und Konvertierung von rsa.PublicKey unterstützen. Muss ich eine proprietäre Methode schreiben, um dies zu tun, oder gibt es eine Klasse, die ich nicht finde, oder eine bessere Möglichkeit, mein Problem zu lösen?Konvertieren von rs.PublicKey zu ssh.PublicKey

Für Kontext, ich habe die rsa.PublicKey von einem x509.Certificate, die von einem Yubikey kamen, der einen Schlüssel in einem seiner PIV Schlitze bestätigt.

Antwort

1

Die NewPublicKey Funktion aus dem Krypto/SSH Paket http://godoc.org/golang.org/x/crypto/ssh#NewPublicKey ein *rsa.PublicKey als Parameter nehmen und gibt eine Instanz der PublicKey Schnittstelle, die eine Verify Methode (Verify(data []byte, sig *Signature) error) umfasst - http://godoc.org/golang.org/x/crypto/ssh#PublicKey.

Das folgende Programm zeigt es - wir ein neues * rsa.PrivateKey und Zeichen eine Nachricht es schaffen, dann wandeln *rsa.PublicKey-ssh.PublicKeyNewPublicKey Funktion und die Signatur verifizieren; Überprüfen Sie außerdem, ob die Signaturprüfung fehlschlägt, wenn die ursprünglichen Daten geändert werden. Die Fehlerprüfung ist der Kürze halber weggelassen.

 
package main 

import (
    "crypto/rand" 
    "crypto/rsa" 
    "fmt" 
    "log" 

    "golang.org/x/crypto/ssh" 
) 

func main() { 
    data := []byte("Hello, world!") 

    // create a new key as *rsa.PrivateKey 
    priv, _ := rsa.GenerateKey(rand.Reader, 512) 
    signer, _ := ssh.NewSignerFromKey(priv) 
    sig, _ := signer.Sign(rand.Reader, data) 

    // extract the ssh.PublicKey from *rsa.PublicKey to verify the signature 
    pub, _ := ssh.NewPublicKey(&priv.PublicKey) 
    if err := pub.Verify(data, sig); err != nil { 
     log.Fatalf("publicKey.Verify failed: %v", err) 
    } 
    fmt.Printf("Signature OK\n") 
    // modify the data and make sure we get a failure 
    data[0]++ 
    if err := pub.Verify(data, sig); err == nil { 
     log.Printf("publicKey.Verify passed on bad data/signature, expect failure") 
    } 
} 

Ausgang:

 
Signature OK