Reply.Net.SADL 1.0.1

dotnet add package Reply.Net.SADL --version 1.0.1                
NuGet\Install-Package Reply.Net.SADL -Version 1.0.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Reply.Net.SADL" Version="1.0.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Reply.Net.SADL --version 1.0.1                
#r "nuget: Reply.Net.SADL, 1.0.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Reply.Net.SADL as a Cake Addin
#addin nuget:?package=Reply.Net.SADL&version=1.0.1

// Install Reply.Net.SADL as a Cake Tool
#tool nuget:?package=Reply.Net.SADL&version=1.0.1                

Drivers Licence Scanning

Data

The barcode on the back of a South African drivers licence contains 720 bytes encoded into a PDF417 barcode format. The first 4 bytes contains a version number that should be used to decide which of the encryption keys to use. All currently valid licences use version 2 for decryption.

Version bytes Version
01 e1 02 45 Version 1
01 9b 09 45 Version 2

Following the version number are 2 bytes containing zeros, i.e. 00 00. The remaining 714 bytes contains the encrypted drivers licence data.

Decryption

The data should be divided into 6 blocks. The first 5 blocks should each be 128 bytes, and the remaining block should be 74 bytes. Each of the licence data blocks should be decrypted using RSA ENCRYPT with the specific licence version public key.

The licence holder details are contained within the first block.

Version 1 - 128 bytes

-----BEGIN RSA PUBLIC KEY-----
MIGXAoGBAP7S4cJ+M2MxbncxenpSxUmBOVGGvkl0dgxyUY1j4FRKSNCIszLFsMNw
x2XWXZg8H53gpCsxDMwHrncL0rYdak3M6sdXaJvcv2CEePrzEvYIfMSWw3Ys9cRl
HK7No0mfrn7bfrQOPhjrMEFw6R7VsVaqzm9DLW7KbMNYUd6MZ49nAhEAu3l//ex/
nkLJ1vebE3BZ2w==
-----END RSA PUBLIC KEY-----

Version 1 - 74 bytes

-----BEGIN RSA PUBLIC KEY-----
MGACSwD/POxrX0Djw2YUUbn8+u866wbcIynA5vTczJJ5cmcWzhW74F7tLFcRvPj1
tsj3J221xDv6owQNwBqxS5xNFvccDOXqlT8MdUxrFwIRANsFuoItmswz+rfY9Cf5
zmU=
-----END RSA PUBLIC KEY-----

Version 2 - 128 bytes

-----BEGIN RSA PUBLIC KEY-----
MIGWAoGBAMqfGO9sPz+kxaRh/qVKsZQGul7NdG1gonSS3KPXTjtcHTFfexA4MkGA
mwKeu9XeTRFgMMxX99WmyaFvNzuxSlCFI/foCkx0TZCFZjpKFHLXryxWrkG1Bl9+
+gKTvTJ4rWk1RvnxYhm3n/Rxo2NoJM/822Oo7YBZ5rmk8NuJU4HLAhAYcJLaZFTO
sYU+aRX4RmoF
-----END RSA PUBLIC KEY-----

Version 2 - 74 bytes

-----BEGIN RSA PUBLIC KEY-----
MF8CSwC0BKDfEdHKz/GhoEjU1XP5U6YsWD10klknVhpteh4rFAQlJq9wtVBUc5Dq
bsdI0w/bga20kODDahmGtASy9fae9dobZj5ZUJEw5wIQMJz+2XGf4qXiDJu0R2U4
Kw==
-----END RSA PUBLIC KEY-----

Interpretation

Refer to this repository for interpretation information: https://github.com/ugommirikwe/sa-license-decoder

Usage

// Byte array contianing raw licence bytes from barcode 
var encryptedLicenceBytes = ...; 

// Decrypt and decode licence fields
var driversLicenceService = new DriversLicenceService();
var decryptedLicenceBytes = driversLicenceService.DecryptLicence(encryptedLicenceBytes);
var licence = driversLicenceService.DecodeLicence(decryptedLicenceBytes);

