Virgil Core SDK allows developers to get up and running with Virgil Cards Service API quickly and add end-to-end security to their new or existing digital solutions to become HIPAA and GDPR compliant and more.

Overview

Virgil Core SDK Objective-C/Swift

Build Status CocoaPods Compatible Carthage compatible Platform GitHub license

Introduction | SDK Features | Installation | Configure SDK | Usage Examples | Docs | Support

Introduction

Virgil Security provides a set of APIs for adding security to any application. In a few simple steps you can encrypt communications, securely store data, and ensure data integrity. Virgil Security products are available for desktop, embedded (IoT), mobile, cloud, and web applications in a variety of modern programming languages.

The Virgil Core SDK is a low-level library that allows developers to get up and running with Virgil Cards Service API quickly and add end-to-end security to their new or existing digital solutions.

In case you need additional security functionality for multi-device support, group chats and more, try our high-level Virgil E3Kit framework.

SDK Features

Installation

Virgil Core SDK is provided as a set of frameworks. These frameworks are distributed via Carthage and CocoaPods. In this guide you'll also find one more package - Virgil Crypto Library, that is used by the SDK to perform cryptographic operations.

All frameworks are available for:

  • iOS 9.0+
  • macOS 10.11+
  • tvOS 9.0+
  • watchOS 2.0+

COCOAPODS

CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods

To integrate VirgilSDK into your Xcode project using CocoaPods, specify it in your Podfile:

target '<Your Target Name>' do
  use_frameworks!

  pod 'VirgilSDK', '~> 8.0'
end

Then, run the following command:

$ pod install

Carthage

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

You can install Carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

To integrate VirgilSDK into your Xcode project using Carthage, create an empty file with name Cartfile in your project's root folder and add following lines to your Cartfile

github "VirgilSecurity/virgil-sdk-x" ~> 8.0

Linking against prebuilt binaries

To link prebuilt frameworks to your app, run following command:

$ carthage update --use-xcframeworks --no-use-binaries

This will build each dependency or download a pre-compiled framework from github Releases.

Building for iOS/tvOS/watchOS

On your application targets’ “General” settings tab, in the “Linked Frameworks and Libraries” section, add following frameworks from the Carthage/Build folder inside your project's folder:

  • VirgilSDK
  • VirgilCrypto
  • VirgilCryptoFoundation
  • VSCCommon
  • VSCFoundation

Check Embed & sign for each.

Building for macOS

On your application target's “General” settings tab, in the “Embedded Binaries” section, drag and drop following frameworks from the Carthage/Build folder on disk:

  • VirgilSDK
  • VirgilCrypto
  • VirgilCryptoFoundation
  • VSCCommon
  • VSCFoundation

Additionally, you'll need to copy debug symbols for debugging and crash reporting on macOS.

On your application target’s “Build Phases” settings tab, click the “+” icon and choose “New Copy Files Phase”. Click the “Destination” drop-down menu and select “Products Directory”. For each framework, drag and drop corresponding dSYM file.

Configure SDK

This section contains guides on how to set up Virgil Core SDK modules for authenticating users, managing Virgil Cards and storing private keys.

Set up authentication

Set up user authentication with tokens that are based on the JSON Web Token standard with some Virgil modifications.

