code: func (csp *impl) getECKey(ski []byte) (pubKey *ecdsa.PublicKey, isPriv bool, err error) {
  	p11lib := csp.ctx
  	session := csp.getSession()
  	defer csp.returnSession(session)
  	isPriv = true
  	_, err = findKeyPairFromSKI(p11lib, session, ski, privateKeyFlag)
  	if err != nil {
  		isPriv = false
  		logger.Debugf("Private key not found [%s] for SKI [%s], looking for Public key", err, hex.EncodeToString(ski))
  	}
  
  	publicKey, err := findKeyPairFromSKI(p11lib, session, ski, publicKeyFlag)
  	if err != nil {
  		return nil, false, fmt.Errorf("Public key not found [%s] for SKI [%s]", err, hex.EncodeToString(ski))
  	}
  
  	ecpt, marshaledOid, err := ecPoint(p11lib, session, *publicKey)
  	if err != nil {
  		return nil, false, fmt.Errorf("Public key not found [%s] for SKI [%s]", err, hex.EncodeToString(ski))
  	}
  
  	curveOid := new(asn1.ObjectIdentifier)
  	_, err = asn1.Unmarshal(marshaledOid, curveOid)
  	if err != nil {
  		return nil, false, fmt.Errorf("Failed Unmarshaling Curve OID [%s]\n%s", err.Error(), hex.EncodeToString(marshaledOid))
  	}
  
  	curve := namedCurveFromOID(*curveOid)
  	if curve == nil {
  		return nil, false, fmt.Errorf("Cound not recognize Curve from OID")
  	}
  	x, y := elliptic.Unmarshal(curve, ecpt)
  	if x == nil {
  		return nil, false, fmt.Errorf("Failed Unmarshaling Public Key")
  	}
  
  	pubKey = &ecdsa.PublicKey{Curve: curve, X: x, Y: y}
  	return pubKey, isPriv, nil
  }
docs: // Look for an EC key by SKI, stored in CKA_ID
  // This function can probably be adapted for both EC and RSA keys.