// Read fields from licence object
var surname = licence.Surname;
var initials = licence.Initials;

Samples

Raw barcode data (base64)

Licence holder: JH Schoeman

AZsJRQAAZxPEXcrzenVzwtrtm630N042KTifimvzxlEEOEQH9m8yM9S6uDMFLIndFcyA+TBpH/j8x3vwSU6kCLXsBGWpuIWAyVxGzCE0n8oDoQuVd4y9lnLFPRUOSq58v5thva3NPGnxEDMjbS4SJ/afSdtAGoWnAhpUfGFrcDgzcjjTfRCGuzxzDHN/qsFkuunNrwJzkE+odXmQeHeWYPh/vwoor1Nzmsh8OXWBAP2bzDvtyHFsNSErf5Ea3WTEMoG9GOsS8bx/ASSfFOz35ujtLixm8y8HFq7yG1t/69iJRXYyyqqHi20lPV1PA43lZd9UspyLPdh3FHgMDowCexV32TdfdsLuhovydg4n3SrEsWEawvBpWITS64CwDCzVJQWj86z1iiMGpHFyUZ5n3Txawebkn4U1/sk+jZsyLvm6LMWwku3kpF+gunwBRGPoYNb68QXr7Juu5qMlXDQ6DMmXSzeafXCzRphmiFE+8iST+00a6EQ81yGCf37skziR4H9HHMLhl8EeqCIz0yxmb3CALa5x0rr87CVQ90WNQMI/DA89lFIlPZrmx5vX2Vkvp0TBw8QLlF9IaTyhtEdnWYfqUdYxvtmcY4ZbJahEb/IlmkVPNwdkbCeBLxdUEMkwyCxgwxJnVWUMXRN9zRWyhsMtzMuzB01mcpkUTfRMxOskZ16IJ4NaWB7zhHVMLAB9cg2CyJx2CMrBVDewYPLvmpdUf8o6261h2h6bDbkGH+g8EM8ybpK4t+eH745F/8BW4QClBK4JV4/c7dDTq/EobHduekv9Ark/NOkSG/ZvF6d6TbNroEAypVOJLRw/bDd75PdpY1e+uqmD6jFmWSyK/DUoKuVaumTYP3Q2qgtLWGcIVaKPLhTmey6EQR45t/4ZzWi+XKQRufYKnwM54ZrovaUCI/tJMN8LiiDtRSimASlqgUchJF2zkravqSnx1UfD

Raw barcode data (base64)

Licence holder: DC Jansen

AZsJRQAAYOmieh5HX4mvF8s6Wuhr2RFS0i+8ofRiuovTnpNBuyatguOrG05oBpJHt1KG7bZP7UdsGkRLun/+yorJ3c9imsWCqGW47v7GgvM95A5opvwIJl34atBYN221bkqdKi2ihdEfQIST+0cGq8NGYyoVa1F8h7WDcqOv2ovhHbrkqPWj0YgVWc4MaazQJncP2edcKMSr0LJ5bnDsqJTYVGvYRWvc2a8KoRL3i1ZSNHG0aAWuhEpmEIui8SooGA5d3e1IQ2I56uISxhk9NRIB5qJGE9JILdrlUr9+IXKSRmZ6nNXHMLpLgHNlhvX5CJSxAX/Op7KZzWJBombEt7KLcE3h8CZgJTWNE0aG4crCupr3TqFrlST0/KIHktJhi+7ISZ26tZb1pWUx8mRiyZba1eEnhAClJmxbWu0t08rhNYIRSL39PVZKwSfJDToSUDHLJj5jh5390Qcl3IAiWnAOXSWaWh0jQNe9LT/sybB44XJmYeLFG5RbVtdi+jBn8rkm3ScHp04VNavxp+4JsOxAaJzTs7mZXf3am18zSC8UQa+kgwSmiyS5QkZNAzTUsgwXpvCdXbEZJXIS97LUiGDiLGSSTcU8A1V2JKAgsXXvR1U5Rs4uYMPyupWGXXOy1EDC/T6zyYUER8JJyGlETbwQPYGXxVVjVebEZFW2GqCxdrzHMpC1MnJtQzm7NbFE/s9cXUxekK7yP8nJN1rnIG+epaIiVTZffgco4zYMt4ViyAWk+aK0pnTrWvMLWYuYsWInoiNQXi4BPkJilujz0f8D1lBvpDEWJDivq7xOi5Ym6IIda9Jk/501ot+Q4r4n4Cl8FioKa7yTfzSdMUE0hLUsonJVsiY6veJ5PLlGOHaF3pZid3zfaAihjDoldZ7U5qtkEPeIG2VUIb6H4/PfEABi8SroBgWco+ESSFVwgKZOTsbgpGaXyuTFxRl+Pe/c

