Source File
public_key_v3.go
Belonging Package
golang.org/x/crypto/openpgp/packet
package packet
import (
)
type PublicKeyV3 struct {
CreationTime time.Time
DaysToExpire uint16
PubKeyAlgo PublicKeyAlgorithm
PublicKey *rsa.PublicKey
Fingerprint [16]byte
KeyId uint64
IsSubkey bool
n, e parsedMPI
}
func ( time.Time, *rsa.PublicKey) *PublicKeyV3 {
:= &PublicKeyV3{
CreationTime: ,
PublicKey: ,
n: fromBig(.N),
e: fromBig(big.NewInt(int64(.E))),
}
.setFingerPrintAndKeyId()
return
}
var [8]byte
if _, = readFull(, [:]); != nil {
return
}
if [0] < 2 || [0] > 3 {
return errors.UnsupportedError("public key version")
}
.CreationTime = time.Unix(int64(uint32([1])<<24|uint32([2])<<16|uint32([3])<<8|uint32([4])), 0)
.DaysToExpire = binary.BigEndian.Uint16([5:7])
.PubKeyAlgo = PublicKeyAlgorithm([7])
switch .PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:
= .parseRSA()
default:
= errors.UnsupportedError("public key type: " + strconv.Itoa(int(.PubKeyAlgo)))
}
if != nil {
return
}
.setFingerPrintAndKeyId()
return
}
if len(.n.bytes) < 8 {
return errors.StructuralError("v3 public key modulus is too short")
}
if len(.e.bytes) > 3 {
= errors.UnsupportedError("large public exponent")
return
}
:= &rsa.PublicKey{N: new(big.Int).SetBytes(.n.bytes)}
for := 0; < len(.e.bytes); ++ {
.E <<= 8
.E |= int(.e.bytes[])
}
.PublicKey =
return
}
func ( *PublicKeyV3) ( io.Writer) {
var uint16
switch .PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:
+= 2 + uint16(len(.n.bytes))
+= 2 + uint16(len(.e.bytes))
default:
panic("unknown public key algorithm")
}
+= 6
.Write([]byte{0x99, byte( >> 8), byte()})
return
}
func ( *PublicKeyV3) ( io.Writer) ( error) {
:= 8 // 8 byte header
switch .PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:
+= 2 + len(.n.bytes)
+= 2 + len(.e.bytes)
default:
panic("unknown public key algorithm")
}
:= packetTypePublicKey
if .IsSubkey {
= packetTypePublicSubkey
}
if = serializeHeader(, , ); != nil {
return
}
return .serializeWithoutHeaders()
}
func ( *PublicKeyV3) ( io.Writer) ( error) {
[5] = byte(.DaysToExpire >> 8)
[7] = byte(.PubKeyAlgo)
if _, = .Write([:]); != nil {
return
}
switch .PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:
return writeMPIs(, .n, .e)
}
return errors.InvalidArgumentError("bad public-key algorithm")
}
func ( *PublicKeyV3) () bool {
return .PubKeyAlgo != PubKeyAlgoRSAEncryptOnly
}
func ( *PublicKeyV3) ( hash.Hash, *SignatureV3) ( error) {
if !.CanSign() {
return errors.InvalidArgumentError("public key cannot generate signatures")
}
:= make([]byte, 5)
[0] = byte(.SigType)
binary.BigEndian.PutUint32([1:], uint32(.CreationTime.Unix()))
.Write()
:= .Sum(nil)
if [0] != .HashTag[0] || [1] != .HashTag[1] {
return errors.SignatureError("hash tag doesn't match")
}
if .PubKeyAlgo != .PubKeyAlgo {
return errors.InvalidArgumentError("public key and signature use different algorithms")
}
switch .PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:
if = rsa.VerifyPKCS1v15(.PublicKey, .Hash, , .RSASignature.bytes); != nil {
return errors.SignatureError("RSA verification failure")
}
return
panic("shouldn't happen")
}
}
func ( *PublicKeyV3) ( string, *PublicKeyV3, *SignatureV3) ( error) {
, := userIdSignatureV3Hash(, , .Hash)
if != nil {
return
}
return .VerifySignatureV3(, )
}
func ( *PublicKeyV3) ( *PublicKeyV3, *SignatureV3) ( error) {
, := keySignatureHash(, , .Hash)
if != nil {
return
}
return .VerifySignatureV3(, )
}
.SerializeSignaturePrefix()
.serializeWithoutHeaders()
.Write([]byte())
return
}
func ( *PublicKeyV3) () string {
return fmt.Sprintf("%X", .KeyId)
}
func ( *PublicKeyV3) () string {
return fmt.Sprintf("%X", .KeyId&0xFFFFFFFF)
}
func ( *PublicKeyV3) () ( uint16, error) {
switch .PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:
= .n.bitLength
default:
= errors.InvalidArgumentError("bad public-key algorithm")
}
return
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |