Erlang/OTP 28.0-rc4 Released

OTP 28.0-rc4

Erlang/OTP 28.0-rc4 is the fourth release candidate before the OTP 28.0 release.

The intention with this release is to get feedback from our users.
All feedback is welcome, even if it is only to say that it works for you, and that it installs as it should.
We encourage users to try it out and give us feedback either by creating an issue at
https://github.com/erlang/otp/issues or by posting to Erlang Forums.

All artifacts for the release can be downloaded from the Erlang/OTP Github release
and you can view the new documentation at https://erlang.org/documentation/doc-16-rc4/doc.
You can also install the latest release using kerl like this:

kerl build 28.0-rc4 28.0-rc4

Starting with this release, a source Software Bill of Materials (SBOM)
will describe the release on the Github Releases page. We welcome feedback on the SBOM.

Erlang/OTP 28 is a new major release with new features, improvements
as well as a few incompatibilities. Some of the new features are highlighted below.

Many thanks to all contributors!

Highlights for RC4

  • The ancient ASN.1 modules used in public_key has been replaced with more
    modern versions, but we have strived to keep the documented Erlang API for the
    public_key application compatible.

Highlights for RC2

  • Functionality making it possible for processes to enable reception of
    priority messages has been introduced in accordance with EEP 76.

Highlights for RC1

New language features

  • Comprehensions have been extended with “zip generators” allowing
    multiple generators to be run in parallel. For example,
    [A+B || A <- [1,2,3] && B <- [4,5,6]] will produce [5,7,9].

  • Generators in comprehensions can now be strict, meaning that if
    the generator pattern does not match, an exception will be raised
    instead of silently ignore the value that didn’t match.

  • It is now possible to use any base for floating point numbers as per
    EEP 75: Based Floating Point Literals.

Compiler and JIT improvements

  • For certain types of errors, the compiler can now suggest
    corrections. For example, when attempting to use variable A that
    is not defined but A0 is, the compiler could emit the following
    message: variable 'A' is unbound, did you mean 'A0'?

  • The size of an atom in the Erlang source code was limited to 255
    bytes in previous releases, meaning that an atom containing only
    emojis could contain only 63 emojis. While atoms are still only
    allowed to contain 255 characters, the number of bytes is no longer
    limited.

  • The warn_deprecated_catch option enables warnings for use of
    old-style catch expressions on the form catch Expr instead of the
    modern trycatchend.

  • Provided that the map argument for a maps:put/3 call is known to
    the compiler to be a map, the compiler will replace such calls with
    the corresponding update using the map syntax.

  • Some BIFs with side-effects (such as binary_to_atom/1) are
    optimized in trycatch in the same way as guard BIFs in
    order to gain performance.

  • The compiler’s alias analysis pass is now both faster and less
    conservative, allowing optimizations of records and binary
    construction to be applied in more cases.

ERTS

  • The trace:system/3 function has been added. It has a similar
    interface as erlang:system_monitor/2 but it also supports trace
    sessions.

  • os:set_signal/2 now supports setting handlers for the SIGWINCH,
    SIGCONT, and SIGINFO signals.

  • The two new BIFs erlang:processes_iterator/0 and
    erlang:process_next/1 make it possible to iterate over the
    process table in a way that scales better than erlang:processes/0.

Shell and terminal

  • The erl -noshell mode has been updated to have two sub modes called
    raw and cooked, where cooked is the old default behaviour and
    raw can be used to bypass the line-editing support of the native
    terminal. Using raw mode it is possible to read keystrokes as they
    occur without the user having to press Enter. Also, the raw mode
    does not echo the typed characters to stdout.

  • The shell now prints a help message explaining how to interrupt a
    running command when stuck executing a command for longer than 5
    seconds.

STDLIB

  • The join(Binaries, Separator) function that joins a list of
    binaries has been added to the binary module.

  • By default, sets created by module sets
    will now be represented as maps.

  • Module re has
    been updated to use the newer PCRE2 library instead of the PCRE library.

  • There is a new zstd module that does Zstandard compression.

Dialyzer

SSL

  • The data handling for tls-v1.3 has been optimized.

Emacs mode (in the Tools application)

  • The indent-region in Emacs command will now handle multiline
    strings better.

For more details about new features and potential incompatibilities see the README.

