File indexing completed on 2024-06-02 05:24:43

0001 #pragma once
0002 /*  smartcard/card.h
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2017 Bundesamt für Sicherheit in der Informationstechnik
0006     SPDX-FileContributor: Intevation GmbH
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #include "keypairinfo.h"
0012 
0013 #include <map>
0014 #include <string>
0015 #include <vector>
0016 
0017 #include <QString>
0018 
0019 namespace Kleo
0020 {
0021 namespace SmartCard
0022 {
0023 
0024 /** Class representing an application on a smartcard or similar hardware token. */
0025 class Card
0026 {
0027 public:
0028     enum PinState {
0029         UnknownPinState,
0030         NullPin,
0031         PinBlocked,
0032         NoPin,
0033         PinOk,
0034 
0035         NumPinStates
0036     };
0037 
0038     enum Status {
0039         NoCard,
0040         CardPresent,
0041         CardActive,
0042         CardUsable,
0043 
0044         _NumScdStates,
0045 
0046         CardError = _NumScdStates,
0047 
0048         NumStates
0049     };
0050 
0051     Card();
0052     virtual ~Card();
0053 
0054     virtual bool operator==(const Card &other) const;
0055     bool operator!=(const Card &other) const;
0056 
0057     void setStatus(Status s);
0058     Status status() const;
0059 
0060     void setSerialNumber(const std::string &sn);
0061     std::string serialNumber() const;
0062 
0063     void setCardInfo(const std::vector<std::pair<std::string, std::string>> &infos);
0064 
0065     QString displaySerialNumber() const;
0066     void setDisplaySerialNumber(const QString &sn);
0067 
0068     std::string appName() const;
0069 
0070     void setAppVersion(int version);
0071     int appVersion() const;
0072     QString displayAppVersion() const;
0073 
0074     void setManufacturer(const std::string &manufacturer);
0075     std::string manufacturer() const;
0076 
0077     std::string cardType() const;
0078 
0079     int cardVersion() const;
0080     QString displayCardVersion() const;
0081 
0082     QString cardHolder() const;
0083 
0084     void setSigningKeyRef(const std::string &keyRef);
0085     std::string signingKeyRef() const;
0086     bool hasSigningKey() const;
0087 
0088     void setEncryptionKeyRef(const std::string &keyRef);
0089     std::string encryptionKeyRef() const;
0090     bool hasEncryptionKey() const;
0091 
0092     void setAuthenticationKeyRef(const std::string &keyRef);
0093     std::string authenticationKeyRef() const;
0094     bool hasAuthenticationKey() const;
0095 
0096     std::vector<PinState> pinStates() const;
0097     void setPinStates(const std::vector<PinState> &pinStates);
0098 
0099     bool hasNullPin() const;
0100     void setHasNullPin(bool value);
0101 
0102     bool canLearnKeys() const;
0103     void setCanLearnKeys(bool value);
0104 
0105     QString errorMsg() const;
0106     void setErrorMsg(const QString &msg);
0107 
0108     const std::vector<KeyPairInfo> &keyInfos() const;
0109     const KeyPairInfo &keyInfo(const std::string &keyRef) const;
0110 
0111     std::string keyFingerprint(const std::string &keyRef) const;
0112 
0113 protected:
0114     void setAppName(const std::string &name);
0115     void setInitialKeyInfos(const std::vector<KeyPairInfo> &infos);
0116 
0117     virtual void processCardInfo();
0118 
0119     void addCardInfo(const std::string &name, const std::string &value);
0120     std::string cardInfo(const std::string &name) const;
0121 
0122 private:
0123     void parseCardInfo(const std::string &name, const std::string &value);
0124 
0125     void updateKeyInfo(const KeyPairInfo &keyPairInfo);
0126 
0127 private:
0128     bool mCanLearn = false;
0129     bool mHasNullPin = false;
0130     Status mStatus = NoCard;
0131     std::string mSerialNumber;
0132     QString mDisplaySerialNumber;
0133     std::string mAppName;
0134     int mAppVersion = -1;
0135     std::string mCardType;
0136     int mCardVersion = -1;
0137     QString mCardHolder;
0138     std::string mSigningKeyRef;
0139     std::string mEncryptionKeyRef;
0140     std::string mAuthenticationKeyRef;
0141     std::vector<PinState> mPinStates;
0142     QString mErrMsg;
0143     std::vector<KeyPairInfo> mKeyInfos;
0144     std::multimap<std::string, std::string> mCardInfo;
0145 };
0146 } // namespace Smartcard
0147 } // namespace Kleopatra