⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 287015 in webkit


Ignore:
Timestamp:
Dec 14, 2021, 12:18:02 AM (5 years ago)
Author:
Ben Nham
Message:

Add web push message decryption routines
https://bugs.webkit.org/show_bug.cgi?id=233903

Reviewed by Brady Eidson.

Source/WebCore:

This adds routines to decrypt push payloads encoded with the aes128gcm and aesgcm schemes.
The crypto primitives that we depend are implemented in PushCrypto, while the logic to use
those primitives to decrypt message payloads is in PushMessageCrypto.

Test: TestWebKitAPI.PushMessageCrypto

  • Headers.cmake:
  • Modules/push-api/PushCrypto.cpp: Added.

(WebCore::PushCrypto::P256DHKeyPair::generate):
(WebCore::PushCrypto::validateP256DHPublicKey):
(WebCore::PushCrypto::computeP256DHSharedSecret):
(WebCore::PushCrypto::hmacSHA256):
(WebCore::PushCrypto::decryptAES128GCM):

  • Modules/push-api/PushCrypto.h: Added.
  • Modules/push-api/PushManager.cpp:

(WebCore::PushManager::subscribe):

  • Modules/push-api/PushMessageCrypto.cpp: Added.

(WebCore::PushCrypto::ClientKeys::generate):
(WebCore::PushCrypto::areClientKeyLengthsValid):
(WebCore::PushCrypto::computeAES128GCMPaddingLength):
(WebCore::PushCrypto::decryptAES128GCMPayload):
(WebCore::PushCrypto::computeAESGCMPaddingLength):
(WebCore::PushCrypto::decryptAESGCMPayload):

  • Modules/push-api/PushMessageCrypto.h: Added.
  • Modules/push-api/cocoa/PushCryptoCocoa.cpp: Added.

(WebCore::PushCrypto::P256DHKeyPair::generate):
(WebCore::PushCrypto::validateP256DHPublicKey):
(WebCore::PushCrypto::computeP256DHSharedSecret):
(WebCore::PushCrypto::hmacSHA256):
(WebCore::PushCrypto::decryptAES128GCM):

  • Sources.txt:
  • SourcesCocoa.txt:
  • WebCore.xcodeproj/project.pbxproj:

Source/WebCore/PAL:

  • pal/spi/cocoa/CommonCryptoSPI.h: Add AES-GCM decryption SPI.