Decrypted Licence (base64)

Licence holder: JH Schoeman

AQIDBAUCjhoDADcBGoJRQeBFQuHhU0NIT0VNQU7gSkjhWkHgWkHgMOAw4eEyMDIyMDAwNlQ2UzbgNjIwNTA0NTEzNjA4MQIZmBIHGZgSB6oAoBGWIFBCAVEBAgIBAlAaV0kEAPoAyEMcKEAAMCAAMUUOMQ+mGSMUy07AWsq8665ivyPwu692As4ev1uG20NiUk4ogWq55kKW7AgkmPkLEw7oU/fm5pAtw4Vcn8PUtrv32t+6K8cxB5wbED+RDw0S8NPhVzyuDc0Zo0PVfsmz/6wo1HkP6650njT7bZ1rkScpFECgPKvQ7uM9seGWjK0tpp3iBpx03tQnXT3D2ulICKLo5lqATYVu0/CQhCfakgzMxjkG/ZMn9PFEAI2xW8S1h55KDI/SEnz0V0ESVteL7NFtpKnuuQWTzRvsiNvbFwAwR/P0PWNIgS4042n+T2VPbdU4pZSSeWGlDhDFuyf8Oph5UlBxbhftQX6ITm86ujbfS46skC9NJ4eu4g70DY3td4wJyU6zTR7xPCnYVDJxTMuhaIvidWy9Piz27RR04A5Ah/pF6VhcVQQYxmB6hv/ToRbcQ806OMR1OcLQozHCv4+TECQ8hQhZY84GJdiDQ6l99R4gbuWRnRgYgMwglna+5p8xM/V+YlH8bdR8sqBAo6/fZBpylxYKyKE7Txa87dcQIDBAUJMQjkLNxZHKmXiPJvC6wWfEVFqS+byHubOFGYOOYoHG5XAUkqrV+jGWdbRkUBblgcD3rsAIITEHCHLJI1A1FAj/AUQoIkOkBmQQtHGaEEb3nxVWMWFh9DCGDca8OFIBo0PHAXcIoQggwKIHAO4REyxbbP4OsYW2gJaityBAYAAgd3d3PeW9Zed4zjnxQdAN0FsiIrGDSDEFXVgoI3aBXefkEGqKCKqUtAQLF4iKCqAqqioiqqqqpKigqBOEFBBQUQFCQAAAAAAAAAAA

Decrypted Licence (base64)

Licence holder: DC Jansen