6 Likes

Building after configuring with the --without-wx option resulted in an error:

ERROR: build failed.
 ERLC	../ebin/dbg_wx_filedialog_win.beam
compile: warnings being treated as errors
dbg_wx_filedialog_win.erl:25:2: behaviour wx_object undefined
%   25| -behaviour(wx_object).
%     |  ^

make[3]: *** [../ebin/dbg_wx_filedialog_win.beam] Error 1
make[2]: *** [opt] Error 2
make[1]: *** [opt] Error 2
make: *** [libs] Error 2

This error didn’t occur with the previous 28.0 release candidates.

1 Like

The public_key re-write is rather substantial so please test this RC with applications that uses ssl, ssh or public_key.

3 Likes

Are you sure? I just tested 28.0-rc1 and I got the same error. Disabling wx like that without also disabling all applications that use wx has as far as I know never worked. What does work is if the configure in wx detects that wx is not available, then all other applications can be built.

1 Like

I know for sure I used the same kerl setup for rc3 and had no trouble. For rc1 and rc2, I built those on a different computer, so I’m not 100% sure, but I copied the kerl config I used for rc3 from that computer, so reasonably sure. This is all on macOS, so I assume there’s no wx available anyway, which is why I’ve always disabled it at config time.

1 Like

This sounds strange, I can’t imagine how that have ever worked, if you disable
wx the beam’s will not be built (guessing) and then the compiler can’t find the behavior nor the include lib stuff.

Is/was pre-built beams included in some releases?
Or does kerl do some magic, with this?

1 Like

It 's not kerl-specific. I habitually save lots of my bash history, so I have logs of configure commands for OTP source tarballs dating back several years, and they’re always like this:

./configure --without-odbc --without-wx --without-hipe

My logs show that on 10 March 2022, for example, I successfully ran the above command to build from an OTP 24.3 tarball. I just ran it again to be sure and it was fine.

2 Likes

Hmm, I’m confused.

The src tar balls contains prebuilt beams so that explains why it works.
Which also means you will never build the debugger for instance or any erlang files
since they are already built.

But testing with RC4 src tar ball without kerl, ./configure --without-wx && make i.e. works fine for me.

Welp, not really sure what to tell you, as --without-wx definitely worked for rc3 – all the logs prove it. But I’ve removed the option for rc4 and have built it successfully.

Yes, I tested a pair of 27 and RC releases and all worked as you say, even RC4.

I’m just saying it (with --without-wx) works because the beam files are pre-built and
can be found by the compiler.

But even RC4 works, don’t understand why it doesn’t work for you.

I.e. it should work when using src tar balls since they contain pre-built beams.
If you build from a clean git repo, only --without-wx should not work (I think).

Guessing a bit here…

  • kerl automatically downloads the pre-built source tar-ball artifact from github if it is available; otherwise, it downloads the raw source tar-ball artifact
  • @vinoski built before the pre-built source tar-ball artifact had been produced, which caused the build to use the raw source tar-ball, which in turn failed due to missing wx beam files
  • The pre-built source tar-ball artifact is now available, so now it builds?
1 Like

@rickard I think your explanation is spot on – I deleted the rc4 tarball kerl originally downloaded and then did a new build, which forced a new download, and now using --without-wx with rc4 works.

But more importantly, this thread is about user feedback, and I’ve verified Yaws builds and passes all tests with rc4.

5 Likes

I get segmentation fault when trying to start observer on the rc4 candidate (also on rc3) after an asdf install. Observer works fine on OTP-27 asdf installs. Anyone else experiencing the same problem?
Seems asdf install builds from erlang source:

> asdf install erlang 28.0-rc4
ERROR: 'asdf_28.0-rc4' is not a kerl-managed Erlang/OTP installation.
ERROR: no build named 'asdf_28.0-rc4'!
Downloading (from GitHub) Erlang/OTP 28.0-rc4 to /home/mikael/.asdf/downloads/erlang/28.0-rc4...
Extracting source code for normal build...
Building (normal) Erlang/OTP 28.0-rc4 (asdf_28.0-rc4); please wait...
Initializing (build) log file at /home/mikael/.asdf/plugins/erlang/kerl-home/builds/asdf_28.0-rc4/otp_build_28.0-rc4.log.
APPLICATIONS DISABLED (See: /home/mikael/.asdf/plugins/erlang/kerl-home/builds/asdf_28.0-rc4/otp_build_28.0-rc4.log)
 * jinterface     : No Java compiler found