Location:
trunk/Source/WebCore
Files:
6 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r287014 r287015  
     12021-12-14  Ben Nham  <nham@apple.com>
     2
     3        Add web push message decryption routines
     4        https://bugs.webkit.org/show_bug.cgi?id=233903
     5
     6        Reviewed by Brady Eidson.
     7
     8        This adds routines to decrypt push payloads encoded with the aes128gcm and aesgcm schemes.
     9        The crypto primitives that we depend are implemented in PushCrypto, while the logic to use
     10        those primitives to decrypt message payloads is in PushMessageCrypto.
     11
     12        Test: TestWebKitAPI.PushMessageCrypto
     13
     14        * Headers.cmake:
     15        * Modules/push-api/PushCrypto.cpp: Added.
     16        (WebCore::PushCrypto::P256DHKeyPair::generate):
     17        (WebCore::PushCrypto::validateP256DHPublicKey):
     18        (WebCore::PushCrypto::computeP256DHSharedSecret):
     19        (WebCore::PushCrypto::hmacSHA256):
     20        (WebCore::PushCrypto::decryptAES128GCM):
     21        * Modules/push-api/PushCrypto.h: Added.
     22        * Modules/push-api/PushManager.cpp:
     23        (WebCore::PushManager::subscribe):
     24        * Modules/push-api/PushMessageCrypto.cpp: Added.
     25        (WebCore::PushCrypto::ClientKeys::generate):
     26        (WebCore::PushCrypto::areClientKeyLengthsValid):
     27        (WebCore::PushCrypto::computeAES128GCMPaddingLength):
     28        (WebCore::PushCrypto::decryptAES128GCMPayload):
     29        (WebCore::PushCrypto::computeAESGCMPaddingLength):
     30        (WebCore::PushCrypto::decryptAESGCMPayload):
     31        * Modules/push-api/PushMessageCrypto.h: Added.
     32        * Modules/push-api/cocoa/PushCryptoCocoa.cpp: Added.
     33        (WebCore::PushCrypto::P256DHKeyPair::generate):
     34        (WebCore::PushCrypto::validateP256DHPublicKey):
     35        (WebCore::PushCrypto::computeP256DHSharedSecret):
     36        (WebCore::PushCrypto::hmacSHA256):
     37        (WebCore::PushCrypto::decryptAES128GCM):
     38        * Sources.txt:
     39        * SourcesCocoa.txt:
     40        * WebCore.xcodeproj/project.pbxproj:
     41
    1422021-12-13  Carlos Garcia Campos  <cgarcia@igalia.com>
    243
  • trunk/Source/WebCore/Headers.cmake

    r286943 r287015  
    291291    Modules/permissions/PermissionState.h
    292292
     293    Modules/push-api/PushCrypto.h
     294    Modules/push-api/PushMessageCrypto.h
    293295    Modules/push-api/PushPermissionState.h
    294296    Modules/push-api/PushSubscriptionData.h
  • trunk/Source/WebCore/Modules/push-api/PushManager.cpp

    r285564 r287015  
    2929#if ENABLE(SERVICE_WORKER)
    3030
    31 #include "CryptoKeyEC.h"
    3231#include "EventLoop.h"
    3332#include "Exception.h"
    3433#include "JSPushPermissionState.h"
    3534#include "JSPushSubscription.h"
     35#include "PushCrypto.h"
    3636#include "ScriptExecutionContext.h"
    3737#include "ServiceWorkerRegistration.h"
     
    102102        }
    103103
    104 #if ENABLE(WEB_CRYPTO)
    105         auto keyData = keyDataResult.returnValue();
    106         auto key = CryptoKeyEC::importRaw(CryptoAlgorithmIdentifier::ECDSA, "P-256"_s, WTFMove(keyData), false, CryptoKeyUsageVerify);
    107 #else
    108         auto key = nullptr;
    109 #endif
    110 
    111         if (!key) {
     104        if (!PushCrypto::validateP256DHPublicKey(keyDataResult.returnValue())) {
    112105            promise.reject(Exception { InvalidAccessError, "applicationServerKey must contain a valid P-256 public key"_s });
    113106            return;
  • trunk/Source/WebCore/PAL/ChangeLog

    r286911 r287015  
     12021-12-14  Ben Nham  <nham@apple.com>
     2
     3        Add web push message decryption routines
     4        https://bugs.webkit.org/show_bug.cgi?id=233903
     5
     6        Reviewed by Brady Eidson.
     7
     8        * pal/spi/cocoa/CommonCryptoSPI.h: Add AES-GCM decryption SPI.
     9
    1102021-12-11  Commit Queue  <commit-queue@webkit.org>
    211
  • trunk/Source/WebCore/PAL/pal/spi/cocoa/CommonCryptoSPI.h

    r281554 r287015  
    2525
    2626#pragma once
     27
     28#include <CommonCrypto/CommonCrypto.h>
    2729
    2830#if USE(APPLE_INTERNAL_SDK)
     
    119121extern "C" void CCKDFParametersDestroy(CCKDFParametersRef params);
    120122extern "C" CCCryptorStatus CCCryptorGCM(CCOperation op, CCAlgorithm alg, const void* key, size_t keyLength, const void* iv, size_t ivLen, const void* aData, size_t aDataLen, const void* dataIn, size_t dataInLength, void* dataOut, void* tag, size_t* tagLength);
     123extern "C" CCCryptorStatus CCCryptorGCMOneshotDecrypt(CCAlgorithm alg, const void *key, size_t keyLength, const void  *iv, size_t ivLen, const void  *aData, size_t aDataLen, const void *dataIn, size_t dataInLength, void        *dataOut, const void  *tagIn, size_t tagLength);
    121124extern "C" CCCryptorStatus CCRSACryptorCreateFromData(CCRSAKeyType keyType, const uint8_t *modulus, size_t modulusLength, const uint8_t *exponent, size_t exponentLength, const uint8_t *p, size_t pLength, const uint8_t *q, size_t qLength, CCRSACryptorRef *ref);
    122125
  • trunk/Source/WebCore/Sources.txt

    r286962 r287015  
    258258Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp
    259259Modules/pictureinpicture/PictureInPictureWindow.cpp
     260Modules/push-api/PushCrypto.cpp
    260261Modules/push-api/PushEvent.cpp
     262Modules/push-api/PushMessageCrypto.cpp
    261263Modules/push-api/PushMessageData.cpp
    262264Modules/push-api/PushSubscription.cpp
  • trunk/Source/WebCore/SourcesCocoa.txt

    r286943 r287015  
    107107Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm
    108108Modules/model-element/scenekit/SceneKitModelPlayer.mm
     109Modules/push-api/cocoa/PushCryptoCocoa.cpp
    109110Modules/speech/cocoa/SpeechRecognizerCocoa.mm
    110111Modules/speech/cocoa/WebSpeechRecognizerTask.mm
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r286962 r287015  
    54375437                EB3C29B62729C38800FB65B4 /* PushSubscriptionChangeEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3C29B42729C36E00FB65B4 /* PushSubscriptionChangeEvent.h */; };
    54385438                EB3C29B72729C38C00FB65B4 /* PushSubscriptionChangeEventInit.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3C29B12729C36D00FB65B4 /* PushSubscriptionChangeEventInit.h */; };
     5439                EBA75C46275EC61A00D6D31C /* PushCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA75C42275EBDAB00D6D31C /* PushCrypto.h */; settings = {ATTRIBUTES = (Private, ); }; };
     5440                EBA75C47275EC62100D6D31C /* PushMessageCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA75C40275EBDAA00D6D31C /* PushMessageCrypto.h */; settings = {ATTRIBUTES = (Private, ); }; };
    54395441                EBB9738127100671007732EF /* PushManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EBB9738027100654007732EF /* PushManager.h */; };
    54405442                EBB9738227100676007732EF /* PushPermissionState.h in Headers */ = {isa = PBXBuildFile; fileRef = EBB9737827100651007732EF /* PushPermissionState.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1758217584                EB3C29B32729C36E00FB65B4 /* PushSubscriptionChangeEvent.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PushSubscriptionChangeEvent.idl; sourceTree = "<group>"; };
    1758317585                EB3C29B42729C36E00FB65B4 /* PushSubscriptionChangeEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PushSubscriptionChangeEvent.h; sourceTree = "<group>"; };
     17586                EBA75C3E275EBDAA00D6D31C /* PushMessageCrypto.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PushMessageCrypto.cpp; sourceTree = "<group>"; };
     17587                EBA75C40275EBDAA00D6D31C /* PushMessageCrypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PushMessageCrypto.h; sourceTree = "<group>"; };
     17588                EBA75C41275EBDAB00D6D31C /* PushCrypto.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PushCrypto.cpp; sourceTree = "<group>"; };
     17589                EBA75C42275EBDAB00D6D31C /* PushCrypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PushCrypto.h; sourceTree = "<group>"; };
     17590                EBA75C45275EC58E00D6D31C /* PushCryptoCocoa.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PushCryptoCocoa.cpp; sourceTree = "<group>"; };
    1758417591                EBB9737827100651007732EF /* PushPermissionState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PushPermissionState.h; sourceTree = "<group>"; };
    1758517592                EBB9737A27100652007732EF /* ServiceWorkerRegistrationPushAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerRegistrationPushAPI.h; sourceTree = "<group>"; };
     
    2103521042                        isa = PBXGroup;
    2103621043                        children = (
     21044                                EBA75C44275EC56000D6D31C /* cocoa */,
     21045                                EBA75C41275EBDAB00D6D31C /* PushCrypto.cpp */,
     21046                                EBA75C42275EBDAB00D6D31C /* PushCrypto.h */,
    2103721047                                EB0FB6FD270D0AE800F7810D /* PushEncryptionKeyName.h */,
    2103821048                                EB0FB700270D0AEA00F7810D /* PushEncryptionKeyName.idl */,
     
    2104521055                                EBB9738027100654007732EF /* PushManager.h */,
    2104621056                                EBB9737E27100653007732EF /* PushManager.idl */,
     21057                                EBA75C3E275EBDAA00D6D31C /* PushMessageCrypto.cpp */,
     21058                                EBA75C40275EBDAA00D6D31C /* PushMessageCrypto.h */,
    2104721059                                418FCBBE2706E4F700F96ECA /* PushMessageData.cpp */,
    2104821060                                418FCBBC2706E4F600F96ECA /* PushMessageData.h */,
     
    3123031242                        );
    3123131243                        path = "contact-picker";
     31244                        sourceTree = "<group>";
     31245                };
     31246                EBA75C44275EC56000D6D31C /* cocoa */ = {
     31247                        isa = PBXGroup;
     31248                        children = (
     31249                                EBA75C45275EC58E00D6D31C /* PushCryptoCocoa.cpp */,
     31250                        );
     31251                        path = cocoa;
    3123231252                        sourceTree = "<group>";
    3123331253                };
     
    3642536445                                0081FF0016B0A2D3008AAA7A /* PublicSuffix.h in Headers */,
    3642636446                                10FB084B14E15C7E00A3DB98 /* PublicURLManager.h in Headers */,
     36447                                EBA75C46275EC61A00D6D31C /* PushCrypto.h in Headers */,
    3642736448                                EB0FB708270D0B1000F7810D /* PushEncryptionKeyName.h in Headers */,
    3642836449                                418FCBC12706E4FB00F96ECA /* PushEvent.h in Headers */,
    3642936450                                418FCBC22706E50100F96ECA /* PushEventInit.h in Headers */,
    3643036451                                EBB9738127100671007732EF /* PushManager.h in Headers */,
     36452                                EBA75C47275EC62100D6D31C /* PushMessageCrypto.h in Headers */,
    3643136453                                EBB9738227100676007732EF /* PushPermissionState.h in Headers */,
    3643236454                                83D511F6250C1CBF002EDC51 /* PushPullFIFO.h in Headers */,
Note: See TracChangeset for help on using the changeset viewer.