AQIDBAUCSxQDADIBFoJaQuHh4UpBTlNFTuBEQ+FaQeBaQeAw4eHhNDE1NjAwMDAyNTIy4DkyMDYxODUwMzYwODgCIBEFEKqgCgEZkgYYIBEFESAWBRABV0kEAPoAyEL4KEAAMAQQQeks05IuWW8xHDBOaW7HBBGaee+5DBIKQqdmb9n/QLkkyF7XfI/LQXyTqDJCarANWRAYxn8OAJ2SI4I662lUDSFOpPm/GfE7lg9+tffbLKOEYjhGnwSdDfGWlRcoeHWnDvEXuooRCI2FWnBmRARmQvxuDJeVoPJKvZo/j2AZAyBQ/0sERkYTNV5FP9TtTA1izrGDsozB844gygQIDBAUAyJ8qAo6NzhSlJKXLuN4TxM9LsNT/yqQ2sFJuTeykvCz5K4pZrWYNH/Y+pRK27F9h1IGJamVqcgc4wFkL/pEG9codK20WCOFe6XJZwVTxfWesAhwAHkEArz+wBOkOz0+Qit4AS+eUOkLsxHhP4Hdsx217E54pXEbsnFLUV+fyucQegA+vKcNkWrxlIFQqHHdy2I7lviM9aq5p+g0lpeddkhB0mi0C2r4p04KM1Puehlz40TX/0GQdqZ4nDAjr5wMeXtSP0o24wqKyNYDCqGTOOAnjNzeWK8pvus/bVoL1Dzd+7wKS5hSvmyiHupI5q7ou+obES0OAf2s6EcJ7MjaAOhgdm1hjP9o36fMDVXZNPRYoaaWZisdV1XsoLX9V+48dDctBitB1lNjPoCuagsp+/5G0oR6RAMGVXGrNGa8G4xOpL0XC14l28ab8pMVqRwrQmp4AQPHmGFC7c6pC9+9Waxa6s+GOIEtN2MbzA2GCQ8CS6OEB47xi4ririBAYAAg44HjmiKcDh4iNVRBUzJMKA6AAyoi1rkghVaEVoArRjRQ7tkzDMSSisCIKQKqEjtBAEEBgQEFFEAZQEAAEBVUEQUUAAAAAAAAAAAA

Decrypted Licence (base64)

Licence holder: J Sanders

Am0WAwAyARaCWkLh4eFTQU5ERVJT4ErhWkHgWkHgMOHh4TYyMzQ1NjAwMDFBQuA4NjA5MTM1MTM5MDEyAiAHAhmqoQoBGYYJEyASERQgFxIUAVdJBAD6AMhDLihAAChCNFWnQrzo0jDnNeVd2987O9NM9v45zkHm/ll7Ivb5cBQx7vfrFr3e975/m97of/HDQKGCh/LRixwt8OqE5KhYXoNDmoVPDQKFWdbMIXtUo8+40zll0RmpShJw785Ys/luDajQ1gRRksEkr7FjiKHRMO4wpyFBGMJfagh7iuNxHOEMJFrGOBpRg5UETHrDTx0mx9RmWuHQjFA+Naa7abq64z0qL5B3ktR5oFuN4rtWXoZeql6MiPthbIY+vGEUN5mPczaChm0UvGwwkQckiCBP+LSAAVexEcEgAKywW4F+62PhksQeG6Zx/0fCjSQUBWD4fEwVwSnz5ARYJAVimcsOERK2EkQ0kXYSqR2NGSxZ9JY1ADb8Y2aC1hQPh/F/NXq+j/IVV3ratkIa1ETAaPu91/FhMgl1MdUWp5yn8UVVm+wFiWW1IC/UsvkUOkKHhSYCaMqt5loAOXGqumWXwtoOK4QcqHboj8RwAqatEPFrOGDu9ChjRI9HpjPpgvTsB3VGApj8Q8RXRPC8zi097mSBVqhNcGcO2vSTKjjIPC5yG+ISRwvFBBnEW9tarAR3lZ98IAMIQgu0VTRca4lsqeIB8xjXXuw1l24bRDiPYi5JEwAlWO09CP+G+6jYdgVLBYskCWGukFDX2g2NLBGjvYB47rCucJ8Yhgjdik1EAgNiKFN3KCCS6qCixBMkBqrbd0FnPWnX3eYFjOWqLbVoEAUARFpF1RRFEBRZS4YgoqogABY7UAEAFFAFVVUBBEVAVVQQAAAAAAAAAAAAAAAA

https://www.b4x.com/android/forum/threads/rsa-encryption-decryption.89436/

https://stackoverflow.com/questions/17549231/decode-south-african-za-drivers-license

https://github.com/ugommirikwe/sa-license-decoder

https://www.b4x.com/android/forum/threads/solved-need-assistance-with-rsa-decryption.118756/

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.1 250 4/22/2023
1.0.0 529 9/11/2020