package pkcs15

import (
	"apc-p15-tool/pkg/tools/asn1obj"
	"crypto/rsa"
)

// privateKeyObject returns the ASN.1 representation of a private key
func (p15 *pkcs15KeyCert) privateKeyObject() []byte {
	var privKeyObj []byte

	switch privKey := p15.key.(type) {
	case *rsa.PrivateKey:
		privKey.Precompute()

		// ensure all expected vals are available
		privKeyObj = asn1obj.Sequence([][]byte{
			// P
			asn1obj.IntegerExplicitValue(3, privKey.Primes[0]),
			// Q
			asn1obj.IntegerExplicitValue(4, privKey.Primes[1]),
			// Dp
			asn1obj.IntegerExplicitValue(5, privKey.Precomputed.Dp),
			// Dq
			asn1obj.IntegerExplicitValue(6, privKey.Precomputed.Dq),
			// Qinv
			asn1obj.IntegerExplicitValue(7, privKey.Precomputed.Qinv),
		})

	// case *ecdsa.PrivateKey:
	// 	// Only private piece is the integer D
	// 	privKeyObj = asn1obj.Sequence([][]byte{
	// 		asn1obj.Integer(privKey.D),
	// 	})

	default:
		// panic if non-RSA key
		panic("private key object for non-rsa key is unexpected and unsupported")
	}

	return privKeyObj
}