Erlang/OTP 28.0-rc4 (asdf_28.0-rc4) has been successfully built.
Cleaning up compilation products for 'asdf_28.0-rc4' under:
  - /home/mikael/.asdf/plugins/erlang/kerl-home/builds...
  - /home/mikael/.asdf/downloads/erlang/28.0-rc4...
... done.

I cannot see any memory dump altough it claims to produce one:

> erl
Erlang/OTP 28 [RELEASE CANDIDATE 4] [erts-16.0] [source] [64-bit] [smp:8:4] [ds:8:4:10] [async-threads:1] [jit:ns]

Eshell V16.0 (press Ctrl+G to abort, type help(). for help)
1> observer:start().
Segmenteringsfel (minnesutskrift skapad)

Yes, and my “infrastructure”:

:~$ head -4 /etc/os-release
PRETTY_NAME=“Ubuntu 24.04.2 LTS”
NAME=“Ubuntu”
VERSION_ID=“24.04”
VERSION=“24.04.2 LTS (Noble Numbat)”

:~$ wx-config --libs all --version
3.2.4
-L/usr/lib/x86_64-linux-gnu -pthread -lwx_gtk3u_xrc-3.2 -lwx_gtk3u_webview-3.2 -lwx_gtk3u_stc-3.2 -lwx_gtk3u_richtext-3.2 -lwx_gtk3u_ribbon-3.2 -lwx_gtk3u_propgrid-3.2 -lwx_gtk3u_aui-3.2 -lwx_gtk3u_gl-3.2 -lwx_gtk3u_html-3.2 -lwx_gtk3u_qa-3.2 -lwx_gtk3u_core-3.2 -lwx_baseu_xml-3.2 -lwx_baseu_net-3.2 -lwx_baseu-3.2

I think ubuntu places them under /var/lib/apport/coredump by default, maybe it is there? If it is there, can you please post a stack backtrace of the crashing thread?

I think we have managed to replicate it and we know what it is.

1 Like

GitHub - potatosalad/erlang-jose: JSON Object Signing and Encryption (JOSE) for Erlang and Elixir doesn’t compile with rc4 (no issues with rc3).
Many errors about undefined macros/records and unbound variables (output of make below)

$ make DEPEND jose.d Error! Failed to eval:

Runtime terminating during boot ({{badmatch,{error,{1,erl_parse,[“syntax error before: “,”‘.’”]}}},[{init,start_it,1,},{init,start_em,1,},{init,do_boot,3,}]})