In order to make calls to Virgil Services (for example, to publish user's Card on Virgil Cards Service), you need to have a JSON Web Token ("JWT") that contains the user's identity, which is a string that uniquely identifies each user in your application.

Credentials that you'll need:

Parameter Description
App ID ID of your Application at Virgil Dashboard
App Key ID A unique string value that identifies your account at the Virgil developer portal
App Key A Private Key that is used to sign API calls to Virgil Services. For security, you will only be shown the App Key when the key is created. Don't forget to save it in a secure location for the next step

Set up JWT provider on Client side

Use these lines of code to specify which JWT generation source you prefer to use in your project:

import VirgilSDK

// Get generated token from server-side
let authenticatedQueryToServerSide: ((String) -> Void) -> Void = { completion in
    completion("eyJraWQiOiI3MGI0NDdlMzIxZj....MK7p7Ak")
}

// Setup AccessTokenProvider
let accessTokenProvider = CallbackJwtProvider { tokenContext, completion in
    authenticatedQueryToServerSide { jwtString in
        completion(jwtString, nil)
    }
}

Generate JWT on Server side

For this subsection we've created a sample backend that demonstrates how you can set up your backend to generate the JWTs. To set up and run the sample backend locally, head over to your GitHub repo of choice:

Node.js | Golang | PHP | Java | Python and follow the instructions in README.

Set up Card Verifier

Virgil Card Verifier helps you automatically verify signatures of a user's Card, for example when you get a Card from Virgil Cards Service.

By default, VirgilCardVerifier verifies only two signatures - those of a Card owner and Virgil Cards Service.

Set up VirgilCardVerifier with the following lines of code:

import VirgilSDK
import VirgilCrypto

// initialize Crypto library
let cardCrypto = VirgilCardCrypto()

let yourBackendVerifierCredentials =
    VerifierCredentials(signer: "YOUR_BACKEND",
                        publicKey: Data(base64Encoded: publicKeyStr)!)

let yourBackendWhitelist =
    try! Whitelist(verifiersCredentials: [yourBackendVerifierCredentials])

let cardVerifier = VirgilCardVerifier(cardCrypto: cardCrypto,
                                      whitelists: [yourBackendWhitelist])

Set up Card Manager

This subsection shows how to set up a Card Manager module to help you manage users' public keys.

With Card Manager you can:

  • specify an access Token (JWT) Provider.
  • specify a Card Verifier used to verify signatures of your users, your App Server, Virgil Services (optional).

Use the following lines of code to set up the Card Manager:

// initialize cardManager and specify accessTokenProvider, cardVerifier
let cardManagerParams = CardManagerParams(cardCrypto: cardCrypto,
                                          accessTokenProvider: accessTokenProvider,
                                          cardVerifier: cardVerifier)

let cardManager = CardManager(params: cardManagerParams)

Usage Examples

Before you start practicing with the usage examples, make sure that the SDK is configured. See the Configure SDK section for more information.

Generate and publish Virgil Cards at Cards Service

Use the following lines of code to create a user's Card with a public key inside and publish it at Virgil Cards Service:

import VirgilSDK
import VirgilCrypto

// save a private key into key storage
let data = try! crypto.exportPrivateKey(keyPair.privateKey)
let entry = try! keychainStorage.store(data: data, withName: "Alice", meta: nil)

// publish user's card on the Cards Service
cardManager.publishCard(privateKey: keyPair.privateKey, publicKey: keyPair.publicKey).start { result in
    switch result {
        // Card is created
        case .success(let card): break
        // Error occured
        case .failure(let error): break
    }
}

Sign then encrypt data

Virgil Core SDK allows you to use a user's private key and their Virgil Cards to sign and encrypt any kind of data.

In the following example, we load a private key from a customized key storage and get recipient's Card from the Virgil Cards Service. Recipient's Card contains a public key which we will use to encrypt the data and verify a signature.

import VirgilSDK
import VirgilCrypto

// prepare a message
let messageToEncrypt = "Hello, Bob!"
let dataToEncrypt = messageToEncrypt.data(using: .utf8)!

// prepare a user's private key
let alicePrivateKeyEntry = try! keychainStorage.retrieveEntry(withName: "Alice")
let alicePrivateKey = try! crypto.importPrivateKey(from: alicePrivateKeyEntry.data)

// using cardManager search for user's cards on Cards Service
cardManager.searchCards(identities: ["Bob"]).start { result in
    switch result {
    // Cards are obtained
    case .success(let cards):
        let bobRelevantCardsPublicKeys = cards
            .map { $0.publicKey }

        // sign a message with a private key then encrypt on a public key
        let encryptedData = try! crypto.signAndEncrypt(dataToEncrypt,
                                                       with: alicePrivateKey,
                                                       for: bobRelevantCardsPublicKeys)

    // Error occured
    case .failure(let error): break
    }
}

Decrypt data and verify signature

Once the user receives the signed and encrypted message, they can decrypt it with their own private key and verify the signature with the sender's Card:

import VirgilSDK
import VirgilCrypto

// prepare a user's private key
let bobPrivateKeyEntry = try! keychainStorage.retrieveEntry(withName: "Bob")
let bobPrivateKey = try! exporter.importPrivateKey(from: bobPrivateKeyEntry.data)

// using cardManager search for user's cards on Cards Service
cardManager.searchCards(identities: ["Alice"]).start { result in
    switch result {
    // Cards are obtained
    case .success(let cards):
        let aliceRelevantCardsPublicKeys = cards.map { $0.publicKey }

        // decrypt with a private key and verify using a public key
        let decryptedData = try! crypto.decryptAndVerify(encryptedData, 
                                                         with: bobPrivateKey,
                                                         usingOneOf: aliceRelevantCardsPublicKeys)

    // Error occured
    case .failure(let error): break
    }
}

Get Card by its ID

Use the following lines of code to get a user's card from Virgil Cloud by its ID:

import VirgilSDK

// using cardManager get a user's card from the Cards Service
cardManager.getCard(withId: "f4bf9f7fcbedaba0392f108c59d8f4a38b3838efb64877380171b54475c2ade8").start { result in
    switch result {
    // Card is obtained
    case .success(let card): break
    // Error occurred
    case .failure(let error): break
    }
}

Get Card by user's identity

For a single user, use the following lines of code to get a user's Card by a user's identity:

import VirgilSDK

// using cardManager search for user's cards on Cards Service
cardManager.searchCards(identity: "Bob").start { result in
    switch result {
    // Cards are obtained
    case .success(let cards): break
    // Error occurred
    case .failure(let error): break
    }
}

Revoke Card

You can revoke user's Card in case they don't need it anymore. Revoked Card can still be obtained using its identifier, but this card won't appear during search query.

import VirgilSDK

let result = cardManager.revokeCard(withId: card.identifier).start { result in
    switch result {
        // Card is revoked
        case .success: break
        // Error occured
        case .failure(let error): break
    }
}

Generate key pair using VirgilCrypto

You can generate a key pair and save it in a secure key storage with the following code:

import VirgilCrypto

let crypto = try! VirgilCrypto()

let keyPair = try! crypto.generateKeyPair()

Save and retrieve key using keychain storage

import VirgilSDK
import VirgilCrypto

let storageParams = try! KeychainStorageParams.makeKeychainStorageParams()
let keychainStorage = KeychainStorage(storageParams: storageParams)

// export key to Data
let data = try! crypto.exportPrivateKey(keyPair.privateKey)

let identity = "Alice"

// save key data
let entry = try! keychainStorage.store(data: data, withName: identity, meta: nil)

// retrieve key data
let retrievedEntry = try! keychainStorage.retrieveEntry(withName: identity)

// import key from Data
let privateKey = try! exporter.importPrivateKey(from: retrievedEntry.data)

Docs

Virgil Security has a powerful set of APIs, and the Developer Documentation can get you started today.

License

This library is released under the 3-clause BSD License.

Support

Our developer support team is here to help you. Find out more information on our Help Center.

You can find us on Twitter or send us email [email protected].

Also, get extra help from our support team on Slack.

Comments
  • Xcode 14 watchOS building for real devices(arm64) issues

    Xcode 14 watchOS building for real devices(arm64) issues

    I'm having issues when building for watchOS in Xcode 14 for real devices (simulator is fine). I get bunch of issues when linking VirgilCryptoFoundation for arm64 arch. In Xcode 13 works fine, probably related to bunch of changes Xcode 14 introduced for watchOS, now there is only 1 target instead of 2 when creating watchOS app, and new architecture. Screenshot 2022-10-06 at 12 29 21

    My Podfile:

    use_frameworks!
    
    target 'Demo' do
      platform :ios, '13.0'
      pod 'VirgilSDK', '8.1.0'
      
    end
    
    target 'DemoWatchOS WatchKit Extension' do
      platform :watchos, '7.0'
      pod 'VirgilSDK', '8.1.0'
      
    end
    

    Tested also with SPM, same result.

    Maybe rebuilding libraries with Xcode 14 tools would help solve this issue?

    enhancement 
    opened by jakov-clay 13
  • Support for arm64 simulator architecture

    Support for arm64 simulator architecture

    Will you support arm64 simulator architecture for M1 processor simulators?

    I get this error when I try to build. building for iOS Simulator, but linking in dylib built for iOS, file '......./Pods/VSCCrypto/Carthage/iOS/VSCCommon.framework/VSCCommon' for architecture arm64

    opened by jakov-clay 7
  • Error when linking VirgilCryptoFoundation arm64 iOS Simulator with bitcode enabled

    Error when linking VirgilCryptoFoundation arm64 iOS Simulator with bitcode enabled

    Hi, I'm really glad that you decided to move to xcframework and support arm64 iOS Simulator.

    I have some issues when building some of your library dependencies for this architecture.

    ld: bitcode bundle could not be generated because '/xxxx/DerivedData/Build/Products/Release-iphonesimulator/XCFrameworkIntermediates/VSCCrypto/Common/VSCCommon.framework/VSCCommon' was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build file 'xxxxx/DerivedData/Build/Products/Release-iphonesimulator/XCFrameworkIntermediates/VSCCrypto/Common/VSCCommon.framework/VSCCommon' for architecture arm64

    I have a framework that I build with your library as dependency. I can't seem to find a way to prevent this problem. I have to build my framework with bitcode enabled. Is it maybe possible that you did not build VSCCommon framework with xcodebuild archive command? Here is a screenshot of Xcode error: Screenshot 2022-02-03 at 17 33 33

    opened by jakov-clay 2
  • VSSSearchCardsHTTPRequest: response body: []

    VSSSearchCardsHTTPRequest: response body: []

    Sometimes got data.

    Used twilio plus virgil.

    [[VirgilHelperClass sharedInstance].virgil.Cards searchCardsWithIdentities:@["key"] completion:^(NSArray<VSSVirgilCard *>* vsenderCard, NSError *error)
    

    vsenderCard.count always 0.

    What is the issue ?

    opened by malaypatel11 2
  • Firebase Firestore getDocument crash

    Firebase Firestore getDocument crash

    Adding 'VirgilSDK', '~> 7.0' to my project made all getDocument and setData calls to the Firebase Firestore database crash. Screenshot 2019-12-30 at 11 32 49 Screenshot 2019-12-30 at 11 32 58 Podfile.lock:

    PODS:
      - abseil/algorithm (0.20190808):
        - abseil/algorithm/algorithm (= 0.20190808)
        - abseil/algorithm/container (= 0.20190808)
      - abseil/algorithm/algorithm (0.20190808)
      - abseil/algorithm/container (0.20190808):
        - abseil/algorithm/algorithm
        - abseil/base/core_headers
        - abseil/meta/type_traits
      - abseil/base (0.20190808):
        - abseil/base/atomic_hook (= 0.20190808)
        - abseil/base/base (= 0.20190808)
        - abseil/base/base_internal (= 0.20190808)
        - abseil/base/bits (= 0.20190808)
        - abseil/base/config (= 0.20190808)
        - abseil/base/core_headers (= 0.20190808)
        - abseil/base/dynamic_annotations (= 0.20190808)
        - abseil/base/endian (= 0.20190808)
        - abseil/base/log_severity (= 0.20190808)
        - abseil/base/malloc_internal (= 0.20190808)
        - abseil/base/pretty_function (= 0.20190808)
        - abseil/base/spinlock_wait (= 0.20190808)
        - abseil/base/throw_delegate (= 0.20190808)
      - abseil/base/atomic_hook (0.20190808)
      - abseil/base/base (0.20190808):
        - abseil/base/atomic_hook
        - abseil/base/base_internal
        - abseil/base/config
        - abseil/base/core_headers
        - abseil/base/dynamic_annotations
        - abseil/base/log_severity
        - abseil/base/spinlock_wait
        - abseil/meta/type_traits
      - abseil/base/base_internal (0.20190808):
        - abseil/meta/type_traits
      - abseil/base/bits (0.20190808):
        - abseil/base/core_headers
      - abseil/base/config (0.20190808)
      - abseil/base/core_headers (0.20190808):
        - abseil/base/config
      - abseil/base/dynamic_annotations (0.20190808)
      - abseil/base/endian (0.20190808):
        - abseil/base/config
        - abseil/base/core_headers
      - abseil/base/log_severity (0.20190808):
        - abseil/base/core_headers
      - abseil/base/malloc_internal (0.20190808):
        - abseil/base/base
        - abseil/base/config
        - abseil/base/core_headers
        - abseil/base/dynamic_annotations
        - abseil/base/spinlock_wait
      - abseil/base/pretty_function (0.20190808)
      - abseil/base/spinlock_wait (0.20190808):
        - abseil/base/core_headers
      - abseil/base/throw_delegate (0.20190808):
        - abseil/base/base
        - abseil/base/config
      - abseil/memory (0.20190808):
        - abseil/memory/memory (= 0.20190808)
      - abseil/memory/memory (0.20190808):
        - abseil/base/core_headers
        - abseil/meta/type_traits
      - abseil/meta (0.20190808):
        - abseil/meta/type_traits (= 0.20190808)
      - abseil/meta/type_traits (0.20190808):
        - abseil/base/config
      - abseil/numeric/int128 (0.20190808):
        - abseil/base/config
        - abseil/base/core_headers
      - abseil/strings/internal (0.20190808):
        - abseil/base/core_headers
        - abseil/base/endian
        - abseil/meta/type_traits
      - abseil/strings/strings (0.20190808):
        - abseil/base/base
        - abseil/base/bits
        - abseil/base/config
        - abseil/base/core_headers
        - abseil/base/endian
        - abseil/base/throw_delegate
        - abseil/memory/memory
        - abseil/meta/type_traits
        - abseil/numeric/int128
        - abseil/strings/internal
      - abseil/time (0.20190808):
        - abseil/time/internal (= 0.20190808)
        - abseil/time/time (= 0.20190808)
      - abseil/time/internal (0.20190808):
        - abseil/time/internal/cctz (= 0.20190808)
      - abseil/time/internal/cctz (0.20190808):
        - abseil/time/internal/cctz/civil_time (= 0.20190808)
        - abseil/time/internal/cctz/includes (= 0.20190808)
        - abseil/time/internal/cctz/time_zone (= 0.20190808)
      - abseil/time/internal/cctz/civil_time (0.20190808)
      - abseil/time/internal/cctz/includes (0.20190808)
      - abseil/time/internal/cctz/time_zone (0.20190808):
        - abseil/time/internal/cctz/civil_time
      - abseil/time/time (0.20190808):
        - abseil/base/base
        - abseil/base/core_headers
        - abseil/numeric/int128
        - abseil/strings/strings
        - abseil/time/internal/cctz/civil_time
        - abseil/time/internal/cctz/time_zone
      - abseil/types (0.20190808):
        - abseil/types/any (= 0.20190808)
        - abseil/types/bad_any_cast (= 0.20190808)
        - abseil/types/bad_any_cast_impl (= 0.20190808)
        - abseil/types/bad_optional_access (= 0.20190808)
        - abseil/types/bad_variant_access (= 0.20190808)
        - abseil/types/compare (= 0.20190808)
        - abseil/types/optional (= 0.20190808)
        - abseil/types/span (= 0.20190808)
        - abseil/types/variant (= 0.20190808)
      - abseil/types/any (0.20190808):
        - abseil/base/config
        - abseil/base/core_headers
        - abseil/meta/type_traits
        - abseil/types/bad_any_cast
        - abseil/utility/utility
      - abseil/types/bad_any_cast (0.20190808):
        - abseil/base/config
        - abseil/types/bad_any_cast_impl
      - abseil/types/bad_any_cast_impl (0.20190808):
        - abseil/base/base
        - abseil/base/config
      - abseil/types/bad_optional_access (0.20190808):
        - abseil/base/base
        - abseil/base/config
      - abseil/types/bad_variant_access (0.20190808):
        - abseil/base/base
        - abseil/base/config
      - abseil/types/compare (0.20190808):
        - abseil/base/core_headers
        - abseil/meta/type_traits
      - abseil/types/optional (0.20190808):
        - abseil/base/base_internal
        - abseil/base/config
        - abseil/base/core_headers
        - abseil/memory/memory
        - abseil/meta/type_traits
        - abseil/types/bad_optional_access
        - abseil/utility/utility
      - abseil/types/span (0.20190808):
        - abseil/algorithm/algorithm
        - abseil/base/core_headers
        - abseil/base/throw_delegate
        - abseil/meta/type_traits
      - abseil/types/variant (0.20190808):
        - abseil/base/base_internal
        - abseil/base/config
        - abseil/base/core_headers
        - abseil/meta/type_traits
        - abseil/types/bad_variant_access
        - abseil/utility/utility
      - abseil/utility/utility (0.20190808):
        - abseil/base/base_internal
        - abseil/base/config
        - abseil/meta/type_traits
      - BoringSSL-GRPC (0.0.3):
        - BoringSSL-GRPC/Implementation (= 0.0.3)
        - BoringSSL-GRPC/Interface (= 0.0.3)
      - BoringSSL-GRPC/Implementation (0.0.3):
        - BoringSSL-GRPC/Interface (= 0.0.3)
      - BoringSSL-GRPC/Interface (0.0.3)
      - Firebase/Analytics (6.14.0):
        - Firebase/Core
      - Firebase/Core (6.14.0):
        - Firebase/CoreOnly
        - FirebaseAnalytics (= 6.1.7)
      - Firebase/CoreOnly (6.14.0):
        - FirebaseCore (= 6.5.0)
      - Firebase/Firestore (6.14.0):
        - Firebase/CoreOnly
        - FirebaseFirestore (~> 1.8.2)
      - FirebaseAnalytics (6.1.7):
        - FirebaseCore (~> 6.5)
        - FirebaseInstanceID (~> 4.2)
        - GoogleAppMeasurement (= 6.1.7)
        - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
        - GoogleUtilities/MethodSwizzler (~> 6.0)
        - GoogleUtilities/Network (~> 6.0)
        - "GoogleUtilities/NSData+zlib (~> 6.0)"
        - nanopb (= 0.3.9011)
      - FirebaseAuthInterop (1.0.0)
      - FirebaseCore (6.5.0):
        - FirebaseCoreDiagnostics (~> 1.0)
        - FirebaseCoreDiagnosticsInterop (~> 1.0)
        - GoogleUtilities/Environment (~> 6.4)
        - GoogleUtilities/Logger (~> 6.4)
      - FirebaseCoreDiagnostics (1.1.2):
        - FirebaseCoreDiagnosticsInterop (~> 1.0)
        - GoogleDataTransportCCTSupport (~> 1.0)
        - GoogleUtilities/Environment (~> 6.2)
        - GoogleUtilities/Logger (~> 6.2)
        - nanopb (~> 0.3.901)
      - FirebaseCoreDiagnosticsInterop (1.1.0)
      - FirebaseFirestore (1.8.3):
        - abseil/algorithm (= 0.20190808)
        - abseil/base (= 0.20190808)
        - abseil/memory (= 0.20190808)
        - abseil/meta (= 0.20190808)
        - abseil/strings/strings (= 0.20190808)
        - abseil/time (= 0.20190808)
        - abseil/types (= 0.20190808)
        - FirebaseAuthInterop (~> 1.0)
        - FirebaseCore (~> 6.2)
        - "gRPC-C++ (= 0.0.9)"
        - leveldb-library (~> 1.22)
        - nanopb (~> 0.3.901)
      - FirebaseInstanceID (4.2.8):
        - FirebaseCore (~> 6.5)
        - GoogleUtilities/Environment (~> 6.4)
        - GoogleUtilities/UserDefaults (~> 6.4)
      - GoogleAppMeasurement (6.1.7):
        - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
        - GoogleUtilities/MethodSwizzler (~> 6.0)
        - GoogleUtilities/Network (~> 6.0)
        - "GoogleUtilities/NSData+zlib (~> 6.0)"
        - nanopb (= 0.3.9011)
      - GoogleDataTransport (3.2.0)
      - GoogleDataTransportCCTSupport (1.2.3):
        - GoogleDataTransport (~> 3.2)
        - nanopb (~> 0.3.901)
      - GoogleUtilities/AppDelegateSwizzler (6.4.0):
        - GoogleUtilities/Environment
        - GoogleUtilities/Logger
        - GoogleUtilities/Network
      - GoogleUtilities/Environment (6.4.0)
      - GoogleUtilities/Logger (6.4.0):
        - GoogleUtilities/Environment
      - GoogleUtilities/MethodSwizzler (6.4.0):
        - GoogleUtilities/Logger
      - GoogleUtilities/Network (6.4.0):
        - GoogleUtilities/Logger
        - "GoogleUtilities/NSData+zlib"
        - GoogleUtilities/Reachability
      - "GoogleUtilities/NSData+zlib (6.4.0)"
      - GoogleUtilities/Reachability (6.4.0):
        - GoogleUtilities/Logger
      - GoogleUtilities/UserDefaults (6.4.0):
        - GoogleUtilities/Logger
      - "gRPC-C++ (0.0.9)":
        - "gRPC-C++/Implementation (= 0.0.9)"
        - "gRPC-C++/Interface (= 0.0.9)"
      - "gRPC-C++/Implementation (0.0.9)":
        - "gRPC-C++/Interface (= 0.0.9)"
        - gRPC-Core (= 1.21.0)
        - nanopb (~> 0.3)
      - "gRPC-C++/Interface (0.0.9)"
      - gRPC-Core (1.21.0):
        - gRPC-Core/Implementation (= 1.21.0)
        - gRPC-Core/Interface (= 1.21.0)
      - gRPC-Core/Implementation (1.21.0):
        - BoringSSL-GRPC (= 0.0.3)
        - gRPC-Core/Interface (= 1.21.0)
        - nanopb (~> 0.3)
      - gRPC-Core/Interface (1.21.0)
      - leveldb-library (1.22)
      - nanopb (0.3.9011):
        - nanopb/decode (= 0.3.9011)
        - nanopb/encode (= 0.3.9011)
      - nanopb/decode (0.3.9011)
      - nanopb/encode (0.3.9011)
      - VirgilCrypto (5.2.2):
        - VirgilCryptoFoundation (~> 0.11.0)
      - VirgilCryptoFoundation (0.11.1):
        - VSCCrypto/Common (= 0.11.0)
        - VSCCrypto/Foundation (= 0.11.0)
      - VirgilSDK (7.0.3):
        - VirgilCrypto (~> 5.2)
      - VSCCrypto/Common (0.11.0)
      - VSCCrypto/Foundation (0.11.0)
    
    DEPENDENCIES:
      - Firebase/Analytics
      - Firebase/Firestore
      - VirgilSDK (~> 7.0)
    
    SPEC REPOS:
      trunk:
        - abseil
        - BoringSSL-GRPC
        - Firebase
        - FirebaseAnalytics
        - FirebaseAuthInterop
        - FirebaseCore
        - FirebaseCoreDiagnostics
        - FirebaseCoreDiagnosticsInterop
        - FirebaseFirestore
        - FirebaseInstanceID
        - GoogleAppMeasurement
        - GoogleDataTransport
        - GoogleDataTransportCCTSupport
        - GoogleUtilities
        - "gRPC-C++"
        - gRPC-Core
        - leveldb-library
        - nanopb
        - VirgilCrypto
        - VirgilCryptoFoundation
        - VirgilSDK
        - VSCCrypto
    
    SPEC CHECKSUMS:
      abseil: 18063d773f5366ff8736a050fe035a28f635fd27
      BoringSSL-GRPC: db8764df3204ccea016e1c8dd15d9a9ad63ff318
      Firebase: 0219bb4782eb1406f1b9b0628a2e625484ce910d
      FirebaseAnalytics: f68b9f3f1241385129ae0a83b63627fc420c05e5
      FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc
      FirebaseCore: 632e05cc5e1199d9147122c16d92305eb04c34bd
      FirebaseCoreDiagnostics: 511f4f3ed7d440bb69127e8b97c2bc8befae639e
      FirebaseCoreDiagnosticsInterop: e9b1b023157e3a2fc6418b5cb601e79b9af7b3a0
      FirebaseFirestore: 52120e2833f804a874ba1a9f59aab864a8ae2286
      FirebaseInstanceID: ce993a3c3670a8f5d47ce371ac5d143c560608c5
      GoogleAppMeasurement: db118eb61a97dd8c4f7014e368d3c335cbbcf80a
      GoogleDataTransport: 8e9b210c97d55fbff306cc5468ff91b9cb32dcf5
      GoogleDataTransportCCTSupport: 202d7cdf9c4a7d81a2bb7f7e7e1ba6faa421b1f2
      GoogleUtilities: 29bd0d8f850efbd28cff6d99e8b7da1f8d236bcf
      "gRPC-C++": 9dfe7b44821e7b3e44aacad2af29d2c21f7cde83
      gRPC-Core: c9aef9a261a1247e881b18059b84d597293c9947
      leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7
      nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
      VirgilCrypto: e7a07d3215c480296a4bc1c719aed358bfa673a1
      VirgilCryptoFoundation: d5678b66b72fe528b8d59469b2787796f8f56c94
      VirgilSDK: a9fab18b9af14dc5cb0670b6c21c0992b4f1fbf6
      VSCCrypto: 9ffdbed1f9c3fdd4baee7d02aa2baab4ca5d8dd2
    
    PODFILE CHECKSUM: ed0245f5650e023dd902ac6b6f34001bf20fe310
    
    COCOAPODS: 1.9.0.beta.2
    
    
    opened by rebeloper 1
  • Fix bash `if` syntax

    Fix bash `if` syntax

    The if statements are not effective, so the ./docs was not created.

    This causes deployment to fail.

    https://github.com/travis-ci/travis-ci/issues/7834

    opened by BanzaiMan 1
  • v8.0.0

    v8.0.0

    Added

    • Xcode 12.2+ support
    • Apple Silicon support

    Project

    • Use new format xcframeworks for dependencies
    • Bumped up test targets macOS requirement to 10.15.0 (Xcode 12 warnings)
    • Updated CI to latest Xcode & sdks

    Dependencies

    • Updated VirgilCrypto 5.5.0 --> 6.0.0

    Other

    • Updated LICENCE & Copyright
    opened by Ogerets 0
  • dyld: Library not loaded

    dyld: Library not loaded

    Hey guys I'm getting this issue when building for IOS:

    dyld: Library not loaded: @rpath/VirgilSDK.framework/VirgilSDK

    I'm using Cocoapods Xcode 11.5 onto IOS 13.5.1 Any idea why this is happening?

    Thanks

    opened by AngeloMateus 3
Releases(8.2.0)
Owner
Virgil Security, Inc.
Virgil Security, Inc. enables developers to eliminate passwords & encrypt everything, in hours, without having to become security experts.
Virgil Security, Inc.
Virgil PFS SDK Objective-C/Swift

Virgil SWIFT PFS SDK Introduction | SDK Features | Installation | Initialization | Chat Example | Register Users | Docs | Support Introduction Virgil

Virgil Security, Inc. 3 Mar 16, 2021
Oversecured Vulnerable iOS App is an iOS app that aggregates all the platform's known and popular security vulnerabilities.

Description Oversecured Vulnerable iOS App is an iOS app that aggregates all the platform's known and popular security vulnerabilities. List of vulner

Oversecured Inc 135 Dec 15, 2022
Automatically audit your Mac for basic security hygiene.

Automatically audit your Mac for basic security hygiene The simplest security is the most important. 80% of hacks are caused by 20% of common preventa

null 229 Jan 6, 2023
Sideload iOS apps regardless of security settings

m1-ios-sideloader Sideload iOS apps regardless of security settings Notes Does not support encrypted IPAs at this time - you can grab decrypted IPAs w

Eric Rabil 20 Dec 4, 2022
This repository contains the source code of the EU Digital COVID Certificate Certlogic for iOS.

This repository contains the source code of the EU Digital COVID Certificate Certlogic for iOS.

null 8 Feb 16, 2022
Send key events to any running macOS application.

KeySender An extremely simple micro package that enables you to send key events to any running application. Install Add the following to your Package.

Jordan Baird 5 Jul 31, 2022
A super simple tool for macOS Swift developers to check validity of a Gumroad-issued software license keys

Gumroad License Validator Overview A super simple tool for macOS Swift developers to check validity of a Gumroad-issued software license keys Requirem

Daniel Kašaj 13 Sep 2, 2022
Swift Package for fetching approximate user location without asking for their permission 👺 .

Earendil Swift Package for fetching approximate user location without asking for their permission ?? . Get their country, subregion or continent with

Przemysław Jabłoński 4 Sep 3, 2021
CryptoTrack - iOS app using API to receive updated crypto prices

CryptoTrack Tools used: Swift Xcode by Jose Sahagun jsahagun.io.

Jose Sahagun 0 Jan 3, 2022
RSA public/private key encryption, private key signing and public key verification in Swift using the Swift Package Manager. Works on iOS, macOS, and Linux (work in progress).

BlueRSA Swift cross-platform RSA wrapper library for RSA encryption and signing. Works on supported Apple platforms (using Security framework). Linux

Kitura 122 Dec 16, 2022
Safe and easy to use crypto for iOS and macOS

Swift-Sodium Swift-Sodium provides a safe and easy to use interface to perform common cryptographic operations on macOS, iOS, tvOS and watchOS. It lev

Frank Denis 483 Jan 5, 2023
RSA public/private key encryption, private key signing and public key verification in Swift using the Swift Package Manager. Works on iOS, macOS, and Linux (work in progress).

BlueRSA Swift cross-platform RSA wrapper library for RSA encryption and signing. Works on supported Apple platforms (using Security framework). Linux

Kitura 122 Dec 16, 2022
Native and encrypted password manager for iOS and macOS.

Open Sesame Native and encrypted password manager for iOS and macOS. What is it? OpenSesame is a free and powerful password manager that lets you mana

OpenSesame 432 Jan 7, 2023
Simple, secure password and data management for individuals and teams

Padloc Simple, secure password and data management for individuals and teams (formerly known as Padlock). This repo is split into multiple packages: P

Padloc 2.1k Jan 8, 2023
PGPro can encrypt and decrypt messages as well as manage all your OpenPGP keys. It is free, simple and lightweight. Everything stays on your device. PGPro is made in Switzerland.

PGPro can encrypt and decrypt messages as well as manage all your OpenPGP keys. It is free, simple and lightweight. Everything stays on your device. P

Luca Näf 250 Jan 4, 2023
A wrapper to make it really easy to deal with iOS, macOS, watchOS and Linux Keychain and store your user's credentials securely.

A wrapper (written only in Swift) to make it really easy to deal with iOS, macOS, watchOS and Linux Keychain and store your user's credentials securely.

Ezequiel Aceto 2 Mar 29, 2022
Cloak Swift - a tool and Tuist plugin to encrypt secrets and then pass them in an obfuscated form into applications

This is Cloak Swift - a tool and Tuist plugin to encrypt secrets and then pass them in an obfuscated form into applications.

Andrew Lord 3 Nov 9, 2022
CryptoSwift is a growing collection of standard and secure cryptographic algorithms implemented in Swift

CryptoSwift Crypto related functions and helpers for Swift implemented in Swift. (#PureSwift) Note: The master branch follows the latest currently rel

Marcin Krzyzanowski 9.4k Jan 5, 2023
A framework for the JOSE standards JWS, JWE, and JWK written in Swift.

JOSESwift is a modular and extensible framework for the JOSE standards JWS, JWE, and JWK written in Swift. ?? Please note that this implementation of

Airside Mobile, Inc. 162 Dec 15, 2022