113 lines
2.5 KiB
Go
113 lines
2.5 KiB
Go
package inspect
|
|
|
|
import (
|
|
"crypto/rsa"
|
|
"crypto/x509"
|
|
"errors"
|
|
)
|
|
|
|
// PKCS1PrivateKeyInfo attempts to parse a DER-form PKCS#1-encoded private RSA
|
|
// key, and returns information about it.
|
|
func PKCS1PrivateKeyInfo(loc string, der []byte) Info {
|
|
key, err := x509.ParsePKCS1PrivateKey(der)
|
|
if err != nil {
|
|
return &BadInfo{
|
|
Typ: TypePrivateKey,
|
|
Loc: loc,
|
|
Underlying: err,
|
|
}
|
|
}
|
|
|
|
return PrivateKeyInfo(loc, key)
|
|
}
|
|
|
|
// PKCS1PrivateKeyInfo attempts to parse a DER-form PKCS#8-encoded private RSA
|
|
// key, and returns information about it.
|
|
func PKCS8PrivateKeyInfo(loc string, der []byte) Info {
|
|
key, err := x509.ParsePKCS8PrivateKey(der)
|
|
if err != nil {
|
|
return &BadInfo{
|
|
Typ: TypePrivateKey,
|
|
Loc: loc,
|
|
Underlying: err,
|
|
}
|
|
}
|
|
|
|
rsakey, ok := key.(*rsa.PrivateKey)
|
|
if !ok {
|
|
return &BadInfo{
|
|
Typ: TypePrivateKey,
|
|
Underlying: errors.New("PKCS#8 private key ytpe is not RSA"),
|
|
}
|
|
}
|
|
|
|
return PrivateKeyInfo(loc, rsakey)
|
|
}
|
|
|
|
// PrivateKeyInfo returns structured information about the given RSA private key.
|
|
func PrivateKeyInfo(loc string, key *rsa.PrivateKey) *PrivateKey {
|
|
pl := make([]int, len(key.Primes))
|
|
for i, n := range key.Primes {
|
|
pl[i] = n.BitLen()
|
|
}
|
|
|
|
return &PrivateKey{
|
|
Loc: loc,
|
|
Primes: len(key.Primes),
|
|
PrimeLens: pl,
|
|
Public: PublicKeyInfo(loc, &key.PublicKey),
|
|
}
|
|
}
|
|
|
|
// PrivateKey holds structured information about an RSA private key. It
|
|
// implements Info.
|
|
type PrivateKey struct {
|
|
// Loc is the location the key was encountered.
|
|
Loc string
|
|
|
|
// Primes is the number of primes, ≥ 2.
|
|
Primes int
|
|
|
|
// PrimeLens holds the bit length of each prime.
|
|
PrimeLens []int
|
|
|
|
// Public holds information about the public portion of the key.
|
|
Public *PublicKey
|
|
}
|
|
|
|
// Type indicates this is a private key.
|
|
func (priv *PrivateKey) Type() Type {
|
|
return TypePrivateKey
|
|
}
|
|
|
|
// Location returns the location data stored by PrivateKeyInfo.
|
|
func (priv *PrivateKey) Location() string {
|
|
return priv.Loc
|
|
}
|
|
|
|
// Info returns structured information about the private key.
|
|
func (priv *PrivateKey) Info() []Section {
|
|
return []Section{
|
|
priv.PrivateKeyInfoSection(),
|
|
priv.Public.PublicKeyInfoSection(),
|
|
}
|
|
}
|
|
|
|
// PrivateKeyInfoSection returns the RSA private key specific information
|
|
// section.
|
|
func (priv *PrivateKey) PrivateKeyInfoSection() Section {
|
|
return Section{
|
|
Title: "RSA private key",
|
|
Fields: []Field{
|
|
Field{
|
|
Key: "Primes",
|
|
Value: priv.Primes,
|
|
},
|
|
Field{
|
|
Key: "Prime lengths",
|
|
Value: priv.PrimeLens,
|
|
},
|
|
},
|
|
}
|
|
}
|