Crash dump is being written to: erl_crash.dump…done
ERLC jose_base64.erl jose_base64url.erl jose.erl jose_app.erl jose_block_encryptor.erl jose_crypto_compat.erl jose_public_key.erl jose_server.erl jose_sup.erl jose_json.erl jose_json_jason.erl jose_json_jiffy.erl jose_json_jsone.erl jose_json_jsx.erl jose_json_ojson.erl jose_json_otp.erl jose_json_poison.erl jose_json_poison_compat_encoder.erl jose_json_poison_lexical_encoder.erl jose_json_thoas.erl jose_json_unsupported.erl jose_chacha20_poly1305.erl jose_chacha20_poly1305_crypto.erl jose_chacha20_poly1305_libsodium.erl jose_chacha20_poly1305_unsupported.erl jose_curve25519.erl jose_curve25519_crypto.erl jose_curve25519_fallback.erl jose_curve25519_libdecaf.erl jose_curve25519_libsodium.erl jose_curve25519_unsupported.erl jose_curve448.erl jose_curve448_crypto.erl jose_curve448_fallback.erl jose_curve448_libdecaf.erl jose_curve448_unsupported.erl jose_jwa.erl jose_jwa_aes.erl jose_jwa_aes_kw.erl jose_jwa_base64url.erl jose_jwa_bench.erl jose_jwa_chacha20.erl jose_jwa_chacha20_poly1305.erl jose_jwa_concat_kdf.erl jose_jwa_curve25519.erl jose_jwa_curve448.erl jose_jwa_ed25519.erl jose_jwa_ed448.erl jose_jwa_hchacha20.erl jose_jwa_math.erl jose_jwa_pkcs1.erl jose_jwa_pkcs5.erl jose_jwa_pkcs7.erl jose_jwa_poly1305.erl jose_jwa_sha3.erl jose_jwa_unsupported.erl jose_jwa_x25519.erl jose_jwa_x448.erl jose_jwa_xchacha20.erl jose_jwa_xchacha20_poly1305.erl jose_sha3.erl jose_sha3_keccakf1600_driver.erl jose_sha3_keccakf1600_nif.erl jose_sha3_libdecaf.erl jose_sha3_unsupported.erl jose_xchacha20_poly1305.erl jose_xchacha20_poly1305_crypto.erl jose_xchacha20_poly1305_libsodium.erl jose_xchacha20_poly1305_unsupported.erl jose_jwe.erl jose_jwe_alg.erl jose_jwe_alg_aes_kw.erl jose_jwe_alg_c20p_kw.erl jose_jwe_alg_dir.erl jose_jwe_alg_ecdh_1pu.erl jose_jwe_alg_ecdh_es.erl jose_jwe_alg_ecdh_ss.erl jose_jwe_alg_pbes2.erl jose_jwe_alg_rsa.erl jose_jwe_alg_xc20p_kw.erl jose_jwe_enc.erl jose_jwe_enc_aes.erl jose_jwe_enc_c20p.erl jose_jwe_enc_xc20p.erl jose_jwe_zip.erl jose_jwk.erl jose_jwk_der.erl jose_jwk_kty.erl jose_jwk_kty_ec.erl jose_jwk_kty_oct.erl jose_jwk_kty_okp_ed25519.erl jose_jwk_kty_okp_ed25519ph.erl jose_jwk_kty_okp_ed448.erl jose_jwk_kty_okp_ed448ph.erl jose_jwk_kty_okp_x25519.erl jose_jwk_kty_okp_x448.erl jose_jwk_kty_rsa.erl jose_jwk_oct.erl jose_jwk_openssh_key.erl jose_jwk_pem.erl jose_jwk_set.erl jose_jwk_use_enc.erl jose_jwk_use_sig.erl jose_jws.erl jose_jws_alg.erl jose_jws_alg_ecdsa.erl jose_jws_alg_eddsa.erl jose_jws_alg_hmac.erl jose_jws_alg_none.erl jose_jws_alg_poly1305.erl jose_jws_alg_rsa_pkcs1_v1_5.erl jose_jws_alg_rsa_pss.erl jose_jwt.erl
Old inliner: threshold=0 functions=[{encode_pair,1},{encode_char,1}]
Old inliner: threshold=0 functions=[{encode_pair,1},{encode_char,1}]
src/jose_public_key.erl:77:69: undefined macro ‘id-PBES2’
% 77| {true, #‘EncryptedPrivateKeyInfo_encryptionAlgorithm’{algorithm = ?‘id-PBES2’, parameters = encode_handle_open_type_wrapper(Der)}};
% | ^

src/jose_public_key.erl:95:21: undefined macro ‘id-PBES2’
% 95| decrypt_parameters(?‘id-PBES2’, DekParams) →
% | ^

src/jose_public_key.erl:724:58: undefined macro ‘id-hmacWithSHA224’
% 724| pseudo_random_function(#‘PBKDF2-params_prf’{algorithm = ?‘id-hmacWithSHA224’= Algo}) →
% | ^

src/jose_public_key.erl:740:23: undefined macro ‘id-hmacWithSHA224’
% 740| pseudo_output_length(?‘id-hmacWithSHA224’) →
% | ^

src/jose_public_key.erl:750:50: undefined macro ‘rc2CBC’
% 750| iv(#‘PBES2-params_encryptionScheme’{algorithm = ?‘rc2CBC’, parameters = ASN1IV}) →
% | ^

src/jose_public_key.erl:66:9: function encrypt_parameters/2 undefined, did you mean encrypt_parameters/1?
% 66| case encrypt_parameters(Cipher, Params) of
% | ^

src/jose_public_key.erl:81:26: record ‘EncryptedPrivateKeyInfo_encryptionAlgorithm’ undefined, did you mean PrivateKeyInfo_privateKeyAlgorithm?
% 81| decrypt_parameters(Arg = #‘EncryptedPrivateKeyInfo_encryptionAlgorithm’{algorithm = Oid, parameters = Param}) →
% | ^

src/jose_public_key.erl:86:9: function decrypt_parameters/2 undefined, did you mean decrypt_parameters/1?
% 86| case decrypt_parameters(Oid, decode_handle_open_type_wrapper(Param)) of
% | ^

src/jose_public_key.erl:86:28: variable ‘Oid’ is unbound
% 86| case decrypt_parameters(Oid, decode_handle_open_type_wrapper(Param)) of
% | ^

src/jose_public_key.erl:86:65: variable ‘Param’ is unbound
% 86| case decrypt_parameters(Oid, decode_handle_open_type_wrapper(Param)) of
% | ^

src/jose_public_key.erl:107:8: record ‘PBES2-params_encryptionScheme’ undefined
% 107| cipher(#‘PBES2-params_encryptionScheme’{algorithm = ?‘id-aes128-CBC’}) →
% | ^

src/jose_public_key.erl:109:8: record ‘PBES2-params_encryptionScheme’ undefined
% 109| cipher(#‘PBES2-params_encryptionScheme’{algorithm = ?‘id-aes192-CBC’}) →
% | ^

src/jose_public_key.erl:111:8: record ‘PBES2-params_encryptionScheme’ undefined
% 111| cipher(#‘PBES2-params_encryptionScheme’{algorithm = ?‘id-aes256-CBC’}) →
% | ^

src/jose_public_key.erl:380:2: record ‘EncryptedPrivateKeyInfo’ undefined, did you mean PrivateKeyInfo?
% 380| #‘EncryptedPrivateKeyInfo’{encryptionAlgorithm = AlgorithmInfo, encryptedData = Data} = der_decode(‘EncryptedPrivateKeyInfo’, Der),
% | ^

src/jose_public_key.erl:381:37: variable ‘AlgorithmInfo’ is unbound
% 381| DecryptParams = decrypt_parameters(AlgorithmInfo),
% | ^

src/jose_public_key.erl:382:28: variable ‘Data’ is unbound, did you mean ‘DecryptParams’?
% 382| {true, {‘PrivateKeyInfo’, Data, DecryptParams}}.
% | ^

src/jose_public_key.erl:503:57: record ‘PBES2-params’ undefined, did you mean RSASSA-PSS-params?
% 503| pem_entry_dec({Asn1Type, EncryptedDer, CipherInfo = {_, #‘PBES2-params’{}}}, Password) when is_atom(Asn1Type) →
% | ^

src/jose_public_key.erl:677:52: record ‘PBES2-params’ undefined, did you mean RSASSA-PSS-params?
% 677| password_to_key_and_iv(Password, _Cipher, Params = #‘PBES2-params’{}) →
% | ^

src/jose_public_key.erl:681:44: record ‘PBEParameter’ undefined, did you mean DHParameter?
% 681| password_to_key_and_iv(Password, _Cipher, {#‘PBEParameter’{salt = Salt, iterationCount = Count}, Hash}) →
% | ^

src/jose_public_key.erl:682:73: variable ‘Salt’ is unbound
% 682| <<Key:8/binary, IV:8/binary, _/binary>> = pubkey_pbe:pbdkdf1(Password, Salt, Count, Hash),
% | ^

src/jose_public_key.erl:682:79: variable ‘Count’ is unbound
% 682| <<Key:8/binary, IV:8/binary, _/binary>> = pubkey_pbe:pbdkdf1(Password, Salt, Count, Hash),
% | ^

src/jose_public_key.erl:701:23: record ‘PBES2-params’ undefined, did you mean RSASSA-PSS-params?
% 701| key_derivation_params(#‘PBES2-params’{keyDerivationFunc = KeyDerivationFunc, encryptionScheme = EncScheme}) →
% | ^

src/jose_public_key.erl:702:2: record ‘PBES2-params_keyDerivationFunc’ undefined, did you mean ECParameters?
% 702| #‘PBES2-params_keyDerivationFunc’{
% | ^

src/jose_public_key.erl:710:6: variable ‘KeyDerivationFunc’ is unbound
% 710| } = KeyDerivationFunc,
% | ^

src/jose_public_key.erl:711:2: record ‘PBES2-params_encryptionScheme’ undefined
% 711| #‘PBES2-params_encryptionScheme’{algorithm = Algo} = EncScheme,
% | ^

src/jose_public_key.erl:711:55: variable ‘EncScheme’ is unbound
% 711| #‘PBES2-params_encryptionScheme’{algorithm = Algo} = EncScheme,
% | ^

src/jose_public_key.erl:712:55: function pseudo_random_function/1 undefined
% 712| {PseudoRandomFunction, PseudoHash, PseudoOtputLen} = pseudo_random_function(Prf),
% | ^

src/jose_public_key.erl:712:78: variable ‘Prf’ is unbound
% 712| {PseudoRandomFunction, PseudoHash, PseudoOtputLen} = pseudo_random_function(Prf),
% | ^

src/jose_public_key.erl:713:30: variable ‘Algo’ is unbound
% 713| KeyLen = derived_key_length(Algo, Length),
% | ^

src/jose_public_key.erl:713:36: variable ‘Length’ is unbound
% 713| KeyLen = derived_key_length(Algo, Length),
% | ^

src/jose_public_key.erl:714:3: variable ‘OctetSalt’ is unbound
% 714| {OctetSalt, Count, KeyLen,
% | ^

src/jose_public_key.erl:714:14: variable ‘Count’ is unbound
% 714| {OctetSalt, Count, KeyLen,
% | ^

src/jose_public_key.erl:715:52: function iv/1 undefined, did you mean key_derivation_params/1?
% 715| PseudoRandomFunction, PseudoHash, PseudoOtputLen, iv(EncScheme)}.
% | ^

src/jose_public_key.erl:107:1: function cipher/1 is unused
% 107| cipher(#‘PBES2-params_encryptionScheme’{algorithm = ?‘id-aes128-CBC’}) →
% | ^

src/jose_public_key.erl:734:1: function hmac/4 is unused
% 734| hmac(SubType, Key, Data, MacLength) →
% | ^

gmake[1]: *** [erlang.mk:1736: ebin/jose.app] Error 1
gmake: *** [erlang.mk:1487: app] Error 2

2 Likes

I think some password based encryption definitions sort of got lost in translation, please try:
public_key: Update included macros in public include file by IngelaAndin · Pull Request #9839 · erlang/otp

1 Like

Thanks for a quick fix. Unfortunately OTP doesn’t build for me with these changes:

gmake[3]: Entering directory '/Users/mkuratczyk/.kerl/builds/otp28-fix/otp_src_git/lib/public_key/src'
 ERLC	../ebin/public_key.beam
 ERLC	../ebin/pubkey_pem.beam
/Users/mkuratczyk/.kerl/builds/otp28-fix/otp_src_git/lib/public_key/src/../include/public_key.hrl:731:2: record 'PBES2-params' already defined
%  731| -record('PBES2-params', {
%     |  ^

/Users/mkuratczyk/.kerl/builds/otp28-fix/otp_src_git/lib/public_key/src/../include/public_key.hrl:746:2: record 'PBEParameter' already defined
%  746| -record('PBEParameter', {
%     |  ^

I pushed a fix for that compile error, but when compiling jose still get record errors:

jose/src/jose_public_key.erl:77:9: record 'EncryptedPrivateKeyInfo_encryptionAlgorithm' undefined, did you mean PrivateKeyInfo_privateKeyAlgorithm?
jose/src/jose_public_key.erl:81:26: record 'EncryptedPrivateKeyInfo_encryptionAlgorithm' undefined, did you mean PrivateKeyInfo_privateKeyAlgorithm?
jose/src/jose_public_key.erl:380:2: record 'EncryptedPrivateKeyInfo' undefined, did you mean PrivateKeyInfo?
jose/src/jose_public_key.erl:704:16: record 'PBKDF2-params' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:720:24: record 'PBKDF2-params_prf' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:722:24: record 'PBKDF2-params_prf' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:724:24: record 'PBKDF2-params_prf' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:726:24: record 'PBKDF2-params_prf' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:728:24: record 'PBKDF2-params_prf' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:730:24: record 'PBKDF2-params_prf' undefined, did you mean PBES2-params?
jose/src/jose_public_key.erl:751:7: record 'RC2-CBC-Parameter' undefined, did you mean PBEParameter?

will have to wait for Ingela to fix those.

1 Like